xref: /aosp_15_r20/external/cronet/third_party/abseil-cpp/absl/time/duration_test.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2017 The Abseil Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #if defined(_MSC_VER)
16 #include <winsock2.h>  // for timeval
17 #endif
18 
19 #include <array>
20 #include <cfloat>
21 #include <chrono>  // NOLINT(build/c++11)
22 #include <cmath>
23 #include <cstdint>
24 #include <ctime>
25 #include <iomanip>
26 #include <limits>
27 #include <random>
28 #include <string>
29 
30 #include "gmock/gmock.h"
31 #include "gtest/gtest.h"
32 #include "absl/strings/str_format.h"
33 #include "absl/time/time.h"
34 
35 namespace {
36 
37 constexpr int64_t kint64max = std::numeric_limits<int64_t>::max();
38 constexpr int64_t kint64min = std::numeric_limits<int64_t>::min();
39 
40 // Approximates the given number of years. This is only used to make some test
41 // code more readable.
ApproxYears(int64_t n)42 absl::Duration ApproxYears(int64_t n) { return absl::Hours(n) * 365 * 24; }
43 
44 // A gMock matcher to match timespec values. Use this matcher like:
45 // timespec ts1, ts2;
46 // EXPECT_THAT(ts1, TimespecMatcher(ts2));
47 MATCHER_P(TimespecMatcher, ts, "") {
48   if (ts.tv_sec == arg.tv_sec && ts.tv_nsec == arg.tv_nsec)
49     return true;
50   *result_listener << "expected: {" << ts.tv_sec << ", " << ts.tv_nsec << "} ";
51   *result_listener << "actual: {" << arg.tv_sec << ", " << arg.tv_nsec << "}";
52   return false;
53 }
54 
55 // A gMock matcher to match timeval values. Use this matcher like:
56 // timeval tv1, tv2;
57 // EXPECT_THAT(tv1, TimevalMatcher(tv2));
58 MATCHER_P(TimevalMatcher, tv, "") {
59   if (tv.tv_sec == arg.tv_sec && tv.tv_usec == arg.tv_usec)
60     return true;
61   *result_listener << "expected: {" << tv.tv_sec << ", " << tv.tv_usec << "} ";
62   *result_listener << "actual: {" << arg.tv_sec << ", " << arg.tv_usec << "}";
63   return false;
64 }
65 
TEST(Duration,ConstExpr)66 TEST(Duration, ConstExpr) {
67   constexpr absl::Duration d0 = absl::ZeroDuration();
68   static_assert(d0 == absl::ZeroDuration(), "ZeroDuration()");
69   constexpr absl::Duration d1 = absl::Seconds(1);
70   static_assert(d1 == absl::Seconds(1), "Seconds(1)");
71   static_assert(d1 != absl::ZeroDuration(), "Seconds(1)");
72   constexpr absl::Duration d2 = absl::InfiniteDuration();
73   static_assert(d2 == absl::InfiniteDuration(), "InfiniteDuration()");
74   static_assert(d2 != absl::ZeroDuration(), "InfiniteDuration()");
75 }
76 
TEST(Duration,ValueSemantics)77 TEST(Duration, ValueSemantics) {
78   // If this compiles, the test passes.
79   constexpr absl::Duration a;      // Default construction
80   constexpr absl::Duration b = a;  // Copy construction
81   constexpr absl::Duration c(b);   // Copy construction (again)
82 
83   absl::Duration d;
84   d = c;  // Assignment
85 }
86 
TEST(Duration,Factories)87 TEST(Duration, Factories) {
88   constexpr absl::Duration zero = absl::ZeroDuration();
89   constexpr absl::Duration nano = absl::Nanoseconds(1);
90   constexpr absl::Duration micro = absl::Microseconds(1);
91   constexpr absl::Duration milli = absl::Milliseconds(1);
92   constexpr absl::Duration sec = absl::Seconds(1);
93   constexpr absl::Duration min = absl::Minutes(1);
94   constexpr absl::Duration hour = absl::Hours(1);
95 
96   EXPECT_EQ(zero, absl::Duration());
97   EXPECT_EQ(zero, absl::Seconds(0));
98   EXPECT_EQ(nano, absl::Nanoseconds(1));
99   EXPECT_EQ(micro, absl::Nanoseconds(1000));
100   EXPECT_EQ(milli, absl::Microseconds(1000));
101   EXPECT_EQ(sec, absl::Milliseconds(1000));
102   EXPECT_EQ(min, absl::Seconds(60));
103   EXPECT_EQ(hour, absl::Minutes(60));
104 
105   // Tests factory limits
106   const absl::Duration inf = absl::InfiniteDuration();
107 
108   EXPECT_GT(inf, absl::Seconds(kint64max));
109   EXPECT_LT(-inf, absl::Seconds(kint64min));
110   EXPECT_LT(-inf, absl::Seconds(-kint64max));
111 
112   EXPECT_EQ(inf, absl::Minutes(kint64max));
113   EXPECT_EQ(-inf, absl::Minutes(kint64min));
114   EXPECT_EQ(-inf, absl::Minutes(-kint64max));
115   EXPECT_GT(inf, absl::Minutes(kint64max / 60));
116   EXPECT_LT(-inf, absl::Minutes(kint64min / 60));
117   EXPECT_LT(-inf, absl::Minutes(-kint64max / 60));
118 
119   EXPECT_EQ(inf, absl::Hours(kint64max));
120   EXPECT_EQ(-inf, absl::Hours(kint64min));
121   EXPECT_EQ(-inf, absl::Hours(-kint64max));
122   EXPECT_GT(inf, absl::Hours(kint64max / 3600));
123   EXPECT_LT(-inf, absl::Hours(kint64min / 3600));
124   EXPECT_LT(-inf, absl::Hours(-kint64max / 3600));
125 }
126 
TEST(Duration,ToConversion)127 TEST(Duration, ToConversion) {
128 #define TEST_DURATION_CONVERSION(UNIT)                                  \
129   do {                                                                  \
130     const absl::Duration d = absl::UNIT(1.5);                           \
131     constexpr absl::Duration z = absl::ZeroDuration();                  \
132     constexpr absl::Duration inf = absl::InfiniteDuration();            \
133     constexpr double dbl_inf = std::numeric_limits<double>::infinity(); \
134     EXPECT_EQ(kint64min, absl::ToInt64##UNIT(-inf));                    \
135     EXPECT_EQ(-1, absl::ToInt64##UNIT(-d));                             \
136     EXPECT_EQ(0, absl::ToInt64##UNIT(z));                               \
137     EXPECT_EQ(1, absl::ToInt64##UNIT(d));                               \
138     EXPECT_EQ(kint64max, absl::ToInt64##UNIT(inf));                     \
139     EXPECT_EQ(-dbl_inf, absl::ToDouble##UNIT(-inf));                    \
140     EXPECT_EQ(-1.5, absl::ToDouble##UNIT(-d));                          \
141     EXPECT_EQ(0, absl::ToDouble##UNIT(z));                              \
142     EXPECT_EQ(1.5, absl::ToDouble##UNIT(d));                            \
143     EXPECT_EQ(dbl_inf, absl::ToDouble##UNIT(inf));                      \
144   } while (0)
145 
146   TEST_DURATION_CONVERSION(Nanoseconds);
147   TEST_DURATION_CONVERSION(Microseconds);
148   TEST_DURATION_CONVERSION(Milliseconds);
149   TEST_DURATION_CONVERSION(Seconds);
150   TEST_DURATION_CONVERSION(Minutes);
151   TEST_DURATION_CONVERSION(Hours);
152 
153 #undef TEST_DURATION_CONVERSION
154 }
155 
156 template <int64_t N>
TestToConversion()157 void TestToConversion() {
158   constexpr absl::Duration nano = absl::Nanoseconds(N);
159   EXPECT_EQ(N, absl::ToInt64Nanoseconds(nano));
160   EXPECT_EQ(0, absl::ToInt64Microseconds(nano));
161   EXPECT_EQ(0, absl::ToInt64Milliseconds(nano));
162   EXPECT_EQ(0, absl::ToInt64Seconds(nano));
163   EXPECT_EQ(0, absl::ToInt64Minutes(nano));
164   EXPECT_EQ(0, absl::ToInt64Hours(nano));
165   const absl::Duration micro = absl::Microseconds(N);
166   EXPECT_EQ(N * 1000, absl::ToInt64Nanoseconds(micro));
167   EXPECT_EQ(N, absl::ToInt64Microseconds(micro));
168   EXPECT_EQ(0, absl::ToInt64Milliseconds(micro));
169   EXPECT_EQ(0, absl::ToInt64Seconds(micro));
170   EXPECT_EQ(0, absl::ToInt64Minutes(micro));
171   EXPECT_EQ(0, absl::ToInt64Hours(micro));
172   const absl::Duration milli = absl::Milliseconds(N);
173   EXPECT_EQ(N * 1000 * 1000, absl::ToInt64Nanoseconds(milli));
174   EXPECT_EQ(N * 1000, absl::ToInt64Microseconds(milli));
175   EXPECT_EQ(N, absl::ToInt64Milliseconds(milli));
176   EXPECT_EQ(0, absl::ToInt64Seconds(milli));
177   EXPECT_EQ(0, absl::ToInt64Minutes(milli));
178   EXPECT_EQ(0, absl::ToInt64Hours(milli));
179   const absl::Duration sec = absl::Seconds(N);
180   EXPECT_EQ(N * 1000 * 1000 * 1000, absl::ToInt64Nanoseconds(sec));
181   EXPECT_EQ(N * 1000 * 1000, absl::ToInt64Microseconds(sec));
182   EXPECT_EQ(N * 1000, absl::ToInt64Milliseconds(sec));
183   EXPECT_EQ(N, absl::ToInt64Seconds(sec));
184   EXPECT_EQ(0, absl::ToInt64Minutes(sec));
185   EXPECT_EQ(0, absl::ToInt64Hours(sec));
186   const absl::Duration min = absl::Minutes(N);
187   EXPECT_EQ(N * 60 * 1000 * 1000 * 1000, absl::ToInt64Nanoseconds(min));
188   EXPECT_EQ(N * 60 * 1000 * 1000, absl::ToInt64Microseconds(min));
189   EXPECT_EQ(N * 60 * 1000, absl::ToInt64Milliseconds(min));
190   EXPECT_EQ(N * 60, absl::ToInt64Seconds(min));
191   EXPECT_EQ(N, absl::ToInt64Minutes(min));
192   EXPECT_EQ(0, absl::ToInt64Hours(min));
193   const absl::Duration hour = absl::Hours(N);
194   EXPECT_EQ(N * 60 * 60 * 1000 * 1000 * 1000, absl::ToInt64Nanoseconds(hour));
195   EXPECT_EQ(N * 60 * 60 * 1000 * 1000, absl::ToInt64Microseconds(hour));
196   EXPECT_EQ(N * 60 * 60 * 1000, absl::ToInt64Milliseconds(hour));
197   EXPECT_EQ(N * 60 * 60, absl::ToInt64Seconds(hour));
198   EXPECT_EQ(N * 60, absl::ToInt64Minutes(hour));
199   EXPECT_EQ(N, absl::ToInt64Hours(hour));
200 }
201 
TEST(Duration,ToConversionDeprecated)202 TEST(Duration, ToConversionDeprecated) {
203   TestToConversion<43>();
204   TestToConversion<1>();
205   TestToConversion<0>();
206   TestToConversion<-1>();
207   TestToConversion<-43>();
208 }
209 
210 template <int64_t N>
TestFromChronoBasicEquality()211 void TestFromChronoBasicEquality() {
212   using std::chrono::nanoseconds;
213   using std::chrono::microseconds;
214   using std::chrono::milliseconds;
215   using std::chrono::seconds;
216   using std::chrono::minutes;
217   using std::chrono::hours;
218 
219   static_assert(absl::Nanoseconds(N) == absl::FromChrono(nanoseconds(N)), "");
220   static_assert(absl::Microseconds(N) == absl::FromChrono(microseconds(N)), "");
221   static_assert(absl::Milliseconds(N) == absl::FromChrono(milliseconds(N)), "");
222   static_assert(absl::Seconds(N) == absl::FromChrono(seconds(N)), "");
223   static_assert(absl::Minutes(N) == absl::FromChrono(minutes(N)), "");
224   static_assert(absl::Hours(N) == absl::FromChrono(hours(N)), "");
225 }
226 
TEST(Duration,FromChrono)227 TEST(Duration, FromChrono) {
228   TestFromChronoBasicEquality<-123>();
229   TestFromChronoBasicEquality<-1>();
230   TestFromChronoBasicEquality<0>();
231   TestFromChronoBasicEquality<1>();
232   TestFromChronoBasicEquality<123>();
233 
234   // Minutes (might, depending on the platform) saturate at +inf.
235   const auto chrono_minutes_max = std::chrono::minutes::max();
236   const auto minutes_max = absl::FromChrono(chrono_minutes_max);
237   const int64_t minutes_max_count = chrono_minutes_max.count();
238   if (minutes_max_count > kint64max / 60) {
239     EXPECT_EQ(absl::InfiniteDuration(), minutes_max);
240   } else {
241     EXPECT_EQ(absl::Minutes(minutes_max_count), minutes_max);
242   }
243 
244   // Minutes (might, depending on the platform) saturate at -inf.
245   const auto chrono_minutes_min = std::chrono::minutes::min();
246   const auto minutes_min = absl::FromChrono(chrono_minutes_min);
247   const int64_t minutes_min_count = chrono_minutes_min.count();
248   if (minutes_min_count < kint64min / 60) {
249     EXPECT_EQ(-absl::InfiniteDuration(), minutes_min);
250   } else {
251     EXPECT_EQ(absl::Minutes(minutes_min_count), minutes_min);
252   }
253 
254   // Hours (might, depending on the platform) saturate at +inf.
255   const auto chrono_hours_max = std::chrono::hours::max();
256   const auto hours_max = absl::FromChrono(chrono_hours_max);
257   const int64_t hours_max_count = chrono_hours_max.count();
258   if (hours_max_count > kint64max / 3600) {
259     EXPECT_EQ(absl::InfiniteDuration(), hours_max);
260   } else {
261     EXPECT_EQ(absl::Hours(hours_max_count), hours_max);
262   }
263 
264   // Hours (might, depending on the platform) saturate at -inf.
265   const auto chrono_hours_min = std::chrono::hours::min();
266   const auto hours_min = absl::FromChrono(chrono_hours_min);
267   const int64_t hours_min_count = chrono_hours_min.count();
268   if (hours_min_count < kint64min / 3600) {
269     EXPECT_EQ(-absl::InfiniteDuration(), hours_min);
270   } else {
271     EXPECT_EQ(absl::Hours(hours_min_count), hours_min);
272   }
273 }
274 
275 template <int64_t N>
TestToChrono()276 void TestToChrono() {
277   using std::chrono::nanoseconds;
278   using std::chrono::microseconds;
279   using std::chrono::milliseconds;
280   using std::chrono::seconds;
281   using std::chrono::minutes;
282   using std::chrono::hours;
283 
284   EXPECT_EQ(nanoseconds(N), absl::ToChronoNanoseconds(absl::Nanoseconds(N)));
285   EXPECT_EQ(microseconds(N), absl::ToChronoMicroseconds(absl::Microseconds(N)));
286   EXPECT_EQ(milliseconds(N), absl::ToChronoMilliseconds(absl::Milliseconds(N)));
287   EXPECT_EQ(seconds(N), absl::ToChronoSeconds(absl::Seconds(N)));
288 
289   constexpr auto absl_minutes = absl::Minutes(N);
290   auto chrono_minutes = minutes(N);
291   if (absl_minutes == -absl::InfiniteDuration()) {
292     chrono_minutes = minutes::min();
293   } else if (absl_minutes == absl::InfiniteDuration()) {
294     chrono_minutes = minutes::max();
295   }
296   EXPECT_EQ(chrono_minutes, absl::ToChronoMinutes(absl_minutes));
297 
298   constexpr auto absl_hours = absl::Hours(N);
299   auto chrono_hours = hours(N);
300   if (absl_hours == -absl::InfiniteDuration()) {
301     chrono_hours = hours::min();
302   } else if (absl_hours == absl::InfiniteDuration()) {
303     chrono_hours = hours::max();
304   }
305   EXPECT_EQ(chrono_hours, absl::ToChronoHours(absl_hours));
306 }
307 
TEST(Duration,ToChrono)308 TEST(Duration, ToChrono) {
309   using std::chrono::nanoseconds;
310   using std::chrono::microseconds;
311   using std::chrono::milliseconds;
312   using std::chrono::seconds;
313   using std::chrono::minutes;
314   using std::chrono::hours;
315 
316   TestToChrono<kint64min>();
317   TestToChrono<-1>();
318   TestToChrono<0>();
319   TestToChrono<1>();
320   TestToChrono<kint64max>();
321 
322   // Verify truncation toward zero.
323   const auto tick = absl::Nanoseconds(1) / 4;
324   EXPECT_EQ(nanoseconds(0), absl::ToChronoNanoseconds(tick));
325   EXPECT_EQ(nanoseconds(0), absl::ToChronoNanoseconds(-tick));
326   EXPECT_EQ(microseconds(0), absl::ToChronoMicroseconds(tick));
327   EXPECT_EQ(microseconds(0), absl::ToChronoMicroseconds(-tick));
328   EXPECT_EQ(milliseconds(0), absl::ToChronoMilliseconds(tick));
329   EXPECT_EQ(milliseconds(0), absl::ToChronoMilliseconds(-tick));
330   EXPECT_EQ(seconds(0), absl::ToChronoSeconds(tick));
331   EXPECT_EQ(seconds(0), absl::ToChronoSeconds(-tick));
332   EXPECT_EQ(minutes(0), absl::ToChronoMinutes(tick));
333   EXPECT_EQ(minutes(0), absl::ToChronoMinutes(-tick));
334   EXPECT_EQ(hours(0), absl::ToChronoHours(tick));
335   EXPECT_EQ(hours(0), absl::ToChronoHours(-tick));
336 
337   // Verifies +/- infinity saturation at max/min.
338   constexpr auto inf = absl::InfiniteDuration();
339   EXPECT_EQ(nanoseconds::min(), absl::ToChronoNanoseconds(-inf));
340   EXPECT_EQ(nanoseconds::max(), absl::ToChronoNanoseconds(inf));
341   EXPECT_EQ(microseconds::min(), absl::ToChronoMicroseconds(-inf));
342   EXPECT_EQ(microseconds::max(), absl::ToChronoMicroseconds(inf));
343   EXPECT_EQ(milliseconds::min(), absl::ToChronoMilliseconds(-inf));
344   EXPECT_EQ(milliseconds::max(), absl::ToChronoMilliseconds(inf));
345   EXPECT_EQ(seconds::min(), absl::ToChronoSeconds(-inf));
346   EXPECT_EQ(seconds::max(), absl::ToChronoSeconds(inf));
347   EXPECT_EQ(minutes::min(), absl::ToChronoMinutes(-inf));
348   EXPECT_EQ(minutes::max(), absl::ToChronoMinutes(inf));
349   EXPECT_EQ(hours::min(), absl::ToChronoHours(-inf));
350   EXPECT_EQ(hours::max(), absl::ToChronoHours(inf));
351 }
352 
TEST(Duration,FactoryOverloads)353 TEST(Duration, FactoryOverloads) {
354   enum E { kOne = 1 };
355 #define TEST_FACTORY_OVERLOADS(NAME)                                          \
356   EXPECT_EQ(1, NAME(kOne) / NAME(kOne));                                      \
357   EXPECT_EQ(1, NAME(static_cast<int8_t>(1)) / NAME(1));                       \
358   EXPECT_EQ(1, NAME(static_cast<int16_t>(1)) / NAME(1));                      \
359   EXPECT_EQ(1, NAME(static_cast<int32_t>(1)) / NAME(1));                      \
360   EXPECT_EQ(1, NAME(static_cast<int64_t>(1)) / NAME(1));                      \
361   EXPECT_EQ(1, NAME(static_cast<uint8_t>(1)) / NAME(1));                      \
362   EXPECT_EQ(1, NAME(static_cast<uint16_t>(1)) / NAME(1));                     \
363   EXPECT_EQ(1, NAME(static_cast<uint32_t>(1)) / NAME(1));                     \
364   EXPECT_EQ(1, NAME(static_cast<uint64_t>(1)) / NAME(1));                     \
365   EXPECT_EQ(NAME(1) / 2, NAME(static_cast<float>(0.5)));                      \
366   EXPECT_EQ(NAME(1) / 2, NAME(static_cast<double>(0.5)));                     \
367   EXPECT_EQ(1.5, absl::FDivDuration(NAME(static_cast<float>(1.5)), NAME(1))); \
368   EXPECT_EQ(1.5, absl::FDivDuration(NAME(static_cast<double>(1.5)), NAME(1)));
369 
370   TEST_FACTORY_OVERLOADS(absl::Nanoseconds);
371   TEST_FACTORY_OVERLOADS(absl::Microseconds);
372   TEST_FACTORY_OVERLOADS(absl::Milliseconds);
373   TEST_FACTORY_OVERLOADS(absl::Seconds);
374   TEST_FACTORY_OVERLOADS(absl::Minutes);
375   TEST_FACTORY_OVERLOADS(absl::Hours);
376 
377 #undef TEST_FACTORY_OVERLOADS
378 
379   EXPECT_EQ(absl::Milliseconds(1500), absl::Seconds(1.5));
380   EXPECT_LT(absl::Nanoseconds(1), absl::Nanoseconds(1.5));
381   EXPECT_GT(absl::Nanoseconds(2), absl::Nanoseconds(1.5));
382 
383   const double dbl_inf = std::numeric_limits<double>::infinity();
384   EXPECT_EQ(absl::InfiniteDuration(), absl::Nanoseconds(dbl_inf));
385   EXPECT_EQ(absl::InfiniteDuration(), absl::Microseconds(dbl_inf));
386   EXPECT_EQ(absl::InfiniteDuration(), absl::Milliseconds(dbl_inf));
387   EXPECT_EQ(absl::InfiniteDuration(), absl::Seconds(dbl_inf));
388   EXPECT_EQ(absl::InfiniteDuration(), absl::Minutes(dbl_inf));
389   EXPECT_EQ(absl::InfiniteDuration(), absl::Hours(dbl_inf));
390   EXPECT_EQ(-absl::InfiniteDuration(), absl::Nanoseconds(-dbl_inf));
391   EXPECT_EQ(-absl::InfiniteDuration(), absl::Microseconds(-dbl_inf));
392   EXPECT_EQ(-absl::InfiniteDuration(), absl::Milliseconds(-dbl_inf));
393   EXPECT_EQ(-absl::InfiniteDuration(), absl::Seconds(-dbl_inf));
394   EXPECT_EQ(-absl::InfiniteDuration(), absl::Minutes(-dbl_inf));
395   EXPECT_EQ(-absl::InfiniteDuration(), absl::Hours(-dbl_inf));
396 }
397 
TEST(Duration,InfinityExamples)398 TEST(Duration, InfinityExamples) {
399   // These examples are used in the documentation in time.h. They are
400   // written so that they can be copy-n-pasted easily.
401 
402   constexpr absl::Duration inf = absl::InfiniteDuration();
403   constexpr absl::Duration d = absl::Seconds(1);  // Any finite duration
404 
405   EXPECT_TRUE(inf == inf + inf);
406   EXPECT_TRUE(inf == inf + d);
407   EXPECT_TRUE(inf == inf - inf);
408   EXPECT_TRUE(-inf == d - inf);
409 
410   EXPECT_TRUE(inf == d * 1e100);
411   EXPECT_TRUE(0 == d / inf);  // NOLINT(readability/check)
412 
413   // Division by zero returns infinity, or kint64min/MAX where necessary.
414   EXPECT_TRUE(inf == d / 0);
415   EXPECT_TRUE(kint64max == d / absl::ZeroDuration());
416 }
417 
TEST(Duration,InfinityComparison)418 TEST(Duration, InfinityComparison) {
419   const absl::Duration inf = absl::InfiniteDuration();
420   const absl::Duration any_dur = absl::Seconds(1);
421 
422   // Equality
423   EXPECT_EQ(inf, inf);
424   EXPECT_EQ(-inf, -inf);
425   EXPECT_NE(inf, -inf);
426   EXPECT_NE(any_dur, inf);
427   EXPECT_NE(any_dur, -inf);
428 
429   // Relational
430   EXPECT_GT(inf, any_dur);
431   EXPECT_LT(-inf, any_dur);
432   EXPECT_LT(-inf, inf);
433   EXPECT_GT(inf, -inf);
434 }
435 
TEST(Duration,InfinityAddition)436 TEST(Duration, InfinityAddition) {
437   const absl::Duration sec_max = absl::Seconds(kint64max);
438   const absl::Duration sec_min = absl::Seconds(kint64min);
439   const absl::Duration any_dur = absl::Seconds(1);
440   const absl::Duration inf = absl::InfiniteDuration();
441 
442   // Addition
443   EXPECT_EQ(inf, inf + inf);
444   EXPECT_EQ(inf, inf + -inf);
445   EXPECT_EQ(-inf, -inf + inf);
446   EXPECT_EQ(-inf, -inf + -inf);
447 
448   EXPECT_EQ(inf, inf + any_dur);
449   EXPECT_EQ(inf, any_dur + inf);
450   EXPECT_EQ(-inf, -inf + any_dur);
451   EXPECT_EQ(-inf, any_dur + -inf);
452 
453   // Interesting case
454   absl::Duration almost_inf = sec_max + absl::Nanoseconds(999999999);
455   EXPECT_GT(inf, almost_inf);
456   almost_inf += -absl::Nanoseconds(999999999);
457   EXPECT_GT(inf, almost_inf);
458 
459   // Addition overflow/underflow
460   EXPECT_EQ(inf, sec_max + absl::Seconds(1));
461   EXPECT_EQ(inf, sec_max + sec_max);
462   EXPECT_EQ(-inf, sec_min + -absl::Seconds(1));
463   EXPECT_EQ(-inf, sec_min + -sec_max);
464 
465   // For reference: IEEE 754 behavior
466   const double dbl_inf = std::numeric_limits<double>::infinity();
467   EXPECT_TRUE(std::isinf(dbl_inf + dbl_inf));
468   EXPECT_TRUE(std::isnan(dbl_inf + -dbl_inf));  // We return inf
469   EXPECT_TRUE(std::isnan(-dbl_inf + dbl_inf));  // We return inf
470   EXPECT_TRUE(std::isinf(-dbl_inf + -dbl_inf));
471 }
472 
TEST(Duration,InfinitySubtraction)473 TEST(Duration, InfinitySubtraction) {
474   const absl::Duration sec_max = absl::Seconds(kint64max);
475   const absl::Duration sec_min = absl::Seconds(kint64min);
476   const absl::Duration any_dur = absl::Seconds(1);
477   const absl::Duration inf = absl::InfiniteDuration();
478 
479   // Subtraction
480   EXPECT_EQ(inf, inf - inf);
481   EXPECT_EQ(inf, inf - -inf);
482   EXPECT_EQ(-inf, -inf - inf);
483   EXPECT_EQ(-inf, -inf - -inf);
484 
485   EXPECT_EQ(inf, inf - any_dur);
486   EXPECT_EQ(-inf, any_dur - inf);
487   EXPECT_EQ(-inf, -inf - any_dur);
488   EXPECT_EQ(inf, any_dur - -inf);
489 
490   // Subtraction overflow/underflow
491   EXPECT_EQ(inf, sec_max - -absl::Seconds(1));
492   EXPECT_EQ(inf, sec_max - -sec_max);
493   EXPECT_EQ(-inf, sec_min - absl::Seconds(1));
494   EXPECT_EQ(-inf, sec_min - sec_max);
495 
496   // Interesting case
497   absl::Duration almost_neg_inf = sec_min;
498   EXPECT_LT(-inf, almost_neg_inf);
499   almost_neg_inf -= -absl::Nanoseconds(1);
500   EXPECT_LT(-inf, almost_neg_inf);
501 
502   // For reference: IEEE 754 behavior
503   const double dbl_inf = std::numeric_limits<double>::infinity();
504   EXPECT_TRUE(std::isnan(dbl_inf - dbl_inf));  // We return inf
505   EXPECT_TRUE(std::isinf(dbl_inf - -dbl_inf));
506   EXPECT_TRUE(std::isinf(-dbl_inf - dbl_inf));
507   EXPECT_TRUE(std::isnan(-dbl_inf - -dbl_inf));  // We return inf
508 }
509 
TEST(Duration,InfinityMultiplication)510 TEST(Duration, InfinityMultiplication) {
511   const absl::Duration sec_max = absl::Seconds(kint64max);
512   const absl::Duration sec_min = absl::Seconds(kint64min);
513   const absl::Duration inf = absl::InfiniteDuration();
514 
515 #define TEST_INF_MUL_WITH_TYPE(T)                                     \
516   EXPECT_EQ(inf, inf * static_cast<T>(2));                            \
517   EXPECT_EQ(-inf, inf * static_cast<T>(-2));                          \
518   EXPECT_EQ(-inf, -inf * static_cast<T>(2));                          \
519   EXPECT_EQ(inf, -inf * static_cast<T>(-2));                          \
520   EXPECT_EQ(inf, inf * static_cast<T>(0));                            \
521   EXPECT_EQ(-inf, -inf * static_cast<T>(0));                          \
522   EXPECT_EQ(inf, sec_max * static_cast<T>(2));                        \
523   EXPECT_EQ(inf, sec_min * static_cast<T>(-2));                       \
524   EXPECT_EQ(inf, (sec_max / static_cast<T>(2)) * static_cast<T>(3));  \
525   EXPECT_EQ(-inf, sec_max * static_cast<T>(-2));                      \
526   EXPECT_EQ(-inf, sec_min * static_cast<T>(2));                       \
527   EXPECT_EQ(-inf, (sec_min / static_cast<T>(2)) * static_cast<T>(3));
528 
529   TEST_INF_MUL_WITH_TYPE(int64_t);  // NOLINT(readability/function)
530   TEST_INF_MUL_WITH_TYPE(double);   // NOLINT(readability/function)
531 
532 #undef TEST_INF_MUL_WITH_TYPE
533 
534   const double dbl_inf = std::numeric_limits<double>::infinity();
535   EXPECT_EQ(inf, inf * dbl_inf);
536   EXPECT_EQ(-inf, -inf * dbl_inf);
537   EXPECT_EQ(-inf, inf * -dbl_inf);
538   EXPECT_EQ(inf, -inf * -dbl_inf);
539 
540   const absl::Duration any_dur = absl::Seconds(1);
541   EXPECT_EQ(inf, any_dur * dbl_inf);
542   EXPECT_EQ(-inf, -any_dur * dbl_inf);
543   EXPECT_EQ(-inf, any_dur * -dbl_inf);
544   EXPECT_EQ(inf, -any_dur * -dbl_inf);
545 
546   // Fixed-point multiplication will produce a finite value, whereas floating
547   // point fuzziness will overflow to inf.
548   EXPECT_NE(absl::InfiniteDuration(), absl::Seconds(1) * kint64max);
549   EXPECT_EQ(inf, absl::Seconds(1) * static_cast<double>(kint64max));
550   EXPECT_NE(-absl::InfiniteDuration(), absl::Seconds(1) * kint64min);
551   EXPECT_EQ(-inf, absl::Seconds(1) * static_cast<double>(kint64min));
552 
553   // Note that sec_max * or / by 1.0 overflows to inf due to the 53-bit
554   // limitations of double.
555   EXPECT_NE(inf, sec_max);
556   EXPECT_NE(inf, sec_max / 1);
557   EXPECT_EQ(inf, sec_max / 1.0);
558   EXPECT_NE(inf, sec_max * 1);
559   EXPECT_EQ(inf, sec_max * 1.0);
560 }
561 
TEST(Duration,InfinityDivision)562 TEST(Duration, InfinityDivision) {
563   const absl::Duration sec_max = absl::Seconds(kint64max);
564   const absl::Duration sec_min = absl::Seconds(kint64min);
565   const absl::Duration inf = absl::InfiniteDuration();
566 
567   // Division of Duration by a double
568 #define TEST_INF_DIV_WITH_TYPE(T)            \
569   EXPECT_EQ(inf, inf / static_cast<T>(2));   \
570   EXPECT_EQ(-inf, inf / static_cast<T>(-2)); \
571   EXPECT_EQ(-inf, -inf / static_cast<T>(2)); \
572   EXPECT_EQ(inf, -inf / static_cast<T>(-2));
573 
574   TEST_INF_DIV_WITH_TYPE(int64_t);  // NOLINT(readability/function)
575   TEST_INF_DIV_WITH_TYPE(double);   // NOLINT(readability/function)
576 
577 #undef TEST_INF_DIV_WITH_TYPE
578 
579   // Division of Duration by a double overflow/underflow
580   EXPECT_EQ(inf, sec_max / 0.5);
581   EXPECT_EQ(inf, sec_min / -0.5);
582   EXPECT_EQ(inf, ((sec_max / 0.5) + absl::Seconds(1)) / 0.5);
583   EXPECT_EQ(-inf, sec_max / -0.5);
584   EXPECT_EQ(-inf, sec_min / 0.5);
585   EXPECT_EQ(-inf, ((sec_min / 0.5) - absl::Seconds(1)) / 0.5);
586 
587   const double dbl_inf = std::numeric_limits<double>::infinity();
588   EXPECT_EQ(inf, inf / dbl_inf);
589   EXPECT_EQ(-inf, inf / -dbl_inf);
590   EXPECT_EQ(-inf, -inf / dbl_inf);
591   EXPECT_EQ(inf, -inf / -dbl_inf);
592 
593   const absl::Duration any_dur = absl::Seconds(1);
594   EXPECT_EQ(absl::ZeroDuration(), any_dur / dbl_inf);
595   EXPECT_EQ(absl::ZeroDuration(), any_dur / -dbl_inf);
596   EXPECT_EQ(absl::ZeroDuration(), -any_dur / dbl_inf);
597   EXPECT_EQ(absl::ZeroDuration(), -any_dur / -dbl_inf);
598 }
599 
TEST(Duration,InfinityModulus)600 TEST(Duration, InfinityModulus) {
601   const absl::Duration sec_max = absl::Seconds(kint64max);
602   const absl::Duration any_dur = absl::Seconds(1);
603   const absl::Duration inf = absl::InfiniteDuration();
604 
605   EXPECT_EQ(inf, inf % inf);
606   EXPECT_EQ(inf, inf % -inf);
607   EXPECT_EQ(-inf, -inf % -inf);
608   EXPECT_EQ(-inf, -inf % inf);
609 
610   EXPECT_EQ(any_dur, any_dur % inf);
611   EXPECT_EQ(any_dur, any_dur % -inf);
612   EXPECT_EQ(-any_dur, -any_dur % inf);
613   EXPECT_EQ(-any_dur, -any_dur % -inf);
614 
615   EXPECT_EQ(inf, inf % -any_dur);
616   EXPECT_EQ(inf, inf % any_dur);
617   EXPECT_EQ(-inf, -inf % -any_dur);
618   EXPECT_EQ(-inf, -inf % any_dur);
619 
620   // Remainder isn't affected by overflow.
621   EXPECT_EQ(absl::ZeroDuration(), sec_max % absl::Seconds(1));
622   EXPECT_EQ(absl::ZeroDuration(), sec_max % absl::Milliseconds(1));
623   EXPECT_EQ(absl::ZeroDuration(), sec_max % absl::Microseconds(1));
624   EXPECT_EQ(absl::ZeroDuration(), sec_max % absl::Nanoseconds(1));
625   EXPECT_EQ(absl::ZeroDuration(), sec_max % absl::Nanoseconds(1) / 4);
626 }
627 
TEST(Duration,InfinityIDiv)628 TEST(Duration, InfinityIDiv) {
629   const absl::Duration sec_max = absl::Seconds(kint64max);
630   const absl::Duration any_dur = absl::Seconds(1);
631   const absl::Duration inf = absl::InfiniteDuration();
632   const double dbl_inf = std::numeric_limits<double>::infinity();
633 
634   // IDivDuration (int64_t return value + a remainer)
635   absl::Duration rem = absl::ZeroDuration();
636   EXPECT_EQ(kint64max, absl::IDivDuration(inf, inf, &rem));
637   EXPECT_EQ(inf, rem);
638 
639   rem = absl::ZeroDuration();
640   EXPECT_EQ(kint64max, absl::IDivDuration(-inf, -inf, &rem));
641   EXPECT_EQ(-inf, rem);
642 
643   rem = absl::ZeroDuration();
644   EXPECT_EQ(kint64max, absl::IDivDuration(inf, any_dur, &rem));
645   EXPECT_EQ(inf, rem);
646 
647   rem = absl::ZeroDuration();
648   EXPECT_EQ(0, absl::IDivDuration(any_dur, inf, &rem));
649   EXPECT_EQ(any_dur, rem);
650 
651   rem = absl::ZeroDuration();
652   EXPECT_EQ(kint64max, absl::IDivDuration(-inf, -any_dur, &rem));
653   EXPECT_EQ(-inf, rem);
654 
655   rem = absl::ZeroDuration();
656   EXPECT_EQ(0, absl::IDivDuration(-any_dur, -inf, &rem));
657   EXPECT_EQ(-any_dur, rem);
658 
659   rem = absl::ZeroDuration();
660   EXPECT_EQ(kint64min, absl::IDivDuration(-inf, inf, &rem));
661   EXPECT_EQ(-inf, rem);
662 
663   rem = absl::ZeroDuration();
664   EXPECT_EQ(kint64min, absl::IDivDuration(inf, -inf, &rem));
665   EXPECT_EQ(inf, rem);
666 
667   rem = absl::ZeroDuration();
668   EXPECT_EQ(kint64min, absl::IDivDuration(-inf, any_dur, &rem));
669   EXPECT_EQ(-inf, rem);
670 
671   rem = absl::ZeroDuration();
672   EXPECT_EQ(0, absl::IDivDuration(-any_dur, inf, &rem));
673   EXPECT_EQ(-any_dur, rem);
674 
675   rem = absl::ZeroDuration();
676   EXPECT_EQ(kint64min, absl::IDivDuration(inf, -any_dur, &rem));
677   EXPECT_EQ(inf, rem);
678 
679   rem = absl::ZeroDuration();
680   EXPECT_EQ(0, absl::IDivDuration(any_dur, -inf, &rem));
681   EXPECT_EQ(any_dur, rem);
682 
683   // IDivDuration overflow/underflow
684   rem = any_dur;
685   EXPECT_EQ(kint64max,
686             absl::IDivDuration(sec_max, absl::Nanoseconds(1) / 4, &rem));
687   EXPECT_EQ(sec_max - absl::Nanoseconds(kint64max) / 4, rem);
688 
689   rem = any_dur;
690   EXPECT_EQ(kint64max,
691             absl::IDivDuration(sec_max, absl::Milliseconds(1), &rem));
692   EXPECT_EQ(sec_max - absl::Milliseconds(kint64max), rem);
693 
694   rem = any_dur;
695   EXPECT_EQ(kint64max,
696             absl::IDivDuration(-sec_max, -absl::Milliseconds(1), &rem));
697   EXPECT_EQ(-sec_max + absl::Milliseconds(kint64max), rem);
698 
699   rem = any_dur;
700   EXPECT_EQ(kint64min,
701             absl::IDivDuration(-sec_max, absl::Milliseconds(1), &rem));
702   EXPECT_EQ(-sec_max - absl::Milliseconds(kint64min), rem);
703 
704   rem = any_dur;
705   EXPECT_EQ(kint64min,
706             absl::IDivDuration(sec_max, -absl::Milliseconds(1), &rem));
707   EXPECT_EQ(sec_max + absl::Milliseconds(kint64min), rem);
708 
709   //
710   // operator/(Duration, Duration) is a wrapper for IDivDuration().
711   //
712 
713   // IEEE 754 says inf / inf should be nan, but int64_t doesn't have
714   // nan so we'll return kint64max/kint64min instead.
715   EXPECT_TRUE(std::isnan(dbl_inf / dbl_inf));
716   EXPECT_EQ(kint64max, inf / inf);
717   EXPECT_EQ(kint64max, -inf / -inf);
718   EXPECT_EQ(kint64min, -inf / inf);
719   EXPECT_EQ(kint64min, inf / -inf);
720 
721   EXPECT_TRUE(std::isinf(dbl_inf / 2.0));
722   EXPECT_EQ(kint64max, inf / any_dur);
723   EXPECT_EQ(kint64max, -inf / -any_dur);
724   EXPECT_EQ(kint64min, -inf / any_dur);
725   EXPECT_EQ(kint64min, inf / -any_dur);
726 
727   EXPECT_EQ(0.0, 2.0 / dbl_inf);
728   EXPECT_EQ(0, any_dur / inf);
729   EXPECT_EQ(0, any_dur / -inf);
730   EXPECT_EQ(0, -any_dur / inf);
731   EXPECT_EQ(0, -any_dur / -inf);
732   EXPECT_EQ(0, absl::ZeroDuration() / inf);
733 
734   // Division of Duration by a Duration overflow/underflow
735   EXPECT_EQ(kint64max, sec_max / absl::Milliseconds(1));
736   EXPECT_EQ(kint64max, -sec_max / -absl::Milliseconds(1));
737   EXPECT_EQ(kint64min, -sec_max / absl::Milliseconds(1));
738   EXPECT_EQ(kint64min, sec_max / -absl::Milliseconds(1));
739 }
740 
TEST(Duration,InfinityFDiv)741 TEST(Duration, InfinityFDiv) {
742   const absl::Duration any_dur = absl::Seconds(1);
743   const absl::Duration inf = absl::InfiniteDuration();
744   const double dbl_inf = std::numeric_limits<double>::infinity();
745 
746   EXPECT_EQ(dbl_inf, absl::FDivDuration(inf, inf));
747   EXPECT_EQ(dbl_inf, absl::FDivDuration(-inf, -inf));
748   EXPECT_EQ(dbl_inf, absl::FDivDuration(inf, any_dur));
749   EXPECT_EQ(0.0, absl::FDivDuration(any_dur, inf));
750   EXPECT_EQ(dbl_inf, absl::FDivDuration(-inf, -any_dur));
751   EXPECT_EQ(0.0, absl::FDivDuration(-any_dur, -inf));
752 
753   EXPECT_EQ(-dbl_inf, absl::FDivDuration(-inf, inf));
754   EXPECT_EQ(-dbl_inf, absl::FDivDuration(inf, -inf));
755   EXPECT_EQ(-dbl_inf, absl::FDivDuration(-inf, any_dur));
756   EXPECT_EQ(0.0, absl::FDivDuration(-any_dur, inf));
757   EXPECT_EQ(-dbl_inf, absl::FDivDuration(inf, -any_dur));
758   EXPECT_EQ(0.0, absl::FDivDuration(any_dur, -inf));
759 }
760 
TEST(Duration,DivisionByZero)761 TEST(Duration, DivisionByZero) {
762   const absl::Duration zero = absl::ZeroDuration();
763   const absl::Duration inf = absl::InfiniteDuration();
764   const absl::Duration any_dur = absl::Seconds(1);
765   const double dbl_inf = std::numeric_limits<double>::infinity();
766   const double dbl_denorm = std::numeric_limits<double>::denorm_min();
767 
768   // Operator/(Duration, double)
769   EXPECT_EQ(inf, zero / 0.0);
770   EXPECT_EQ(-inf, zero / -0.0);
771   EXPECT_EQ(inf, any_dur / 0.0);
772   EXPECT_EQ(-inf, any_dur / -0.0);
773   EXPECT_EQ(-inf, -any_dur / 0.0);
774   EXPECT_EQ(inf, -any_dur / -0.0);
775 
776   // Tests dividing by a number very close to, but not quite zero.
777   EXPECT_EQ(zero, zero / dbl_denorm);
778   EXPECT_EQ(zero, zero / -dbl_denorm);
779   EXPECT_EQ(inf, any_dur / dbl_denorm);
780   EXPECT_EQ(-inf, any_dur / -dbl_denorm);
781   EXPECT_EQ(-inf, -any_dur / dbl_denorm);
782   EXPECT_EQ(inf, -any_dur / -dbl_denorm);
783 
784   // IDiv
785   absl::Duration rem = zero;
786   EXPECT_EQ(kint64max, absl::IDivDuration(zero, zero, &rem));
787   EXPECT_EQ(inf, rem);
788 
789   rem = zero;
790   EXPECT_EQ(kint64max, absl::IDivDuration(any_dur, zero, &rem));
791   EXPECT_EQ(inf, rem);
792 
793   rem = zero;
794   EXPECT_EQ(kint64min, absl::IDivDuration(-any_dur, zero, &rem));
795   EXPECT_EQ(-inf, rem);
796 
797   // Operator/(Duration, Duration)
798   EXPECT_EQ(kint64max, zero / zero);
799   EXPECT_EQ(kint64max, any_dur / zero);
800   EXPECT_EQ(kint64min, -any_dur / zero);
801 
802   // FDiv
803   EXPECT_EQ(dbl_inf, absl::FDivDuration(zero, zero));
804   EXPECT_EQ(dbl_inf, absl::FDivDuration(any_dur, zero));
805   EXPECT_EQ(-dbl_inf, absl::FDivDuration(-any_dur, zero));
806 }
807 
TEST(Duration,NaN)808 TEST(Duration, NaN) {
809   // Note that IEEE 754 does not define the behavior of a nan's sign when it is
810   // copied, so the code below allows for either + or - InfiniteDuration.
811 #define TEST_NAN_HANDLING(NAME, NAN)           \
812   do {                                         \
813     const auto inf = absl::InfiniteDuration(); \
814     auto x = NAME(NAN);                        \
815     EXPECT_TRUE(x == inf || x == -inf);        \
816     auto y = NAME(42);                         \
817     y *= NAN;                                  \
818     EXPECT_TRUE(y == inf || y == -inf);        \
819     auto z = NAME(42);                         \
820     z /= NAN;                                  \
821     EXPECT_TRUE(z == inf || z == -inf);        \
822   } while (0)
823 
824   const double nan = std::numeric_limits<double>::quiet_NaN();
825   TEST_NAN_HANDLING(absl::Nanoseconds, nan);
826   TEST_NAN_HANDLING(absl::Microseconds, nan);
827   TEST_NAN_HANDLING(absl::Milliseconds, nan);
828   TEST_NAN_HANDLING(absl::Seconds, nan);
829   TEST_NAN_HANDLING(absl::Minutes, nan);
830   TEST_NAN_HANDLING(absl::Hours, nan);
831 
832   TEST_NAN_HANDLING(absl::Nanoseconds, -nan);
833   TEST_NAN_HANDLING(absl::Microseconds, -nan);
834   TEST_NAN_HANDLING(absl::Milliseconds, -nan);
835   TEST_NAN_HANDLING(absl::Seconds, -nan);
836   TEST_NAN_HANDLING(absl::Minutes, -nan);
837   TEST_NAN_HANDLING(absl::Hours, -nan);
838 
839 #undef TEST_NAN_HANDLING
840 }
841 
TEST(Duration,Range)842 TEST(Duration, Range) {
843   const absl::Duration range = ApproxYears(100 * 1e9);
844   const absl::Duration range_future = range;
845   const absl::Duration range_past = -range;
846 
847   EXPECT_LT(range_future, absl::InfiniteDuration());
848   EXPECT_GT(range_past, -absl::InfiniteDuration());
849 
850   const absl::Duration full_range = range_future - range_past;
851   EXPECT_GT(full_range, absl::ZeroDuration());
852   EXPECT_LT(full_range, absl::InfiniteDuration());
853 
854   const absl::Duration neg_full_range = range_past - range_future;
855   EXPECT_LT(neg_full_range, absl::ZeroDuration());
856   EXPECT_GT(neg_full_range, -absl::InfiniteDuration());
857 
858   EXPECT_LT(neg_full_range, full_range);
859   EXPECT_EQ(neg_full_range, -full_range);
860 }
861 
TEST(Duration,RelationalOperators)862 TEST(Duration, RelationalOperators) {
863 #define TEST_REL_OPS(UNIT)               \
864   static_assert(UNIT(2) == UNIT(2), ""); \
865   static_assert(UNIT(1) != UNIT(2), ""); \
866   static_assert(UNIT(1) < UNIT(2), "");  \
867   static_assert(UNIT(3) > UNIT(2), "");  \
868   static_assert(UNIT(1) <= UNIT(2), ""); \
869   static_assert(UNIT(2) <= UNIT(2), ""); \
870   static_assert(UNIT(3) >= UNIT(2), ""); \
871   static_assert(UNIT(2) >= UNIT(2), "");
872 
873   TEST_REL_OPS(absl::Nanoseconds);
874   TEST_REL_OPS(absl::Microseconds);
875   TEST_REL_OPS(absl::Milliseconds);
876   TEST_REL_OPS(absl::Seconds);
877   TEST_REL_OPS(absl::Minutes);
878   TEST_REL_OPS(absl::Hours);
879 
880 #undef TEST_REL_OPS
881 }
882 
TEST(Duration,Addition)883 TEST(Duration, Addition) {
884 #define TEST_ADD_OPS(UNIT)                  \
885   do {                                      \
886     EXPECT_EQ(UNIT(2), UNIT(1) + UNIT(1));  \
887     EXPECT_EQ(UNIT(1), UNIT(2) - UNIT(1));  \
888     EXPECT_EQ(UNIT(0), UNIT(2) - UNIT(2));  \
889     EXPECT_EQ(UNIT(-1), UNIT(1) - UNIT(2)); \
890     EXPECT_EQ(UNIT(-2), UNIT(0) - UNIT(2)); \
891     EXPECT_EQ(UNIT(-2), UNIT(1) - UNIT(3)); \
892     absl::Duration a = UNIT(1);             \
893     a += UNIT(1);                           \
894     EXPECT_EQ(UNIT(2), a);                  \
895     a -= UNIT(1);                           \
896     EXPECT_EQ(UNIT(1), a);                  \
897   } while (0)
898 
899   TEST_ADD_OPS(absl::Nanoseconds);
900   TEST_ADD_OPS(absl::Microseconds);
901   TEST_ADD_OPS(absl::Milliseconds);
902   TEST_ADD_OPS(absl::Seconds);
903   TEST_ADD_OPS(absl::Minutes);
904   TEST_ADD_OPS(absl::Hours);
905 
906 #undef TEST_ADD_OPS
907 
908   EXPECT_EQ(absl::Seconds(2), absl::Seconds(3) - 2 * absl::Milliseconds(500));
909   EXPECT_EQ(absl::Seconds(2) + absl::Milliseconds(500),
910             absl::Seconds(3) - absl::Milliseconds(500));
911 
912   EXPECT_EQ(absl::Seconds(1) + absl::Milliseconds(998),
913             absl::Milliseconds(999) + absl::Milliseconds(999));
914 
915   EXPECT_EQ(absl::Milliseconds(-1),
916             absl::Milliseconds(998) - absl::Milliseconds(999));
917 
918   // Tests fractions of a nanoseconds. These are implementation details only.
919   EXPECT_GT(absl::Nanoseconds(1), absl::Nanoseconds(1) / 2);
920   EXPECT_EQ(absl::Nanoseconds(1),
921             absl::Nanoseconds(1) / 2 + absl::Nanoseconds(1) / 2);
922   EXPECT_GT(absl::Nanoseconds(1) / 4, absl::Nanoseconds(0));
923   EXPECT_EQ(absl::Nanoseconds(1) / 8, absl::Nanoseconds(0));
924 
925   // Tests subtraction that will cause wrap around of the rep_lo_ bits.
926   absl::Duration d_7_5 = absl::Seconds(7) + absl::Milliseconds(500);
927   absl::Duration d_3_7 = absl::Seconds(3) + absl::Milliseconds(700);
928   absl::Duration ans_3_8 = absl::Seconds(3) + absl::Milliseconds(800);
929   EXPECT_EQ(ans_3_8, d_7_5 - d_3_7);
930 
931   // Subtracting min_duration
932   absl::Duration min_dur = absl::Seconds(kint64min);
933   EXPECT_EQ(absl::Seconds(0), min_dur - min_dur);
934   EXPECT_EQ(absl::Seconds(kint64max), absl::Seconds(-1) - min_dur);
935 }
936 
TEST(Duration,Negation)937 TEST(Duration, Negation) {
938   // By storing negations of various values in constexpr variables we
939   // verify that the initializers are constant expressions.
940   constexpr absl::Duration negated_zero_duration = -absl::ZeroDuration();
941   EXPECT_EQ(negated_zero_duration, absl::ZeroDuration());
942 
943   constexpr absl::Duration negated_infinite_duration =
944       -absl::InfiniteDuration();
945   EXPECT_NE(negated_infinite_duration, absl::InfiniteDuration());
946   EXPECT_EQ(-negated_infinite_duration, absl::InfiniteDuration());
947 
948   // The public APIs to check if a duration is infinite depend on using
949   // -InfiniteDuration(), but we're trying to test operator- here, so we
950   // need to use the lower-level internal query IsInfiniteDuration.
951   EXPECT_TRUE(
952       absl::time_internal::IsInfiniteDuration(negated_infinite_duration));
953 
954   // The largest Duration is kint64max seconds and kTicksPerSecond - 1 ticks.
955   // Using the absl::time_internal::MakeDuration API is the cleanest way to
956   // construct that Duration.
957   constexpr absl::Duration max_duration = absl::time_internal::MakeDuration(
958       kint64max, absl::time_internal::kTicksPerSecond - 1);
959   constexpr absl::Duration negated_max_duration = -max_duration;
960   // The largest negatable value is one tick above the minimum representable;
961   // it's the negation of max_duration.
962   constexpr absl::Duration nearly_min_duration =
963       absl::time_internal::MakeDuration(kint64min, int64_t{1});
964   constexpr absl::Duration negated_nearly_min_duration = -nearly_min_duration;
965 
966   EXPECT_EQ(negated_max_duration, nearly_min_duration);
967   EXPECT_EQ(negated_nearly_min_duration, max_duration);
968   EXPECT_EQ(-(-max_duration), max_duration);
969 
970   constexpr absl::Duration min_duration =
971       absl::time_internal::MakeDuration(kint64min);
972   constexpr absl::Duration negated_min_duration = -min_duration;
973   EXPECT_EQ(negated_min_duration, absl::InfiniteDuration());
974 }
975 
TEST(Duration,AbsoluteValue)976 TEST(Duration, AbsoluteValue) {
977   EXPECT_EQ(absl::ZeroDuration(), AbsDuration(absl::ZeroDuration()));
978   EXPECT_EQ(absl::Seconds(1), AbsDuration(absl::Seconds(1)));
979   EXPECT_EQ(absl::Seconds(1), AbsDuration(absl::Seconds(-1)));
980 
981   EXPECT_EQ(absl::InfiniteDuration(), AbsDuration(absl::InfiniteDuration()));
982   EXPECT_EQ(absl::InfiniteDuration(), AbsDuration(-absl::InfiniteDuration()));
983 
984   absl::Duration max_dur =
985       absl::Seconds(kint64max) + (absl::Seconds(1) - absl::Nanoseconds(1) / 4);
986   EXPECT_EQ(max_dur, AbsDuration(max_dur));
987 
988   absl::Duration min_dur = absl::Seconds(kint64min);
989   EXPECT_EQ(absl::InfiniteDuration(), AbsDuration(min_dur));
990   EXPECT_EQ(max_dur, AbsDuration(min_dur + absl::Nanoseconds(1) / 4));
991 }
992 
TEST(Duration,Multiplication)993 TEST(Duration, Multiplication) {
994 #define TEST_MUL_OPS(UNIT)                                    \
995   do {                                                        \
996     EXPECT_EQ(UNIT(5), UNIT(2) * 2.5);                        \
997     EXPECT_EQ(UNIT(2), UNIT(5) / 2.5);                        \
998     EXPECT_EQ(UNIT(-5), UNIT(-2) * 2.5);                      \
999     EXPECT_EQ(UNIT(-5), -UNIT(2) * 2.5);                      \
1000     EXPECT_EQ(UNIT(-5), UNIT(2) * -2.5);                      \
1001     EXPECT_EQ(UNIT(-2), UNIT(-5) / 2.5);                      \
1002     EXPECT_EQ(UNIT(-2), -UNIT(5) / 2.5);                      \
1003     EXPECT_EQ(UNIT(-2), UNIT(5) / -2.5);                      \
1004     EXPECT_EQ(UNIT(2), UNIT(11) % UNIT(3));                   \
1005     absl::Duration a = UNIT(2);                               \
1006     a *= 2.5;                                                 \
1007     EXPECT_EQ(UNIT(5), a);                                    \
1008     a /= 2.5;                                                 \
1009     EXPECT_EQ(UNIT(2), a);                                    \
1010     a %= UNIT(1);                                             \
1011     EXPECT_EQ(UNIT(0), a);                                    \
1012     absl::Duration big = UNIT(1000000000);                    \
1013     big *= 3;                                                 \
1014     big /= 3;                                                 \
1015     EXPECT_EQ(UNIT(1000000000), big);                         \
1016     EXPECT_EQ(-UNIT(2), -UNIT(2));                            \
1017     EXPECT_EQ(-UNIT(2), UNIT(2) * -1);                        \
1018     EXPECT_EQ(-UNIT(2), -1 * UNIT(2));                        \
1019     EXPECT_EQ(-UNIT(-2), UNIT(2));                            \
1020     EXPECT_EQ(2, UNIT(2) / UNIT(1));                          \
1021     absl::Duration rem;                                       \
1022     EXPECT_EQ(2, absl::IDivDuration(UNIT(2), UNIT(1), &rem)); \
1023     EXPECT_EQ(2.0, absl::FDivDuration(UNIT(2), UNIT(1)));     \
1024   } while (0)
1025 
1026   TEST_MUL_OPS(absl::Nanoseconds);
1027   TEST_MUL_OPS(absl::Microseconds);
1028   TEST_MUL_OPS(absl::Milliseconds);
1029   TEST_MUL_OPS(absl::Seconds);
1030   TEST_MUL_OPS(absl::Minutes);
1031   TEST_MUL_OPS(absl::Hours);
1032 
1033 #undef TEST_MUL_OPS
1034 
1035   // Ensures that multiplication and division by 1 with a maxed-out durations
1036   // doesn't lose precision.
1037   absl::Duration max_dur =
1038       absl::Seconds(kint64max) + (absl::Seconds(1) - absl::Nanoseconds(1) / 4);
1039   absl::Duration min_dur = absl::Seconds(kint64min);
1040   EXPECT_EQ(max_dur, max_dur * 1);
1041   EXPECT_EQ(max_dur, max_dur / 1);
1042   EXPECT_EQ(min_dur, min_dur * 1);
1043   EXPECT_EQ(min_dur, min_dur / 1);
1044 
1045   // Tests division on a Duration with a large number of significant digits.
1046   // Tests when the digits span hi and lo as well as only in hi.
1047   absl::Duration sigfigs = absl::Seconds(2000000000) + absl::Nanoseconds(3);
1048   EXPECT_EQ(absl::Seconds(666666666) + absl::Nanoseconds(666666667) +
1049                 absl::Nanoseconds(1) / 2,
1050             sigfigs / 3);
1051   sigfigs = absl::Seconds(int64_t{7000000000});
1052   EXPECT_EQ(absl::Seconds(2333333333) + absl::Nanoseconds(333333333) +
1053                 absl::Nanoseconds(1) / 4,
1054             sigfigs / 3);
1055 
1056   EXPECT_EQ(absl::Seconds(7) + absl::Milliseconds(500), absl::Seconds(3) * 2.5);
1057   EXPECT_EQ(absl::Seconds(8) * -1 + absl::Milliseconds(300),
1058             (absl::Seconds(2) + absl::Milliseconds(200)) * -3.5);
1059   EXPECT_EQ(-absl::Seconds(8) + absl::Milliseconds(300),
1060             (absl::Seconds(2) + absl::Milliseconds(200)) * -3.5);
1061   EXPECT_EQ(absl::Seconds(1) + absl::Milliseconds(875),
1062             (absl::Seconds(7) + absl::Milliseconds(500)) / 4);
1063   EXPECT_EQ(absl::Seconds(30),
1064             (absl::Seconds(7) + absl::Milliseconds(500)) / 0.25);
1065   EXPECT_EQ(absl::Seconds(3),
1066             (absl::Seconds(7) + absl::Milliseconds(500)) / 2.5);
1067 
1068   // Tests division remainder.
1069   EXPECT_EQ(absl::Nanoseconds(0), absl::Nanoseconds(7) % absl::Nanoseconds(1));
1070   EXPECT_EQ(absl::Nanoseconds(0), absl::Nanoseconds(0) % absl::Nanoseconds(10));
1071   EXPECT_EQ(absl::Nanoseconds(2), absl::Nanoseconds(7) % absl::Nanoseconds(5));
1072   EXPECT_EQ(absl::Nanoseconds(2), absl::Nanoseconds(2) % absl::Nanoseconds(5));
1073 
1074   EXPECT_EQ(absl::Nanoseconds(1), absl::Nanoseconds(10) % absl::Nanoseconds(3));
1075   EXPECT_EQ(absl::Nanoseconds(1),
1076             absl::Nanoseconds(10) % absl::Nanoseconds(-3));
1077   EXPECT_EQ(absl::Nanoseconds(-1),
1078             absl::Nanoseconds(-10) % absl::Nanoseconds(3));
1079   EXPECT_EQ(absl::Nanoseconds(-1),
1080             absl::Nanoseconds(-10) % absl::Nanoseconds(-3));
1081 
1082   EXPECT_EQ(absl::Milliseconds(100),
1083             absl::Seconds(1) % absl::Milliseconds(300));
1084   EXPECT_EQ(
1085       absl::Milliseconds(300),
1086       (absl::Seconds(3) + absl::Milliseconds(800)) % absl::Milliseconds(500));
1087 
1088   EXPECT_EQ(absl::Nanoseconds(1), absl::Nanoseconds(1) % absl::Seconds(1));
1089   EXPECT_EQ(absl::Nanoseconds(-1), absl::Nanoseconds(-1) % absl::Seconds(1));
1090   EXPECT_EQ(0, absl::Nanoseconds(-1) / absl::Seconds(1));  // Actual -1e-9
1091 
1092   // Tests identity a = (a/b)*b + a%b
1093 #define TEST_MOD_IDENTITY(a, b) \
1094   EXPECT_EQ((a), ((a) / (b))*(b) + ((a)%(b)))
1095 
1096   TEST_MOD_IDENTITY(absl::Seconds(0), absl::Seconds(2));
1097   TEST_MOD_IDENTITY(absl::Seconds(1), absl::Seconds(1));
1098   TEST_MOD_IDENTITY(absl::Seconds(1), absl::Seconds(2));
1099   TEST_MOD_IDENTITY(absl::Seconds(2), absl::Seconds(1));
1100 
1101   TEST_MOD_IDENTITY(absl::Seconds(-2), absl::Seconds(1));
1102   TEST_MOD_IDENTITY(absl::Seconds(2), absl::Seconds(-1));
1103   TEST_MOD_IDENTITY(absl::Seconds(-2), absl::Seconds(-1));
1104 
1105   TEST_MOD_IDENTITY(absl::Nanoseconds(0), absl::Nanoseconds(2));
1106   TEST_MOD_IDENTITY(absl::Nanoseconds(1), absl::Nanoseconds(1));
1107   TEST_MOD_IDENTITY(absl::Nanoseconds(1), absl::Nanoseconds(2));
1108   TEST_MOD_IDENTITY(absl::Nanoseconds(2), absl::Nanoseconds(1));
1109 
1110   TEST_MOD_IDENTITY(absl::Nanoseconds(-2), absl::Nanoseconds(1));
1111   TEST_MOD_IDENTITY(absl::Nanoseconds(2), absl::Nanoseconds(-1));
1112   TEST_MOD_IDENTITY(absl::Nanoseconds(-2), absl::Nanoseconds(-1));
1113 
1114   // Mixed seconds + subseconds
1115   absl::Duration mixed_a = absl::Seconds(1) + absl::Nanoseconds(2);
1116   absl::Duration mixed_b = absl::Seconds(1) + absl::Nanoseconds(3);
1117 
1118   TEST_MOD_IDENTITY(absl::Seconds(0), mixed_a);
1119   TEST_MOD_IDENTITY(mixed_a, mixed_a);
1120   TEST_MOD_IDENTITY(mixed_a, mixed_b);
1121   TEST_MOD_IDENTITY(mixed_b, mixed_a);
1122 
1123   TEST_MOD_IDENTITY(-mixed_a, mixed_b);
1124   TEST_MOD_IDENTITY(mixed_a, -mixed_b);
1125   TEST_MOD_IDENTITY(-mixed_a, -mixed_b);
1126 
1127 #undef TEST_MOD_IDENTITY
1128 }
1129 
TEST(Duration,Truncation)1130 TEST(Duration, Truncation) {
1131   const absl::Duration d = absl::Nanoseconds(1234567890);
1132   const absl::Duration inf = absl::InfiniteDuration();
1133   for (int unit_sign : {1, -1}) {  // sign shouldn't matter
1134     EXPECT_EQ(absl::Nanoseconds(1234567890),
1135               Trunc(d, unit_sign * absl::Nanoseconds(1)));
1136     EXPECT_EQ(absl::Microseconds(1234567),
1137               Trunc(d, unit_sign * absl::Microseconds(1)));
1138     EXPECT_EQ(absl::Milliseconds(1234),
1139               Trunc(d, unit_sign * absl::Milliseconds(1)));
1140     EXPECT_EQ(absl::Seconds(1), Trunc(d, unit_sign * absl::Seconds(1)));
1141     EXPECT_EQ(inf, Trunc(inf, unit_sign * absl::Seconds(1)));
1142 
1143     EXPECT_EQ(absl::Nanoseconds(-1234567890),
1144               Trunc(-d, unit_sign * absl::Nanoseconds(1)));
1145     EXPECT_EQ(absl::Microseconds(-1234567),
1146               Trunc(-d, unit_sign * absl::Microseconds(1)));
1147     EXPECT_EQ(absl::Milliseconds(-1234),
1148               Trunc(-d, unit_sign * absl::Milliseconds(1)));
1149     EXPECT_EQ(absl::Seconds(-1), Trunc(-d, unit_sign * absl::Seconds(1)));
1150     EXPECT_EQ(-inf, Trunc(-inf, unit_sign * absl::Seconds(1)));
1151   }
1152 }
1153 
TEST(Duration,Flooring)1154 TEST(Duration, Flooring) {
1155   const absl::Duration d = absl::Nanoseconds(1234567890);
1156   const absl::Duration inf = absl::InfiniteDuration();
1157   for (int unit_sign : {1, -1}) {  // sign shouldn't matter
1158     EXPECT_EQ(absl::Nanoseconds(1234567890),
1159               absl::Floor(d, unit_sign * absl::Nanoseconds(1)));
1160     EXPECT_EQ(absl::Microseconds(1234567),
1161               absl::Floor(d, unit_sign * absl::Microseconds(1)));
1162     EXPECT_EQ(absl::Milliseconds(1234),
1163               absl::Floor(d, unit_sign * absl::Milliseconds(1)));
1164     EXPECT_EQ(absl::Seconds(1), absl::Floor(d, unit_sign * absl::Seconds(1)));
1165     EXPECT_EQ(inf, absl::Floor(inf, unit_sign * absl::Seconds(1)));
1166 
1167     EXPECT_EQ(absl::Nanoseconds(-1234567890),
1168               absl::Floor(-d, unit_sign * absl::Nanoseconds(1)));
1169     EXPECT_EQ(absl::Microseconds(-1234568),
1170               absl::Floor(-d, unit_sign * absl::Microseconds(1)));
1171     EXPECT_EQ(absl::Milliseconds(-1235),
1172               absl::Floor(-d, unit_sign * absl::Milliseconds(1)));
1173     EXPECT_EQ(absl::Seconds(-2), absl::Floor(-d, unit_sign * absl::Seconds(1)));
1174     EXPECT_EQ(-inf, absl::Floor(-inf, unit_sign * absl::Seconds(1)));
1175   }
1176 }
1177 
TEST(Duration,Ceiling)1178 TEST(Duration, Ceiling) {
1179   const absl::Duration d = absl::Nanoseconds(1234567890);
1180   const absl::Duration inf = absl::InfiniteDuration();
1181   for (int unit_sign : {1, -1}) {  // // sign shouldn't matter
1182     EXPECT_EQ(absl::Nanoseconds(1234567890),
1183               absl::Ceil(d, unit_sign * absl::Nanoseconds(1)));
1184     EXPECT_EQ(absl::Microseconds(1234568),
1185               absl::Ceil(d, unit_sign * absl::Microseconds(1)));
1186     EXPECT_EQ(absl::Milliseconds(1235),
1187               absl::Ceil(d, unit_sign * absl::Milliseconds(1)));
1188     EXPECT_EQ(absl::Seconds(2), absl::Ceil(d, unit_sign * absl::Seconds(1)));
1189     EXPECT_EQ(inf, absl::Ceil(inf, unit_sign * absl::Seconds(1)));
1190 
1191     EXPECT_EQ(absl::Nanoseconds(-1234567890),
1192               absl::Ceil(-d, unit_sign * absl::Nanoseconds(1)));
1193     EXPECT_EQ(absl::Microseconds(-1234567),
1194               absl::Ceil(-d, unit_sign * absl::Microseconds(1)));
1195     EXPECT_EQ(absl::Milliseconds(-1234),
1196               absl::Ceil(-d, unit_sign * absl::Milliseconds(1)));
1197     EXPECT_EQ(absl::Seconds(-1), absl::Ceil(-d, unit_sign * absl::Seconds(1)));
1198     EXPECT_EQ(-inf, absl::Ceil(-inf, unit_sign * absl::Seconds(1)));
1199   }
1200 }
1201 
TEST(Duration,RoundTripUnits)1202 TEST(Duration, RoundTripUnits) {
1203   const int kRange = 100000;
1204 
1205 #define ROUND_TRIP_UNIT(U, LOW, HIGH)          \
1206   do {                                         \
1207     for (int64_t i = LOW; i < HIGH; ++i) {     \
1208       absl::Duration d = absl::U(i);           \
1209       if (d == absl::InfiniteDuration())       \
1210         EXPECT_EQ(kint64max, d / absl::U(1));  \
1211       else if (d == -absl::InfiniteDuration()) \
1212         EXPECT_EQ(kint64min, d / absl::U(1));  \
1213       else                                     \
1214         EXPECT_EQ(i, absl::U(i) / absl::U(1)); \
1215     }                                          \
1216   } while (0)
1217 
1218   ROUND_TRIP_UNIT(Nanoseconds, kint64min, kint64min + kRange);
1219   ROUND_TRIP_UNIT(Nanoseconds, -kRange, kRange);
1220   ROUND_TRIP_UNIT(Nanoseconds, kint64max - kRange, kint64max);
1221 
1222   ROUND_TRIP_UNIT(Microseconds, kint64min, kint64min + kRange);
1223   ROUND_TRIP_UNIT(Microseconds, -kRange, kRange);
1224   ROUND_TRIP_UNIT(Microseconds, kint64max - kRange, kint64max);
1225 
1226   ROUND_TRIP_UNIT(Milliseconds, kint64min, kint64min + kRange);
1227   ROUND_TRIP_UNIT(Milliseconds, -kRange, kRange);
1228   ROUND_TRIP_UNIT(Milliseconds, kint64max - kRange, kint64max);
1229 
1230   ROUND_TRIP_UNIT(Seconds, kint64min, kint64min + kRange);
1231   ROUND_TRIP_UNIT(Seconds, -kRange, kRange);
1232   ROUND_TRIP_UNIT(Seconds, kint64max - kRange, kint64max);
1233 
1234   ROUND_TRIP_UNIT(Minutes, kint64min / 60, kint64min / 60 + kRange);
1235   ROUND_TRIP_UNIT(Minutes, -kRange, kRange);
1236   ROUND_TRIP_UNIT(Minutes, kint64max / 60 - kRange, kint64max / 60);
1237 
1238   ROUND_TRIP_UNIT(Hours, kint64min / 3600, kint64min / 3600 + kRange);
1239   ROUND_TRIP_UNIT(Hours, -kRange, kRange);
1240   ROUND_TRIP_UNIT(Hours, kint64max / 3600 - kRange, kint64max / 3600);
1241 
1242 #undef ROUND_TRIP_UNIT
1243 }
1244 
TEST(Duration,TruncConversions)1245 TEST(Duration, TruncConversions) {
1246   // Tests ToTimespec()/DurationFromTimespec()
1247   const struct {
1248     absl::Duration d;
1249     timespec ts;
1250   } to_ts[] = {
1251       {absl::Seconds(1) + absl::Nanoseconds(1), {1, 1}},
1252       {absl::Seconds(1) + absl::Nanoseconds(1) / 2, {1, 0}},
1253       {absl::Seconds(1) + absl::Nanoseconds(0), {1, 0}},
1254       {absl::Seconds(0) + absl::Nanoseconds(0), {0, 0}},
1255       {absl::Seconds(0) - absl::Nanoseconds(1) / 2, {0, 0}},
1256       {absl::Seconds(0) - absl::Nanoseconds(1), {-1, 999999999}},
1257       {absl::Seconds(-1) + absl::Nanoseconds(1), {-1, 1}},
1258       {absl::Seconds(-1) + absl::Nanoseconds(1) / 2, {-1, 1}},
1259       {absl::Seconds(-1) + absl::Nanoseconds(0), {-1, 0}},
1260       {absl::Seconds(-1) - absl::Nanoseconds(1) / 2, {-1, 0}},
1261   };
1262   for (const auto& test : to_ts) {
1263     EXPECT_THAT(absl::ToTimespec(test.d), TimespecMatcher(test.ts));
1264   }
1265   const struct {
1266     timespec ts;
1267     absl::Duration d;
1268   } from_ts[] = {
1269       {{1, 1}, absl::Seconds(1) + absl::Nanoseconds(1)},
1270       {{1, 0}, absl::Seconds(1) + absl::Nanoseconds(0)},
1271       {{0, 0}, absl::Seconds(0) + absl::Nanoseconds(0)},
1272       {{0, -1}, absl::Seconds(0) - absl::Nanoseconds(1)},
1273       {{-1, 999999999}, absl::Seconds(0) - absl::Nanoseconds(1)},
1274       {{-1, 1}, absl::Seconds(-1) + absl::Nanoseconds(1)},
1275       {{-1, 0}, absl::Seconds(-1) + absl::Nanoseconds(0)},
1276       {{-1, -1}, absl::Seconds(-1) - absl::Nanoseconds(1)},
1277       {{-2, 999999999}, absl::Seconds(-1) - absl::Nanoseconds(1)},
1278   };
1279   for (const auto& test : from_ts) {
1280     EXPECT_EQ(test.d, absl::DurationFromTimespec(test.ts));
1281   }
1282 
1283   // Tests ToTimeval()/DurationFromTimeval() (same as timespec above)
1284   const struct {
1285     absl::Duration d;
1286     timeval tv;
1287   } to_tv[] = {
1288       {absl::Seconds(1) + absl::Microseconds(1), {1, 1}},
1289       {absl::Seconds(1) + absl::Microseconds(1) / 2, {1, 0}},
1290       {absl::Seconds(1) + absl::Microseconds(0), {1, 0}},
1291       {absl::Seconds(0) + absl::Microseconds(0), {0, 0}},
1292       {absl::Seconds(0) - absl::Microseconds(1) / 2, {0, 0}},
1293       {absl::Seconds(0) - absl::Microseconds(1), {-1, 999999}},
1294       {absl::Seconds(-1) + absl::Microseconds(1), {-1, 1}},
1295       {absl::Seconds(-1) + absl::Microseconds(1) / 2, {-1, 1}},
1296       {absl::Seconds(-1) + absl::Microseconds(0), {-1, 0}},
1297       {absl::Seconds(-1) - absl::Microseconds(1) / 2, {-1, 0}},
1298   };
1299   for (const auto& test : to_tv) {
1300     EXPECT_THAT(absl::ToTimeval(test.d), TimevalMatcher(test.tv));
1301   }
1302   const struct {
1303     timeval tv;
1304     absl::Duration d;
1305   } from_tv[] = {
1306       {{1, 1}, absl::Seconds(1) + absl::Microseconds(1)},
1307       {{1, 0}, absl::Seconds(1) + absl::Microseconds(0)},
1308       {{0, 0}, absl::Seconds(0) + absl::Microseconds(0)},
1309       {{0, -1}, absl::Seconds(0) - absl::Microseconds(1)},
1310       {{-1, 999999}, absl::Seconds(0) - absl::Microseconds(1)},
1311       {{-1, 1}, absl::Seconds(-1) + absl::Microseconds(1)},
1312       {{-1, 0}, absl::Seconds(-1) + absl::Microseconds(0)},
1313       {{-1, -1}, absl::Seconds(-1) - absl::Microseconds(1)},
1314       {{-2, 999999}, absl::Seconds(-1) - absl::Microseconds(1)},
1315   };
1316   for (const auto& test : from_tv) {
1317     EXPECT_EQ(test.d, absl::DurationFromTimeval(test.tv));
1318   }
1319 }
1320 
TEST(Duration,SmallConversions)1321 TEST(Duration, SmallConversions) {
1322   // Special tests for conversions of small durations.
1323 
1324   EXPECT_EQ(absl::ZeroDuration(), absl::Seconds(0));
1325   // TODO(bww): Is the next one OK?
1326   EXPECT_EQ(absl::ZeroDuration(), absl::Seconds(std::nextafter(0.125e-9, 0)));
1327   EXPECT_EQ(absl::Nanoseconds(1) / 4, absl::Seconds(0.125e-9));
1328   EXPECT_EQ(absl::Nanoseconds(1) / 4, absl::Seconds(0.250e-9));
1329   EXPECT_EQ(absl::Nanoseconds(1) / 2, absl::Seconds(0.375e-9));
1330   EXPECT_EQ(absl::Nanoseconds(1) / 2, absl::Seconds(0.500e-9));
1331   EXPECT_EQ(absl::Nanoseconds(3) / 4, absl::Seconds(0.625e-9));
1332   EXPECT_EQ(absl::Nanoseconds(3) / 4, absl::Seconds(0.750e-9));
1333   EXPECT_EQ(absl::Nanoseconds(1), absl::Seconds(0.875e-9));
1334   EXPECT_EQ(absl::Nanoseconds(1), absl::Seconds(1.000e-9));
1335 
1336   EXPECT_EQ(absl::ZeroDuration(), absl::Seconds(std::nextafter(-0.125e-9, 0)));
1337   EXPECT_EQ(-absl::Nanoseconds(1) / 4, absl::Seconds(-0.125e-9));
1338   EXPECT_EQ(-absl::Nanoseconds(1) / 4, absl::Seconds(-0.250e-9));
1339   EXPECT_EQ(-absl::Nanoseconds(1) / 2, absl::Seconds(-0.375e-9));
1340   EXPECT_EQ(-absl::Nanoseconds(1) / 2, absl::Seconds(-0.500e-9));
1341   EXPECT_EQ(-absl::Nanoseconds(3) / 4, absl::Seconds(-0.625e-9));
1342   EXPECT_EQ(-absl::Nanoseconds(3) / 4, absl::Seconds(-0.750e-9));
1343   EXPECT_EQ(-absl::Nanoseconds(1), absl::Seconds(-0.875e-9));
1344   EXPECT_EQ(-absl::Nanoseconds(1), absl::Seconds(-1.000e-9));
1345 
1346   timespec ts;
1347   ts.tv_sec = 0;
1348   ts.tv_nsec = 0;
1349   EXPECT_THAT(ToTimespec(absl::Nanoseconds(0)), TimespecMatcher(ts));
1350   // TODO(bww): Are the next three OK?
1351   EXPECT_THAT(ToTimespec(absl::Nanoseconds(1) / 4), TimespecMatcher(ts));
1352   EXPECT_THAT(ToTimespec(absl::Nanoseconds(2) / 4), TimespecMatcher(ts));
1353   EXPECT_THAT(ToTimespec(absl::Nanoseconds(3) / 4), TimespecMatcher(ts));
1354   ts.tv_nsec = 1;
1355   EXPECT_THAT(ToTimespec(absl::Nanoseconds(4) / 4), TimespecMatcher(ts));
1356   EXPECT_THAT(ToTimespec(absl::Nanoseconds(5) / 4), TimespecMatcher(ts));
1357   EXPECT_THAT(ToTimespec(absl::Nanoseconds(6) / 4), TimespecMatcher(ts));
1358   EXPECT_THAT(ToTimespec(absl::Nanoseconds(7) / 4), TimespecMatcher(ts));
1359   ts.tv_nsec = 2;
1360   EXPECT_THAT(ToTimespec(absl::Nanoseconds(8) / 4), TimespecMatcher(ts));
1361 
1362   timeval tv;
1363   tv.tv_sec = 0;
1364   tv.tv_usec = 0;
1365   EXPECT_THAT(ToTimeval(absl::Nanoseconds(0)), TimevalMatcher(tv));
1366   // TODO(bww): Is the next one OK?
1367   EXPECT_THAT(ToTimeval(absl::Nanoseconds(999)), TimevalMatcher(tv));
1368   tv.tv_usec = 1;
1369   EXPECT_THAT(ToTimeval(absl::Nanoseconds(1000)), TimevalMatcher(tv));
1370   EXPECT_THAT(ToTimeval(absl::Nanoseconds(1999)), TimevalMatcher(tv));
1371   tv.tv_usec = 2;
1372   EXPECT_THAT(ToTimeval(absl::Nanoseconds(2000)), TimevalMatcher(tv));
1373 }
1374 
VerifyApproxSameAsMul(double time_as_seconds,int * const misses)1375 void VerifyApproxSameAsMul(double time_as_seconds, int* const misses) {
1376   auto direct_seconds = absl::Seconds(time_as_seconds);
1377   auto mul_by_one_second = time_as_seconds * absl::Seconds(1);
1378   // These are expected to differ by up to one tick due to fused multiply/add
1379   // contraction.
1380   if (absl::AbsDuration(direct_seconds - mul_by_one_second) >
1381       absl::time_internal::MakeDuration(0, 1u)) {
1382     if (*misses > 10) return;
1383     ASSERT_LE(++(*misses), 10) << "Too many errors, not reporting more.";
1384     EXPECT_EQ(direct_seconds, mul_by_one_second)
1385         << "given double time_as_seconds = " << std::setprecision(17)
1386         << time_as_seconds;
1387   }
1388 }
1389 
1390 // For a variety of interesting durations, we find the exact point
1391 // where one double converts to that duration, and the very next double
1392 // converts to the next duration.  For both of those points, verify that
1393 // Seconds(point) returns a duration near point * Seconds(1.0). (They may
1394 // not be exactly equal due to fused multiply/add contraction.)
TEST(Duration,ToDoubleSecondsCheckEdgeCases)1395 TEST(Duration, ToDoubleSecondsCheckEdgeCases) {
1396 #if (defined(__i386__) || defined(_M_IX86)) && FLT_EVAL_METHOD != 0
1397   // We're using an x87-compatible FPU, and intermediate operations can be
1398   // performed with 80-bit floats. This means the edge cases are different than
1399   // what we expect here, so just skip this test.
1400   GTEST_SKIP()
1401       << "Skipping the test because we detected x87 floating-point semantics";
1402 #endif
1403 
1404   constexpr uint32_t kTicksPerSecond = absl::time_internal::kTicksPerSecond;
1405   constexpr auto duration_tick = absl::time_internal::MakeDuration(0, 1u);
1406   int misses = 0;
1407   for (int64_t seconds = 0; seconds < 99; ++seconds) {
1408     uint32_t tick_vals[] = {0, +999, +999999, +999999999, kTicksPerSecond - 1,
1409                             0, 1000, 1000000, 1000000000, kTicksPerSecond,
1410                             1, 1001, 1000001, 1000000001, kTicksPerSecond + 1,
1411                             2, 1002, 1000002, 1000000002, kTicksPerSecond + 2,
1412                             3, 1003, 1000003, 1000000003, kTicksPerSecond + 3,
1413                             4, 1004, 1000004, 1000000004, kTicksPerSecond + 4,
1414                             5, 6,    7,       8,          9};
1415     for (uint32_t ticks : tick_vals) {
1416       absl::Duration s_plus_t = absl::Seconds(seconds) + ticks * duration_tick;
1417       for (absl::Duration d : {s_plus_t, -s_plus_t}) {
1418         absl::Duration after_d = d + duration_tick;
1419         EXPECT_NE(d, after_d);
1420         EXPECT_EQ(after_d - d, duration_tick);
1421 
1422         double low_edge = ToDoubleSeconds(d);
1423         EXPECT_EQ(d, absl::Seconds(low_edge));
1424 
1425         double high_edge = ToDoubleSeconds(after_d);
1426         EXPECT_EQ(after_d, absl::Seconds(high_edge));
1427 
1428         for (;;) {
1429           double midpoint = low_edge + (high_edge - low_edge) / 2;
1430           if (midpoint == low_edge || midpoint == high_edge) break;
1431           absl::Duration mid_duration = absl::Seconds(midpoint);
1432           if (mid_duration == d) {
1433             low_edge = midpoint;
1434           } else {
1435             EXPECT_EQ(mid_duration, after_d);
1436             high_edge = midpoint;
1437           }
1438         }
1439         // Now low_edge is the highest double that converts to Duration d,
1440         // and high_edge is the lowest double that converts to Duration after_d.
1441         VerifyApproxSameAsMul(low_edge, &misses);
1442         VerifyApproxSameAsMul(high_edge, &misses);
1443       }
1444     }
1445   }
1446 }
1447 
TEST(Duration,ToDoubleSecondsCheckRandom)1448 TEST(Duration, ToDoubleSecondsCheckRandom) {
1449   std::random_device rd;
1450   std::seed_seq seed({rd(), rd(), rd(), rd(), rd(), rd(), rd(), rd()});
1451   std::mt19937_64 gen(seed);
1452   // We want doubles distributed from 1/8ns up to 2^63, where
1453   // as many values are tested from 1ns to 2ns as from 1sec to 2sec,
1454   // so even distribute along a log-scale of those values, and
1455   // exponentiate before using them.  (9.223377e+18 is just slightly
1456   // out of bounds for absl::Duration.)
1457   std::uniform_real_distribution<double> uniform(std::log(0.125e-9),
1458                                                  std::log(9.223377e+18));
1459   int misses = 0;
1460   for (int i = 0; i < 1000000; ++i) {
1461     double d = std::exp(uniform(gen));
1462     VerifyApproxSameAsMul(d, &misses);
1463     VerifyApproxSameAsMul(-d, &misses);
1464   }
1465 }
1466 
TEST(Duration,ConversionSaturation)1467 TEST(Duration, ConversionSaturation) {
1468   absl::Duration d;
1469 
1470   const auto max_timeval_sec =
1471       std::numeric_limits<decltype(timeval::tv_sec)>::max();
1472   const auto min_timeval_sec =
1473       std::numeric_limits<decltype(timeval::tv_sec)>::min();
1474   timeval tv;
1475   tv.tv_sec = max_timeval_sec;
1476   tv.tv_usec = 999998;
1477   d = absl::DurationFromTimeval(tv);
1478   tv = ToTimeval(d);
1479   EXPECT_EQ(max_timeval_sec, tv.tv_sec);
1480   EXPECT_EQ(999998, tv.tv_usec);
1481   d += absl::Microseconds(1);
1482   tv = ToTimeval(d);
1483   EXPECT_EQ(max_timeval_sec, tv.tv_sec);
1484   EXPECT_EQ(999999, tv.tv_usec);
1485   d += absl::Microseconds(1);  // no effect
1486   tv = ToTimeval(d);
1487   EXPECT_EQ(max_timeval_sec, tv.tv_sec);
1488   EXPECT_EQ(999999, tv.tv_usec);
1489 
1490   tv.tv_sec = min_timeval_sec;
1491   tv.tv_usec = 1;
1492   d = absl::DurationFromTimeval(tv);
1493   tv = ToTimeval(d);
1494   EXPECT_EQ(min_timeval_sec, tv.tv_sec);
1495   EXPECT_EQ(1, tv.tv_usec);
1496   d -= absl::Microseconds(1);
1497   tv = ToTimeval(d);
1498   EXPECT_EQ(min_timeval_sec, tv.tv_sec);
1499   EXPECT_EQ(0, tv.tv_usec);
1500   d -= absl::Microseconds(1);  // no effect
1501   tv = ToTimeval(d);
1502   EXPECT_EQ(min_timeval_sec, tv.tv_sec);
1503   EXPECT_EQ(0, tv.tv_usec);
1504 
1505   const auto max_timespec_sec =
1506       std::numeric_limits<decltype(timespec::tv_sec)>::max();
1507   const auto min_timespec_sec =
1508       std::numeric_limits<decltype(timespec::tv_sec)>::min();
1509   timespec ts;
1510   ts.tv_sec = max_timespec_sec;
1511   ts.tv_nsec = 999999998;
1512   d = absl::DurationFromTimespec(ts);
1513   ts = absl::ToTimespec(d);
1514   EXPECT_EQ(max_timespec_sec, ts.tv_sec);
1515   EXPECT_EQ(999999998, ts.tv_nsec);
1516   d += absl::Nanoseconds(1);
1517   ts = absl::ToTimespec(d);
1518   EXPECT_EQ(max_timespec_sec, ts.tv_sec);
1519   EXPECT_EQ(999999999, ts.tv_nsec);
1520   d += absl::Nanoseconds(1);  // no effect
1521   ts = absl::ToTimespec(d);
1522   EXPECT_EQ(max_timespec_sec, ts.tv_sec);
1523   EXPECT_EQ(999999999, ts.tv_nsec);
1524 
1525   ts.tv_sec = min_timespec_sec;
1526   ts.tv_nsec = 1;
1527   d = absl::DurationFromTimespec(ts);
1528   ts = absl::ToTimespec(d);
1529   EXPECT_EQ(min_timespec_sec, ts.tv_sec);
1530   EXPECT_EQ(1, ts.tv_nsec);
1531   d -= absl::Nanoseconds(1);
1532   ts = absl::ToTimespec(d);
1533   EXPECT_EQ(min_timespec_sec, ts.tv_sec);
1534   EXPECT_EQ(0, ts.tv_nsec);
1535   d -= absl::Nanoseconds(1);  // no effect
1536   ts = absl::ToTimespec(d);
1537   EXPECT_EQ(min_timespec_sec, ts.tv_sec);
1538   EXPECT_EQ(0, ts.tv_nsec);
1539 }
1540 
TEST(Duration,FormatDuration)1541 TEST(Duration, FormatDuration) {
1542   // Example from Go's docs.
1543   EXPECT_EQ("72h3m0.5s",
1544             absl::FormatDuration(absl::Hours(72) + absl::Minutes(3) +
1545                                  absl::Milliseconds(500)));
1546   // Go's largest time: 2540400h10m10.000000000s
1547   EXPECT_EQ("2540400h10m10s",
1548             absl::FormatDuration(absl::Hours(2540400) + absl::Minutes(10) +
1549                                  absl::Seconds(10)));
1550 
1551   EXPECT_EQ("0", absl::FormatDuration(absl::ZeroDuration()));
1552   EXPECT_EQ("0", absl::FormatDuration(absl::Seconds(0)));
1553   EXPECT_EQ("0", absl::FormatDuration(absl::Nanoseconds(0)));
1554 
1555   EXPECT_EQ("1ns", absl::FormatDuration(absl::Nanoseconds(1)));
1556   EXPECT_EQ("1us", absl::FormatDuration(absl::Microseconds(1)));
1557   EXPECT_EQ("1ms", absl::FormatDuration(absl::Milliseconds(1)));
1558   EXPECT_EQ("1s", absl::FormatDuration(absl::Seconds(1)));
1559   EXPECT_EQ("1m", absl::FormatDuration(absl::Minutes(1)));
1560   EXPECT_EQ("1h", absl::FormatDuration(absl::Hours(1)));
1561 
1562   EXPECT_EQ("1h1m", absl::FormatDuration(absl::Hours(1) + absl::Minutes(1)));
1563   EXPECT_EQ("1h1s", absl::FormatDuration(absl::Hours(1) + absl::Seconds(1)));
1564   EXPECT_EQ("1m1s", absl::FormatDuration(absl::Minutes(1) + absl::Seconds(1)));
1565 
1566   EXPECT_EQ("1h0.25s",
1567             absl::FormatDuration(absl::Hours(1) + absl::Milliseconds(250)));
1568   EXPECT_EQ("1m0.25s",
1569             absl::FormatDuration(absl::Minutes(1) + absl::Milliseconds(250)));
1570   EXPECT_EQ("1h1m0.25s",
1571             absl::FormatDuration(absl::Hours(1) + absl::Minutes(1) +
1572                                  absl::Milliseconds(250)));
1573   EXPECT_EQ("1h0.0005s",
1574             absl::FormatDuration(absl::Hours(1) + absl::Microseconds(500)));
1575   EXPECT_EQ("1h0.0000005s",
1576             absl::FormatDuration(absl::Hours(1) + absl::Nanoseconds(500)));
1577 
1578   // Subsecond special case.
1579   EXPECT_EQ("1.5ns", absl::FormatDuration(absl::Nanoseconds(1) +
1580                                           absl::Nanoseconds(1) / 2));
1581   EXPECT_EQ("1.25ns", absl::FormatDuration(absl::Nanoseconds(1) +
1582                                            absl::Nanoseconds(1) / 4));
1583   EXPECT_EQ("1ns", absl::FormatDuration(absl::Nanoseconds(1) +
1584                                         absl::Nanoseconds(1) / 9));
1585   EXPECT_EQ("1.2us", absl::FormatDuration(absl::Microseconds(1) +
1586                                           absl::Nanoseconds(200)));
1587   EXPECT_EQ("1.2ms", absl::FormatDuration(absl::Milliseconds(1) +
1588                                           absl::Microseconds(200)));
1589   EXPECT_EQ("1.0002ms", absl::FormatDuration(absl::Milliseconds(1) +
1590                                              absl::Nanoseconds(200)));
1591   EXPECT_EQ("1.00001ms", absl::FormatDuration(absl::Milliseconds(1) +
1592                                               absl::Nanoseconds(10)));
1593   EXPECT_EQ("1.000001ms",
1594             absl::FormatDuration(absl::Milliseconds(1) + absl::Nanoseconds(1)));
1595 
1596   // Negative durations.
1597   EXPECT_EQ("-1ns", absl::FormatDuration(absl::Nanoseconds(-1)));
1598   EXPECT_EQ("-1us", absl::FormatDuration(absl::Microseconds(-1)));
1599   EXPECT_EQ("-1ms", absl::FormatDuration(absl::Milliseconds(-1)));
1600   EXPECT_EQ("-1s", absl::FormatDuration(absl::Seconds(-1)));
1601   EXPECT_EQ("-1m", absl::FormatDuration(absl::Minutes(-1)));
1602   EXPECT_EQ("-1h", absl::FormatDuration(absl::Hours(-1)));
1603 
1604   EXPECT_EQ("-1h1m",
1605             absl::FormatDuration(-(absl::Hours(1) + absl::Minutes(1))));
1606   EXPECT_EQ("-1h1s",
1607             absl::FormatDuration(-(absl::Hours(1) + absl::Seconds(1))));
1608   EXPECT_EQ("-1m1s",
1609             absl::FormatDuration(-(absl::Minutes(1) + absl::Seconds(1))));
1610 
1611   EXPECT_EQ("-1ns", absl::FormatDuration(absl::Nanoseconds(-1)));
1612   EXPECT_EQ("-1.2us", absl::FormatDuration(
1613                           -(absl::Microseconds(1) + absl::Nanoseconds(200))));
1614   EXPECT_EQ("-1.2ms", absl::FormatDuration(
1615                           -(absl::Milliseconds(1) + absl::Microseconds(200))));
1616   EXPECT_EQ("-1.0002ms", absl::FormatDuration(-(absl::Milliseconds(1) +
1617                                                 absl::Nanoseconds(200))));
1618   EXPECT_EQ("-1.00001ms", absl::FormatDuration(-(absl::Milliseconds(1) +
1619                                                  absl::Nanoseconds(10))));
1620   EXPECT_EQ("-1.000001ms", absl::FormatDuration(-(absl::Milliseconds(1) +
1621                                                   absl::Nanoseconds(1))));
1622 
1623   //
1624   // Interesting corner cases.
1625   //
1626 
1627   const absl::Duration qns = absl::Nanoseconds(1) / 4;
1628   const absl::Duration max_dur =
1629       absl::Seconds(kint64max) + (absl::Seconds(1) - qns);
1630   const absl::Duration min_dur = absl::Seconds(kint64min);
1631 
1632   EXPECT_EQ("0.25ns", absl::FormatDuration(qns));
1633   EXPECT_EQ("-0.25ns", absl::FormatDuration(-qns));
1634   EXPECT_EQ("2562047788015215h30m7.99999999975s",
1635             absl::FormatDuration(max_dur));
1636   EXPECT_EQ("-2562047788015215h30m8s", absl::FormatDuration(min_dur));
1637 
1638   // Tests printing full precision from units that print using FDivDuration
1639   EXPECT_EQ("55.00000000025s", absl::FormatDuration(absl::Seconds(55) + qns));
1640   EXPECT_EQ("55.00000025ms",
1641             absl::FormatDuration(absl::Milliseconds(55) + qns));
1642   EXPECT_EQ("55.00025us", absl::FormatDuration(absl::Microseconds(55) + qns));
1643   EXPECT_EQ("55.25ns", absl::FormatDuration(absl::Nanoseconds(55) + qns));
1644 
1645   // Formatting infinity
1646   EXPECT_EQ("inf", absl::FormatDuration(absl::InfiniteDuration()));
1647   EXPECT_EQ("-inf", absl::FormatDuration(-absl::InfiniteDuration()));
1648 
1649   // Formatting approximately +/- 100 billion years
1650   const absl::Duration huge_range = ApproxYears(100000000000);
1651   EXPECT_EQ("876000000000000h", absl::FormatDuration(huge_range));
1652   EXPECT_EQ("-876000000000000h", absl::FormatDuration(-huge_range));
1653 
1654   EXPECT_EQ("876000000000000h0.999999999s",
1655             absl::FormatDuration(huge_range +
1656                                  (absl::Seconds(1) - absl::Nanoseconds(1))));
1657   EXPECT_EQ("876000000000000h0.9999999995s",
1658             absl::FormatDuration(
1659                 huge_range + (absl::Seconds(1) - absl::Nanoseconds(1) / 2)));
1660   EXPECT_EQ("876000000000000h0.99999999975s",
1661             absl::FormatDuration(
1662                 huge_range + (absl::Seconds(1) - absl::Nanoseconds(1) / 4)));
1663 
1664   EXPECT_EQ("-876000000000000h0.999999999s",
1665             absl::FormatDuration(-huge_range -
1666                                  (absl::Seconds(1) - absl::Nanoseconds(1))));
1667   EXPECT_EQ("-876000000000000h0.9999999995s",
1668             absl::FormatDuration(
1669                 -huge_range - (absl::Seconds(1) - absl::Nanoseconds(1) / 2)));
1670   EXPECT_EQ("-876000000000000h0.99999999975s",
1671             absl::FormatDuration(
1672                 -huge_range - (absl::Seconds(1) - absl::Nanoseconds(1) / 4)));
1673 }
1674 
TEST(Duration,ParseDuration)1675 TEST(Duration, ParseDuration) {
1676   absl::Duration d;
1677 
1678   // No specified unit. Should only work for zero and infinity.
1679   EXPECT_TRUE(absl::ParseDuration("0", &d));
1680   EXPECT_EQ(absl::ZeroDuration(), d);
1681   EXPECT_TRUE(absl::ParseDuration("+0", &d));
1682   EXPECT_EQ(absl::ZeroDuration(), d);
1683   EXPECT_TRUE(absl::ParseDuration("-0", &d));
1684   EXPECT_EQ(absl::ZeroDuration(), d);
1685 
1686   EXPECT_TRUE(absl::ParseDuration("inf", &d));
1687   EXPECT_EQ(absl::InfiniteDuration(), d);
1688   EXPECT_TRUE(absl::ParseDuration("+inf", &d));
1689   EXPECT_EQ(absl::InfiniteDuration(), d);
1690   EXPECT_TRUE(absl::ParseDuration("-inf", &d));
1691   EXPECT_EQ(-absl::InfiniteDuration(), d);
1692   EXPECT_FALSE(absl::ParseDuration("infBlah", &d));
1693 
1694   // Illegal input forms.
1695   EXPECT_FALSE(absl::ParseDuration("", &d));
1696   EXPECT_FALSE(absl::ParseDuration("0.0", &d));
1697   EXPECT_FALSE(absl::ParseDuration(".0", &d));
1698   EXPECT_FALSE(absl::ParseDuration(".", &d));
1699   EXPECT_FALSE(absl::ParseDuration("01", &d));
1700   EXPECT_FALSE(absl::ParseDuration("1", &d));
1701   EXPECT_FALSE(absl::ParseDuration("-1", &d));
1702   EXPECT_FALSE(absl::ParseDuration("2", &d));
1703   EXPECT_FALSE(absl::ParseDuration("2 s", &d));
1704   EXPECT_FALSE(absl::ParseDuration(".s", &d));
1705   EXPECT_FALSE(absl::ParseDuration("-.s", &d));
1706   EXPECT_FALSE(absl::ParseDuration("s", &d));
1707   EXPECT_FALSE(absl::ParseDuration(" 2s", &d));
1708   EXPECT_FALSE(absl::ParseDuration("2s ", &d));
1709   EXPECT_FALSE(absl::ParseDuration(" 2s ", &d));
1710   EXPECT_FALSE(absl::ParseDuration("2mt", &d));
1711   EXPECT_FALSE(absl::ParseDuration("1e3s", &d));
1712 
1713   // One unit type.
1714   EXPECT_TRUE(absl::ParseDuration("1ns", &d));
1715   EXPECT_EQ(absl::Nanoseconds(1), d);
1716   EXPECT_TRUE(absl::ParseDuration("1us", &d));
1717   EXPECT_EQ(absl::Microseconds(1), d);
1718   EXPECT_TRUE(absl::ParseDuration("1ms", &d));
1719   EXPECT_EQ(absl::Milliseconds(1), d);
1720   EXPECT_TRUE(absl::ParseDuration("1s", &d));
1721   EXPECT_EQ(absl::Seconds(1), d);
1722   EXPECT_TRUE(absl::ParseDuration("2m", &d));
1723   EXPECT_EQ(absl::Minutes(2), d);
1724   EXPECT_TRUE(absl::ParseDuration("2h", &d));
1725   EXPECT_EQ(absl::Hours(2), d);
1726 
1727   // Huge counts of a unit.
1728   EXPECT_TRUE(absl::ParseDuration("9223372036854775807us", &d));
1729   EXPECT_EQ(absl::Microseconds(9223372036854775807), d);
1730   EXPECT_TRUE(absl::ParseDuration("-9223372036854775807us", &d));
1731   EXPECT_EQ(absl::Microseconds(-9223372036854775807), d);
1732 
1733   // Multiple units.
1734   EXPECT_TRUE(absl::ParseDuration("2h3m4s", &d));
1735   EXPECT_EQ(absl::Hours(2) + absl::Minutes(3) + absl::Seconds(4), d);
1736   EXPECT_TRUE(absl::ParseDuration("3m4s5us", &d));
1737   EXPECT_EQ(absl::Minutes(3) + absl::Seconds(4) + absl::Microseconds(5), d);
1738   EXPECT_TRUE(absl::ParseDuration("2h3m4s5ms6us7ns", &d));
1739   EXPECT_EQ(absl::Hours(2) + absl::Minutes(3) + absl::Seconds(4) +
1740                 absl::Milliseconds(5) + absl::Microseconds(6) +
1741                 absl::Nanoseconds(7),
1742             d);
1743 
1744   // Multiple units out of order.
1745   EXPECT_TRUE(absl::ParseDuration("2us3m4s5h", &d));
1746   EXPECT_EQ(absl::Hours(5) + absl::Minutes(3) + absl::Seconds(4) +
1747                 absl::Microseconds(2),
1748             d);
1749 
1750   // Fractional values of units.
1751   EXPECT_TRUE(absl::ParseDuration("1.5ns", &d));
1752   EXPECT_EQ(1.5 * absl::Nanoseconds(1), d);
1753   EXPECT_TRUE(absl::ParseDuration("1.5us", &d));
1754   EXPECT_EQ(1.5 * absl::Microseconds(1), d);
1755   EXPECT_TRUE(absl::ParseDuration("1.5ms", &d));
1756   EXPECT_EQ(1.5 * absl::Milliseconds(1), d);
1757   EXPECT_TRUE(absl::ParseDuration("1.5s", &d));
1758   EXPECT_EQ(1.5 * absl::Seconds(1), d);
1759   EXPECT_TRUE(absl::ParseDuration("1.5m", &d));
1760   EXPECT_EQ(1.5 * absl::Minutes(1), d);
1761   EXPECT_TRUE(absl::ParseDuration("1.5h", &d));
1762   EXPECT_EQ(1.5 * absl::Hours(1), d);
1763 
1764   // Huge fractional counts of a unit.
1765   EXPECT_TRUE(absl::ParseDuration("0.4294967295s", &d));
1766   EXPECT_EQ(absl::Nanoseconds(429496729) + absl::Nanoseconds(1) / 2, d);
1767   EXPECT_TRUE(absl::ParseDuration("0.429496729501234567890123456789s", &d));
1768   EXPECT_EQ(absl::Nanoseconds(429496729) + absl::Nanoseconds(1) / 2, d);
1769 
1770   // Negative durations.
1771   EXPECT_TRUE(absl::ParseDuration("-1s", &d));
1772   EXPECT_EQ(absl::Seconds(-1), d);
1773   EXPECT_TRUE(absl::ParseDuration("-1m", &d));
1774   EXPECT_EQ(absl::Minutes(-1), d);
1775   EXPECT_TRUE(absl::ParseDuration("-1h", &d));
1776   EXPECT_EQ(absl::Hours(-1), d);
1777 
1778   EXPECT_TRUE(absl::ParseDuration("-1h2s", &d));
1779   EXPECT_EQ(-(absl::Hours(1) + absl::Seconds(2)), d);
1780   EXPECT_FALSE(absl::ParseDuration("1h-2s", &d));
1781   EXPECT_FALSE(absl::ParseDuration("-1h-2s", &d));
1782   EXPECT_FALSE(absl::ParseDuration("-1h -2s", &d));
1783 }
1784 
TEST(Duration,FormatParseRoundTrip)1785 TEST(Duration, FormatParseRoundTrip) {
1786 #define TEST_PARSE_ROUNDTRIP(d)                \
1787   do {                                         \
1788     std::string s = absl::FormatDuration(d);   \
1789     absl::Duration dur;                        \
1790     EXPECT_TRUE(absl::ParseDuration(s, &dur)); \
1791     EXPECT_EQ(d, dur);                         \
1792   } while (0)
1793 
1794   TEST_PARSE_ROUNDTRIP(absl::Nanoseconds(1));
1795   TEST_PARSE_ROUNDTRIP(absl::Microseconds(1));
1796   TEST_PARSE_ROUNDTRIP(absl::Milliseconds(1));
1797   TEST_PARSE_ROUNDTRIP(absl::Seconds(1));
1798   TEST_PARSE_ROUNDTRIP(absl::Minutes(1));
1799   TEST_PARSE_ROUNDTRIP(absl::Hours(1));
1800   TEST_PARSE_ROUNDTRIP(absl::Hours(1) + absl::Nanoseconds(2));
1801 
1802   TEST_PARSE_ROUNDTRIP(absl::Nanoseconds(-1));
1803   TEST_PARSE_ROUNDTRIP(absl::Microseconds(-1));
1804   TEST_PARSE_ROUNDTRIP(absl::Milliseconds(-1));
1805   TEST_PARSE_ROUNDTRIP(absl::Seconds(-1));
1806   TEST_PARSE_ROUNDTRIP(absl::Minutes(-1));
1807   TEST_PARSE_ROUNDTRIP(absl::Hours(-1));
1808 
1809   TEST_PARSE_ROUNDTRIP(absl::Hours(-1) + absl::Nanoseconds(2));
1810   TEST_PARSE_ROUNDTRIP(absl::Hours(1) + absl::Nanoseconds(-2));
1811   TEST_PARSE_ROUNDTRIP(absl::Hours(-1) + absl::Nanoseconds(-2));
1812 
1813   TEST_PARSE_ROUNDTRIP(absl::Nanoseconds(1) +
1814                        absl::Nanoseconds(1) / 4);  // 1.25ns
1815 
1816   const absl::Duration huge_range = ApproxYears(100000000000);
1817   TEST_PARSE_ROUNDTRIP(huge_range);
1818   TEST_PARSE_ROUNDTRIP(huge_range + (absl::Seconds(1) - absl::Nanoseconds(1)));
1819 
1820 #undef TEST_PARSE_ROUNDTRIP
1821 }
1822 
TEST(Duration,AbslStringify)1823 TEST(Duration, AbslStringify) {
1824   // FormatDuration is already well tested, so just use one test case here to
1825   // verify that StrFormat("%v", d) works as expected.
1826   absl::Duration d = absl::Seconds(1);
1827   EXPECT_EQ(absl::StrFormat("%v", d), absl::FormatDuration(d));
1828 }
1829 
TEST(Duration,NoPadding)1830 TEST(Duration, NoPadding) {
1831   // Should match the size of a struct with uint32_t alignment and no padding.
1832   using NoPadding = std::array<uint32_t, 3>;
1833   EXPECT_EQ(sizeof(NoPadding), sizeof(absl::Duration));
1834   EXPECT_EQ(alignof(NoPadding), alignof(absl::Duration));
1835 }
1836 
1837 }  // namespace
1838