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