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


grpc
Author(s):
autogenerated on Fri May 16 2025 02:58:17