|  | // 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/third_party/quiche/src/quic/core/quic_time.h" | 
|  | #include "net/third_party/quiche/src/quic/platform/api/quic_test.h" | 
|  | #include "net/third_party/quiche/src/quic/test_tools/mock_clock.h" | 
|  |  | 
|  | namespace quic { | 
|  | namespace test { | 
|  |  | 
|  | class QuicTimeDeltaTest : public QuicTest {}; | 
|  |  | 
|  | TEST_F(QuicTimeDeltaTest, Zero) { | 
|  | EXPECT_TRUE(QuicTime::Delta::Zero().IsZero()); | 
|  | EXPECT_FALSE(QuicTime::Delta::Zero().IsInfinite()); | 
|  | EXPECT_FALSE(QuicTime::Delta::FromMilliseconds(1).IsZero()); | 
|  | } | 
|  |  | 
|  | TEST_F(QuicTimeDeltaTest, Infinite) { | 
|  | EXPECT_TRUE(QuicTime::Delta::Infinite().IsInfinite()); | 
|  | EXPECT_FALSE(QuicTime::Delta::Zero().IsInfinite()); | 
|  | EXPECT_FALSE(QuicTime::Delta::FromMilliseconds(1).IsInfinite()); | 
|  | } | 
|  |  | 
|  | TEST_F(QuicTimeDeltaTest, FromTo) { | 
|  | EXPECT_EQ(QuicTime::Delta::FromMilliseconds(1), | 
|  | QuicTime::Delta::FromMicroseconds(1000)); | 
|  | EXPECT_EQ(QuicTime::Delta::FromSeconds(1), | 
|  | QuicTime::Delta::FromMilliseconds(1000)); | 
|  | EXPECT_EQ(QuicTime::Delta::FromSeconds(1), | 
|  | QuicTime::Delta::FromMicroseconds(1000000)); | 
|  |  | 
|  | EXPECT_EQ(1, QuicTime::Delta::FromMicroseconds(1000).ToMilliseconds()); | 
|  | EXPECT_EQ(2, QuicTime::Delta::FromMilliseconds(2000).ToSeconds()); | 
|  | EXPECT_EQ(1000, QuicTime::Delta::FromMilliseconds(1).ToMicroseconds()); | 
|  | EXPECT_EQ(1, QuicTime::Delta::FromMicroseconds(1000).ToMilliseconds()); | 
|  | EXPECT_EQ(QuicTime::Delta::FromMilliseconds(2000).ToMicroseconds(), | 
|  | QuicTime::Delta::FromSeconds(2).ToMicroseconds()); | 
|  | } | 
|  |  | 
|  | TEST_F(QuicTimeDeltaTest, Add) { | 
|  | EXPECT_EQ(QuicTime::Delta::FromMicroseconds(2000), | 
|  | QuicTime::Delta::Zero() + QuicTime::Delta::FromMilliseconds(2)); | 
|  | } | 
|  |  | 
|  | TEST_F(QuicTimeDeltaTest, Subtract) { | 
|  | EXPECT_EQ(QuicTime::Delta::FromMicroseconds(1000), | 
|  | QuicTime::Delta::FromMilliseconds(2) - | 
|  | QuicTime::Delta::FromMilliseconds(1)); | 
|  | } | 
|  |  | 
|  | TEST_F(QuicTimeDeltaTest, Multiply) { | 
|  | int i = 2; | 
|  | EXPECT_EQ(QuicTime::Delta::FromMicroseconds(4000), | 
|  | QuicTime::Delta::FromMilliseconds(2) * i); | 
|  | EXPECT_EQ(QuicTime::Delta::FromMicroseconds(4000), | 
|  | i * QuicTime::Delta::FromMilliseconds(2)); | 
|  | double d = 2; | 
|  | EXPECT_EQ(QuicTime::Delta::FromMicroseconds(4000), | 
|  | QuicTime::Delta::FromMilliseconds(2) * d); | 
|  | EXPECT_EQ(QuicTime::Delta::FromMicroseconds(4000), | 
|  | d * QuicTime::Delta::FromMilliseconds(2)); | 
|  |  | 
|  | // Ensure we are rounding correctly within a single-bit level of precision. | 
|  | EXPECT_EQ(QuicTime::Delta::FromMicroseconds(5), | 
|  | QuicTime::Delta::FromMicroseconds(9) * 0.5); | 
|  | EXPECT_EQ(QuicTime::Delta::FromMicroseconds(2), | 
|  | QuicTime::Delta::FromMicroseconds(12) * 0.2); | 
|  | } | 
|  |  | 
|  | TEST_F(QuicTimeDeltaTest, Max) { | 
|  | EXPECT_EQ(QuicTime::Delta::FromMicroseconds(2000), | 
|  | std::max(QuicTime::Delta::FromMicroseconds(1000), | 
|  | QuicTime::Delta::FromMicroseconds(2000))); | 
|  | } | 
|  |  | 
|  | TEST_F(QuicTimeDeltaTest, NotEqual) { | 
|  | EXPECT_TRUE(QuicTime::Delta::FromSeconds(0) != | 
|  | QuicTime::Delta::FromSeconds(1)); | 
|  | EXPECT_FALSE(QuicTime::Delta::FromSeconds(0) != | 
|  | QuicTime::Delta::FromSeconds(0)); | 
|  | } | 
|  |  | 
|  | TEST_F(QuicTimeDeltaTest, DebuggingValue) { | 
|  | const QuicTime::Delta one_us = QuicTime::Delta::FromMicroseconds(1); | 
|  | const QuicTime::Delta one_ms = QuicTime::Delta::FromMilliseconds(1); | 
|  | const QuicTime::Delta one_s = QuicTime::Delta::FromSeconds(1); | 
|  |  | 
|  | EXPECT_EQ("3s", (3 * one_s).ToDebuggingValue()); | 
|  | EXPECT_EQ("3ms", (3 * one_ms).ToDebuggingValue()); | 
|  | EXPECT_EQ("3us", (3 * one_us).ToDebuggingValue()); | 
|  |  | 
|  | EXPECT_EQ("3001us", (3 * one_ms + one_us).ToDebuggingValue()); | 
|  | EXPECT_EQ("3001ms", (3 * one_s + one_ms).ToDebuggingValue()); | 
|  | EXPECT_EQ("3000001us", (3 * one_s + one_us).ToDebuggingValue()); | 
|  | } | 
|  |  | 
|  | class QuicTimeTest : public QuicTest { | 
|  | protected: | 
|  | MockClock clock_; | 
|  | }; | 
|  |  | 
|  | TEST_F(QuicTimeTest, Initialized) { | 
|  | EXPECT_FALSE(QuicTime::Zero().IsInitialized()); | 
|  | EXPECT_TRUE((QuicTime::Zero() + QuicTime::Delta::FromMicroseconds(1)) | 
|  | .IsInitialized()); | 
|  | } | 
|  |  | 
|  | TEST_F(QuicTimeTest, CopyConstruct) { | 
|  | QuicTime time_1 = QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(1234); | 
|  | EXPECT_NE(time_1, QuicTime(QuicTime::Zero())); | 
|  | EXPECT_EQ(time_1, QuicTime(time_1)); | 
|  | } | 
|  |  | 
|  | TEST_F(QuicTimeTest, CopyAssignment) { | 
|  | QuicTime time_1 = QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(1234); | 
|  | QuicTime time_2 = QuicTime::Zero(); | 
|  | EXPECT_NE(time_1, time_2); | 
|  | time_2 = time_1; | 
|  | EXPECT_EQ(time_1, time_2); | 
|  | } | 
|  |  | 
|  | TEST_F(QuicTimeTest, Add) { | 
|  | QuicTime time_1 = QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(1); | 
|  | QuicTime time_2 = QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(2); | 
|  |  | 
|  | QuicTime::Delta diff = time_2 - time_1; | 
|  |  | 
|  | EXPECT_EQ(QuicTime::Delta::FromMilliseconds(1), diff); | 
|  | EXPECT_EQ(1000, diff.ToMicroseconds()); | 
|  | EXPECT_EQ(1, diff.ToMilliseconds()); | 
|  | } | 
|  |  | 
|  | TEST_F(QuicTimeTest, Subtract) { | 
|  | QuicTime time_1 = QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(1); | 
|  | QuicTime time_2 = QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(2); | 
|  |  | 
|  | EXPECT_EQ(QuicTime::Delta::FromMilliseconds(1), time_2 - time_1); | 
|  | } | 
|  |  | 
|  | TEST_F(QuicTimeTest, SubtractDelta) { | 
|  | QuicTime time = QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(2); | 
|  | EXPECT_EQ(QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(1), | 
|  | time - QuicTime::Delta::FromMilliseconds(1)); | 
|  | } | 
|  |  | 
|  | TEST_F(QuicTimeTest, Max) { | 
|  | QuicTime time_1 = QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(1); | 
|  | QuicTime time_2 = QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(2); | 
|  |  | 
|  | EXPECT_EQ(time_2, std::max(time_1, time_2)); | 
|  | } | 
|  |  | 
|  | TEST_F(QuicTimeTest, MockClock) { | 
|  | clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); | 
|  |  | 
|  | QuicTime now = clock_.ApproximateNow(); | 
|  | QuicTime time = QuicTime::Zero() + QuicTime::Delta::FromMicroseconds(1000); | 
|  |  | 
|  | EXPECT_EQ(now, time); | 
|  |  | 
|  | clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); | 
|  | now = clock_.ApproximateNow(); | 
|  |  | 
|  | EXPECT_NE(now, time); | 
|  |  | 
|  | time = time + QuicTime::Delta::FromMilliseconds(1); | 
|  | EXPECT_EQ(now, time); | 
|  | } | 
|  |  | 
|  | TEST_F(QuicTimeTest, LE) { | 
|  | const QuicTime zero = QuicTime::Zero(); | 
|  | const QuicTime one = zero + QuicTime::Delta::FromSeconds(1); | 
|  | EXPECT_TRUE(zero <= zero); | 
|  | EXPECT_TRUE(zero <= one); | 
|  | EXPECT_TRUE(one <= one); | 
|  | EXPECT_FALSE(one <= zero); | 
|  | } | 
|  |  | 
|  | }  // namespace test | 
|  | }  // namespace quic |