/*
 *  Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "modules/rtp_rtcp/source/absolute_capture_time_sender.h"

#include "system_wrappers/include/ntp_time.h"
#include "test/gmock.h"
#include "test/gtest.h"

namespace webrtc {

TEST(AbsoluteCaptureTimeSenderTest, GetSourceWithoutCsrcs) {
  constexpr uint32_t kSsrc = 12;

  EXPECT_EQ(AbsoluteCaptureTimeSender::GetSource(kSsrc, {}), kSsrc);
}

TEST(AbsoluteCaptureTimeSenderTest, GetSourceWithCsrcs) {
  constexpr uint32_t kSsrc = 12;
  constexpr uint32_t kCsrcs[] = {34, 56, 78, 90};

  EXPECT_EQ(AbsoluteCaptureTimeSender::GetSource(kSsrc, kCsrcs), kCsrcs[0]);
}

TEST(AbsoluteCaptureTimeSenderTest, InterpolateLaterPacketSentLater) {
  constexpr uint32_t kSource = 1337;
  constexpr int kRtpClockFrequency = 64'000;
  constexpr uint32_t kRtpTimestamp0 = 1020300000;
  constexpr uint32_t kRtpTimestamp1 = kRtpTimestamp0 + 1280;
  constexpr uint32_t kRtpTimestamp2 = kRtpTimestamp0 + 2560;
  const AbsoluteCaptureTime kExtension0 = {Int64MsToUQ32x32(9000),
                                           Int64MsToQ32x32(-350)};
  const AbsoluteCaptureTime kExtension1 = {Int64MsToUQ32x32(9000 + 20),
                                           Int64MsToQ32x32(-350)};
  const AbsoluteCaptureTime kExtension2 = {Int64MsToUQ32x32(9000 + 40),
                                           Int64MsToQ32x32(-350)};
  SimulatedClock clock(0);
  AbsoluteCaptureTimeSender sender(&clock);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp0, kRtpClockFrequency,
                                NtpTime(kExtension0.absolute_capture_timestamp),
                                kExtension0.estimated_capture_clock_offset),
            kExtension0);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp1, kRtpClockFrequency,
                                NtpTime(kExtension1.absolute_capture_timestamp),
                                kExtension1.estimated_capture_clock_offset),
            absl::nullopt);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp2, kRtpClockFrequency,
                                NtpTime(kExtension2.absolute_capture_timestamp),
                                kExtension2.estimated_capture_clock_offset),
            absl::nullopt);
}

TEST(AbsoluteCaptureTimeSenderTest, InterpolateEarlierPacketSentLater) {
  constexpr uint32_t kSource = 1337;
  constexpr int kRtpClockFrequency = 64'000;
  constexpr uint32_t kRtpTimestamp0 = 1020300000;
  constexpr uint32_t kRtpTimestamp1 = kRtpTimestamp0 - 1280;
  constexpr uint32_t kRtpTimestamp2 = kRtpTimestamp0 - 2560;
  const AbsoluteCaptureTime kExtension0 = {Int64MsToUQ32x32(9000),
                                           Int64MsToQ32x32(-350)};
  const AbsoluteCaptureTime kExtension1 = {Int64MsToUQ32x32(9000 - 20),
                                           Int64MsToQ32x32(-350)};
  const AbsoluteCaptureTime kExtension2 = {Int64MsToUQ32x32(9000 - 40),
                                           Int64MsToQ32x32(-350)};

  SimulatedClock clock(0);
  AbsoluteCaptureTimeSender sender(&clock);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp0, kRtpClockFrequency,
                                NtpTime(kExtension0.absolute_capture_timestamp),
                                kExtension0.estimated_capture_clock_offset),
            kExtension0);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp1, kRtpClockFrequency,
                                NtpTime(kExtension1.absolute_capture_timestamp),
                                kExtension1.estimated_capture_clock_offset),
            absl::nullopt);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp2, kRtpClockFrequency,
                                NtpTime(kExtension2.absolute_capture_timestamp),
                                kExtension2.estimated_capture_clock_offset),
            absl::nullopt);
}

TEST(AbsoluteCaptureTimeSenderTest,
     InterpolateLaterPacketSentLaterWithRtpTimestampWrapAround) {
  constexpr uint32_t kSource = 1337;
  constexpr int kRtpClockFrequency = 64'000;
  constexpr uint32_t kRtpTimestamp0 = uint32_t{0} - 80;
  constexpr uint32_t kRtpTimestamp1 = 1280 - 80;
  constexpr uint32_t kRtpTimestamp2 = 2560 - 80;
  const AbsoluteCaptureTime kExtension0 = {Int64MsToUQ32x32(9000),
                                           Int64MsToQ32x32(-350)};
  const AbsoluteCaptureTime kExtension1 = {Int64MsToUQ32x32(9000 + 20),
                                           Int64MsToQ32x32(-350)};
  const AbsoluteCaptureTime kExtension2 = {Int64MsToUQ32x32(9000 + 40),
                                           Int64MsToQ32x32(-350)};

  SimulatedClock clock(0);
  AbsoluteCaptureTimeSender sender(&clock);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp0, kRtpClockFrequency,
                                NtpTime(kExtension0.absolute_capture_timestamp),
                                kExtension0.estimated_capture_clock_offset),
            kExtension0);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp1, kRtpClockFrequency,
                                NtpTime(kExtension1.absolute_capture_timestamp),
                                kExtension1.estimated_capture_clock_offset),
            absl::nullopt);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp2, kRtpClockFrequency,
                                NtpTime(kExtension2.absolute_capture_timestamp),
                                kExtension2.estimated_capture_clock_offset),
            absl::nullopt);
}

TEST(AbsoluteCaptureTimeSenderTest,
     InterpolateEarlierPacketSentLaterWithRtpTimestampWrapAround) {
  constexpr uint32_t kSource = 1337;
  constexpr int kRtpClockFrequency = 64'000;
  constexpr uint32_t kRtpTimestamp0 = 799;
  constexpr uint32_t kRtpTimestamp1 = kRtpTimestamp0 - 1280;
  constexpr uint32_t kRtpTimestamp2 = kRtpTimestamp0 - 2560;
  const AbsoluteCaptureTime kExtension0 = {Int64MsToUQ32x32(9000),
                                           Int64MsToQ32x32(-350)};
  const AbsoluteCaptureTime kExtension1 = {Int64MsToUQ32x32(9000 - 20),
                                           Int64MsToQ32x32(-350)};
  const AbsoluteCaptureTime kExtension2 = {Int64MsToUQ32x32(9000 - 40),
                                           Int64MsToQ32x32(-350)};

  SimulatedClock clock(0);
  AbsoluteCaptureTimeSender sender(&clock);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp0, kRtpClockFrequency,
                                NtpTime(kExtension0.absolute_capture_timestamp),
                                kExtension0.estimated_capture_clock_offset),
            kExtension0);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp1, kRtpClockFrequency,
                                NtpTime(kExtension1.absolute_capture_timestamp),
                                kExtension1.estimated_capture_clock_offset),
            absl::nullopt);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp2, kRtpClockFrequency,
                                NtpTime(kExtension2.absolute_capture_timestamp),
                                kExtension2.estimated_capture_clock_offset),
            absl::nullopt);
}

TEST(AbsoluteCaptureTimeSenderTest, SkipInterpolateIfTooLate) {
  constexpr uint32_t kSource = 1337;
  constexpr int kRtpClockFrequency = 64'000;
  constexpr uint32_t kRtpTimestamp0 = 1020300000;
  constexpr uint32_t kRtpTimestamp1 = kRtpTimestamp0 + 1280;
  constexpr uint32_t kRtpTimestamp2 = kRtpTimestamp0 + 2560;
  const AbsoluteCaptureTime kExtension0 = {Int64MsToUQ32x32(9000),
                                           Int64MsToQ32x32(-350)};
  const AbsoluteCaptureTime kExtension1 = {Int64MsToUQ32x32(9000 + 20),
                                           Int64MsToQ32x32(-350)};
  const AbsoluteCaptureTime kExtension2 = {Int64MsToUQ32x32(9000 + 40),
                                           Int64MsToQ32x32(-350)};

  SimulatedClock clock(0);
  AbsoluteCaptureTimeSender sender(&clock);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp0, kRtpClockFrequency,
                                NtpTime(kExtension0.absolute_capture_timestamp),
                                kExtension0.estimated_capture_clock_offset),
            kExtension0);

  clock.AdvanceTime(AbsoluteCaptureTimeSender::kInterpolationMaxInterval);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp1, kRtpClockFrequency,
                                NtpTime(kExtension1.absolute_capture_timestamp),
                                kExtension1.estimated_capture_clock_offset),
            absl::nullopt);

  clock.AdvanceTime(TimeDelta::Millis(1));

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp2, kRtpClockFrequency,
                                NtpTime(kExtension2.absolute_capture_timestamp),
                                kExtension2.estimated_capture_clock_offset),
            kExtension2);
}

TEST(AbsoluteCaptureTimeSenderTest, SkipInterpolateIfSourceChanged) {
  constexpr uint32_t kSource0 = 1337;
  constexpr uint32_t kSource1 = 1338;
  constexpr int kRtpClockFrequency = 64'000;
  constexpr uint32_t kRtpTimestamp0 = 1020300000;
  constexpr uint32_t kRtpTimestamp1 = kRtpTimestamp0 + 1280;
  constexpr uint32_t kRtpTimestamp2 = kRtpTimestamp0 + 2560;
  const AbsoluteCaptureTime kExtension0 = {Int64MsToUQ32x32(9000),
                                           Int64MsToQ32x32(-350)};
  const AbsoluteCaptureTime kExtension1 = {Int64MsToUQ32x32(9000 + 20),
                                           Int64MsToQ32x32(-350)};
  const AbsoluteCaptureTime kExtension2 = {Int64MsToUQ32x32(9000 + 40),
                                           Int64MsToQ32x32(-350)};

  SimulatedClock clock(0);
  AbsoluteCaptureTimeSender sender(&clock);

  EXPECT_EQ(sender.OnSendPacket(kSource0, kRtpTimestamp0, kRtpClockFrequency,
                                NtpTime(kExtension0.absolute_capture_timestamp),
                                kExtension0.estimated_capture_clock_offset),
            kExtension0);

  EXPECT_EQ(sender.OnSendPacket(kSource1, kRtpTimestamp1, kRtpClockFrequency,
                                NtpTime(kExtension1.absolute_capture_timestamp),
                                kExtension1.estimated_capture_clock_offset),
            kExtension1);

  EXPECT_EQ(sender.OnSendPacket(kSource1, kRtpTimestamp2, kRtpClockFrequency,
                                NtpTime(kExtension2.absolute_capture_timestamp),
                                kExtension2.estimated_capture_clock_offset),
            absl::nullopt);
}

TEST(AbsoluteCaptureTimeSenderTest, SkipInterpolateWhenForced) {
  constexpr uint32_t kSource = 1337;
  constexpr int kRtpClockFrequency = 64'000;
  constexpr uint32_t kRtpTimestamp0 = 1020300000;
  constexpr uint32_t kRtpTimestamp1 = kRtpTimestamp0 + 1280;
  constexpr uint32_t kRtpTimestamp2 = kRtpTimestamp0 + 2560;
  const AbsoluteCaptureTime kExtension0 = {Int64MsToUQ32x32(9000),
                                           Int64MsToQ32x32(-350)};
  const AbsoluteCaptureTime kExtension1 = {Int64MsToUQ32x32(9000 + 20),
                                           Int64MsToQ32x32(-350)};
  const AbsoluteCaptureTime kExtension2 = {Int64MsToUQ32x32(9000 + 40),
                                           Int64MsToQ32x32(-350)};

  SimulatedClock clock(0);
  AbsoluteCaptureTimeSender sender(&clock);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp0, kRtpClockFrequency,
                                NtpTime(kExtension0.absolute_capture_timestamp),
                                kExtension0.estimated_capture_clock_offset),
            kExtension0);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp1, kRtpClockFrequency,
                                NtpTime(kExtension1.absolute_capture_timestamp),
                                kExtension1.estimated_capture_clock_offset,
                                /*force=*/true),
            kExtension1);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp2, kRtpClockFrequency,
                                NtpTime(kExtension2.absolute_capture_timestamp),
                                kExtension2.estimated_capture_clock_offset,
                                /*force=*/false),
            absl::nullopt);
}

TEST(AbsoluteCaptureTimeSenderTest, SkipInterpolateIfRtpClockFrequencyChanged) {
  constexpr uint32_t kSource = 1337;
  constexpr int kRtpClockFrequency0 = 64'000;
  constexpr int kRtpClockFrequency1 = 32'000;
  constexpr uint32_t kRtpTimestamp0 = 1020300000;
  constexpr uint32_t kRtpTimestamp1 = kRtpTimestamp0 + 640;
  constexpr uint32_t kRtpTimestamp2 = kRtpTimestamp0 + 1280;
  const AbsoluteCaptureTime kExtension0 = {Int64MsToUQ32x32(9000),
                                           Int64MsToQ32x32(-350)};
  const AbsoluteCaptureTime kExtension1 = {Int64MsToUQ32x32(9000 + 20),
                                           Int64MsToQ32x32(-350)};
  const AbsoluteCaptureTime kExtension2 = {Int64MsToUQ32x32(9000 + 40),
                                           Int64MsToQ32x32(-350)};

  SimulatedClock clock(0);
  AbsoluteCaptureTimeSender sender(&clock);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp0, kRtpClockFrequency0,
                                NtpTime(kExtension0.absolute_capture_timestamp),
                                kExtension0.estimated_capture_clock_offset),
            kExtension0);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp1, kRtpClockFrequency1,
                                NtpTime(kExtension1.absolute_capture_timestamp),
                                kExtension1.estimated_capture_clock_offset),
            kExtension1);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp2, kRtpClockFrequency1,
                                NtpTime(kExtension2.absolute_capture_timestamp),
                                kExtension2.estimated_capture_clock_offset),
            absl::nullopt);
}

TEST(AbsoluteCaptureTimeSenderTest,
     SkipInterpolateIfRtpClockFrequencyIsInvalid) {
  constexpr uint32_t kSource = 1337;
  constexpr int kRtpClockFrequency = 0;
  constexpr uint32_t kRtpTimestamp = 1020300000;
  const AbsoluteCaptureTime kExtension0 = {Int64MsToUQ32x32(9000),
                                           Int64MsToQ32x32(-350)};
  const AbsoluteCaptureTime kExtension1 = {Int64MsToUQ32x32(9000 + 20),
                                           Int64MsToQ32x32(-350)};
  const AbsoluteCaptureTime kExtension2 = {Int64MsToUQ32x32(9000 + 40),
                                           Int64MsToQ32x32(-350)};

  SimulatedClock clock(0);
  AbsoluteCaptureTimeSender sender(&clock);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp, kRtpClockFrequency,
                                NtpTime(kExtension0.absolute_capture_timestamp),
                                kExtension0.estimated_capture_clock_offset),
            kExtension0);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp, kRtpClockFrequency,
                                NtpTime(kExtension1.absolute_capture_timestamp),
                                kExtension1.estimated_capture_clock_offset),
            kExtension1);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp, kRtpClockFrequency,
                                NtpTime(kExtension2.absolute_capture_timestamp),
                                kExtension2.estimated_capture_clock_offset),
            kExtension2);
}

TEST(AbsoluteCaptureTimeSenderTest,
     SkipInterpolateIfEstimatedCaptureClockOffsetChanged) {
  constexpr uint32_t kSource = 1337;
  constexpr int kRtpClockFrequency = 64'000;
  constexpr uint32_t kRtpTimestamp0 = 1020300000;
  constexpr uint32_t kRtpTimestamp1 = kRtpTimestamp0 + 1280;
  constexpr uint32_t kRtpTimestamp2 = kRtpTimestamp0 + 2560;
  const AbsoluteCaptureTime kExtension0 = {Int64MsToUQ32x32(9000),
                                           Int64MsToQ32x32(-350)};
  const AbsoluteCaptureTime kExtension1 = {Int64MsToUQ32x32(9000 + 20),
                                           Int64MsToQ32x32(370)};
  const AbsoluteCaptureTime kExtension2 = {Int64MsToUQ32x32(9000 + 40),
                                           absl::nullopt};

  SimulatedClock clock(0);
  AbsoluteCaptureTimeSender sender(&clock);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp0, kRtpClockFrequency,
                                NtpTime(kExtension0.absolute_capture_timestamp),
                                kExtension0.estimated_capture_clock_offset),
            kExtension0);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp1, kRtpClockFrequency,
                                NtpTime(kExtension1.absolute_capture_timestamp),
                                kExtension1.estimated_capture_clock_offset),
            kExtension1);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp2, kRtpClockFrequency,
                                NtpTime(kExtension2.absolute_capture_timestamp),
                                kExtension2.estimated_capture_clock_offset),
            kExtension2);
}

TEST(AbsoluteCaptureTimeSenderTest,
     SkipInterpolateIfTooMuchInterpolationError) {
  constexpr uint32_t kSource = 1337;
  constexpr int kRtpClockFrequency = 64'000;
  constexpr uint32_t kRtpTimestamp0 = 1020300000;
  constexpr uint32_t kRtpTimestamp1 = kRtpTimestamp0 + 1280;
  constexpr uint32_t kRtpTimestamp2 = kRtpTimestamp0 + 2560;
  const AbsoluteCaptureTime kExtension0 = {Int64MsToUQ32x32(9000),
                                           Int64MsToQ32x32(-350)};
  const AbsoluteCaptureTime kExtension1 = {
      Int64MsToUQ32x32(9000 + 20 +
                       AbsoluteCaptureTimeSender::kInterpolationMaxError.ms()),
      Int64MsToQ32x32(-350)};
  const AbsoluteCaptureTime kExtension2 = {
      Int64MsToUQ32x32(9000 + 40 +
                       AbsoluteCaptureTimeSender::kInterpolationMaxError.ms() +
                       1),
      Int64MsToQ32x32(-350)};

  SimulatedClock clock(0);
  AbsoluteCaptureTimeSender sender(&clock);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp0, kRtpClockFrequency,
                                NtpTime(kExtension0.absolute_capture_timestamp),
                                kExtension0.estimated_capture_clock_offset),
            kExtension0);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp1, kRtpClockFrequency,
                                NtpTime(kExtension1.absolute_capture_timestamp),
                                kExtension1.estimated_capture_clock_offset),
            absl::nullopt);

  EXPECT_EQ(sender.OnSendPacket(kSource, kRtpTimestamp2, kRtpClockFrequency,
                                NtpTime(kExtension2.absolute_capture_timestamp),
                                kExtension2.estimated_capture_clock_offset),
            kExtension2);
}

}  // namespace webrtc
