/*
 *  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/fakeclock.h"
#include "rtc_base/timeutils.h"
#include "system_wrappers/include/clock.h"
#include "test/gtest.h"

namespace webrtc {

// Disabled as flake: http://bugs.webrtc.org/8610
#ifdef WEBRTC_IOS
#define MAYBE_TimeMicrosToNtpMatchRealTimeClockInitially \
  DISABLED_TimeMicrosToNtpMatchRealTimeClockInitially
#else
#define MAYBE_TimeMicrosToNtpMatchRealTimeClockInitially \
  TimeMicrosToNtpMatchRealTimeClockInitially
#endif
TEST(TimeUtilTest, MAYBE_TimeMicrosToNtpMatchRealTimeClockInitially) {
  Clock* legacy_clock = Clock::GetRealTimeClock();
  NtpTime before_legacy_time = TimeMicrosToNtp(rtc::TimeMicros());
  NtpTime legacy_time = legacy_clock->CurrentNtpTime();
  NtpTime after_legacy_time = TimeMicrosToNtp(rtc::TimeMicros());

  // This test will fail once every 136 years, when NtpTime wraparound.
  // More often than that, it will fail if system adjust ntp time while test
  // is running.
  // To mitigate ntp time adjustment and potentional different precisions of
  // Clock and TimeMicrosToNtp, relax expectation by a millisecond.
  EXPECT_GE(legacy_time.ToMs(), before_legacy_time.ToMs() - 1);
  EXPECT_LE(legacy_time.ToMs(), after_legacy_time.ToMs() + 1);
}

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.SetTimeMicros(2);
  NtpTime time_ntp = TimeMicrosToNtp(time_us);
  clock.SetTimeMicros(time_us);
  EXPECT_EQ(TimeMicrosToNtp(time_us), time_ntp);
  clock.SetTimeMicros(1000000);
  EXPECT_EQ(TimeMicrosToNtp(time_us), time_ntp);
}

TEST(TimeUtilTest, TimeMicrosToNtpKeepsIntervals) {
  rtc::ScopedFakeClock clock;
  NtpTime time_ntp1 = TimeMicrosToNtp(rtc::TimeMicros());
  clock.AdvanceTimeMicros(20000);
  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
