• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "base/time/time.h"
6 
7 #include <stdint.h>
8 #include <time.h>
9 #include <limits>
10 #include <string>
11 
12 #include "base/compiler_specific.h"
13 #include "base/logging.h"
14 #include "base/macros.h"
15 #include "base/strings/stringprintf.h"
16 #include "base/threading/platform_thread.h"
17 #include "build/build_config.h"
18 #include "testing/gtest/include/gtest/gtest.h"
19 
20 namespace base {
21 
22 namespace {
23 
TEST(TimeTestOutOfBounds,FromExplodedOutOfBoundsTime)24 TEST(TimeTestOutOfBounds, FromExplodedOutOfBoundsTime) {
25   // FromUTCExploded must set time to Time(0) and failure, if the day is set to
26   // 31 on a 28-30 day month. Test |exploded| returns Time(0) on 31st of
27   // February and 31st of April. New implementation handles this.
28 
29   const struct DateTestData {
30     Time::Exploded explode;
31     bool is_valid;
32   } kDateTestData[] = {
33       // 31st of February
34       {{2016, 2, 0, 31, 12, 30, 0, 0}, true},
35       // 31st of April
36       {{2016, 4, 0, 31, 8, 43, 0, 0}, true},
37       // Negative month
38       {{2016, -5, 0, 2, 4, 10, 0, 0}, false},
39       // Negative date of month
40       {{2016, 6, 0, -15, 2, 50, 0, 0}, false},
41       // Negative hours
42       {{2016, 7, 0, 10, -11, 29, 0, 0}, false},
43       // Negative minutes
44       {{2016, 3, 0, 14, 10, -29, 0, 0}, false},
45       // Negative seconds
46       {{2016, 10, 0, 25, 7, 47, -30, 0}, false},
47       // Negative milliseconds
48       {{2016, 10, 0, 25, 7, 47, 20, -500}, false},
49       // Hours are too large
50       {{2016, 7, 0, 10, 26, 29, 0, 0}, false},
51       // Minutes are too large
52       {{2016, 3, 0, 14, 10, 78, 0, 0}, false},
53       // Seconds are too large
54       {{2016, 10, 0, 25, 7, 47, 234, 0}, false},
55       // Milliseconds are too large
56       {{2016, 10, 0, 25, 6, 31, 23, 1643}, false},
57       // Test overflow. Time is valid, but overflow case
58       // results in Time(0).
59       {{9840633, 1, 0, 1, 1, 1, 0, 0}, true},
60       // Underflow will fail as well.
61       {{-9840633, 1, 0, 1, 1, 1, 0, 0}, true},
62       // Test integer overflow and underflow cases for the values themselves.
63       {{std::numeric_limits<int>::min(), 1, 0, 1, 1, 1, 0, 0}, true},
64       {{std::numeric_limits<int>::max(), 1, 0, 1, 1, 1, 0, 0}, true},
65       {{2016, std::numeric_limits<int>::min(), 0, 1, 1, 1, 0, 0}, false},
66       {{2016, std::numeric_limits<int>::max(), 0, 1, 1, 1, 0, 0}, false},
67   };
68 
69   for (const auto& test : kDateTestData) {
70     EXPECT_EQ(test.explode.HasValidValues(), test.is_valid);
71 
72     base::Time result;
73     EXPECT_FALSE(base::Time::FromUTCExploded(test.explode, &result));
74     EXPECT_TRUE(result.is_null());
75     EXPECT_FALSE(base::Time::FromLocalExploded(test.explode, &result));
76     EXPECT_TRUE(result.is_null());
77   }
78 }
79 
80 // Specialized test fixture allowing time strings without timezones to be
81 // tested by comparing them to a known time in the local zone.
82 // See also pr_time_unittests.cc
83 class TimeTest : public testing::Test {
84  protected:
SetUp()85   void SetUp() override {
86     // Use mktime to get a time_t, and turn it into a PRTime by converting
87     // seconds to microseconds.  Use 15th Oct 2007 12:45:00 local.  This
88     // must be a time guaranteed to be outside of a DST fallback hour in
89     // any timezone.
90     struct tm local_comparison_tm = {
91       0,            // second
92       45,           // minute
93       12,           // hour
94       15,           // day of month
95       10 - 1,       // month
96       2007 - 1900,  // year
97       0,            // day of week (ignored, output only)
98       0,            // day of year (ignored, output only)
99       -1            // DST in effect, -1 tells mktime to figure it out
100     };
101 
102     time_t converted_time = mktime(&local_comparison_tm);
103     ASSERT_GT(converted_time, 0);
104     comparison_time_local_ = Time::FromTimeT(converted_time);
105 
106     // time_t representation of 15th Oct 2007 12:45:00 PDT
107     comparison_time_pdt_ = Time::FromTimeT(1192477500);
108   }
109 
110   Time comparison_time_local_;
111   Time comparison_time_pdt_;
112 };
113 
114 // Test conversions to/from time_t and exploding/unexploding.
TEST_F(TimeTest,TimeT)115 TEST_F(TimeTest, TimeT) {
116   // C library time and exploded time.
117   time_t now_t_1 = time(NULL);
118   struct tm tms;
119 #if defined(OS_WIN)
120   localtime_s(&tms, &now_t_1);
121 #elif defined(OS_POSIX)
122   localtime_r(&now_t_1, &tms);
123 #endif
124 
125   // Convert to ours.
126   Time our_time_1 = Time::FromTimeT(now_t_1);
127   Time::Exploded exploded;
128   our_time_1.LocalExplode(&exploded);
129 
130   // This will test both our exploding and our time_t -> Time conversion.
131   EXPECT_EQ(tms.tm_year + 1900, exploded.year);
132   EXPECT_EQ(tms.tm_mon + 1, exploded.month);
133   EXPECT_EQ(tms.tm_mday, exploded.day_of_month);
134   EXPECT_EQ(tms.tm_hour, exploded.hour);
135   EXPECT_EQ(tms.tm_min, exploded.minute);
136   EXPECT_EQ(tms.tm_sec, exploded.second);
137 
138   // Convert exploded back to the time struct.
139   Time our_time_2;
140   EXPECT_TRUE(Time::FromLocalExploded(exploded, &our_time_2));
141   EXPECT_TRUE(our_time_1 == our_time_2);
142 
143   time_t now_t_2 = our_time_2.ToTimeT();
144   EXPECT_EQ(now_t_1, now_t_2);
145 
146   EXPECT_EQ(10, Time().FromTimeT(10).ToTimeT());
147   EXPECT_EQ(10.0, Time().FromTimeT(10).ToDoubleT());
148 
149   // Conversions of 0 should stay 0.
150   EXPECT_EQ(0, Time().ToTimeT());
151   EXPECT_EQ(0, Time::FromTimeT(0).ToInternalValue());
152 }
153 
154 // Test conversions to/from javascript time.
TEST_F(TimeTest,JsTime)155 TEST_F(TimeTest, JsTime) {
156   Time epoch = Time::FromJsTime(0.0);
157   EXPECT_EQ(epoch, Time::UnixEpoch());
158   Time t = Time::FromJsTime(700000.3);
159   EXPECT_EQ(700.0003, t.ToDoubleT());
160   t = Time::FromDoubleT(800.73);
161   EXPECT_EQ(800730.0, t.ToJsTime());
162 }
163 
164 #if defined(OS_POSIX)
TEST_F(TimeTest,FromTimeVal)165 TEST_F(TimeTest, FromTimeVal) {
166   Time now = Time::Now();
167   Time also_now = Time::FromTimeVal(now.ToTimeVal());
168   EXPECT_EQ(now, also_now);
169 }
170 #endif  // OS_POSIX
171 
TEST_F(TimeTest,FromExplodedWithMilliseconds)172 TEST_F(TimeTest, FromExplodedWithMilliseconds) {
173   // Some platform implementations of FromExploded are liable to drop
174   // milliseconds if we aren't careful.
175   Time now = Time::NowFromSystemTime();
176   Time::Exploded exploded1 = {0};
177   now.UTCExplode(&exploded1);
178   exploded1.millisecond = 500;
179   Time time;
180   EXPECT_TRUE(Time::FromUTCExploded(exploded1, &time));
181   Time::Exploded exploded2 = {0};
182   time.UTCExplode(&exploded2);
183   EXPECT_EQ(exploded1.millisecond, exploded2.millisecond);
184 }
185 
TEST_F(TimeTest,ZeroIsSymmetric)186 TEST_F(TimeTest, ZeroIsSymmetric) {
187   Time zero_time(Time::FromTimeT(0));
188   EXPECT_EQ(0, zero_time.ToTimeT());
189 
190   EXPECT_EQ(0.0, zero_time.ToDoubleT());
191 }
192 
TEST_F(TimeTest,LocalExplode)193 TEST_F(TimeTest, LocalExplode) {
194   Time a = Time::Now();
195   Time::Exploded exploded;
196   a.LocalExplode(&exploded);
197 
198   Time b;
199   EXPECT_TRUE(Time::FromLocalExploded(exploded, &b));
200 
201   // The exploded structure doesn't have microseconds, and on Mac & Linux, the
202   // internal OS conversion uses seconds, which will cause truncation. So we
203   // can only make sure that the delta is within one second.
204   EXPECT_TRUE((a - b) < TimeDelta::FromSeconds(1));
205 }
206 
TEST_F(TimeTest,UTCExplode)207 TEST_F(TimeTest, UTCExplode) {
208   Time a = Time::Now();
209   Time::Exploded exploded;
210   a.UTCExplode(&exploded);
211 
212   Time b;
213   EXPECT_TRUE(Time::FromUTCExploded(exploded, &b));
214   EXPECT_TRUE((a - b) < TimeDelta::FromSeconds(1));
215 }
216 
TEST_F(TimeTest,LocalMidnight)217 TEST_F(TimeTest, LocalMidnight) {
218   Time::Exploded exploded;
219   Time::Now().LocalMidnight().LocalExplode(&exploded);
220   EXPECT_EQ(0, exploded.hour);
221   EXPECT_EQ(0, exploded.minute);
222   EXPECT_EQ(0, exploded.second);
223   EXPECT_EQ(0, exploded.millisecond);
224 }
225 
TEST_F(TimeTest,ParseTimeTest1)226 TEST_F(TimeTest, ParseTimeTest1) {
227   time_t current_time = 0;
228   time(&current_time);
229 
230   const int BUFFER_SIZE = 64;
231   struct tm local_time = {0};
232   char time_buf[BUFFER_SIZE] = {0};
233 #if defined(OS_WIN)
234   localtime_s(&local_time, &current_time);
235   asctime_s(time_buf, arraysize(time_buf), &local_time);
236 #elif defined(OS_POSIX)
237   localtime_r(&current_time, &local_time);
238   asctime_r(&local_time, time_buf);
239 #endif
240 
241   Time parsed_time;
242   EXPECT_TRUE(Time::FromString(time_buf, &parsed_time));
243   EXPECT_EQ(current_time, parsed_time.ToTimeT());
244 }
245 
TEST_F(TimeTest,DayOfWeekSunday)246 TEST_F(TimeTest, DayOfWeekSunday) {
247   Time time;
248   EXPECT_TRUE(Time::FromString("Sun, 06 May 2012 12:00:00 GMT", &time));
249   Time::Exploded exploded;
250   time.UTCExplode(&exploded);
251   EXPECT_EQ(0, exploded.day_of_week);
252 }
253 
TEST_F(TimeTest,DayOfWeekWednesday)254 TEST_F(TimeTest, DayOfWeekWednesday) {
255   Time time;
256   EXPECT_TRUE(Time::FromString("Wed, 09 May 2012 12:00:00 GMT", &time));
257   Time::Exploded exploded;
258   time.UTCExplode(&exploded);
259   EXPECT_EQ(3, exploded.day_of_week);
260 }
261 
TEST_F(TimeTest,DayOfWeekSaturday)262 TEST_F(TimeTest, DayOfWeekSaturday) {
263   Time time;
264   EXPECT_TRUE(Time::FromString("Sat, 12 May 2012 12:00:00 GMT", &time));
265   Time::Exploded exploded;
266   time.UTCExplode(&exploded);
267   EXPECT_EQ(6, exploded.day_of_week);
268 }
269 
TEST_F(TimeTest,ParseTimeTest2)270 TEST_F(TimeTest, ParseTimeTest2) {
271   Time parsed_time;
272   EXPECT_TRUE(Time::FromString("Mon, 15 Oct 2007 19:45:00 GMT", &parsed_time));
273   EXPECT_EQ(comparison_time_pdt_, parsed_time);
274 }
275 
TEST_F(TimeTest,ParseTimeTest3)276 TEST_F(TimeTest, ParseTimeTest3) {
277   Time parsed_time;
278   EXPECT_TRUE(Time::FromString("15 Oct 07 12:45:00", &parsed_time));
279   EXPECT_EQ(comparison_time_local_, parsed_time);
280 }
281 
TEST_F(TimeTest,ParseTimeTest4)282 TEST_F(TimeTest, ParseTimeTest4) {
283   Time parsed_time;
284   EXPECT_TRUE(Time::FromString("15 Oct 07 19:45 GMT", &parsed_time));
285   EXPECT_EQ(comparison_time_pdt_, parsed_time);
286 }
287 
TEST_F(TimeTest,ParseTimeTest5)288 TEST_F(TimeTest, ParseTimeTest5) {
289   Time parsed_time;
290   EXPECT_TRUE(Time::FromString("Mon Oct 15 12:45 PDT 2007", &parsed_time));
291   EXPECT_EQ(comparison_time_pdt_, parsed_time);
292 }
293 
TEST_F(TimeTest,ParseTimeTest6)294 TEST_F(TimeTest, ParseTimeTest6) {
295   Time parsed_time;
296   EXPECT_TRUE(Time::FromString("Monday, Oct 15, 2007 12:45 PM", &parsed_time));
297   EXPECT_EQ(comparison_time_local_, parsed_time);
298 }
299 
TEST_F(TimeTest,ParseTimeTest7)300 TEST_F(TimeTest, ParseTimeTest7) {
301   Time parsed_time;
302   EXPECT_TRUE(Time::FromString("10/15/07 12:45:00 PM", &parsed_time));
303   EXPECT_EQ(comparison_time_local_, parsed_time);
304 }
305 
TEST_F(TimeTest,ParseTimeTest8)306 TEST_F(TimeTest, ParseTimeTest8) {
307   Time parsed_time;
308   EXPECT_TRUE(Time::FromString("15-OCT-2007 12:45pm", &parsed_time));
309   EXPECT_EQ(comparison_time_local_, parsed_time);
310 }
311 
TEST_F(TimeTest,ParseTimeTest9)312 TEST_F(TimeTest, ParseTimeTest9) {
313   Time parsed_time;
314   EXPECT_TRUE(Time::FromString("16 Oct 2007 4:45-JST (Tuesday)", &parsed_time));
315   EXPECT_EQ(comparison_time_pdt_, parsed_time);
316 }
317 
TEST_F(TimeTest,ParseTimeTest10)318 TEST_F(TimeTest, ParseTimeTest10) {
319   Time parsed_time;
320   EXPECT_TRUE(Time::FromString("15/10/07 12:45", &parsed_time));
321   EXPECT_EQ(parsed_time, comparison_time_local_);
322 }
323 
324 // Test some of edge cases around epoch, etc.
TEST_F(TimeTest,ParseTimeTestEpoch0)325 TEST_F(TimeTest, ParseTimeTestEpoch0) {
326   Time parsed_time;
327 
328   // time_t == epoch == 0
329   EXPECT_TRUE(Time::FromString("Thu Jan 01 01:00:00 +0100 1970",
330                                &parsed_time));
331   EXPECT_EQ(0, parsed_time.ToTimeT());
332   EXPECT_TRUE(Time::FromString("Thu Jan 01 00:00:00 GMT 1970",
333                                &parsed_time));
334   EXPECT_EQ(0, parsed_time.ToTimeT());
335 }
336 
TEST_F(TimeTest,ParseTimeTestEpoch1)337 TEST_F(TimeTest, ParseTimeTestEpoch1) {
338   Time parsed_time;
339 
340   // time_t == 1 second after epoch == 1
341   EXPECT_TRUE(Time::FromString("Thu Jan 01 01:00:01 +0100 1970",
342                                &parsed_time));
343   EXPECT_EQ(1, parsed_time.ToTimeT());
344   EXPECT_TRUE(Time::FromString("Thu Jan 01 00:00:01 GMT 1970",
345                                &parsed_time));
346   EXPECT_EQ(1, parsed_time.ToTimeT());
347 }
348 
TEST_F(TimeTest,ParseTimeTestEpoch2)349 TEST_F(TimeTest, ParseTimeTestEpoch2) {
350   Time parsed_time;
351 
352   // time_t == 2 seconds after epoch == 2
353   EXPECT_TRUE(Time::FromString("Thu Jan 01 01:00:02 +0100 1970",
354                                &parsed_time));
355   EXPECT_EQ(2, parsed_time.ToTimeT());
356   EXPECT_TRUE(Time::FromString("Thu Jan 01 00:00:02 GMT 1970",
357                                &parsed_time));
358   EXPECT_EQ(2, parsed_time.ToTimeT());
359 }
360 
TEST_F(TimeTest,ParseTimeTestEpochNeg1)361 TEST_F(TimeTest, ParseTimeTestEpochNeg1) {
362   Time parsed_time;
363 
364   // time_t == 1 second before epoch == -1
365   EXPECT_TRUE(Time::FromString("Thu Jan 01 00:59:59 +0100 1970",
366                                &parsed_time));
367   EXPECT_EQ(-1, parsed_time.ToTimeT());
368   EXPECT_TRUE(Time::FromString("Wed Dec 31 23:59:59 GMT 1969",
369                                &parsed_time));
370   EXPECT_EQ(-1, parsed_time.ToTimeT());
371 }
372 
373 // If time_t is 32 bits, a date after year 2038 will overflow time_t and
374 // cause timegm() to return -1.  The parsed time should not be 1 second
375 // before epoch.
TEST_F(TimeTest,ParseTimeTestEpochNotNeg1)376 TEST_F(TimeTest, ParseTimeTestEpochNotNeg1) {
377   Time parsed_time;
378 
379   EXPECT_TRUE(Time::FromString("Wed Dec 31 23:59:59 GMT 2100",
380                                &parsed_time));
381   EXPECT_NE(-1, parsed_time.ToTimeT());
382 }
383 
TEST_F(TimeTest,ParseTimeTestEpochNeg2)384 TEST_F(TimeTest, ParseTimeTestEpochNeg2) {
385   Time parsed_time;
386 
387   // time_t == 2 seconds before epoch == -2
388   EXPECT_TRUE(Time::FromString("Thu Jan 01 00:59:58 +0100 1970",
389                                &parsed_time));
390   EXPECT_EQ(-2, parsed_time.ToTimeT());
391   EXPECT_TRUE(Time::FromString("Wed Dec 31 23:59:58 GMT 1969",
392                                &parsed_time));
393   EXPECT_EQ(-2, parsed_time.ToTimeT());
394 }
395 
TEST_F(TimeTest,ParseTimeTestEpoch1960)396 TEST_F(TimeTest, ParseTimeTestEpoch1960) {
397   Time parsed_time;
398 
399   // time_t before Epoch, in 1960
400   EXPECT_TRUE(Time::FromString("Wed Jun 29 19:40:01 +0100 1960",
401                                &parsed_time));
402   EXPECT_EQ(-299999999, parsed_time.ToTimeT());
403   EXPECT_TRUE(Time::FromString("Wed Jun 29 18:40:01 GMT 1960",
404                                &parsed_time));
405   EXPECT_EQ(-299999999, parsed_time.ToTimeT());
406   EXPECT_TRUE(Time::FromString("Wed Jun 29 17:40:01 GMT 1960",
407                                &parsed_time));
408   EXPECT_EQ(-300003599, parsed_time.ToTimeT());
409 }
410 
TEST_F(TimeTest,ParseTimeTestEmpty)411 TEST_F(TimeTest, ParseTimeTestEmpty) {
412   Time parsed_time;
413   EXPECT_FALSE(Time::FromString("", &parsed_time));
414 }
415 
TEST_F(TimeTest,ParseTimeTestInvalidString)416 TEST_F(TimeTest, ParseTimeTestInvalidString) {
417   Time parsed_time;
418   EXPECT_FALSE(Time::FromString("Monday morning 2000", &parsed_time));
419 }
420 
TEST_F(TimeTest,ExplodeBeforeUnixEpoch)421 TEST_F(TimeTest, ExplodeBeforeUnixEpoch) {
422   static const int kUnixEpochYear = 1970;  // In case this changes (ha!).
423   Time t;
424   Time::Exploded exploded;
425 
426   t = Time::UnixEpoch() - TimeDelta::FromMicroseconds(1);
427   t.UTCExplode(&exploded);
428   EXPECT_TRUE(exploded.HasValidValues());
429   // Should be 1969-12-31 23:59:59 999 milliseconds (and 999 microseconds).
430   EXPECT_EQ(kUnixEpochYear - 1, exploded.year);
431   EXPECT_EQ(12, exploded.month);
432   EXPECT_EQ(31, exploded.day_of_month);
433   EXPECT_EQ(23, exploded.hour);
434   EXPECT_EQ(59, exploded.minute);
435   EXPECT_EQ(59, exploded.second);
436   EXPECT_EQ(999, exploded.millisecond);
437 
438   t = Time::UnixEpoch() - TimeDelta::FromMicroseconds(1000);
439   t.UTCExplode(&exploded);
440   EXPECT_TRUE(exploded.HasValidValues());
441   // Should be 1969-12-31 23:59:59 999 milliseconds.
442   EXPECT_EQ(kUnixEpochYear - 1, exploded.year);
443   EXPECT_EQ(12, exploded.month);
444   EXPECT_EQ(31, exploded.day_of_month);
445   EXPECT_EQ(23, exploded.hour);
446   EXPECT_EQ(59, exploded.minute);
447   EXPECT_EQ(59, exploded.second);
448   EXPECT_EQ(999, exploded.millisecond);
449 
450   t = Time::UnixEpoch() - TimeDelta::FromMicroseconds(1001);
451   t.UTCExplode(&exploded);
452   EXPECT_TRUE(exploded.HasValidValues());
453   // Should be 1969-12-31 23:59:59 998 milliseconds (and 999 microseconds).
454   EXPECT_EQ(kUnixEpochYear - 1, exploded.year);
455   EXPECT_EQ(12, exploded.month);
456   EXPECT_EQ(31, exploded.day_of_month);
457   EXPECT_EQ(23, exploded.hour);
458   EXPECT_EQ(59, exploded.minute);
459   EXPECT_EQ(59, exploded.second);
460   EXPECT_EQ(998, exploded.millisecond);
461 
462   t = Time::UnixEpoch() - TimeDelta::FromMilliseconds(1000);
463   t.UTCExplode(&exploded);
464   EXPECT_TRUE(exploded.HasValidValues());
465   // Should be 1969-12-31 23:59:59.
466   EXPECT_EQ(kUnixEpochYear - 1, exploded.year);
467   EXPECT_EQ(12, exploded.month);
468   EXPECT_EQ(31, exploded.day_of_month);
469   EXPECT_EQ(23, exploded.hour);
470   EXPECT_EQ(59, exploded.minute);
471   EXPECT_EQ(59, exploded.second);
472   EXPECT_EQ(0, exploded.millisecond);
473 
474   t = Time::UnixEpoch() - TimeDelta::FromMilliseconds(1001);
475   t.UTCExplode(&exploded);
476   EXPECT_TRUE(exploded.HasValidValues());
477   // Should be 1969-12-31 23:59:58 999 milliseconds.
478   EXPECT_EQ(kUnixEpochYear - 1, exploded.year);
479   EXPECT_EQ(12, exploded.month);
480   EXPECT_EQ(31, exploded.day_of_month);
481   EXPECT_EQ(23, exploded.hour);
482   EXPECT_EQ(59, exploded.minute);
483   EXPECT_EQ(58, exploded.second);
484   EXPECT_EQ(999, exploded.millisecond);
485 
486   // Make sure we still handle at/after Unix epoch correctly.
487   t = Time::UnixEpoch();
488   t.UTCExplode(&exploded);
489   EXPECT_TRUE(exploded.HasValidValues());
490   // Should be 1970-12-31 00:00:00 0 milliseconds.
491   EXPECT_EQ(kUnixEpochYear, exploded.year);
492   EXPECT_EQ(1, exploded.month);
493   EXPECT_EQ(1, exploded.day_of_month);
494   EXPECT_EQ(0, exploded.hour);
495   EXPECT_EQ(0, exploded.minute);
496   EXPECT_EQ(0, exploded.second);
497   EXPECT_EQ(0, exploded.millisecond);
498 
499   t = Time::UnixEpoch() + TimeDelta::FromMicroseconds(1);
500   t.UTCExplode(&exploded);
501   EXPECT_TRUE(exploded.HasValidValues());
502   // Should be 1970-01-01 00:00:00 0 milliseconds (and 1 microsecond).
503   EXPECT_EQ(kUnixEpochYear, exploded.year);
504   EXPECT_EQ(1, exploded.month);
505   EXPECT_EQ(1, exploded.day_of_month);
506   EXPECT_EQ(0, exploded.hour);
507   EXPECT_EQ(0, exploded.minute);
508   EXPECT_EQ(0, exploded.second);
509   EXPECT_EQ(0, exploded.millisecond);
510 
511   t = Time::UnixEpoch() + TimeDelta::FromMicroseconds(1000);
512   t.UTCExplode(&exploded);
513   EXPECT_TRUE(exploded.HasValidValues());
514   // Should be 1970-01-01 00:00:00 1 millisecond.
515   EXPECT_EQ(kUnixEpochYear, exploded.year);
516   EXPECT_EQ(1, exploded.month);
517   EXPECT_EQ(1, exploded.day_of_month);
518   EXPECT_EQ(0, exploded.hour);
519   EXPECT_EQ(0, exploded.minute);
520   EXPECT_EQ(0, exploded.second);
521   EXPECT_EQ(1, exploded.millisecond);
522 
523   t = Time::UnixEpoch() + TimeDelta::FromMilliseconds(1000);
524   t.UTCExplode(&exploded);
525   EXPECT_TRUE(exploded.HasValidValues());
526   // Should be 1970-01-01 00:00:01.
527   EXPECT_EQ(kUnixEpochYear, exploded.year);
528   EXPECT_EQ(1, exploded.month);
529   EXPECT_EQ(1, exploded.day_of_month);
530   EXPECT_EQ(0, exploded.hour);
531   EXPECT_EQ(0, exploded.minute);
532   EXPECT_EQ(1, exploded.second);
533   EXPECT_EQ(0, exploded.millisecond);
534 
535   t = Time::UnixEpoch() + TimeDelta::FromMilliseconds(1001);
536   t.UTCExplode(&exploded);
537   EXPECT_TRUE(exploded.HasValidValues());
538   // Should be 1970-01-01 00:00:01 1 millisecond.
539   EXPECT_EQ(kUnixEpochYear, exploded.year);
540   EXPECT_EQ(1, exploded.month);
541   EXPECT_EQ(1, exploded.day_of_month);
542   EXPECT_EQ(0, exploded.hour);
543   EXPECT_EQ(0, exploded.minute);
544   EXPECT_EQ(1, exploded.second);
545   EXPECT_EQ(1, exploded.millisecond);
546 }
547 
TEST_F(TimeTest,Max)548 TEST_F(TimeTest, Max) {
549   Time max = Time::Max();
550   EXPECT_TRUE(max.is_max());
551   EXPECT_EQ(max, Time::Max());
552   EXPECT_GT(max, Time::Now());
553   EXPECT_GT(max, Time());
554 }
555 
TEST_F(TimeTest,MaxConversions)556 TEST_F(TimeTest, MaxConversions) {
557   Time t = Time::Max();
558   EXPECT_EQ(std::numeric_limits<int64_t>::max(), t.ToInternalValue());
559 
560   t = Time::FromDoubleT(std::numeric_limits<double>::infinity());
561   EXPECT_TRUE(t.is_max());
562   EXPECT_EQ(std::numeric_limits<double>::infinity(), t.ToDoubleT());
563 
564   t = Time::FromJsTime(std::numeric_limits<double>::infinity());
565   EXPECT_TRUE(t.is_max());
566   EXPECT_EQ(std::numeric_limits<double>::infinity(), t.ToJsTime());
567 
568   t = Time::FromTimeT(std::numeric_limits<time_t>::max());
569   EXPECT_TRUE(t.is_max());
570   EXPECT_EQ(std::numeric_limits<time_t>::max(), t.ToTimeT());
571 
572 #if defined(OS_POSIX)
573   struct timeval tval;
574   tval.tv_sec = std::numeric_limits<time_t>::max();
575   tval.tv_usec = static_cast<suseconds_t>(Time::kMicrosecondsPerSecond) - 1;
576   t = Time::FromTimeVal(tval);
577   EXPECT_TRUE(t.is_max());
578   tval = t.ToTimeVal();
579   EXPECT_EQ(std::numeric_limits<time_t>::max(), tval.tv_sec);
580   EXPECT_EQ(static_cast<suseconds_t>(Time::kMicrosecondsPerSecond) - 1,
581       tval.tv_usec);
582 #endif
583 
584 #if defined(OS_MACOSX)
585   t = Time::FromCFAbsoluteTime(std::numeric_limits<CFAbsoluteTime>::infinity());
586   EXPECT_TRUE(t.is_max());
587   EXPECT_EQ(std::numeric_limits<CFAbsoluteTime>::infinity(),
588             t.ToCFAbsoluteTime());
589 #endif
590 
591 #if defined(OS_WIN)
592   FILETIME ftime;
593   ftime.dwHighDateTime = std::numeric_limits<DWORD>::max();
594   ftime.dwLowDateTime = std::numeric_limits<DWORD>::max();
595   t = Time::FromFileTime(ftime);
596   EXPECT_TRUE(t.is_max());
597   ftime = t.ToFileTime();
598   EXPECT_EQ(std::numeric_limits<DWORD>::max(), ftime.dwHighDateTime);
599   EXPECT_EQ(std::numeric_limits<DWORD>::max(), ftime.dwLowDateTime);
600 #endif
601 }
602 
603 #if defined(OS_MACOSX)
TEST_F(TimeTest,TimeTOverflow)604 TEST_F(TimeTest, TimeTOverflow) {
605   Time t = Time::FromInternalValue(std::numeric_limits<int64_t>::max() - 1);
606   EXPECT_FALSE(t.is_max());
607   EXPECT_EQ(std::numeric_limits<time_t>::max(), t.ToTimeT());
608 }
609 #endif
610 
611 #if defined(OS_ANDROID)
TEST_F(TimeTest,FromLocalExplodedCrashOnAndroid)612 TEST_F(TimeTest, FromLocalExplodedCrashOnAndroid) {
613   // This crashed inside Time:: FromLocalExploded() on Android 4.1.2.
614   // See http://crbug.com/287821
615   Time::Exploded midnight = {2013,  // year
616                              10,    // month
617                              0,     // day_of_week
618                              13,    // day_of_month
619                              0,     // hour
620                              0,     // minute
621                              0,     // second
622   };
623   // The string passed to putenv() must be a char* and the documentation states
624   // that it 'becomes part of the environment', so use a static buffer.
625   static char buffer[] = "TZ=America/Santiago";
626   putenv(buffer);
627   tzset();
628   Time t;
629   EXPECT_TRUE(Time::FromLocalExploded(midnight, &t));
630   EXPECT_EQ(1381633200, t.ToTimeT());
631 }
632 #endif  // OS_ANDROID
633 
TEST(TimeTicks,Deltas)634 TEST(TimeTicks, Deltas) {
635   for (int index = 0; index < 50; index++) {
636     TimeTicks ticks_start = TimeTicks::Now();
637     base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
638     TimeTicks ticks_stop = TimeTicks::Now();
639     TimeDelta delta = ticks_stop - ticks_start;
640     // Note:  Although we asked for a 10ms sleep, if the
641     // time clock has a finer granularity than the Sleep()
642     // clock, it is quite possible to wakeup early.  Here
643     // is how that works:
644     //      Time(ms timer)      Time(us timer)
645     //          5                   5010
646     //          6                   6010
647     //          7                   7010
648     //          8                   8010
649     //          9                   9000
650     // Elapsed  4ms                 3990us
651     //
652     // Unfortunately, our InMilliseconds() function truncates
653     // rather than rounds.  We should consider fixing this
654     // so that our averages come out better.
655     EXPECT_GE(delta.InMilliseconds(), 9);
656     EXPECT_GE(delta.InMicroseconds(), 9000);
657     EXPECT_EQ(delta.InSeconds(), 0);
658   }
659 }
660 
HighResClockTest(TimeTicks (* GetTicks)())661 static void HighResClockTest(TimeTicks (*GetTicks)()) {
662   // IsHighResolution() is false on some systems.  Since the product still works
663   // even if it's false, it makes this entire test questionable.
664   if (!TimeTicks::IsHighResolution())
665     return;
666 
667   // Why do we loop here?
668   // We're trying to measure that intervals increment in a VERY small amount
669   // of time --  less than 15ms.  Unfortunately, if we happen to have a
670   // context switch in the middle of our test, the context switch could easily
671   // exceed our limit.  So, we iterate on this several times.  As long as we're
672   // able to detect the fine-granularity timers at least once, then the test
673   // has succeeded.
674 
675   const int kTargetGranularityUs = 15000;  // 15ms
676 
677   bool success = false;
678   int retries = 100;  // Arbitrary.
679   TimeDelta delta;
680   while (!success && retries--) {
681     TimeTicks ticks_start = GetTicks();
682     // Loop until we can detect that the clock has changed.  Non-HighRes timers
683     // will increment in chunks, e.g. 15ms.  By spinning until we see a clock
684     // change, we detect the minimum time between measurements.
685     do {
686       delta = GetTicks() - ticks_start;
687     } while (delta.InMilliseconds() == 0);
688 
689     if (delta.InMicroseconds() <= kTargetGranularityUs)
690       success = true;
691   }
692 
693   // In high resolution mode, we expect to see the clock increment
694   // in intervals less than 15ms.
695   EXPECT_TRUE(success);
696 }
697 
TEST(TimeTicks,HighRes)698 TEST(TimeTicks, HighRes) {
699   HighResClockTest(&TimeTicks::Now);
700 }
701 
702 // Fails frequently on Android http://crbug.com/352633 with:
703 // Expected: (delta_thread.InMicroseconds()) > (0), actual: 0 vs 0
704 #if defined(OS_ANDROID)
705 #define MAYBE_ThreadNow DISABLED_ThreadNow
706 #else
707 #define MAYBE_ThreadNow ThreadNow
708 #endif
TEST(ThreadTicks,MAYBE_ThreadNow)709 TEST(ThreadTicks, MAYBE_ThreadNow) {
710   if (ThreadTicks::IsSupported()) {
711     ThreadTicks::WaitUntilInitialized();
712     TimeTicks begin = TimeTicks::Now();
713     ThreadTicks begin_thread = ThreadTicks::Now();
714     // Make sure that ThreadNow value is non-zero.
715     EXPECT_GT(begin_thread, ThreadTicks());
716     // Sleep for 10 milliseconds to get the thread de-scheduled.
717     base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
718     ThreadTicks end_thread = ThreadTicks::Now();
719     TimeTicks end = TimeTicks::Now();
720     TimeDelta delta = end - begin;
721     TimeDelta delta_thread = end_thread - begin_thread;
722     // Make sure that some thread time have elapsed.
723     EXPECT_GT(delta_thread.InMicroseconds(), 0);
724     // But the thread time is at least 9ms less than clock time.
725     TimeDelta difference = delta - delta_thread;
726     EXPECT_GE(difference.InMicroseconds(), 9000);
727   }
728 }
729 
TEST(TimeTicks,SnappedToNextTickBasic)730 TEST(TimeTicks, SnappedToNextTickBasic) {
731   base::TimeTicks phase = base::TimeTicks::FromInternalValue(4000);
732   base::TimeDelta interval = base::TimeDelta::FromMicroseconds(1000);
733   base::TimeTicks timestamp;
734 
735   // Timestamp in previous interval.
736   timestamp = base::TimeTicks::FromInternalValue(3500);
737   EXPECT_EQ(4000,
738             timestamp.SnappedToNextTick(phase, interval).ToInternalValue());
739 
740   // Timestamp in next interval.
741   timestamp = base::TimeTicks::FromInternalValue(4500);
742   EXPECT_EQ(5000,
743             timestamp.SnappedToNextTick(phase, interval).ToInternalValue());
744 
745   // Timestamp multiple intervals before.
746   timestamp = base::TimeTicks::FromInternalValue(2500);
747   EXPECT_EQ(3000,
748             timestamp.SnappedToNextTick(phase, interval).ToInternalValue());
749 
750   // Timestamp multiple intervals after.
751   timestamp = base::TimeTicks::FromInternalValue(6500);
752   EXPECT_EQ(7000,
753             timestamp.SnappedToNextTick(phase, interval).ToInternalValue());
754 
755   // Timestamp on previous interval.
756   timestamp = base::TimeTicks::FromInternalValue(3000);
757   EXPECT_EQ(3000,
758             timestamp.SnappedToNextTick(phase, interval).ToInternalValue());
759 
760   // Timestamp on next interval.
761   timestamp = base::TimeTicks::FromInternalValue(5000);
762   EXPECT_EQ(5000,
763             timestamp.SnappedToNextTick(phase, interval).ToInternalValue());
764 
765   // Timestamp equal to phase.
766   timestamp = base::TimeTicks::FromInternalValue(4000);
767   EXPECT_EQ(4000,
768             timestamp.SnappedToNextTick(phase, interval).ToInternalValue());
769 }
770 
TEST(TimeTicks,SnappedToNextTickOverflow)771 TEST(TimeTicks, SnappedToNextTickOverflow) {
772   // int(big_timestamp / interval) < 0, so this causes a crash if the number of
773   // intervals elapsed is attempted to be stored in an int.
774   base::TimeTicks phase = base::TimeTicks::FromInternalValue(0);
775   base::TimeDelta interval = base::TimeDelta::FromMicroseconds(4000);
776   base::TimeTicks big_timestamp =
777       base::TimeTicks::FromInternalValue(8635916564000);
778 
779   EXPECT_EQ(8635916564000,
780             big_timestamp.SnappedToNextTick(phase, interval).ToInternalValue());
781   EXPECT_EQ(8635916564000,
782             big_timestamp.SnappedToNextTick(big_timestamp, interval)
783                 .ToInternalValue());
784 }
785 
TEST(TimeDelta,FromAndIn)786 TEST(TimeDelta, FromAndIn) {
787   // static_assert also checks that the contained expression is a constant
788   // expression, meaning all its components are suitable for initializing global
789   // variables.
790   static_assert(TimeDelta::FromDays(2) == TimeDelta::FromHours(48), "");
791   static_assert(TimeDelta::FromHours(3) == TimeDelta::FromMinutes(180), "");
792   static_assert(TimeDelta::FromMinutes(2) == TimeDelta::FromSeconds(120), "");
793   static_assert(TimeDelta::FromSeconds(2) == TimeDelta::FromMilliseconds(2000),
794                 "");
795   static_assert(
796       TimeDelta::FromMilliseconds(2) == TimeDelta::FromMicroseconds(2000), "");
797   static_assert(
798       TimeDelta::FromSecondsD(2.3) == TimeDelta::FromMilliseconds(2300), "");
799   static_assert(
800       TimeDelta::FromMillisecondsD(2.5) == TimeDelta::FromMicroseconds(2500),
801       "");
802   EXPECT_EQ(13, TimeDelta::FromDays(13).InDays());
803   EXPECT_EQ(13, TimeDelta::FromHours(13).InHours());
804   EXPECT_EQ(13, TimeDelta::FromMinutes(13).InMinutes());
805   EXPECT_EQ(13, TimeDelta::FromSeconds(13).InSeconds());
806   EXPECT_EQ(13.0, TimeDelta::FromSeconds(13).InSecondsF());
807   EXPECT_EQ(13, TimeDelta::FromMilliseconds(13).InMilliseconds());
808   EXPECT_EQ(13.0, TimeDelta::FromMilliseconds(13).InMillisecondsF());
809   EXPECT_EQ(13, TimeDelta::FromSecondsD(13.1).InSeconds());
810   EXPECT_EQ(13.1, TimeDelta::FromSecondsD(13.1).InSecondsF());
811   EXPECT_EQ(13, TimeDelta::FromMillisecondsD(13.3).InMilliseconds());
812   EXPECT_EQ(13.3, TimeDelta::FromMillisecondsD(13.3).InMillisecondsF());
813   EXPECT_EQ(13, TimeDelta::FromMicroseconds(13).InMicroseconds());
814   EXPECT_EQ(3.456, TimeDelta::FromMillisecondsD(3.45678).InMillisecondsF());
815 }
816 
817 #if defined(OS_POSIX)
TEST(TimeDelta,TimeSpecConversion)818 TEST(TimeDelta, TimeSpecConversion) {
819   TimeDelta delta = TimeDelta::FromSeconds(0);
820   struct timespec result = delta.ToTimeSpec();
821   EXPECT_EQ(result.tv_sec, 0);
822   EXPECT_EQ(result.tv_nsec, 0);
823   EXPECT_EQ(delta, TimeDelta::FromTimeSpec(result));
824 
825   delta = TimeDelta::FromSeconds(1);
826   result = delta.ToTimeSpec();
827   EXPECT_EQ(result.tv_sec, 1);
828   EXPECT_EQ(result.tv_nsec, 0);
829   EXPECT_EQ(delta, TimeDelta::FromTimeSpec(result));
830 
831   delta = TimeDelta::FromMicroseconds(1);
832   result = delta.ToTimeSpec();
833   EXPECT_EQ(result.tv_sec, 0);
834   EXPECT_EQ(result.tv_nsec, 1000);
835   EXPECT_EQ(delta, TimeDelta::FromTimeSpec(result));
836 
837   delta = TimeDelta::FromMicroseconds(Time::kMicrosecondsPerSecond + 1);
838   result = delta.ToTimeSpec();
839   EXPECT_EQ(result.tv_sec, 1);
840   EXPECT_EQ(result.tv_nsec, 1000);
841   EXPECT_EQ(delta, TimeDelta::FromTimeSpec(result));
842 }
843 #endif  // OS_POSIX
844 
845 // Our internal time format is serialized in things like databases, so it's
846 // important that it's consistent across all our platforms.  We use the 1601
847 // Windows epoch as the internal format across all platforms.
TEST(TimeDelta,WindowsEpoch)848 TEST(TimeDelta, WindowsEpoch) {
849   Time::Exploded exploded;
850   exploded.year = 1970;
851   exploded.month = 1;
852   exploded.day_of_week = 0;  // Should be unusued.
853   exploded.day_of_month = 1;
854   exploded.hour = 0;
855   exploded.minute = 0;
856   exploded.second = 0;
857   exploded.millisecond = 0;
858   Time t;
859   EXPECT_TRUE(Time::FromUTCExploded(exploded, &t));
860   // Unix 1970 epoch.
861   EXPECT_EQ(INT64_C(11644473600000000), t.ToInternalValue());
862 
863   // We can't test 1601 epoch, since the system time functions on Linux
864   // only compute years starting from 1900.
865 }
866 
867 // We could define this separately for Time, TimeTicks and TimeDelta but the
868 // definitions would be identical anyway.
869 template <class Any>
AnyToString(Any any)870 std::string AnyToString(Any any) {
871   std::ostringstream oss;
872   oss << any;
873   return oss.str();
874 }
875 
TEST(TimeDelta,Magnitude)876 TEST(TimeDelta, Magnitude) {
877   const int64_t zero = 0;
878   EXPECT_EQ(TimeDelta::FromMicroseconds(zero),
879             TimeDelta::FromMicroseconds(zero).magnitude());
880 
881   const int64_t one = 1;
882   const int64_t negative_one = -1;
883   EXPECT_EQ(TimeDelta::FromMicroseconds(one),
884             TimeDelta::FromMicroseconds(one).magnitude());
885   EXPECT_EQ(TimeDelta::FromMicroseconds(one),
886             TimeDelta::FromMicroseconds(negative_one).magnitude());
887 
888   const int64_t max_int64_minus_one = std::numeric_limits<int64_t>::max() - 1;
889   const int64_t min_int64_plus_two = std::numeric_limits<int64_t>::min() + 2;
890   EXPECT_EQ(TimeDelta::FromMicroseconds(max_int64_minus_one),
891             TimeDelta::FromMicroseconds(max_int64_minus_one).magnitude());
892   EXPECT_EQ(TimeDelta::FromMicroseconds(max_int64_minus_one),
893             TimeDelta::FromMicroseconds(min_int64_plus_two).magnitude());
894 }
895 
TEST(TimeDelta,Max)896 TEST(TimeDelta, Max) {
897   TimeDelta max = TimeDelta::Max();
898   EXPECT_TRUE(max.is_max());
899   EXPECT_EQ(max, TimeDelta::Max());
900   EXPECT_GT(max, TimeDelta::FromDays(100 * 365));
901   EXPECT_GT(max, TimeDelta());
902 }
903 
IsMin(TimeDelta delta)904 bool IsMin(TimeDelta delta) {
905   return (-delta).is_max();
906 }
907 
TEST(TimeDelta,MaxConversions)908 TEST(TimeDelta, MaxConversions) {
909   TimeDelta t = TimeDelta::Max();
910   EXPECT_EQ(std::numeric_limits<int64_t>::max(), t.ToInternalValue());
911 
912   EXPECT_EQ(std::numeric_limits<int>::max(), t.InDays());
913   EXPECT_EQ(std::numeric_limits<int>::max(), t.InHours());
914   EXPECT_EQ(std::numeric_limits<int>::max(), t.InMinutes());
915   EXPECT_EQ(std::numeric_limits<double>::infinity(), t.InSecondsF());
916   EXPECT_EQ(std::numeric_limits<int64_t>::max(), t.InSeconds());
917   EXPECT_EQ(std::numeric_limits<double>::infinity(), t.InMillisecondsF());
918   EXPECT_EQ(std::numeric_limits<int64_t>::max(), t.InMilliseconds());
919   EXPECT_EQ(std::numeric_limits<int64_t>::max(), t.InMillisecondsRoundedUp());
920 
921   t = TimeDelta::FromDays(std::numeric_limits<int>::max());
922   EXPECT_TRUE(t.is_max());
923 
924   t = TimeDelta::FromHours(std::numeric_limits<int>::max());
925   EXPECT_TRUE(t.is_max());
926 
927   t = TimeDelta::FromMinutes(std::numeric_limits<int>::max());
928   EXPECT_TRUE(t.is_max());
929 
930   int64_t max_int = std::numeric_limits<int64_t>::max();
931 
932   t = TimeDelta::FromSeconds(max_int / Time::kMicrosecondsPerSecond + 1);
933   EXPECT_TRUE(t.is_max());
934 
935   t = TimeDelta::FromMilliseconds(max_int / Time::kMillisecondsPerSecond + 1);
936   EXPECT_TRUE(t.is_max());
937 
938   t = TimeDelta::FromMicroseconds(max_int);
939   EXPECT_TRUE(t.is_max());
940 
941   t = TimeDelta::FromSeconds(-max_int / Time::kMicrosecondsPerSecond - 1);
942   EXPECT_TRUE(IsMin(t));
943 
944   t = TimeDelta::FromMilliseconds(-max_int / Time::kMillisecondsPerSecond - 1);
945   EXPECT_TRUE(IsMin(t));
946 
947   t = TimeDelta::FromMicroseconds(-max_int);
948   EXPECT_TRUE(IsMin(t));
949 
950   t = -TimeDelta::FromMicroseconds(std::numeric_limits<int64_t>::min());
951   EXPECT_FALSE(IsMin(t));
952 
953   t = TimeDelta::FromSecondsD(std::numeric_limits<double>::infinity());
954   EXPECT_TRUE(t.is_max());
955 
956   double max_d = max_int;
957 
958   t = TimeDelta::FromSecondsD(max_d / Time::kMicrosecondsPerSecond + 1);
959   EXPECT_TRUE(t.is_max());
960 
961   t = TimeDelta::FromMillisecondsD(std::numeric_limits<double>::infinity());
962   EXPECT_TRUE(t.is_max());
963 
964   t = TimeDelta::FromMillisecondsD(max_d / Time::kMillisecondsPerSecond * 2);
965   EXPECT_TRUE(t.is_max());
966 
967   t = TimeDelta::FromSecondsD(-max_d / Time::kMicrosecondsPerSecond - 1);
968   EXPECT_TRUE(IsMin(t));
969 
970   t = TimeDelta::FromMillisecondsD(-max_d / Time::kMillisecondsPerSecond * 2);
971   EXPECT_TRUE(IsMin(t));
972 }
973 
TEST(TimeDelta,NumericOperators)974 TEST(TimeDelta, NumericOperators) {
975   double d = 0.5;
976   EXPECT_EQ(TimeDelta::FromMilliseconds(500),
977             TimeDelta::FromMilliseconds(1000) * d);
978   EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
979             TimeDelta::FromMilliseconds(1000) / d);
980   EXPECT_EQ(TimeDelta::FromMilliseconds(500),
981             TimeDelta::FromMilliseconds(1000) *= d);
982   EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
983             TimeDelta::FromMilliseconds(1000) /= d);
984   EXPECT_EQ(TimeDelta::FromMilliseconds(500),
985             d * TimeDelta::FromMilliseconds(1000));
986 
987   float f = 0.5;
988   EXPECT_EQ(TimeDelta::FromMilliseconds(500),
989             TimeDelta::FromMilliseconds(1000) * f);
990   EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
991             TimeDelta::FromMilliseconds(1000) / f);
992   EXPECT_EQ(TimeDelta::FromMilliseconds(500),
993             TimeDelta::FromMilliseconds(1000) *= f);
994   EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
995             TimeDelta::FromMilliseconds(1000) /= f);
996   EXPECT_EQ(TimeDelta::FromMilliseconds(500),
997             f * TimeDelta::FromMilliseconds(1000));
998 
999   int i = 2;
1000   EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
1001             TimeDelta::FromMilliseconds(1000) * i);
1002   EXPECT_EQ(TimeDelta::FromMilliseconds(500),
1003             TimeDelta::FromMilliseconds(1000) / i);
1004   EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
1005             TimeDelta::FromMilliseconds(1000) *= i);
1006   EXPECT_EQ(TimeDelta::FromMilliseconds(500),
1007             TimeDelta::FromMilliseconds(1000) /= i);
1008   EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
1009             i * TimeDelta::FromMilliseconds(1000));
1010 
1011   int64_t i64 = 2;
1012   EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
1013             TimeDelta::FromMilliseconds(1000) * i64);
1014   EXPECT_EQ(TimeDelta::FromMilliseconds(500),
1015             TimeDelta::FromMilliseconds(1000) / i64);
1016   EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
1017             TimeDelta::FromMilliseconds(1000) *= i64);
1018   EXPECT_EQ(TimeDelta::FromMilliseconds(500),
1019             TimeDelta::FromMilliseconds(1000) /= i64);
1020   EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
1021             i64 * TimeDelta::FromMilliseconds(1000));
1022 
1023   EXPECT_EQ(TimeDelta::FromMilliseconds(500),
1024             TimeDelta::FromMilliseconds(1000) * 0.5);
1025   EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
1026             TimeDelta::FromMilliseconds(1000) / 0.5);
1027   EXPECT_EQ(TimeDelta::FromMilliseconds(500),
1028             TimeDelta::FromMilliseconds(1000) *= 0.5);
1029   EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
1030             TimeDelta::FromMilliseconds(1000) /= 0.5);
1031   EXPECT_EQ(TimeDelta::FromMilliseconds(500),
1032             0.5 * TimeDelta::FromMilliseconds(1000));
1033 
1034   EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
1035             TimeDelta::FromMilliseconds(1000) * 2);
1036   EXPECT_EQ(TimeDelta::FromMilliseconds(500),
1037             TimeDelta::FromMilliseconds(1000) / 2);
1038   EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
1039             TimeDelta::FromMilliseconds(1000) *= 2);
1040   EXPECT_EQ(TimeDelta::FromMilliseconds(500),
1041             TimeDelta::FromMilliseconds(1000) /= 2);
1042   EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
1043             2 * TimeDelta::FromMilliseconds(1000));
1044 }
1045 
TEST(TimeDelta,Overflows)1046 TEST(TimeDelta, Overflows) {
1047   // Some sanity checks.
1048   EXPECT_TRUE(TimeDelta::Max().is_max());
1049   EXPECT_TRUE(IsMin(-TimeDelta::Max()));
1050   EXPECT_GT(TimeDelta(), -TimeDelta::Max());
1051 
1052   TimeDelta large_delta = TimeDelta::Max() - TimeDelta::FromMilliseconds(1);
1053   TimeDelta large_negative = -large_delta;
1054   EXPECT_GT(TimeDelta(), large_negative);
1055   EXPECT_FALSE(large_delta.is_max());
1056   EXPECT_FALSE(IsMin(-large_negative));
1057   TimeDelta one_second = TimeDelta::FromSeconds(1);
1058 
1059   // Test +, -, * and / operators.
1060   EXPECT_TRUE((large_delta + one_second).is_max());
1061   EXPECT_TRUE(IsMin(large_negative + (-one_second)));
1062   EXPECT_TRUE(IsMin(large_negative - one_second));
1063   EXPECT_TRUE((large_delta - (-one_second)).is_max());
1064   EXPECT_TRUE((large_delta * 2).is_max());
1065   EXPECT_TRUE(IsMin(large_delta * -2));
1066   EXPECT_TRUE((large_delta / 0.5).is_max());
1067   EXPECT_TRUE(IsMin(large_delta / -0.5));
1068 
1069   // Test +=, -=, *= and /= operators.
1070   TimeDelta delta = large_delta;
1071   delta += one_second;
1072   EXPECT_TRUE(delta.is_max());
1073   delta = large_negative;
1074   delta += -one_second;
1075   EXPECT_TRUE(IsMin(delta));
1076 
1077   delta = large_negative;
1078   delta -= one_second;
1079   EXPECT_TRUE(IsMin(delta));
1080   delta = large_delta;
1081   delta -= -one_second;
1082   EXPECT_TRUE(delta.is_max());
1083 
1084   delta = large_delta;
1085   delta *= 2;
1086   EXPECT_TRUE(delta.is_max());
1087   delta = large_negative;
1088   delta *= 1.5;
1089   EXPECT_TRUE(IsMin(delta));
1090 
1091   delta = large_delta;
1092   delta /= 0.5;
1093   EXPECT_TRUE(delta.is_max());
1094   delta = large_negative;
1095   delta /= 0.5;
1096   EXPECT_TRUE(IsMin(delta));
1097 
1098   // Test operations with Time and TimeTicks.
1099   EXPECT_TRUE((large_delta + Time::Now()).is_max());
1100   EXPECT_TRUE((large_delta + TimeTicks::Now()).is_max());
1101   EXPECT_TRUE((Time::Now() + large_delta).is_max());
1102   EXPECT_TRUE((TimeTicks::Now() + large_delta).is_max());
1103 
1104   Time time_now = Time::Now();
1105   EXPECT_EQ(one_second, (time_now + one_second) - time_now);
1106   EXPECT_EQ(-one_second, (time_now - one_second) - time_now);
1107 
1108   TimeTicks ticks_now = TimeTicks::Now();
1109   EXPECT_EQ(-one_second, (ticks_now - one_second) - ticks_now);
1110   EXPECT_EQ(one_second, (ticks_now + one_second) - ticks_now);
1111 }
1112 
TEST(TimeDeltaLogging,DCheckEqCompiles)1113 TEST(TimeDeltaLogging, DCheckEqCompiles) {
1114   DCHECK_EQ(TimeDelta(), TimeDelta());
1115 }
1116 
TEST(TimeDeltaLogging,EmptyIsZero)1117 TEST(TimeDeltaLogging, EmptyIsZero) {
1118   TimeDelta zero;
1119   EXPECT_EQ("0 s", AnyToString(zero));
1120 }
1121 
TEST(TimeDeltaLogging,FiveHundredMs)1122 TEST(TimeDeltaLogging, FiveHundredMs) {
1123   TimeDelta five_hundred_ms = TimeDelta::FromMilliseconds(500);
1124   EXPECT_EQ("0.5 s", AnyToString(five_hundred_ms));
1125 }
1126 
TEST(TimeDeltaLogging,MinusTenSeconds)1127 TEST(TimeDeltaLogging, MinusTenSeconds) {
1128   TimeDelta minus_ten_seconds = TimeDelta::FromSeconds(-10);
1129   EXPECT_EQ("-10 s", AnyToString(minus_ten_seconds));
1130 }
1131 
TEST(TimeDeltaLogging,DoesNotMessUpFormattingFlags)1132 TEST(TimeDeltaLogging, DoesNotMessUpFormattingFlags) {
1133   std::ostringstream oss;
1134   std::ios_base::fmtflags flags_before = oss.flags();
1135   oss << TimeDelta();
1136   EXPECT_EQ(flags_before, oss.flags());
1137 }
1138 
TEST(TimeDeltaLogging,DoesNotMakeStreamBad)1139 TEST(TimeDeltaLogging, DoesNotMakeStreamBad) {
1140   std::ostringstream oss;
1141   oss << TimeDelta();
1142   EXPECT_TRUE(oss.good());
1143 }
1144 
TEST(TimeLogging,DCheckEqCompiles)1145 TEST(TimeLogging, DCheckEqCompiles) {
1146   DCHECK_EQ(Time(), Time());
1147 }
1148 
TEST(TimeLogging,ChromeBirthdate)1149 TEST(TimeLogging, ChromeBirthdate) {
1150   Time birthdate;
1151   ASSERT_TRUE(Time::FromString("Tue, 02 Sep 2008 09:42:18 GMT", &birthdate));
1152   EXPECT_EQ("2008-09-02 09:42:18.000 UTC", AnyToString(birthdate));
1153 }
1154 
TEST(TimeLogging,DoesNotMessUpFormattingFlags)1155 TEST(TimeLogging, DoesNotMessUpFormattingFlags) {
1156   std::ostringstream oss;
1157   std::ios_base::fmtflags flags_before = oss.flags();
1158   oss << Time();
1159   EXPECT_EQ(flags_before, oss.flags());
1160 }
1161 
TEST(TimeLogging,DoesNotMakeStreamBad)1162 TEST(TimeLogging, DoesNotMakeStreamBad) {
1163   std::ostringstream oss;
1164   oss << Time();
1165   EXPECT_TRUE(oss.good());
1166 }
1167 
TEST(TimeTicksLogging,DCheckEqCompiles)1168 TEST(TimeTicksLogging, DCheckEqCompiles) {
1169   DCHECK_EQ(TimeTicks(), TimeTicks());
1170 }
1171 
TEST(TimeTicksLogging,ZeroTime)1172 TEST(TimeTicksLogging, ZeroTime) {
1173   TimeTicks zero;
1174   EXPECT_EQ("0 bogo-microseconds", AnyToString(zero));
1175 }
1176 
TEST(TimeTicksLogging,FortyYearsLater)1177 TEST(TimeTicksLogging, FortyYearsLater) {
1178   TimeTicks forty_years_later =
1179       TimeTicks() + TimeDelta::FromDays(365.25 * 40);
1180   EXPECT_EQ("1262304000000000 bogo-microseconds",
1181             AnyToString(forty_years_later));
1182 }
1183 
TEST(TimeTicksLogging,DoesNotMessUpFormattingFlags)1184 TEST(TimeTicksLogging, DoesNotMessUpFormattingFlags) {
1185   std::ostringstream oss;
1186   std::ios_base::fmtflags flags_before = oss.flags();
1187   oss << TimeTicks();
1188   EXPECT_EQ(flags_before, oss.flags());
1189 }
1190 
TEST(TimeTicksLogging,DoesNotMakeStreamBad)1191 TEST(TimeTicksLogging, DoesNotMakeStreamBad) {
1192   std::ostringstream oss;
1193   oss << TimeTicks();
1194   EXPECT_TRUE(oss.good());
1195 }
1196 
1197 }  // namespace
1198 
1199 }  // namespace base
1200