third_party/abseil-cpp/absl/time/time_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 #include "absl/time/time.h"
16 
17 #if defined(_MSC_VER)
18 #include <winsock2.h> // for timeval
19 #endif
20 
21 #include <chrono> // NOLINT(build/c++11)
22 #include <cstring>
23 #include <ctime>
24 #include <iomanip>
25 #include <limits>
26 #include <string>
27 
28 #include "gmock/gmock.h"
29 #include "gtest/gtest.h"
30 #include "absl/numeric/int128.h"
31 #include "absl/time/clock.h"
32 #include "absl/time/internal/test_util.h"
33 
34 namespace {
35 
36 #if defined(GTEST_USES_SIMPLE_RE) && GTEST_USES_SIMPLE_RE
37 const char kZoneAbbrRE[] = ".*"; // just punt
38 #else
39 const char kZoneAbbrRE[] = "[A-Za-z]{3,4}|[-+][0-9]{2}([0-9]{2})?";
40 #endif
41 
42 // This helper is a macro so that failed expectations show up with the
43 // correct line numbers.
44 #define EXPECT_CIVIL_INFO(ci, y, m, d, h, min, s, off, isdst) \
45  do { \
46  EXPECT_EQ(y, ci.cs.year()); \
47  EXPECT_EQ(m, ci.cs.month()); \
48  EXPECT_EQ(d, ci.cs.day()); \
49  EXPECT_EQ(h, ci.cs.hour()); \
50  EXPECT_EQ(min, ci.cs.minute()); \
51  EXPECT_EQ(s, ci.cs.second()); \
52  EXPECT_EQ(off, ci.offset); \
53  EXPECT_EQ(isdst, ci.is_dst); \
54  EXPECT_THAT(ci.zone_abbr, testing::MatchesRegex(kZoneAbbrRE)); \
55  } while (0)
56 
57 // A gMock matcher to match timespec values. Use this matcher like:
58 // timespec ts1, ts2;
59 // EXPECT_THAT(ts1, TimespecMatcher(ts2));
60 MATCHER_P(TimespecMatcher, ts, "") {
61  if (ts.tv_sec == arg.tv_sec && ts.tv_nsec == arg.tv_nsec) return true;
62  *result_listener << "expected: {" << ts.tv_sec << ", " << ts.tv_nsec << "} ";
63  *result_listener << "actual: {" << arg.tv_sec << ", " << arg.tv_nsec << "}";
64  return false;
65 }
66 
67 // A gMock matcher to match timeval values. Use this matcher like:
68 // timeval tv1, tv2;
69 // EXPECT_THAT(tv1, TimevalMatcher(tv2));
70 MATCHER_P(TimevalMatcher, tv, "") {
71  if (tv.tv_sec == arg.tv_sec && tv.tv_usec == arg.tv_usec) return true;
72  *result_listener << "expected: {" << tv.tv_sec << ", " << tv.tv_usec << "} ";
73  *result_listener << "actual: {" << arg.tv_sec << ", " << arg.tv_usec << "}";
74  return false;
75 }
76 
77 TEST(Time, ConstExpr) {
78  constexpr absl::Time t0 = absl::UnixEpoch();
79  static_assert(t0 == absl::Time(), "UnixEpoch");
80  constexpr absl::Time t1 = absl::InfiniteFuture();
81  static_assert(t1 != absl::Time(), "InfiniteFuture");
82  constexpr absl::Time t2 = absl::InfinitePast();
83  static_assert(t2 != absl::Time(), "InfinitePast");
84  constexpr absl::Time t3 = absl::FromUnixNanos(0);
85  static_assert(t3 == absl::Time(), "FromUnixNanos");
86  constexpr absl::Time t4 = absl::FromUnixMicros(0);
87  static_assert(t4 == absl::Time(), "FromUnixMicros");
88  constexpr absl::Time t5 = absl::FromUnixMillis(0);
89  static_assert(t5 == absl::Time(), "FromUnixMillis");
90  constexpr absl::Time t6 = absl::FromUnixSeconds(0);
91  static_assert(t6 == absl::Time(), "FromUnixSeconds");
92  constexpr absl::Time t7 = absl::FromTimeT(0);
93  static_assert(t7 == absl::Time(), "FromTimeT");
94 }
95 
96 TEST(Time, ValueSemantics) {
97  absl::Time a; // Default construction
98  absl::Time b = a; // Copy construction
99  EXPECT_EQ(a, b);
100  absl::Time c(a); // Copy construction (again)
101  EXPECT_EQ(a, b);
102  EXPECT_EQ(a, c);
103  EXPECT_EQ(b, c);
104  b = c; // Assignment
105  EXPECT_EQ(a, b);
106  EXPECT_EQ(a, c);
107  EXPECT_EQ(b, c);
108 }
109 
110 TEST(Time, UnixEpoch) {
111  const auto ci = absl::UTCTimeZone().At(absl::UnixEpoch());
112  EXPECT_EQ(absl::CivilSecond(1970, 1, 1, 0, 0, 0), ci.cs);
113  EXPECT_EQ(absl::ZeroDuration(), ci.subsecond);
114  EXPECT_EQ(absl::Weekday::thursday, absl::GetWeekday(ci.cs));
115 }
116 
117 TEST(Time, Breakdown) {
118  absl::TimeZone tz = absl::time_internal::LoadTimeZone("America/New_York");
120 
121  // The Unix epoch as seen in NYC.
122  auto ci = tz.At(t);
123  EXPECT_CIVIL_INFO(ci, 1969, 12, 31, 19, 0, 0, -18000, false);
124  EXPECT_EQ(absl::ZeroDuration(), ci.subsecond);
125  EXPECT_EQ(absl::Weekday::wednesday, absl::GetWeekday(ci.cs));
126 
127  // Just before the epoch.
128  t -= absl::Nanoseconds(1);
129  ci = tz.At(t);
130  EXPECT_CIVIL_INFO(ci, 1969, 12, 31, 18, 59, 59, -18000, false);
131  EXPECT_EQ(absl::Nanoseconds(999999999), ci.subsecond);
132  EXPECT_EQ(absl::Weekday::wednesday, absl::GetWeekday(ci.cs));
133 
134  // Some time later.
135  t += absl::Hours(24) * 2735;
136  t += absl::Hours(18) + absl::Minutes(30) + absl::Seconds(15) +
138  ci = tz.At(t);
139  EXPECT_CIVIL_INFO(ci, 1977, 6, 28, 14, 30, 15, -14400, true);
140  EXPECT_EQ(8, ci.subsecond / absl::Nanoseconds(1));
141  EXPECT_EQ(absl::Weekday::tuesday, absl::GetWeekday(ci.cs));
142 }
143 
144 TEST(Time, AdditiveOperators) {
146  const absl::Time t0;
147  const absl::Time t1 = t0 + d;
148 
149  EXPECT_EQ(d, t1 - t0);
150  EXPECT_EQ(-d, t0 - t1);
151  EXPECT_EQ(t0, t1 - d);
152 
153  absl::Time t(t0);
154  EXPECT_EQ(t0, t);
155  t += d;
156  EXPECT_EQ(t0 + d, t);
157  EXPECT_EQ(d, t - t0);
158  t -= d;
159  EXPECT_EQ(t0, t);
160 
161  // Tests overflow between subseconds and seconds.
162  t = absl::UnixEpoch();
163  t += absl::Milliseconds(500);
165  t += absl::Milliseconds(600);
167  t -= absl::Milliseconds(600);
169  t -= absl::Milliseconds(500);
171 }
172 
173 TEST(Time, RelationalOperators) {
174  constexpr absl::Time t1 = absl::FromUnixNanos(0);
175  constexpr absl::Time t2 = absl::FromUnixNanos(1);
176  constexpr absl::Time t3 = absl::FromUnixNanos(2);
177 
178  static_assert(absl::Time() == t1, "");
179  static_assert(t1 == t1, "");
180  static_assert(t2 == t2, "");
181  static_assert(t3 == t3, "");
182 
183  static_assert(t1 < t2, "");
184  static_assert(t2 < t3, "");
185  static_assert(t1 < t3, "");
186 
187  static_assert(t1 <= t1, "");
188  static_assert(t1 <= t2, "");
189  static_assert(t2 <= t2, "");
190  static_assert(t2 <= t3, "");
191  static_assert(t3 <= t3, "");
192  static_assert(t1 <= t3, "");
193 
194  static_assert(t2 > t1, "");
195  static_assert(t3 > t2, "");
196  static_assert(t3 > t1, "");
197 
198  static_assert(t2 >= t2, "");
199  static_assert(t2 >= t1, "");
200  static_assert(t3 >= t3, "");
201  static_assert(t3 >= t2, "");
202  static_assert(t1 >= t1, "");
203  static_assert(t3 >= t1, "");
204 }
205 
206 TEST(Time, Infinity) {
207  constexpr absl::Time ifuture = absl::InfiniteFuture();
208  constexpr absl::Time ipast = absl::InfinitePast();
209 
210  static_assert(ifuture == ifuture, "");
211  static_assert(ipast == ipast, "");
212  static_assert(ipast < ifuture, "");
213  static_assert(ifuture > ipast, "");
214 
215  // Arithmetic saturates
216  EXPECT_EQ(ifuture, ifuture + absl::Seconds(1));
217  EXPECT_EQ(ifuture, ifuture - absl::Seconds(1));
218  EXPECT_EQ(ipast, ipast + absl::Seconds(1));
219  EXPECT_EQ(ipast, ipast - absl::Seconds(1));
220 
221  EXPECT_EQ(absl::InfiniteDuration(), ifuture - ifuture);
222  EXPECT_EQ(absl::InfiniteDuration(), ifuture - ipast);
223  EXPECT_EQ(-absl::InfiniteDuration(), ipast - ifuture);
224  EXPECT_EQ(-absl::InfiniteDuration(), ipast - ipast);
225 
226  constexpr absl::Time t = absl::UnixEpoch(); // Any finite time.
227  static_assert(t < ifuture, "");
228  static_assert(t > ipast, "");
229 
230  EXPECT_EQ(ifuture, t + absl::InfiniteDuration());
231  EXPECT_EQ(ipast, t - absl::InfiniteDuration());
232 }
233 
234 TEST(Time, FloorConversion) {
235 #define TEST_FLOOR_CONVERSION(TO, FROM) \
236  EXPECT_EQ(1, TO(FROM(1001))); \
237  EXPECT_EQ(1, TO(FROM(1000))); \
238  EXPECT_EQ(0, TO(FROM(999))); \
239  EXPECT_EQ(0, TO(FROM(1))); \
240  EXPECT_EQ(0, TO(FROM(0))); \
241  EXPECT_EQ(-1, TO(FROM(-1))); \
242  EXPECT_EQ(-1, TO(FROM(-999))); \
243  EXPECT_EQ(-1, TO(FROM(-1000))); \
244  EXPECT_EQ(-2, TO(FROM(-1001)));
245 
250 
251 #undef TEST_FLOOR_CONVERSION
252 
253  // Tests ToUnixNanos.
258  EXPECT_EQ(-1,
261  EXPECT_EQ(-2,
263 
264  // Tests ToUniversal, which uses a different epoch than the tests above.
265  EXPECT_EQ(1,
267  EXPECT_EQ(1,
269  EXPECT_EQ(0,
271  EXPECT_EQ(0,
273  EXPECT_EQ(0,
275  EXPECT_EQ(-1,
277  EXPECT_EQ(-1,
279  EXPECT_EQ(
281  EXPECT_EQ(
283 
284  // Tests ToTimespec()/TimeFromTimespec()
285  const struct {
286  absl::Time t;
287  timespec ts;
288  } to_ts[] = {
289  {absl::FromUnixSeconds(1) + absl::Nanoseconds(1), {1, 1}},
290  {absl::FromUnixSeconds(1) + absl::Nanoseconds(1) / 2, {1, 0}},
291  {absl::FromUnixSeconds(1) + absl::Nanoseconds(0), {1, 0}},
292  {absl::FromUnixSeconds(0) + absl::Nanoseconds(0), {0, 0}},
293  {absl::FromUnixSeconds(0) - absl::Nanoseconds(1) / 2, {-1, 999999999}},
294  {absl::FromUnixSeconds(0) - absl::Nanoseconds(1), {-1, 999999999}},
295  {absl::FromUnixSeconds(-1) + absl::Nanoseconds(1), {-1, 1}},
296  {absl::FromUnixSeconds(-1) + absl::Nanoseconds(1) / 2, {-1, 0}},
297  {absl::FromUnixSeconds(-1) + absl::Nanoseconds(0), {-1, 0}},
298  {absl::FromUnixSeconds(-1) - absl::Nanoseconds(1) / 2, {-2, 999999999}},
299  };
300  for (const auto& test : to_ts) {
301  EXPECT_THAT(absl::ToTimespec(test.t), TimespecMatcher(test.ts));
302  }
303  const struct {
304  timespec ts;
305  absl::Time t;
306  } from_ts[] = {
307  {{1, 1}, absl::FromUnixSeconds(1) + absl::Nanoseconds(1)},
308  {{1, 0}, absl::FromUnixSeconds(1) + absl::Nanoseconds(0)},
309  {{0, 0}, absl::FromUnixSeconds(0) + absl::Nanoseconds(0)},
310  {{0, -1}, absl::FromUnixSeconds(0) - absl::Nanoseconds(1)},
311  {{-1, 999999999}, absl::FromUnixSeconds(0) - absl::Nanoseconds(1)},
312  {{-1, 1}, absl::FromUnixSeconds(-1) + absl::Nanoseconds(1)},
313  {{-1, 0}, absl::FromUnixSeconds(-1) + absl::Nanoseconds(0)},
314  {{-1, -1}, absl::FromUnixSeconds(-1) - absl::Nanoseconds(1)},
315  {{-2, 999999999}, absl::FromUnixSeconds(-1) - absl::Nanoseconds(1)},
316  };
317  for (const auto& test : from_ts) {
319  }
320 
321  // Tests ToTimeval()/TimeFromTimeval() (same as timespec above)
322  const struct {
323  absl::Time t;
324  timeval tv;
325  } to_tv[] = {
326  {absl::FromUnixSeconds(1) + absl::Microseconds(1), {1, 1}},
327  {absl::FromUnixSeconds(1) + absl::Microseconds(1) / 2, {1, 0}},
328  {absl::FromUnixSeconds(1) + absl::Microseconds(0), {1, 0}},
329  {absl::FromUnixSeconds(0) + absl::Microseconds(0), {0, 0}},
330  {absl::FromUnixSeconds(0) - absl::Microseconds(1) / 2, {-1, 999999}},
331  {absl::FromUnixSeconds(0) - absl::Microseconds(1), {-1, 999999}},
332  {absl::FromUnixSeconds(-1) + absl::Microseconds(1), {-1, 1}},
333  {absl::FromUnixSeconds(-1) + absl::Microseconds(1) / 2, {-1, 0}},
334  {absl::FromUnixSeconds(-1) + absl::Microseconds(0), {-1, 0}},
335  {absl::FromUnixSeconds(-1) - absl::Microseconds(1) / 2, {-2, 999999}},
336  };
337  for (const auto& test : to_tv) {
338  EXPECT_THAT(ToTimeval(test.t), TimevalMatcher(test.tv));
339  }
340  const struct {
341  timeval tv;
342  absl::Time t;
343  } from_tv[] = {
344  {{1, 1}, absl::FromUnixSeconds(1) + absl::Microseconds(1)},
345  {{1, 0}, absl::FromUnixSeconds(1) + absl::Microseconds(0)},
346  {{0, 0}, absl::FromUnixSeconds(0) + absl::Microseconds(0)},
347  {{0, -1}, absl::FromUnixSeconds(0) - absl::Microseconds(1)},
348  {{-1, 999999}, absl::FromUnixSeconds(0) - absl::Microseconds(1)},
349  {{-1, 1}, absl::FromUnixSeconds(-1) + absl::Microseconds(1)},
350  {{-1, 0}, absl::FromUnixSeconds(-1) + absl::Microseconds(0)},
351  {{-1, -1}, absl::FromUnixSeconds(-1) - absl::Microseconds(1)},
352  {{-2, 999999}, absl::FromUnixSeconds(-1) - absl::Microseconds(1)},
353  };
354  for (const auto& test : from_tv) {
356  }
357 
358  // Tests flooring near negative infinity.
359  const int64_t min_plus_1 = std::numeric_limits<int64_t>::min() + 1;
360  EXPECT_EQ(min_plus_1, absl::ToUnixSeconds(absl::FromUnixSeconds(min_plus_1)));
363  absl::Nanoseconds(1) / 2));
364 
365  // Tests flooring near positive infinity.
369  absl::Nanoseconds(1) / 2));
376  absl::Nanoseconds(1) / 2));
377 }
378 
379 TEST(Time, RoundtripConversion) {
380 #if defined(ABSL_SKIP_TIME_TESTS_BROKEN_ON_MSVC_OPT) && \
381  ABSL_SKIP_TIME_TESTS_BROKEN_ON_MSVC_OPT
382  GTEST_SKIP();
383 #endif
384 
385 #define TEST_CONVERSION_ROUND_TRIP(SOURCE, FROM, TO, MATCHER) \
386  EXPECT_THAT(TO(FROM(SOURCE)), MATCHER(SOURCE))
387 
388  // FromUnixNanos() and ToUnixNanos()
391  testing::Eq);
393  testing::Eq);
395  testing::Eq);
397  testing::Eq)
398  << now_ns;
399 
400  // FromUnixMicros() and ToUnixMicros()
401  int64_t now_us = absl::GetCurrentTimeNanos() / 1000;
403  testing::Eq);
405  testing::Eq);
407  testing::Eq);
409  testing::Eq)
410  << now_us;
411 
412  // FromUnixMillis() and ToUnixMillis()
413  int64_t now_ms = absl::GetCurrentTimeNanos() / 1000000;
415  testing::Eq);
417  testing::Eq);
419  testing::Eq);
421  testing::Eq)
422  << now_ms;
423 
424  // FromUnixSeconds() and ToUnixSeconds()
425  int64_t now_s = std::time(nullptr);
427  testing::Eq);
429  testing::Eq);
431  testing::Eq);
433  testing::Eq)
434  << now_s;
435 
436  // FromTimeT() and ToTimeT()
437  time_t now_time_t = std::time(nullptr);
442  testing::Eq)
443  << now_time_t;
444 
445  // TimeFromTimeval() and ToTimeval()
446  timeval tv;
447  tv.tv_sec = -1;
448  tv.tv_usec = 0;
450  TimevalMatcher);
451  tv.tv_sec = -1;
452  tv.tv_usec = 999999;
454  TimevalMatcher);
455  tv.tv_sec = 0;
456  tv.tv_usec = 0;
458  TimevalMatcher);
459  tv.tv_sec = 0;
460  tv.tv_usec = 1;
462  TimevalMatcher);
463  tv.tv_sec = 1;
464  tv.tv_usec = 0;
466  TimevalMatcher);
467 
468  // TimeFromTimespec() and ToTimespec()
469  timespec ts;
470  ts.tv_sec = -1;
471  ts.tv_nsec = 0;
473  TimespecMatcher);
474  ts.tv_sec = -1;
475  ts.tv_nsec = 999999999;
477  TimespecMatcher);
478  ts.tv_sec = 0;
479  ts.tv_nsec = 0;
481  TimespecMatcher);
482  ts.tv_sec = 0;
483  ts.tv_nsec = 1;
485  TimespecMatcher);
486  ts.tv_sec = 1;
487  ts.tv_nsec = 0;
489  TimespecMatcher);
490 
491  // FromUDate() and ToUDate()
492  double now_ud = absl::GetCurrentTimeNanos() / 1000000;
509  << std::fixed << std::setprecision(17) << now_ud;
510 
511  // FromUniversal() and ToUniversal()
512  int64_t now_uni = ((719162LL * (24 * 60 * 60)) * (1000 * 1000 * 10)) +
513  (absl::GetCurrentTimeNanos() / 100);
515  testing::Eq);
517  testing::Eq);
519  testing::Eq);
521  testing::Eq)
522  << now_uni;
523 
524 #undef TEST_CONVERSION_ROUND_TRIP
525 }
526 
527 template <typename Duration>
528 std::chrono::system_clock::time_point MakeChronoUnixTime(const Duration& d) {
529  return std::chrono::system_clock::from_time_t(0) + d;
530 }
531 
532 TEST(Time, FromChrono) {
534  absl::FromChrono(std::chrono::system_clock::from_time_t(-1)));
536  absl::FromChrono(std::chrono::system_clock::from_time_t(0)));
538  absl::FromChrono(std::chrono::system_clock::from_time_t(1)));
539 
540  EXPECT_EQ(
542  absl::FromChrono(MakeChronoUnixTime(std::chrono::milliseconds(-1))));
544  absl::FromChrono(MakeChronoUnixTime(std::chrono::milliseconds(0))));
546  absl::FromChrono(MakeChronoUnixTime(std::chrono::milliseconds(1))));
547 
548  // Chrono doesn't define exactly its range and precision (neither does
549  // absl::Time), so let's simply test +/- ~100 years to make sure things work.
550  const auto century_sec = 60 * 60 * 24 * 365 * int64_t{100};
551  const auto century = std::chrono::seconds(century_sec);
552  const auto chrono_future = MakeChronoUnixTime(century);
553  const auto chrono_past = MakeChronoUnixTime(-century);
554  EXPECT_EQ(absl::FromUnixSeconds(century_sec),
555  absl::FromChrono(chrono_future));
556  EXPECT_EQ(absl::FromUnixSeconds(-century_sec), absl::FromChrono(chrono_past));
557 
558  // Roundtrip them both back to chrono.
559  EXPECT_EQ(chrono_future,
561  EXPECT_EQ(chrono_past,
563 }
564 
565 TEST(Time, ToChronoTime) {
566 #if defined(ABSL_SKIP_TIME_TESTS_BROKEN_ON_MSVC_OPT) && \
567  ABSL_SKIP_TIME_TESTS_BROKEN_ON_MSVC_OPT
568  GTEST_SKIP();
569 #endif
570 
571  EXPECT_EQ(std::chrono::system_clock::from_time_t(-1),
573  EXPECT_EQ(std::chrono::system_clock::from_time_t(0),
575  EXPECT_EQ(std::chrono::system_clock::from_time_t(1),
577 
578  EXPECT_EQ(MakeChronoUnixTime(std::chrono::milliseconds(-1)),
580  EXPECT_EQ(MakeChronoUnixTime(std::chrono::milliseconds(0)),
582  EXPECT_EQ(MakeChronoUnixTime(std::chrono::milliseconds(1)),
584 
585  // Time before the Unix epoch should floor, not trunc.
586  const auto tick = absl::Nanoseconds(1) / 4;
587  EXPECT_EQ(std::chrono::system_clock::from_time_t(0) -
588  std::chrono::system_clock::duration(1),
590 }
591 
592 // Check that absl::int128 works as a std::chrono::duration representation.
593 TEST(Time, Chrono128) {
594  // Define a std::chrono::time_point type whose time[sic]_since_epoch() is
595  // a signed 128-bit count of attoseconds. This has a range and resolution
596  // (currently) beyond those of absl::Time, and undoubtedly also beyond those
597  // of std::chrono::system_clock::time_point.
598  //
599  // Note: The to/from-chrono support should probably be updated to handle
600  // such wide representations.
601  using Timestamp =
602  std::chrono::time_point<std::chrono::system_clock,
603  std::chrono::duration<absl::int128, std::atto>>;
604 
605  // Expect that we can round-trip the std::chrono::system_clock::time_point
606  // extremes through both absl::Time and Timestamp, and that Timestamp can
607  // handle the (current) absl::Time extremes.
608  //
609  // Note: We should use std::chrono::floor() instead of time_point_cast(),
610  // but floor() is only available since c++17.
611  for (const auto tp : {std::chrono::system_clock::time_point::min(),
614  EXPECT_EQ(tp, std::chrono::time_point_cast<
615  std::chrono::system_clock::time_point::duration>(
616  std::chrono::time_point_cast<Timestamp::duration>(tp)));
617  }
619  v *= Timestamp::duration::period::den;
620  auto ts = Timestamp(Timestamp::duration(v));
621  ts += std::chrono::duration<int64_t, std::atto>(0);
623  ts.time_since_epoch().count() / Timestamp::duration::period::den);
624  EXPECT_EQ(0,
625  ts.time_since_epoch().count() % Timestamp::duration::period::den);
627  v *= Timestamp::duration::period::den;
628  ts = Timestamp(Timestamp::duration(v));
629  ts += std::chrono::duration<int64_t, std::atto>(999999999750000000);
631  ts.time_since_epoch().count() / Timestamp::duration::period::den);
632  EXPECT_EQ(999999999750000000,
633  ts.time_since_epoch().count() % Timestamp::duration::period::den);
634 }
635 
636 TEST(Time, TimeZoneAt) {
637  const absl::TimeZone nyc =
638  absl::time_internal::LoadTimeZone("America/New_York");
639  const std::string fmt = "%a, %e %b %Y %H:%M:%S %z (%Z)";
640 
641  // A non-transition where the civil time is unique.
642  absl::CivilSecond nov01(2013, 11, 1, 8, 30, 0);
643  const auto nov01_ci = nyc.At(nov01);
645  EXPECT_EQ("Fri, 1 Nov 2013 08:30:00 -0400 (EDT)",
646  absl::FormatTime(fmt, nov01_ci.pre, nyc));
647  EXPECT_EQ(nov01_ci.pre, nov01_ci.trans);
648  EXPECT_EQ(nov01_ci.pre, nov01_ci.post);
649  EXPECT_EQ(nov01_ci.pre, absl::FromCivil(nov01, nyc));
650 
651  // A Spring DST transition, when there is a gap in civil time
652  // and we prefer the later of the possible interpretations of a
653  // non-existent time.
654  absl::CivilSecond mar13(2011, 3, 13, 2, 15, 0);
655  const auto mar_ci = nyc.At(mar13);
657  EXPECT_EQ("Sun, 13 Mar 2011 03:15:00 -0400 (EDT)",
658  absl::FormatTime(fmt, mar_ci.pre, nyc));
659  EXPECT_EQ("Sun, 13 Mar 2011 03:00:00 -0400 (EDT)",
660  absl::FormatTime(fmt, mar_ci.trans, nyc));
661  EXPECT_EQ("Sun, 13 Mar 2011 01:15:00 -0500 (EST)",
662  absl::FormatTime(fmt, mar_ci.post, nyc));
663  EXPECT_EQ(mar_ci.trans, absl::FromCivil(mar13, nyc));
664 
665  // A Fall DST transition, when civil times are repeated and
666  // we prefer the earlier of the possible interpretations of an
667  // ambiguous time.
668  absl::CivilSecond nov06(2011, 11, 6, 1, 15, 0);
669  const auto nov06_ci = nyc.At(nov06);
671  EXPECT_EQ("Sun, 6 Nov 2011 01:15:00 -0400 (EDT)",
672  absl::FormatTime(fmt, nov06_ci.pre, nyc));
673  EXPECT_EQ("Sun, 6 Nov 2011 01:00:00 -0500 (EST)",
674  absl::FormatTime(fmt, nov06_ci.trans, nyc));
675  EXPECT_EQ("Sun, 6 Nov 2011 01:15:00 -0500 (EST)",
676  absl::FormatTime(fmt, nov06_ci.post, nyc));
677  EXPECT_EQ(nov06_ci.pre, absl::FromCivil(nov06, nyc));
678 
679  // Check that (time_t) -1 is handled correctly.
680  absl::CivilSecond minus1(1969, 12, 31, 18, 59, 59);
681  const auto minus1_cl = nyc.At(minus1);
683  EXPECT_EQ(-1, absl::ToTimeT(minus1_cl.pre));
684  EXPECT_EQ("Wed, 31 Dec 1969 18:59:59 -0500 (EST)",
685  absl::FormatTime(fmt, minus1_cl.pre, nyc));
686  EXPECT_EQ("Wed, 31 Dec 1969 23:59:59 +0000 (UTC)",
687  absl::FormatTime(fmt, minus1_cl.pre, absl::UTCTimeZone()));
688 }
689 
690 // FromCivil(CivilSecond(year, mon, day, hour, min, sec), UTCTimeZone())
691 // has a specialized fastpath implementation, which we exercise here.
692 TEST(Time, FromCivilUTC) {
693  const absl::TimeZone utc = absl::UTCTimeZone();
694  const std::string fmt = "%a, %e %b %Y %H:%M:%S %z (%Z)";
695  const int kMax = std::numeric_limits<int>::max();
696  const int kMin = std::numeric_limits<int>::min();
697  absl::Time t;
698 
699  // 292091940881 is the last positive year to use the fastpath.
700  t = absl::FromCivil(
701  absl::CivilSecond(292091940881, kMax, kMax, kMax, kMax, kMax), utc);
702  EXPECT_EQ("Fri, 25 Nov 292277026596 12:21:07 +0000 (UTC)",
703  absl::FormatTime(fmt, t, utc));
704  t = absl::FromCivil(
705  absl::CivilSecond(292091940882, kMax, kMax, kMax, kMax, kMax), utc);
706  EXPECT_EQ("infinite-future", absl::FormatTime(fmt, t, utc)); // no overflow
707 
708  // -292091936940 is the last negative year to use the fastpath.
709  t = absl::FromCivil(
710  absl::CivilSecond(-292091936940, kMin, kMin, kMin, kMin, kMin), utc);
711  EXPECT_EQ("Fri, 1 Nov -292277022657 10:37:52 +0000 (UTC)",
712  absl::FormatTime(fmt, t, utc));
713  t = absl::FromCivil(
714  absl::CivilSecond(-292091936941, kMin, kMin, kMin, kMin, kMin), utc);
715  EXPECT_EQ("infinite-past", absl::FormatTime(fmt, t, utc)); // no underflow
716 
717  // Check that we're counting leap years correctly.
718  t = absl::FromCivil(absl::CivilSecond(1900, 2, 28, 23, 59, 59), utc);
719  EXPECT_EQ("Wed, 28 Feb 1900 23:59:59 +0000 (UTC)",
720  absl::FormatTime(fmt, t, utc));
721  t = absl::FromCivil(absl::CivilSecond(1900, 3, 1, 0, 0, 0), utc);
722  EXPECT_EQ("Thu, 1 Mar 1900 00:00:00 +0000 (UTC)",
723  absl::FormatTime(fmt, t, utc));
724  t = absl::FromCivil(absl::CivilSecond(2000, 2, 29, 23, 59, 59), utc);
725  EXPECT_EQ("Tue, 29 Feb 2000 23:59:59 +0000 (UTC)",
726  absl::FormatTime(fmt, t, utc));
727  t = absl::FromCivil(absl::CivilSecond(2000, 3, 1, 0, 0, 0), utc);
728  EXPECT_EQ("Wed, 1 Mar 2000 00:00:00 +0000 (UTC)",
729  absl::FormatTime(fmt, t, utc));
730 }
731 
732 TEST(Time, ToTM) {
733  const absl::TimeZone utc = absl::UTCTimeZone();
734 
735  // Compares the results of ToTM() to gmtime_r() for lots of times over the
736  // course of a few days.
737  const absl::Time start =
738  absl::FromCivil(absl::CivilSecond(2014, 1, 2, 3, 4, 5), utc);
739  const absl::Time end =
740  absl::FromCivil(absl::CivilSecond(2014, 1, 5, 3, 4, 5), utc);
741  for (absl::Time t = start; t < end; t += absl::Seconds(30)) {
742  const struct tm tm_bt = ToTM(t, utc);
743  const time_t tt = absl::ToTimeT(t);
744  struct tm tm_lc;
745 #ifdef _WIN32
746  gmtime_s(&tm_lc, &tt);
747 #else
748  gmtime_r(&tt, &tm_lc);
749 #endif
750  EXPECT_EQ(tm_lc.tm_year, tm_bt.tm_year);
751  EXPECT_EQ(tm_lc.tm_mon, tm_bt.tm_mon);
752  EXPECT_EQ(tm_lc.tm_mday, tm_bt.tm_mday);
753  EXPECT_EQ(tm_lc.tm_hour, tm_bt.tm_hour);
754  EXPECT_EQ(tm_lc.tm_min, tm_bt.tm_min);
755  EXPECT_EQ(tm_lc.tm_sec, tm_bt.tm_sec);
756  EXPECT_EQ(tm_lc.tm_wday, tm_bt.tm_wday);
757  EXPECT_EQ(tm_lc.tm_yday, tm_bt.tm_yday);
758  EXPECT_EQ(tm_lc.tm_isdst, tm_bt.tm_isdst);
759 
760  ASSERT_FALSE(HasFailure());
761  }
762 
763  // Checks that the tm_isdst field is correct when in standard time.
764  const absl::TimeZone nyc =
765  absl::time_internal::LoadTimeZone("America/New_York");
766  absl::Time t = absl::FromCivil(absl::CivilSecond(2014, 3, 1, 0, 0, 0), nyc);
767  struct tm tm = ToTM(t, nyc);
768  EXPECT_FALSE(tm.tm_isdst);
769 
770  // Checks that the tm_isdst field is correct when in daylight time.
771  t = absl::FromCivil(absl::CivilSecond(2014, 4, 1, 0, 0, 0), nyc);
772  tm = ToTM(t, nyc);
773  EXPECT_TRUE(tm.tm_isdst);
774 
775  // Checks overflow.
776  tm = ToTM(absl::InfiniteFuture(), nyc);
777  EXPECT_EQ(std::numeric_limits<int>::max() - 1900, tm.tm_year);
778  EXPECT_EQ(11, tm.tm_mon);
779  EXPECT_EQ(31, tm.tm_mday);
780  EXPECT_EQ(23, tm.tm_hour);
781  EXPECT_EQ(59, tm.tm_min);
782  EXPECT_EQ(59, tm.tm_sec);
783  EXPECT_EQ(4, tm.tm_wday);
784  EXPECT_EQ(364, tm.tm_yday);
785  EXPECT_FALSE(tm.tm_isdst);
786 
787  // Checks underflow.
788  tm = ToTM(absl::InfinitePast(), nyc);
790  EXPECT_EQ(0, tm.tm_mon);
791  EXPECT_EQ(1, tm.tm_mday);
792  EXPECT_EQ(0, tm.tm_hour);
793  EXPECT_EQ(0, tm.tm_min);
794  EXPECT_EQ(0, tm.tm_sec);
795  EXPECT_EQ(0, tm.tm_wday);
796  EXPECT_EQ(0, tm.tm_yday);
797  EXPECT_FALSE(tm.tm_isdst);
798 }
799 
800 TEST(Time, FromTM) {
801  const absl::TimeZone nyc =
802  absl::time_internal::LoadTimeZone("America/New_York");
803 
804  // Verifies that tm_isdst doesn't affect anything when the time is unique.
805  struct tm tm;
806  std::memset(&tm, 0, sizeof(tm));
807  tm.tm_year = 2014 - 1900;
808  tm.tm_mon = 6 - 1;
809  tm.tm_mday = 28;
810  tm.tm_hour = 1;
811  tm.tm_min = 2;
812  tm.tm_sec = 3;
813  tm.tm_isdst = -1;
814  absl::Time t = FromTM(tm, nyc);
815  EXPECT_EQ("2014-06-28T01:02:03-04:00", absl::FormatTime(t, nyc)); // DST
816  tm.tm_isdst = 0;
817  t = FromTM(tm, nyc);
818  EXPECT_EQ("2014-06-28T01:02:03-04:00", absl::FormatTime(t, nyc)); // DST
819  tm.tm_isdst = 1;
820  t = FromTM(tm, nyc);
821  EXPECT_EQ("2014-06-28T01:02:03-04:00", absl::FormatTime(t, nyc)); // DST
822 
823  // Adjusts tm to refer to an ambiguous time.
824  tm.tm_year = 2014 - 1900;
825  tm.tm_mon = 11 - 1;
826  tm.tm_mday = 2;
827  tm.tm_hour = 1;
828  tm.tm_min = 30;
829  tm.tm_sec = 42;
830  tm.tm_isdst = -1;
831  t = FromTM(tm, nyc);
832  EXPECT_EQ("2014-11-02T01:30:42-04:00", absl::FormatTime(t, nyc)); // DST
833  tm.tm_isdst = 0;
834  t = FromTM(tm, nyc);
835  EXPECT_EQ("2014-11-02T01:30:42-05:00", absl::FormatTime(t, nyc)); // STD
836  tm.tm_isdst = 1;
837  t = FromTM(tm, nyc);
838  EXPECT_EQ("2014-11-02T01:30:42-04:00", absl::FormatTime(t, nyc)); // DST
839 
840  // Adjusts tm to refer to a skipped time.
841  tm.tm_year = 2014 - 1900;
842  tm.tm_mon = 3 - 1;
843  tm.tm_mday = 9;
844  tm.tm_hour = 2;
845  tm.tm_min = 30;
846  tm.tm_sec = 42;
847  tm.tm_isdst = -1;
848  t = FromTM(tm, nyc);
849  EXPECT_EQ("2014-03-09T03:30:42-04:00", absl::FormatTime(t, nyc)); // DST
850  tm.tm_isdst = 0;
851  t = FromTM(tm, nyc);
852  EXPECT_EQ("2014-03-09T01:30:42-05:00", absl::FormatTime(t, nyc)); // STD
853  tm.tm_isdst = 1;
854  t = FromTM(tm, nyc);
855  EXPECT_EQ("2014-03-09T03:30:42-04:00", absl::FormatTime(t, nyc)); // DST
856 
857  // Adjusts tm to refer to a time with a year larger than 2147483647.
858  tm.tm_year = 2147483647 - 1900 + 1;
859  tm.tm_mon = 6 - 1;
860  tm.tm_mday = 28;
861  tm.tm_hour = 1;
862  tm.tm_min = 2;
863  tm.tm_sec = 3;
864  tm.tm_isdst = -1;
866  EXPECT_EQ("2147483648-06-28T01:02:03+00:00",
868 
869  // Adjusts tm to refer to a time with a very large month.
870  tm.tm_year = 2019 - 1900;
871  tm.tm_mon = 2147483647;
872  tm.tm_mday = 28;
873  tm.tm_hour = 1;
874  tm.tm_min = 2;
875  tm.tm_sec = 3;
876  tm.tm_isdst = -1;
878  EXPECT_EQ("178958989-08-28T01:02:03+00:00",
880 }
881 
882 TEST(Time, TMRoundTrip) {
883  const absl::TimeZone nyc =
884  absl::time_internal::LoadTimeZone("America/New_York");
885 
886  // Test round-tripping across a skipped transition
887  absl::Time start = absl::FromCivil(absl::CivilHour(2014, 3, 9, 0), nyc);
888  absl::Time end = absl::FromCivil(absl::CivilHour(2014, 3, 9, 4), nyc);
889  for (absl::Time t = start; t < end; t += absl::Minutes(1)) {
890  struct tm tm = ToTM(t, nyc);
891  absl::Time rt = FromTM(tm, nyc);
892  EXPECT_EQ(rt, t);
893  }
894 
895  // Test round-tripping across an ambiguous transition
896  start = absl::FromCivil(absl::CivilHour(2014, 11, 2, 0), nyc);
897  end = absl::FromCivil(absl::CivilHour(2014, 11, 2, 4), nyc);
898  for (absl::Time t = start; t < end; t += absl::Minutes(1)) {
899  struct tm tm = ToTM(t, nyc);
900  absl::Time rt = FromTM(tm, nyc);
901  EXPECT_EQ(rt, t);
902  }
903 
904  // Test round-tripping of unique instants crossing a day boundary
905  start = absl::FromCivil(absl::CivilHour(2014, 6, 27, 22), nyc);
906  end = absl::FromCivil(absl::CivilHour(2014, 6, 28, 4), nyc);
907  for (absl::Time t = start; t < end; t += absl::Minutes(1)) {
908  struct tm tm = ToTM(t, nyc);
909  absl::Time rt = FromTM(tm, nyc);
910  EXPECT_EQ(rt, t);
911  }
912 }
913 
914 TEST(Time, Range) {
915  // The API's documented range is +/- 100 billion years.
916  const absl::Duration range = absl::Hours(24) * 365.2425 * 100000000000;
917 
918  // Arithmetic and comparison still works at +/-range around base values.
919  absl::Time bases[2] = {absl::UnixEpoch(), absl::Now()};
920  for (const auto base : bases) {
921  absl::Time bottom = base - range;
922  EXPECT_GT(bottom, bottom - absl::Nanoseconds(1));
923  EXPECT_LT(bottom, bottom + absl::Nanoseconds(1));
924  absl::Time top = base + range;
927  absl::Duration full_range = 2 * range;
928  EXPECT_EQ(full_range, top - bottom);
929  EXPECT_EQ(-full_range, bottom - top);
930  }
931 }
932 
933 TEST(Time, Limits) {
934  // It is an implementation detail that Time().rep_ == ZeroDuration(),
935  // and that the resolution of a Duration is 1/4 of a nanosecond.
936  const absl::Time zero;
937  const absl::Time max =
939  absl::Nanoseconds(999999999) + absl::Nanoseconds(3) / 4;
940  const absl::Time min =
942 
943  // Some simple max/min bounds checks.
946  EXPECT_LT(zero, max);
947  EXPECT_GT(zero, min);
950 
951  // Check sign of Time differences.
952  EXPECT_LT(absl::ZeroDuration(), max - zero);
954  zero - absl::Nanoseconds(1) / 4 - min); // avoid zero - min
955 
956  // Arithmetic works at max - 0.25ns and min + 0.25ns.
957  EXPECT_GT(max, max - absl::Nanoseconds(1) / 4);
958  EXPECT_LT(min, min + absl::Nanoseconds(1) / 4);
959 }
960 
961 TEST(Time, ConversionSaturation) {
962  const absl::TimeZone utc = absl::UTCTimeZone();
963  absl::Time t;
964 
965  const auto max_time_t = std::numeric_limits<time_t>::max();
966  const auto min_time_t = std::numeric_limits<time_t>::min();
967  time_t tt = max_time_t - 1;
968  t = absl::FromTimeT(tt);
969  tt = absl::ToTimeT(t);
970  EXPECT_EQ(max_time_t - 1, tt);
971  t += absl::Seconds(1);
972  tt = absl::ToTimeT(t);
973  EXPECT_EQ(max_time_t, tt);
974  t += absl::Seconds(1); // no effect
975  tt = absl::ToTimeT(t);
976  EXPECT_EQ(max_time_t, tt);
977 
978  tt = min_time_t + 1;
979  t = absl::FromTimeT(tt);
980  tt = absl::ToTimeT(t);
981  EXPECT_EQ(min_time_t + 1, tt);
982  t -= absl::Seconds(1);
983  tt = absl::ToTimeT(t);
984  EXPECT_EQ(min_time_t, tt);
985  t -= absl::Seconds(1); // no effect
986  tt = absl::ToTimeT(t);
987  EXPECT_EQ(min_time_t, tt);
988 
989  const auto max_timeval_sec =
990  std::numeric_limits<decltype(timeval::tv_sec)>::max();
991  const auto min_timeval_sec =
992  std::numeric_limits<decltype(timeval::tv_sec)>::min();
993  timeval tv;
994  tv.tv_sec = max_timeval_sec;
995  tv.tv_usec = 999998;
996  t = absl::TimeFromTimeval(tv);
997  tv = ToTimeval(t);
998  EXPECT_EQ(max_timeval_sec, tv.tv_sec);
999  EXPECT_EQ(999998, tv.tv_usec);
1000  t += absl::Microseconds(1);
1001  tv = ToTimeval(t);
1002  EXPECT_EQ(max_timeval_sec, tv.tv_sec);
1003  EXPECT_EQ(999999, tv.tv_usec);
1004  t += absl::Microseconds(1); // no effect
1005  tv = ToTimeval(t);
1006  EXPECT_EQ(max_timeval_sec, tv.tv_sec);
1007  EXPECT_EQ(999999, tv.tv_usec);
1008 
1009  tv.tv_sec = min_timeval_sec;
1010  tv.tv_usec = 1;
1011  t = absl::TimeFromTimeval(tv);
1012  tv = ToTimeval(t);
1013  EXPECT_EQ(min_timeval_sec, tv.tv_sec);
1014  EXPECT_EQ(1, tv.tv_usec);
1015  t -= absl::Microseconds(1);
1016  tv = ToTimeval(t);
1017  EXPECT_EQ(min_timeval_sec, tv.tv_sec);
1018  EXPECT_EQ(0, tv.tv_usec);
1019  t -= absl::Microseconds(1); // no effect
1020  tv = ToTimeval(t);
1021  EXPECT_EQ(min_timeval_sec, tv.tv_sec);
1022  EXPECT_EQ(0, tv.tv_usec);
1023 
1024  const auto max_timespec_sec =
1025  std::numeric_limits<decltype(timespec::tv_sec)>::max();
1026  const auto min_timespec_sec =
1027  std::numeric_limits<decltype(timespec::tv_sec)>::min();
1028  timespec ts;
1029  ts.tv_sec = max_timespec_sec;
1030  ts.tv_nsec = 999999998;
1031  t = absl::TimeFromTimespec(ts);
1032  ts = absl::ToTimespec(t);
1033  EXPECT_EQ(max_timespec_sec, ts.tv_sec);
1034  EXPECT_EQ(999999998, ts.tv_nsec);
1035  t += absl::Nanoseconds(1);
1036  ts = absl::ToTimespec(t);
1037  EXPECT_EQ(max_timespec_sec, ts.tv_sec);
1038  EXPECT_EQ(999999999, ts.tv_nsec);
1039  t += absl::Nanoseconds(1); // no effect
1040  ts = absl::ToTimespec(t);
1041  EXPECT_EQ(max_timespec_sec, ts.tv_sec);
1042  EXPECT_EQ(999999999, ts.tv_nsec);
1043 
1044  ts.tv_sec = min_timespec_sec;
1045  ts.tv_nsec = 1;
1046  t = absl::TimeFromTimespec(ts);
1047  ts = absl::ToTimespec(t);
1048  EXPECT_EQ(min_timespec_sec, ts.tv_sec);
1049  EXPECT_EQ(1, ts.tv_nsec);
1050  t -= absl::Nanoseconds(1);
1051  ts = absl::ToTimespec(t);
1052  EXPECT_EQ(min_timespec_sec, ts.tv_sec);
1053  EXPECT_EQ(0, ts.tv_nsec);
1054  t -= absl::Nanoseconds(1); // no effect
1055  ts = absl::ToTimespec(t);
1056  EXPECT_EQ(min_timespec_sec, ts.tv_sec);
1057  EXPECT_EQ(0, ts.tv_nsec);
1058 
1059  // Checks how TimeZone::At() saturates on infinities.
1060  auto ci = utc.At(absl::InfiniteFuture());
1061  EXPECT_CIVIL_INFO(ci, std::numeric_limits<int64_t>::max(), 12, 31, 23, 59, 59,
1062  0, false);
1063  EXPECT_EQ(absl::InfiniteDuration(), ci.subsecond);
1064  EXPECT_EQ(absl::Weekday::thursday, absl::GetWeekday(ci.cs));
1065  EXPECT_EQ(365, absl::GetYearDay(ci.cs));
1066  EXPECT_STREQ("-00", ci.zone_abbr); // artifact of TimeZone::At()
1067  ci = utc.At(absl::InfinitePast());
1068  EXPECT_CIVIL_INFO(ci, std::numeric_limits<int64_t>::min(), 1, 1, 0, 0, 0, 0,
1069  false);
1070  EXPECT_EQ(-absl::InfiniteDuration(), ci.subsecond);
1071  EXPECT_EQ(absl::Weekday::sunday, absl::GetWeekday(ci.cs));
1072  EXPECT_EQ(1, absl::GetYearDay(ci.cs));
1073  EXPECT_STREQ("-00", ci.zone_abbr); // artifact of TimeZone::At()
1074 
1075  // Approach the maximal Time value from below.
1076  t = absl::FromCivil(absl::CivilSecond(292277026596, 12, 4, 15, 30, 6), utc);
1077  EXPECT_EQ("292277026596-12-04T15:30:06+00:00",
1079  t = absl::FromCivil(absl::CivilSecond(292277026596, 12, 4, 15, 30, 7), utc);
1080  EXPECT_EQ("292277026596-12-04T15:30:07+00:00",
1082  EXPECT_EQ(
1084  t);
1085 
1086  // Checks that we can also get the maximal Time value for a far-east zone.
1087  const absl::TimeZone plus14 = absl::FixedTimeZone(14 * 60 * 60);
1088  t = absl::FromCivil(absl::CivilSecond(292277026596, 12, 5, 5, 30, 7), plus14);
1089  EXPECT_EQ("292277026596-12-05T05:30:07+14:00",
1090  absl::FormatTime(absl::RFC3339_full, t, plus14));
1091  EXPECT_EQ(
1093  t);
1094 
1095  // One second later should push us to infinity.
1096  t = absl::FromCivil(absl::CivilSecond(292277026596, 12, 4, 15, 30, 8), utc);
1097  EXPECT_EQ("infinite-future", absl::FormatTime(absl::RFC3339_full, t, utc));
1098 
1099  // Approach the minimal Time value from above.
1100  t = absl::FromCivil(absl::CivilSecond(-292277022657, 1, 27, 8, 29, 53), utc);
1101  EXPECT_EQ("-292277022657-01-27T08:29:53+00:00",
1103  t = absl::FromCivil(absl::CivilSecond(-292277022657, 1, 27, 8, 29, 52), utc);
1104  EXPECT_EQ("-292277022657-01-27T08:29:52+00:00",
1106  EXPECT_EQ(
1108  t);
1109 
1110  // Checks that we can also get the minimal Time value for a far-west zone.
1111  const absl::TimeZone minus12 = absl::FixedTimeZone(-12 * 60 * 60);
1112  t = absl::FromCivil(absl::CivilSecond(-292277022657, 1, 26, 20, 29, 52),
1113  minus12);
1114  EXPECT_EQ("-292277022657-01-26T20:29:52-12:00",
1115  absl::FormatTime(absl::RFC3339_full, t, minus12));
1116  EXPECT_EQ(
1118  t);
1119 
1120  // One second before should push us to -infinity.
1121  t = absl::FromCivil(absl::CivilSecond(-292277022657, 1, 27, 8, 29, 51), utc);
1122  EXPECT_EQ("infinite-past", absl::FormatTime(absl::RFC3339_full, t, utc));
1123 }
1124 
1125 // In zones with POSIX-style recurring rules we use special logic to
1126 // handle conversions in the distant future. Here we check the limits
1127 // of those conversions, particularly with respect to integer overflow.
1128 TEST(Time, ExtendedConversionSaturation) {
1129  const absl::TimeZone syd =
1130  absl::time_internal::LoadTimeZone("Australia/Sydney");
1131  const absl::TimeZone nyc =
1132  absl::time_internal::LoadTimeZone("America/New_York");
1133  const absl::Time max =
1136  absl::Time t;
1137 
1138  // The maximal time converted in each zone.
1139  ci = syd.At(max);
1140  EXPECT_CIVIL_INFO(ci, 292277026596, 12, 5, 2, 30, 7, 39600, true);
1141  t = absl::FromCivil(absl::CivilSecond(292277026596, 12, 5, 2, 30, 7), syd);
1142  EXPECT_EQ(max, t);
1143  ci = nyc.At(max);
1144  EXPECT_CIVIL_INFO(ci, 292277026596, 12, 4, 10, 30, 7, -18000, false);
1145  t = absl::FromCivil(absl::CivilSecond(292277026596, 12, 4, 10, 30, 7), nyc);
1146  EXPECT_EQ(max, t);
1147 
1148  // One second later should push us to infinity.
1149  t = absl::FromCivil(absl::CivilSecond(292277026596, 12, 5, 2, 30, 8), syd);
1151  t = absl::FromCivil(absl::CivilSecond(292277026596, 12, 4, 10, 30, 8), nyc);
1153 
1154  // And we should stick there.
1155  t = absl::FromCivil(absl::CivilSecond(292277026596, 12, 5, 2, 30, 9), syd);
1157  t = absl::FromCivil(absl::CivilSecond(292277026596, 12, 4, 10, 30, 9), nyc);
1159 
1160  // All the way up to a saturated date/time, without overflow.
1165 }
1166 
1167 TEST(Time, FromCivilAlignment) {
1168  const absl::TimeZone utc = absl::UTCTimeZone();
1169  const absl::CivilSecond cs(2015, 2, 3, 4, 5, 6);
1170  absl::Time t = absl::FromCivil(cs, utc);
1171  EXPECT_EQ("2015-02-03T04:05:06+00:00", absl::FormatTime(t, utc));
1173  EXPECT_EQ("2015-02-03T04:05:00+00:00", absl::FormatTime(t, utc));
1175  EXPECT_EQ("2015-02-03T04:00:00+00:00", absl::FormatTime(t, utc));
1177  EXPECT_EQ("2015-02-03T00:00:00+00:00", absl::FormatTime(t, utc));
1179  EXPECT_EQ("2015-02-01T00:00:00+00:00", absl::FormatTime(t, utc));
1181  EXPECT_EQ("2015-01-01T00:00:00+00:00", absl::FormatTime(t, utc));
1182 }
1183 
1184 TEST(Time, LegacyDateTime) {
1185  const absl::TimeZone utc = absl::UTCTimeZone();
1186  const std::string ymdhms = "%Y-%m-%d %H:%M:%S";
1187  const int kMax = std::numeric_limits<int>::max();
1188  const int kMin = std::numeric_limits<int>::min();
1189  absl::Time t;
1190 
1192  kMax, kMax, kMax, kMax, utc);
1193  EXPECT_EQ("infinite-future",
1194  absl::FormatTime(ymdhms, t, utc)); // no overflow
1196  kMin, kMin, kMin, kMin, utc);
1197  EXPECT_EQ("infinite-past", absl::FormatTime(ymdhms, t, utc)); // no overflow
1198 
1199  // Check normalization.
1200  EXPECT_TRUE(absl::ConvertDateTime(2013, 10, 32, 8, 30, 0, utc).normalized);
1201  t = absl::FromDateTime(2015, 1, 1, 0, 0, 60, utc);
1202  EXPECT_EQ("2015-01-01 00:01:00", absl::FormatTime(ymdhms, t, utc));
1203  t = absl::FromDateTime(2015, 1, 1, 0, 60, 0, utc);
1204  EXPECT_EQ("2015-01-01 01:00:00", absl::FormatTime(ymdhms, t, utc));
1205  t = absl::FromDateTime(2015, 1, 1, 24, 0, 0, utc);
1206  EXPECT_EQ("2015-01-02 00:00:00", absl::FormatTime(ymdhms, t, utc));
1207  t = absl::FromDateTime(2015, 1, 32, 0, 0, 0, utc);
1208  EXPECT_EQ("2015-02-01 00:00:00", absl::FormatTime(ymdhms, t, utc));
1209  t = absl::FromDateTime(2015, 13, 1, 0, 0, 0, utc);
1210  EXPECT_EQ("2016-01-01 00:00:00", absl::FormatTime(ymdhms, t, utc));
1211  t = absl::FromDateTime(2015, 13, 32, 60, 60, 60, utc);
1212  EXPECT_EQ("2016-02-03 13:01:00", absl::FormatTime(ymdhms, t, utc));
1213  t = absl::FromDateTime(2015, 1, 1, 0, 0, -1, utc);
1214  EXPECT_EQ("2014-12-31 23:59:59", absl::FormatTime(ymdhms, t, utc));
1215  t = absl::FromDateTime(2015, 1, 1, 0, -1, 0, utc);
1216  EXPECT_EQ("2014-12-31 23:59:00", absl::FormatTime(ymdhms, t, utc));
1217  t = absl::FromDateTime(2015, 1, 1, -1, 0, 0, utc);
1218  EXPECT_EQ("2014-12-31 23:00:00", absl::FormatTime(ymdhms, t, utc));
1219  t = absl::FromDateTime(2015, 1, -1, 0, 0, 0, utc);
1220  EXPECT_EQ("2014-12-30 00:00:00", absl::FormatTime(ymdhms, t, utc));
1221  t = absl::FromDateTime(2015, -1, 1, 0, 0, 0, utc);
1222  EXPECT_EQ("2014-11-01 00:00:00", absl::FormatTime(ymdhms, t, utc));
1223  t = absl::FromDateTime(2015, -1, -1, -1, -1, -1, utc);
1224  EXPECT_EQ("2014-10-29 22:58:59", absl::FormatTime(ymdhms, t, utc));
1225 }
1226 
1227 TEST(Time, NextTransitionUTC) {
1228  const auto tz = absl::UTCTimeZone();
1230 
1231  auto t = absl::InfinitePast();
1232  EXPECT_FALSE(tz.NextTransition(t, &trans));
1233 
1234  t = absl::InfiniteFuture();
1235  EXPECT_FALSE(tz.NextTransition(t, &trans));
1236 }
1237 
1238 TEST(Time, PrevTransitionUTC) {
1239  const auto tz = absl::UTCTimeZone();
1241 
1242  auto t = absl::InfiniteFuture();
1243  EXPECT_FALSE(tz.PrevTransition(t, &trans));
1244 
1245  t = absl::InfinitePast();
1246  EXPECT_FALSE(tz.PrevTransition(t, &trans));
1247 }
1248 
1249 TEST(Time, NextTransitionNYC) {
1250  const auto tz = absl::time_internal::LoadTimeZone("America/New_York");
1252 
1253  auto t = absl::FromCivil(absl::CivilSecond(2018, 6, 30, 0, 0, 0), tz);
1254  EXPECT_TRUE(tz.NextTransition(t, &trans));
1255  EXPECT_EQ(absl::CivilSecond(2018, 11, 4, 2, 0, 0), trans.from);
1256  EXPECT_EQ(absl::CivilSecond(2018, 11, 4, 1, 0, 0), trans.to);
1257 
1258  t = absl::InfiniteFuture();
1259  EXPECT_FALSE(tz.NextTransition(t, &trans));
1260 
1261  t = absl::InfinitePast();
1262  EXPECT_TRUE(tz.NextTransition(t, &trans));
1263  if (trans.from == absl::CivilSecond(1918, 03, 31, 2, 0, 0)) {
1264  // It looks like the tzdata is only 32 bit (probably macOS),
1265  // which bottoms out at 1901-12-13T20:45:52+00:00.
1266  EXPECT_EQ(absl::CivilSecond(1918, 3, 31, 3, 0, 0), trans.to);
1267  } else {
1268  EXPECT_EQ(absl::CivilSecond(1883, 11, 18, 12, 3, 58), trans.from);
1269  EXPECT_EQ(absl::CivilSecond(1883, 11, 18, 12, 0, 0), trans.to);
1270  }
1271 }
1272 
1273 TEST(Time, PrevTransitionNYC) {
1274  const auto tz = absl::time_internal::LoadTimeZone("America/New_York");
1276 
1277  auto t = absl::FromCivil(absl::CivilSecond(2018, 6, 30, 0, 0, 0), tz);
1278  EXPECT_TRUE(tz.PrevTransition(t, &trans));
1279  EXPECT_EQ(absl::CivilSecond(2018, 3, 11, 2, 0, 0), trans.from);
1280  EXPECT_EQ(absl::CivilSecond(2018, 3, 11, 3, 0, 0), trans.to);
1281 
1282  t = absl::InfinitePast();
1283  EXPECT_FALSE(tz.PrevTransition(t, &trans));
1284 
1285  t = absl::InfiniteFuture();
1286  EXPECT_TRUE(tz.PrevTransition(t, &trans));
1287  // We have a transition but we don't know which one.
1288 }
1289 
1290 } // namespace
EXPECT_FALSE
#define EXPECT_FALSE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1970
testing::DoubleEq
internal::FloatingEqMatcher< double > DoubleEq(double rhs)
Definition: cares/cares/test/gmock-1.8.0/gmock/gmock.h:8634
absl::ToTM
struct tm ToTM(absl::Time t, absl::TimeZone tz)
Definition: third_party/abseil-cpp/absl/time/time.cc:449
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::FromTimeT
constexpr Time FromTimeT(time_t t)
Definition: third_party/abseil-cpp/absl/time/time.h:1613
absl::FromChrono
Time FromChrono(const std::chrono::system_clock::time_point &tp)
Definition: third_party/abseil-cpp/absl/time/time.cc:334
absl::ToTimeT
time_t ToTimeT(Time t)
Definition: third_party/abseil-cpp/absl/time/time.cc:277
absl::ToUnixNanos
int64_t ToUnixNanos(Time t)
Definition: third_party/abseil-cpp/absl/time/time.cc:243
test_evm.cs
cs
Definition: test_evm.py:8
absl::ZeroDuration
constexpr Duration ZeroDuration()
Definition: third_party/abseil-cpp/absl/time/time.h:308
memset
return memset(p, 0, total)
absl::Time
Definition: third_party/abseil-cpp/absl/time/time.h:642
absl::time_internal::cctz::detail::civil_time< time_internal::second_tag >
Timestamp
Definition: bloaty/third_party/protobuf/src/google/protobuf/timestamp.pb.h:69
EXPECT_THAT
#define EXPECT_THAT(value, matcher)
absl::FromUniversal
absl::Time FromUniversal(int64_t universal)
Definition: third_party/abseil-cpp/absl/time/time.cc:239
absl::TimeZone::CivilTransition::to
CivilSecond to
Definition: third_party/abseil-cpp/absl/time/time.h:1050
capstone.range
range
Definition: third_party/bloaty/third_party/capstone/bindings/python/capstone/__init__.py:6
absl::time_internal::cctz::time_point
std::chrono::time_point< std::chrono::system_clock, D > time_point
Definition: abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h:39
test
Definition: spinlock_test.cc:36
absl::Nanoseconds
constexpr Duration Nanoseconds(T n)
Definition: third_party/abseil-cpp/absl/time/time.h:407
EXPECT_GT
#define EXPECT_GT(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2036
absl::FromUnixMillis
constexpr Time FromUnixMillis(int64_t ms)
Definition: third_party/abseil-cpp/absl/time/time.h:1605
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
absl::FromUnixNanos
constexpr Time FromUnixNanos(int64_t ns)
Definition: third_party/abseil-cpp/absl/time/time.h:1597
absl::ToUDate
double ToUDate(Time t)
Definition: third_party/abseil-cpp/absl/time/time.cc:279
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
absl::UTCTimeZone
TimeZone UTCTimeZone()
Definition: third_party/abseil-cpp/absl/time/time.h:1099
absl::TimeZone::CivilTransition::from
CivilSecond from
Definition: third_party/abseil-cpp/absl/time/time.h:1049
absl::TimeZone::PrevTransition
bool PrevTransition(Time t, CivilTransition *trans) const
Definition: third_party/abseil-cpp/absl/time/time.cc:394
absl::ConvertDateTime
absl::TimeConversion ConvertDateTime(int64_t year, int mon, int day, int hour, int min, int sec, TimeZone tz)
Definition: third_party/abseil-cpp/absl/time/time.cc:402
absl::ToUnixMillis
int64_t ToUnixMillis(Time t)
Definition: third_party/abseil-cpp/absl/time/time.cc:263
absl::ToUnixMicros
int64_t ToUnixMicros(Time t)
Definition: third_party/abseil-cpp/absl/time/time.cc:253
absl::TimeZone::CivilTransition
Definition: third_party/abseil-cpp/absl/time/time.h:1048
absl::FormatTime
std::string FormatTime(absl::string_view format, absl::Time t, absl::TimeZone tz)
Definition: abseil-cpp/absl/time/format.cc:74
EXPECT_EQ
#define EXPECT_EQ(a, b)
Definition: iomgr/time_averaged_stats_test.cc:27
absl::GetCurrentTimeNanos
ABSL_NAMESPACE_BEGIN int64_t GetCurrentTimeNanos()
Definition: abseil-cpp/absl/time/clock.cc:78
absl::Milliseconds
constexpr Duration Milliseconds(T n)
Definition: third_party/abseil-cpp/absl/time/time.h:415
start
static uint64_t start
Definition: benchmark-pound.c:74
absl::TimeZone::At
CivilInfo At(Time t) const
Definition: third_party/abseil-cpp/absl/time/time.cc:351
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
end
char * end
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1008
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
t0
static int64_t t0
Definition: bloaty/third_party/re2/util/benchmark.cc:44
Timestamp
struct Timestamp Timestamp
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/protobuf.h:672
absl::FixedTimeZone
TimeZone FixedTimeZone(int seconds)
Definition: third_party/abseil-cpp/absl/time/time.h:1091
setup.v
v
Definition: third_party/bloaty/third_party/capstone/bindings/python/setup.py:42
absl::ToTimeval
timeval ToTimeval(Duration d)
Definition: abseil-cpp/absl/time/duration.cc:636
absl::ToUniversal
int64_t ToUniversal(absl::Time t)
Definition: third_party/abseil-cpp/absl/time/time.cc:284
testing::Eq
internal::EqMatcher< T > Eq(T x)
Definition: cares/cares/test/gmock-1.8.0/gmock/gmock.h:8561
absl::TimeZone::TimeInfo::REPEATED
@ REPEATED
Definition: third_party/abseil-cpp/absl/time/time.h:979
absl::RFC3339_full
ABSL_NAMESPACE_BEGIN const ABSL_DLL char RFC3339_full[]
Definition: third_party/abseil-cpp/absl/time/time.h:1261
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
gen_synthetic_protos.base
base
Definition: gen_synthetic_protos.py:31
absl::UnixEpoch
constexpr Time UnixEpoch()
Definition: third_party/abseil-cpp/absl/time/time.h:744
absl::TimeZone::CivilInfo
Definition: third_party/abseil-cpp/absl/time/time.h:931
min
#define min(a, b)
Definition: qsort.h:83
b
uint64_t b
Definition: abseil-cpp/absl/container/internal/layout_test.cc:53
absl::GetWeekday
Weekday GetWeekday(CivilSecond cs)
Definition: abseil-cpp/absl/time/civil_time.h:381
absl::FromUnixMicros
constexpr Time FromUnixMicros(int64_t us)
Definition: third_party/abseil-cpp/absl/time/time.h:1601
absl::FromTM
absl::Time FromTM(const struct tm &tm, absl::TimeZone tz)
Definition: third_party/abseil-cpp/absl/time/time.cc:434
d
static const fe d
Definition: curve25519_tables.h:19
absl::FromUnixSeconds
constexpr Time FromUnixSeconds(int64_t s)
Definition: third_party/abseil-cpp/absl/time/time.h:1609
absl::FromUDate
absl::Time FromUDate(double udate)
Definition: third_party/abseil-cpp/absl/time/time.cc:235
absl::TimeZone::TimeInfo::SKIPPED
@ SKIPPED
Definition: third_party/abseil-cpp/absl/time/time.h:978
absl::time_internal::cctz::detail::civil_time< time_internal::second_tag >::max
static CONSTEXPR_F civil_time() max()
Definition: abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h:404
tm
static uv_timer_t tm
Definition: test-tcp-open.c:41
EXPECT_STREQ
#define EXPECT_STREQ(s1, s2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2095
absl::Seconds
constexpr Duration Seconds(T n)
Definition: third_party/abseil-cpp/absl/time/time.h:419
testing::internal::fmt
GTEST_API_ const char * fmt
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1808
absl::Now
ABSL_NAMESPACE_BEGIN Time Now()
Definition: abseil-cpp/absl/time/clock.cc:39
TEST_CONVERSION_ROUND_TRIP
#define TEST_CONVERSION_ROUND_TRIP(SOURCE, FROM, TO, MATCHER)
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
absl::FromDateTime
Time FromDateTime(int64_t year, int mon, int day, int hour, int min, int sec, TimeZone tz)
Definition: third_party/abseil-cpp/absl/time/time.h:1225
timeval::tv_usec
long tv_usec
Definition: setup_once.h:122
Range
Range(0, 512)
absl::TimeFromTimespec
absl::Time TimeFromTimespec(timespec ts)
Definition: third_party/abseil-cpp/absl/time/time.cc:288
EXPECT_CIVIL_INFO
#define EXPECT_CIVIL_INFO(ci, y, m, d, h, min, s, off, isdst)
Definition: third_party/abseil-cpp/absl/time/time_test.cc:44
timeval
Definition: setup_once.h:113
absl::str_format_internal::LengthMod::t
@ t
absl::Hours
constexpr Duration Hours(T n)
Definition: third_party/abseil-cpp/absl/time/time.h:427
EXPECT_LT
#define EXPECT_LT(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2032
MATCHER_P
#define MATCHER_P(name, p0, description)
Definition: bloaty/third_party/googletest/googlemock/include/gmock/gmock-generated-matchers.h:311
absl::TimeZone::NextTransition
bool NextTransition(Time t, CivilTransition *trans) const
Definition: third_party/abseil-cpp/absl/time/time.cc:390
absl::FromCivil
Time FromCivil(CivilSecond ct, TimeZone tz)
Definition: third_party/abseil-cpp/absl/time/time.h:1158
TEST_FLOOR_CONVERSION
#define TEST_FLOOR_CONVERSION(TO, FROM)
rep
const CordRep * rep
Definition: cord_analysis.cc:53
ASSERT_FALSE
#define ASSERT_FALSE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1976
absl::GetYearDay
int GetYearDay(CivilSecond cs)
Definition: abseil-cpp/absl/time/civil_time.h:433
absl::UniversalEpoch
constexpr Time UniversalEpoch()
Definition: third_party/abseil-cpp/absl/time/time.h:750
absl::ToUnixSeconds
int64_t ToUnixSeconds(Time t)
Definition: third_party/abseil-cpp/absl/time/time.cc:273
absl::InfinitePast
constexpr Time InfinitePast()
Definition: third_party/abseil-cpp/absl/time/time.h:768
EXPECT_GE
#define EXPECT_GE(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2034
absl::Minutes
constexpr Duration Minutes(T n)
Definition: third_party/abseil-cpp/absl/time/time.h:423
EXPECT_TRUE
#define EXPECT_TRUE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1967
absl::time_internal::LoadTimeZone
TimeZone LoadTimeZone(const std::string &name)
Definition: abseil-cpp/absl/time/internal/test_util.cc:32
Duration
Definition: bloaty/third_party/protobuf/src/google/protobuf/duration.pb.h:69
absl::ToChronoTime
std::chrono::system_clock::time_point ToChronoTime(absl::Time t)
Definition: third_party/abseil-cpp/absl/time/time.cc:339
absl::TimeFromTimeval
absl::Time TimeFromTimeval(timeval tv)
Definition: third_party/abseil-cpp/absl/time/time.cc:292
absl::InfiniteDuration
constexpr Duration InfiniteDuration()
Definition: third_party/abseil-cpp/absl/time/time.h:1573
t1
Table t1
Definition: abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc:185
absl::TimeZone::TimeInfo::UNIQUE
@ UNIQUE
Definition: third_party/abseil-cpp/absl/time/time.h:977
top
static upb_pb_encoder_segment * top(upb_pb_encoder *e)
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/upb.c:7624
absl::TimeZone
Definition: third_party/abseil-cpp/absl/time/time.h:912
absl::InfiniteFuture
constexpr Time InfiniteFuture()
Definition: third_party/abseil-cpp/absl/time/time.h:760
LL
#define LL(x)


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:36