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