/*
 *  Copyright (c) 2015 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/time_util.h"

#include "rtc_base/fake_clock.h"
#include "rtc_base/time_utils.h"
#include "system_wrappers/include/clock.h"
#include "test/gtest.h"

namespace webrtc {

TEST(TimeUtilTest, TimeMicrosToNtpDoesntChangeBetweenRuns) {
  rtc::ScopedFakeClock clock;
  // TimeMicrosToNtp is not pure: it behave differently between different
  // execution of the program, but should behave same during same execution.
  const int64_t time_us = 12345;
  clock.SetTime(Timestamp::Micros(2));
  NtpTime time_ntp = TimeMicrosToNtp(time_us);
  clock.SetTime(Timestamp::Micros(time_us));
  EXPECT_EQ(TimeMicrosToNtp(time_us), time_ntp);
  clock.SetTime(Timestamp::Micros(1000000));
  EXPECT_EQ(TimeMicrosToNtp(time_us), time_ntp);
}

TEST(TimeUtilTest, TimeMicrosToNtpKeepsIntervals) {
  rtc::ScopedFakeClock clock;
  NtpTime time_ntp1 = TimeMicrosToNtp(rtc::TimeMicros());
  clock.AdvanceTime(TimeDelta::Millis(20));
  NtpTime time_ntp2 = TimeMicrosToNtp(rtc::TimeMicros());
  EXPECT_EQ(time_ntp2.ToMs() - time_ntp1.ToMs(), 20);
}

TEST(TimeUtilTest, CompactNtp) {
  const uint32_t kNtpSec = 0x12345678;
  const uint32_t kNtpFrac = 0x23456789;
  const NtpTime kNtp(kNtpSec, kNtpFrac);
  const uint32_t kNtpMid = 0x56782345;
  EXPECT_EQ(kNtpMid, CompactNtp(kNtp));
}

TEST(TimeUtilTest, CompactNtpRttToMs) {
  const NtpTime ntp1(0x12345, 0x23456);
  const NtpTime ntp2(0x12654, 0x64335);
  int64_t ms_diff = ntp2.ToMs() - ntp1.ToMs();
  uint32_t ntp_diff = CompactNtp(ntp2) - CompactNtp(ntp1);

  int64_t ntp_to_ms_diff = CompactNtpRttToMs(ntp_diff);

  EXPECT_NEAR(ms_diff, ntp_to_ms_diff, 1);
}

TEST(TimeUtilTest, CompactNtpRttToMsWithWrap) {
  const NtpTime ntp1(0x1ffff, 0x23456);
  const NtpTime ntp2(0x20000, 0x64335);
  int64_t ms_diff = ntp2.ToMs() - ntp1.ToMs();

  // While ntp2 > ntp1, there compact ntp presentation happen to be opposite.
  // That shouldn't be a problem as long as unsigned arithmetic is used.
  ASSERT_GT(ntp2.ToMs(), ntp1.ToMs());
  ASSERT_LT(CompactNtp(ntp2), CompactNtp(ntp1));

  uint32_t ntp_diff = CompactNtp(ntp2) - CompactNtp(ntp1);
  int64_t ntp_to_ms_diff = CompactNtpRttToMs(ntp_diff);

  EXPECT_NEAR(ms_diff, ntp_to_ms_diff, 1);
}

TEST(TimeUtilTest, CompactNtpRttToMsLarge) {
  const NtpTime ntp1(0x10000, 0x00006);
  const NtpTime ntp2(0x17fff, 0xffff5);
  int64_t ms_diff = ntp2.ToMs() - ntp1.ToMs();
  // Ntp difference close to 2^15 seconds should convert correctly too.
  ASSERT_NEAR(ms_diff, ((1 << 15) - 1) * 1000, 1);
  uint32_t ntp_diff = CompactNtp(ntp2) - CompactNtp(ntp1);
  int64_t ntp_to_ms_diff = CompactNtpRttToMs(ntp_diff);

  EXPECT_NEAR(ms_diff, ntp_to_ms_diff, 1);
}

TEST(TimeUtilTest, CompactNtpRttToMsNegative) {
  const NtpTime ntp1(0x20000, 0x23456);
  const NtpTime ntp2(0x1ffff, 0x64335);
  int64_t ms_diff = ntp2.ToMs() - ntp1.ToMs();
  ASSERT_GT(0, ms_diff);
  // Ntp difference close to 2^16 seconds should be treated as negative.
  uint32_t ntp_diff = CompactNtp(ntp2) - CompactNtp(ntp1);
  int64_t ntp_to_ms_diff = CompactNtpRttToMs(ntp_diff);
  EXPECT_EQ(1, ntp_to_ms_diff);
}

TEST(TimeUtilTest, SaturatedUsToCompactNtp) {
  // Converts negative to zero.
  EXPECT_EQ(SaturatedUsToCompactNtp(-1), 0u);
  EXPECT_EQ(SaturatedUsToCompactNtp(0), 0u);
  // Converts values just above and just below max uint32_t.
  EXPECT_EQ(SaturatedUsToCompactNtp(65536000000), 0xffffffff);
  EXPECT_EQ(SaturatedUsToCompactNtp(65535999985), 0xffffffff);
  EXPECT_EQ(SaturatedUsToCompactNtp(65535999970), 0xfffffffe);
  // Converts half-seconds.
  EXPECT_EQ(SaturatedUsToCompactNtp(500000), 0x8000u);
  EXPECT_EQ(SaturatedUsToCompactNtp(1000000), 0x10000u);
  EXPECT_EQ(SaturatedUsToCompactNtp(1500000), 0x18000u);
  // Convert us -> compact_ntp -> ms. Compact ntp precision is ~15us.
  EXPECT_EQ(CompactNtpRttToMs(SaturatedUsToCompactNtp(1516)), 2);
  EXPECT_EQ(CompactNtpRttToMs(SaturatedUsToCompactNtp(15000)), 15);
  EXPECT_EQ(CompactNtpRttToMs(SaturatedUsToCompactNtp(5485)), 5);
  EXPECT_EQ(CompactNtpRttToMs(SaturatedUsToCompactNtp(5515)), 6);
}

}  // namespace webrtc
