1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "quiche/quic/core/quic_time.h"
6
7 #include "quiche/quic/platform/api/quic_test.h"
8 #include "quiche/quic/test_tools/mock_clock.h"
9
10 namespace quic {
11 namespace test {
12
13 class QuicTimeDeltaTest : public QuicTest {};
14
TEST_F(QuicTimeDeltaTest,Zero)15 TEST_F(QuicTimeDeltaTest, Zero) {
16 EXPECT_TRUE(QuicTime::Delta::Zero().IsZero());
17 EXPECT_FALSE(QuicTime::Delta::Zero().IsInfinite());
18 EXPECT_FALSE(QuicTime::Delta::FromMilliseconds(1).IsZero());
19 }
20
TEST_F(QuicTimeDeltaTest,Infinite)21 TEST_F(QuicTimeDeltaTest, Infinite) {
22 EXPECT_TRUE(QuicTime::Delta::Infinite().IsInfinite());
23 EXPECT_FALSE(QuicTime::Delta::Zero().IsInfinite());
24 EXPECT_FALSE(QuicTime::Delta::FromMilliseconds(1).IsInfinite());
25 }
26
TEST_F(QuicTimeDeltaTest,FromTo)27 TEST_F(QuicTimeDeltaTest, FromTo) {
28 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(1),
29 QuicTime::Delta::FromMicroseconds(1000));
30 EXPECT_EQ(QuicTime::Delta::FromSeconds(1),
31 QuicTime::Delta::FromMilliseconds(1000));
32 EXPECT_EQ(QuicTime::Delta::FromSeconds(1),
33 QuicTime::Delta::FromMicroseconds(1000000));
34
35 EXPECT_EQ(1, QuicTime::Delta::FromMicroseconds(1000).ToMilliseconds());
36 EXPECT_EQ(2, QuicTime::Delta::FromMilliseconds(2000).ToSeconds());
37 EXPECT_EQ(1000, QuicTime::Delta::FromMilliseconds(1).ToMicroseconds());
38 EXPECT_EQ(1, QuicTime::Delta::FromMicroseconds(1000).ToMilliseconds());
39 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(2000).ToMicroseconds(),
40 QuicTime::Delta::FromSeconds(2).ToMicroseconds());
41 }
42
TEST_F(QuicTimeDeltaTest,Add)43 TEST_F(QuicTimeDeltaTest, Add) {
44 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(2000),
45 QuicTime::Delta::Zero() + QuicTime::Delta::FromMilliseconds(2));
46 }
47
TEST_F(QuicTimeDeltaTest,Subtract)48 TEST_F(QuicTimeDeltaTest, Subtract) {
49 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(1000),
50 QuicTime::Delta::FromMilliseconds(2) -
51 QuicTime::Delta::FromMilliseconds(1));
52 }
53
TEST_F(QuicTimeDeltaTest,Multiply)54 TEST_F(QuicTimeDeltaTest, Multiply) {
55 int i = 2;
56 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(4000),
57 QuicTime::Delta::FromMilliseconds(2) * i);
58 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(4000),
59 i * QuicTime::Delta::FromMilliseconds(2));
60 double d = 2;
61 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(4000),
62 QuicTime::Delta::FromMilliseconds(2) * d);
63 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(4000),
64 d * QuicTime::Delta::FromMilliseconds(2));
65
66 // Ensure we are rounding correctly within a single-bit level of precision.
67 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(5),
68 QuicTime::Delta::FromMicroseconds(9) * 0.5);
69 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(2),
70 QuicTime::Delta::FromMicroseconds(12) * 0.2);
71 }
72
TEST_F(QuicTimeDeltaTest,Max)73 TEST_F(QuicTimeDeltaTest, Max) {
74 EXPECT_EQ(QuicTime::Delta::FromMicroseconds(2000),
75 std::max(QuicTime::Delta::FromMicroseconds(1000),
76 QuicTime::Delta::FromMicroseconds(2000)));
77 }
78
TEST_F(QuicTimeDeltaTest,NotEqual)79 TEST_F(QuicTimeDeltaTest, NotEqual) {
80 EXPECT_TRUE(QuicTime::Delta::FromSeconds(0) !=
81 QuicTime::Delta::FromSeconds(1));
82 EXPECT_FALSE(QuicTime::Delta::FromSeconds(0) !=
83 QuicTime::Delta::FromSeconds(0));
84 }
85
TEST_F(QuicTimeDeltaTest,DebuggingValue)86 TEST_F(QuicTimeDeltaTest, DebuggingValue) {
87 const QuicTime::Delta one_us = QuicTime::Delta::FromMicroseconds(1);
88 const QuicTime::Delta one_ms = QuicTime::Delta::FromMilliseconds(1);
89 const QuicTime::Delta one_s = QuicTime::Delta::FromSeconds(1);
90
91 EXPECT_EQ("1s", one_s.ToDebuggingValue());
92 EXPECT_EQ("3s", (3 * one_s).ToDebuggingValue());
93 EXPECT_EQ("1ms", one_ms.ToDebuggingValue());
94 EXPECT_EQ("3ms", (3 * one_ms).ToDebuggingValue());
95 EXPECT_EQ("1us", one_us.ToDebuggingValue());
96 EXPECT_EQ("3us", (3 * one_us).ToDebuggingValue());
97
98 EXPECT_EQ("3001us", (3 * one_ms + one_us).ToDebuggingValue());
99 EXPECT_EQ("3001ms", (3 * one_s + one_ms).ToDebuggingValue());
100 EXPECT_EQ("3000001us", (3 * one_s + one_us).ToDebuggingValue());
101 }
102
103 class QuicTimeTest : public QuicTest {
104 protected:
105 MockClock clock_;
106 };
107
TEST_F(QuicTimeTest,Initialized)108 TEST_F(QuicTimeTest, Initialized) {
109 EXPECT_FALSE(QuicTime::Zero().IsInitialized());
110 EXPECT_TRUE((QuicTime::Zero() + QuicTime::Delta::FromMicroseconds(1))
111 .IsInitialized());
112 }
113
TEST_F(QuicTimeTest,CopyConstruct)114 TEST_F(QuicTimeTest, CopyConstruct) {
115 QuicTime time_1 = QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(1234);
116 EXPECT_NE(time_1, QuicTime(QuicTime::Zero()));
117 EXPECT_EQ(time_1, QuicTime(time_1));
118 }
119
TEST_F(QuicTimeTest,CopyAssignment)120 TEST_F(QuicTimeTest, CopyAssignment) {
121 QuicTime time_1 = QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(1234);
122 QuicTime time_2 = QuicTime::Zero();
123 EXPECT_NE(time_1, time_2);
124 time_2 = time_1;
125 EXPECT_EQ(time_1, time_2);
126 }
127
TEST_F(QuicTimeTest,Add)128 TEST_F(QuicTimeTest, Add) {
129 QuicTime time_1 = QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(1);
130 QuicTime time_2 = QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(2);
131
132 QuicTime::Delta diff = time_2 - time_1;
133
134 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(1), diff);
135 EXPECT_EQ(1000, diff.ToMicroseconds());
136 EXPECT_EQ(1, diff.ToMilliseconds());
137 }
138
TEST_F(QuicTimeTest,Subtract)139 TEST_F(QuicTimeTest, Subtract) {
140 QuicTime time_1 = QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(1);
141 QuicTime time_2 = QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(2);
142
143 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(1), time_2 - time_1);
144 }
145
TEST_F(QuicTimeTest,SubtractDelta)146 TEST_F(QuicTimeTest, SubtractDelta) {
147 QuicTime time = QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(2);
148 EXPECT_EQ(QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(1),
149 time - QuicTime::Delta::FromMilliseconds(1));
150 }
151
TEST_F(QuicTimeTest,Max)152 TEST_F(QuicTimeTest, Max) {
153 QuicTime time_1 = QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(1);
154 QuicTime time_2 = QuicTime::Zero() + QuicTime::Delta::FromMilliseconds(2);
155
156 EXPECT_EQ(time_2, std::max(time_1, time_2));
157 }
158
TEST_F(QuicTimeTest,MockClock)159 TEST_F(QuicTimeTest, MockClock) {
160 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
161
162 QuicTime now = clock_.ApproximateNow();
163 QuicTime time = QuicTime::Zero() + QuicTime::Delta::FromMicroseconds(1000);
164
165 EXPECT_EQ(now, time);
166
167 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
168 now = clock_.ApproximateNow();
169
170 EXPECT_NE(now, time);
171
172 time = time + QuicTime::Delta::FromMilliseconds(1);
173 EXPECT_EQ(now, time);
174 }
175
TEST_F(QuicTimeTest,LE)176 TEST_F(QuicTimeTest, LE) {
177 const QuicTime zero = QuicTime::Zero();
178 const QuicTime one = zero + QuicTime::Delta::FromSeconds(1);
179 EXPECT_TRUE(zero <= zero);
180 EXPECT_TRUE(zero <= one);
181 EXPECT_TRUE(one <= one);
182 EXPECT_FALSE(one <= zero);
183 }
184
185 } // namespace test
186 } // namespace quic
187