// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "net/quic/quic_clock_skew_detector.h"

#include "net/third_party/quic/test_tools/mock_clock.h"
#include "net/third_party/quic/test_tools/mock_random.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace net {
namespace test {
namespace {

class QuicClockSkewDetectorTest : public ::testing::Test {
 protected:
  QuicClockSkewDetectorTest()
      : start_ticks_time_(base::TimeTicks::Now()),
        start_wall_time_(base::Time::Now()),
        detector_(start_ticks_time_, start_wall_time_) {}

  base::TimeTicks start_ticks_time_;
  base::Time start_wall_time_;
  QuicClockSkewDetector detector_;
};

TEST_F(QuicClockSkewDetectorTest, NoChange) {
  EXPECT_FALSE(
      detector_.ClockSkewDetected(start_ticks_time_, start_wall_time_));
}

TEST_F(QuicClockSkewDetectorTest, NoOffset) {
  base::TimeDelta delta = base::TimeDelta::FromSeconds(57);
  EXPECT_FALSE(detector_.ClockSkewDetected(start_ticks_time_ + delta,
                                           start_wall_time_ + delta));
}

TEST_F(QuicClockSkewDetectorTest, SmallOffset) {
  base::TimeDelta delta = base::TimeDelta::FromMilliseconds(57);
  EXPECT_FALSE(
      detector_.ClockSkewDetected(start_ticks_time_, start_wall_time_ + delta));
}

TEST_F(QuicClockSkewDetectorTest, ManySmallOffset) {
  for (int i = 0; i < 10; ++i) {
    base::TimeDelta delta = base::TimeDelta::FromMilliseconds(500);
    EXPECT_FALSE(detector_.ClockSkewDetected(start_ticks_time_,
                                             start_wall_time_ + i * delta));
  }
}

TEST_F(QuicClockSkewDetectorTest, LargeOffset) {
  base::TimeDelta delta = base::TimeDelta::FromMilliseconds(1001);
  EXPECT_TRUE(
      detector_.ClockSkewDetected(start_ticks_time_, start_wall_time_ + delta));
}

TEST_F(QuicClockSkewDetectorTest, LargeOffsetThenSmallOffset) {
  base::TimeDelta delta = base::TimeDelta::FromMilliseconds(1001);
  EXPECT_TRUE(
      detector_.ClockSkewDetected(start_ticks_time_, start_wall_time_ + delta));
  base::TimeDelta small_delta = base::TimeDelta::FromMilliseconds(571001);
  EXPECT_FALSE(detector_.ClockSkewDetected(
      start_ticks_time_ + small_delta, start_wall_time_ + delta + small_delta));
}

}  // namespace
}  // namespace test
}  // namespace net
