1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Worker #include "base/time/time.h"
6*635a8641SAndroid Build Coastguard Worker
7*635a8641SAndroid Build Coastguard Worker #include <stdint.h>
8*635a8641SAndroid Build Coastguard Worker #include <time.h>
9*635a8641SAndroid Build Coastguard Worker #include <limits>
10*635a8641SAndroid Build Coastguard Worker #include <string>
11*635a8641SAndroid Build Coastguard Worker
12*635a8641SAndroid Build Coastguard Worker #include "base/build_time.h"
13*635a8641SAndroid Build Coastguard Worker #include "base/compiler_specific.h"
14*635a8641SAndroid Build Coastguard Worker #include "base/logging.h"
15*635a8641SAndroid Build Coastguard Worker #include "base/macros.h"
16*635a8641SAndroid Build Coastguard Worker #include "base/strings/stringprintf.h"
17*635a8641SAndroid Build Coastguard Worker #include "base/threading/platform_thread.h"
18*635a8641SAndroid Build Coastguard Worker #include "base/time/time_override.h"
19*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h"
20*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
21*635a8641SAndroid Build Coastguard Worker
22*635a8641SAndroid Build Coastguard Worker #if defined(OS_ANDROID)
23*635a8641SAndroid Build Coastguard Worker #include "base/android/jni_android.h"
24*635a8641SAndroid Build Coastguard Worker #elif defined(OS_IOS)
25*635a8641SAndroid Build Coastguard Worker #include "base/ios/ios_util.h"
26*635a8641SAndroid Build Coastguard Worker #elif defined(OS_WIN)
27*635a8641SAndroid Build Coastguard Worker #include <windows.h>
28*635a8641SAndroid Build Coastguard Worker #endif
29*635a8641SAndroid Build Coastguard Worker
30*635a8641SAndroid Build Coastguard Worker namespace base {
31*635a8641SAndroid Build Coastguard Worker
32*635a8641SAndroid Build Coastguard Worker namespace {
33*635a8641SAndroid Build Coastguard Worker
TEST(TimeTestOutOfBounds,FromExplodedOutOfBoundsTime)34*635a8641SAndroid Build Coastguard Worker TEST(TimeTestOutOfBounds, FromExplodedOutOfBoundsTime) {
35*635a8641SAndroid Build Coastguard Worker // FromUTCExploded must set time to Time(0) and failure, if the day is set to
36*635a8641SAndroid Build Coastguard Worker // 31 on a 28-30 day month. Test |exploded| returns Time(0) on 31st of
37*635a8641SAndroid Build Coastguard Worker // February and 31st of April. New implementation handles this.
38*635a8641SAndroid Build Coastguard Worker
39*635a8641SAndroid Build Coastguard Worker const struct DateTestData {
40*635a8641SAndroid Build Coastguard Worker Time::Exploded explode;
41*635a8641SAndroid Build Coastguard Worker bool is_valid;
42*635a8641SAndroid Build Coastguard Worker } kDateTestData[] = {
43*635a8641SAndroid Build Coastguard Worker // 31st of February
44*635a8641SAndroid Build Coastguard Worker {{2016, 2, 0, 31, 12, 30, 0, 0}, true},
45*635a8641SAndroid Build Coastguard Worker // 31st of April
46*635a8641SAndroid Build Coastguard Worker {{2016, 4, 0, 31, 8, 43, 0, 0}, true},
47*635a8641SAndroid Build Coastguard Worker // Negative month
48*635a8641SAndroid Build Coastguard Worker {{2016, -5, 0, 2, 4, 10, 0, 0}, false},
49*635a8641SAndroid Build Coastguard Worker // Negative date of month
50*635a8641SAndroid Build Coastguard Worker {{2016, 6, 0, -15, 2, 50, 0, 0}, false},
51*635a8641SAndroid Build Coastguard Worker // Negative hours
52*635a8641SAndroid Build Coastguard Worker {{2016, 7, 0, 10, -11, 29, 0, 0}, false},
53*635a8641SAndroid Build Coastguard Worker // Negative minutes
54*635a8641SAndroid Build Coastguard Worker {{2016, 3, 0, 14, 10, -29, 0, 0}, false},
55*635a8641SAndroid Build Coastguard Worker // Negative seconds
56*635a8641SAndroid Build Coastguard Worker {{2016, 10, 0, 25, 7, 47, -30, 0}, false},
57*635a8641SAndroid Build Coastguard Worker // Negative milliseconds
58*635a8641SAndroid Build Coastguard Worker {{2016, 10, 0, 25, 7, 47, 20, -500}, false},
59*635a8641SAndroid Build Coastguard Worker // Hours are too large
60*635a8641SAndroid Build Coastguard Worker {{2016, 7, 0, 10, 26, 29, 0, 0}, false},
61*635a8641SAndroid Build Coastguard Worker // Minutes are too large
62*635a8641SAndroid Build Coastguard Worker {{2016, 3, 0, 14, 10, 78, 0, 0}, false},
63*635a8641SAndroid Build Coastguard Worker // Seconds are too large
64*635a8641SAndroid Build Coastguard Worker {{2016, 10, 0, 25, 7, 47, 234, 0}, false},
65*635a8641SAndroid Build Coastguard Worker // Milliseconds are too large
66*635a8641SAndroid Build Coastguard Worker {{2016, 10, 0, 25, 6, 31, 23, 1643}, false},
67*635a8641SAndroid Build Coastguard Worker // Test overflow. Time is valid, but overflow case
68*635a8641SAndroid Build Coastguard Worker // results in Time(0).
69*635a8641SAndroid Build Coastguard Worker {{9840633, 1, 0, 1, 1, 1, 0, 0}, true},
70*635a8641SAndroid Build Coastguard Worker // Underflow will fail as well.
71*635a8641SAndroid Build Coastguard Worker {{-9840633, 1, 0, 1, 1, 1, 0, 0}, true},
72*635a8641SAndroid Build Coastguard Worker // Test integer overflow and underflow cases for the values themselves.
73*635a8641SAndroid Build Coastguard Worker {{std::numeric_limits<int>::min(), 1, 0, 1, 1, 1, 0, 0}, true},
74*635a8641SAndroid Build Coastguard Worker {{std::numeric_limits<int>::max(), 1, 0, 1, 1, 1, 0, 0}, true},
75*635a8641SAndroid Build Coastguard Worker {{2016, std::numeric_limits<int>::min(), 0, 1, 1, 1, 0, 0}, false},
76*635a8641SAndroid Build Coastguard Worker {{2016, std::numeric_limits<int>::max(), 0, 1, 1, 1, 0, 0}, false},
77*635a8641SAndroid Build Coastguard Worker };
78*635a8641SAndroid Build Coastguard Worker
79*635a8641SAndroid Build Coastguard Worker for (const auto& test : kDateTestData) {
80*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(test.explode.HasValidValues(), test.is_valid);
81*635a8641SAndroid Build Coastguard Worker
82*635a8641SAndroid Build Coastguard Worker base::Time result;
83*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(base::Time::FromUTCExploded(test.explode, &result));
84*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(result.is_null());
85*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(base::Time::FromLocalExploded(test.explode, &result));
86*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(result.is_null());
87*635a8641SAndroid Build Coastguard Worker }
88*635a8641SAndroid Build Coastguard Worker }
89*635a8641SAndroid Build Coastguard Worker
90*635a8641SAndroid Build Coastguard Worker // Specialized test fixture allowing time strings without timezones to be
91*635a8641SAndroid Build Coastguard Worker // tested by comparing them to a known time in the local zone.
92*635a8641SAndroid Build Coastguard Worker // See also pr_time_unittests.cc
93*635a8641SAndroid Build Coastguard Worker class TimeTest : public testing::Test {
94*635a8641SAndroid Build Coastguard Worker protected:
SetUp()95*635a8641SAndroid Build Coastguard Worker void SetUp() override {
96*635a8641SAndroid Build Coastguard Worker // Use mktime to get a time_t, and turn it into a PRTime by converting
97*635a8641SAndroid Build Coastguard Worker // seconds to microseconds. Use 15th Oct 2007 12:45:00 local. This
98*635a8641SAndroid Build Coastguard Worker // must be a time guaranteed to be outside of a DST fallback hour in
99*635a8641SAndroid Build Coastguard Worker // any timezone.
100*635a8641SAndroid Build Coastguard Worker struct tm local_comparison_tm = {
101*635a8641SAndroid Build Coastguard Worker 0, // second
102*635a8641SAndroid Build Coastguard Worker 45, // minute
103*635a8641SAndroid Build Coastguard Worker 12, // hour
104*635a8641SAndroid Build Coastguard Worker 15, // day of month
105*635a8641SAndroid Build Coastguard Worker 10 - 1, // month
106*635a8641SAndroid Build Coastguard Worker 2007 - 1900, // year
107*635a8641SAndroid Build Coastguard Worker 0, // day of week (ignored, output only)
108*635a8641SAndroid Build Coastguard Worker 0, // day of year (ignored, output only)
109*635a8641SAndroid Build Coastguard Worker -1 // DST in effect, -1 tells mktime to figure it out
110*635a8641SAndroid Build Coastguard Worker };
111*635a8641SAndroid Build Coastguard Worker
112*635a8641SAndroid Build Coastguard Worker time_t converted_time = mktime(&local_comparison_tm);
113*635a8641SAndroid Build Coastguard Worker ASSERT_GT(converted_time, 0);
114*635a8641SAndroid Build Coastguard Worker comparison_time_local_ = Time::FromTimeT(converted_time);
115*635a8641SAndroid Build Coastguard Worker
116*635a8641SAndroid Build Coastguard Worker // time_t representation of 15th Oct 2007 12:45:00 PDT
117*635a8641SAndroid Build Coastguard Worker comparison_time_pdt_ = Time::FromTimeT(1192477500);
118*635a8641SAndroid Build Coastguard Worker }
119*635a8641SAndroid Build Coastguard Worker
120*635a8641SAndroid Build Coastguard Worker Time comparison_time_local_;
121*635a8641SAndroid Build Coastguard Worker Time comparison_time_pdt_;
122*635a8641SAndroid Build Coastguard Worker };
123*635a8641SAndroid Build Coastguard Worker
124*635a8641SAndroid Build Coastguard Worker // Test conversion to/from TimeDeltas elapsed since the Windows epoch.
125*635a8641SAndroid Build Coastguard Worker // Conversions should be idempotent and non-lossy.
TEST_F(TimeTest,DeltaSinceWindowsEpoch)126*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, DeltaSinceWindowsEpoch) {
127*635a8641SAndroid Build Coastguard Worker const TimeDelta delta = TimeDelta::FromMicroseconds(123);
128*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(delta,
129*635a8641SAndroid Build Coastguard Worker Time::FromDeltaSinceWindowsEpoch(delta).ToDeltaSinceWindowsEpoch());
130*635a8641SAndroid Build Coastguard Worker
131*635a8641SAndroid Build Coastguard Worker const Time now = Time::Now();
132*635a8641SAndroid Build Coastguard Worker const Time actual =
133*635a8641SAndroid Build Coastguard Worker Time::FromDeltaSinceWindowsEpoch(now.ToDeltaSinceWindowsEpoch());
134*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(now, actual);
135*635a8641SAndroid Build Coastguard Worker
136*635a8641SAndroid Build Coastguard Worker // Null times should remain null after a round-trip conversion. This is an
137*635a8641SAndroid Build Coastguard Worker // important invariant for the common use case of serialization +
138*635a8641SAndroid Build Coastguard Worker // deserialization.
139*635a8641SAndroid Build Coastguard Worker const Time should_be_null =
140*635a8641SAndroid Build Coastguard Worker Time::FromDeltaSinceWindowsEpoch(Time().ToDeltaSinceWindowsEpoch());
141*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(should_be_null.is_null());
142*635a8641SAndroid Build Coastguard Worker }
143*635a8641SAndroid Build Coastguard Worker
144*635a8641SAndroid Build Coastguard Worker // Test conversion to/from time_t.
TEST_F(TimeTest,TimeT)145*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, TimeT) {
146*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(10, Time().FromTimeT(10).ToTimeT());
147*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(10.0, Time().FromTimeT(10).ToDoubleT());
148*635a8641SAndroid Build Coastguard Worker
149*635a8641SAndroid Build Coastguard Worker // Conversions of 0 should stay 0.
150*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, Time().ToTimeT());
151*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, Time::FromTimeT(0).ToInternalValue());
152*635a8641SAndroid Build Coastguard Worker }
153*635a8641SAndroid Build Coastguard Worker
154*635a8641SAndroid Build Coastguard Worker // Test conversions to/from time_t and exploding/unexploding (utc time).
TEST_F(TimeTest,UTCTimeT)155*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, UTCTimeT) {
156*635a8641SAndroid Build Coastguard Worker // C library time and exploded time.
157*635a8641SAndroid Build Coastguard Worker time_t now_t_1 = time(nullptr);
158*635a8641SAndroid Build Coastguard Worker struct tm tms;
159*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
160*635a8641SAndroid Build Coastguard Worker gmtime_s(&tms, &now_t_1);
161*635a8641SAndroid Build Coastguard Worker #elif defined(OS_POSIX) || defined(OS_FUCHSIA)
162*635a8641SAndroid Build Coastguard Worker gmtime_r(&now_t_1, &tms);
163*635a8641SAndroid Build Coastguard Worker #endif
164*635a8641SAndroid Build Coastguard Worker
165*635a8641SAndroid Build Coastguard Worker // Convert to ours.
166*635a8641SAndroid Build Coastguard Worker Time our_time_1 = Time::FromTimeT(now_t_1);
167*635a8641SAndroid Build Coastguard Worker Time::Exploded exploded;
168*635a8641SAndroid Build Coastguard Worker our_time_1.UTCExplode(&exploded);
169*635a8641SAndroid Build Coastguard Worker
170*635a8641SAndroid Build Coastguard Worker // This will test both our exploding and our time_t -> Time conversion.
171*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(tms.tm_year + 1900, exploded.year);
172*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(tms.tm_mon + 1, exploded.month);
173*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(tms.tm_mday, exploded.day_of_month);
174*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(tms.tm_hour, exploded.hour);
175*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(tms.tm_min, exploded.minute);
176*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(tms.tm_sec, exploded.second);
177*635a8641SAndroid Build Coastguard Worker
178*635a8641SAndroid Build Coastguard Worker // Convert exploded back to the time struct.
179*635a8641SAndroid Build Coastguard Worker Time our_time_2;
180*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromUTCExploded(exploded, &our_time_2));
181*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(our_time_1 == our_time_2);
182*635a8641SAndroid Build Coastguard Worker
183*635a8641SAndroid Build Coastguard Worker time_t now_t_2 = our_time_2.ToTimeT();
184*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(now_t_1, now_t_2);
185*635a8641SAndroid Build Coastguard Worker }
186*635a8641SAndroid Build Coastguard Worker
187*635a8641SAndroid Build Coastguard Worker // Test conversions to/from time_t and exploding/unexploding (local time).
TEST_F(TimeTest,LocalTimeT)188*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, LocalTimeT) {
189*635a8641SAndroid Build Coastguard Worker #if defined(OS_IOS) && TARGET_OS_SIMULATOR
190*635a8641SAndroid Build Coastguard Worker // The function CFTimeZoneCopySystem() fails to determine the system timezone
191*635a8641SAndroid Build Coastguard Worker // when running iOS 11.0 simulator on an host running High Sierra and return
192*635a8641SAndroid Build Coastguard Worker // the "GMT" timezone. This causes Time::LocalExplode and localtime_r values
193*635a8641SAndroid Build Coastguard Worker // to differ by the local timezone offset. Disable the test if simulating
194*635a8641SAndroid Build Coastguard Worker // iOS 10.0 as it is not possible to check the version of the host mac.
195*635a8641SAndroid Build Coastguard Worker // TODO(crbug.com/782033): remove this once support for iOS pre-11.0 is
196*635a8641SAndroid Build Coastguard Worker // dropped or when the bug in CFTimeZoneCopySystem() is fixed.
197*635a8641SAndroid Build Coastguard Worker if (ios::IsRunningOnIOS10OrLater() && !ios::IsRunningOnIOS11OrLater()) {
198*635a8641SAndroid Build Coastguard Worker return;
199*635a8641SAndroid Build Coastguard Worker }
200*635a8641SAndroid Build Coastguard Worker #endif
201*635a8641SAndroid Build Coastguard Worker
202*635a8641SAndroid Build Coastguard Worker // C library time and exploded time.
203*635a8641SAndroid Build Coastguard Worker time_t now_t_1 = time(nullptr);
204*635a8641SAndroid Build Coastguard Worker struct tm tms;
205*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
206*635a8641SAndroid Build Coastguard Worker localtime_s(&tms, &now_t_1);
207*635a8641SAndroid Build Coastguard Worker #elif defined(OS_POSIX) || defined(OS_FUCHSIA)
208*635a8641SAndroid Build Coastguard Worker localtime_r(&now_t_1, &tms);
209*635a8641SAndroid Build Coastguard Worker #endif
210*635a8641SAndroid Build Coastguard Worker
211*635a8641SAndroid Build Coastguard Worker // Convert to ours.
212*635a8641SAndroid Build Coastguard Worker Time our_time_1 = Time::FromTimeT(now_t_1);
213*635a8641SAndroid Build Coastguard Worker Time::Exploded exploded;
214*635a8641SAndroid Build Coastguard Worker our_time_1.LocalExplode(&exploded);
215*635a8641SAndroid Build Coastguard Worker
216*635a8641SAndroid Build Coastguard Worker // This will test both our exploding and our time_t -> Time conversion.
217*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(tms.tm_year + 1900, exploded.year);
218*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(tms.tm_mon + 1, exploded.month);
219*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(tms.tm_mday, exploded.day_of_month);
220*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(tms.tm_hour, exploded.hour);
221*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(tms.tm_min, exploded.minute);
222*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(tms.tm_sec, exploded.second);
223*635a8641SAndroid Build Coastguard Worker
224*635a8641SAndroid Build Coastguard Worker // Convert exploded back to the time struct.
225*635a8641SAndroid Build Coastguard Worker Time our_time_2;
226*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromLocalExploded(exploded, &our_time_2));
227*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(our_time_1 == our_time_2);
228*635a8641SAndroid Build Coastguard Worker
229*635a8641SAndroid Build Coastguard Worker time_t now_t_2 = our_time_2.ToTimeT();
230*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(now_t_1, now_t_2);
231*635a8641SAndroid Build Coastguard Worker }
232*635a8641SAndroid Build Coastguard Worker
233*635a8641SAndroid Build Coastguard Worker // Test conversions to/from javascript time.
TEST_F(TimeTest,JsTime)234*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, JsTime) {
235*635a8641SAndroid Build Coastguard Worker Time epoch = Time::FromJsTime(0.0);
236*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(epoch, Time::UnixEpoch());
237*635a8641SAndroid Build Coastguard Worker Time t = Time::FromJsTime(700000.3);
238*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(700.0003, t.ToDoubleT());
239*635a8641SAndroid Build Coastguard Worker t = Time::FromDoubleT(800.73);
240*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(800730.0, t.ToJsTime());
241*635a8641SAndroid Build Coastguard Worker }
242*635a8641SAndroid Build Coastguard Worker
243*635a8641SAndroid Build Coastguard Worker #if defined(OS_POSIX) || defined(OS_FUCHSIA)
TEST_F(TimeTest,FromTimeVal)244*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, FromTimeVal) {
245*635a8641SAndroid Build Coastguard Worker Time now = Time::Now();
246*635a8641SAndroid Build Coastguard Worker Time also_now = Time::FromTimeVal(now.ToTimeVal());
247*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(now, also_now);
248*635a8641SAndroid Build Coastguard Worker }
249*635a8641SAndroid Build Coastguard Worker #endif // defined(OS_POSIX) || defined(OS_FUCHSIA)
250*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,FromExplodedWithMilliseconds)251*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, FromExplodedWithMilliseconds) {
252*635a8641SAndroid Build Coastguard Worker // Some platform implementations of FromExploded are liable to drop
253*635a8641SAndroid Build Coastguard Worker // milliseconds if we aren't careful.
254*635a8641SAndroid Build Coastguard Worker Time now = Time::NowFromSystemTime();
255*635a8641SAndroid Build Coastguard Worker Time::Exploded exploded1 = {0};
256*635a8641SAndroid Build Coastguard Worker now.UTCExplode(&exploded1);
257*635a8641SAndroid Build Coastguard Worker exploded1.millisecond = 500;
258*635a8641SAndroid Build Coastguard Worker Time time;
259*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromUTCExploded(exploded1, &time));
260*635a8641SAndroid Build Coastguard Worker Time::Exploded exploded2 = {0};
261*635a8641SAndroid Build Coastguard Worker time.UTCExplode(&exploded2);
262*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(exploded1.millisecond, exploded2.millisecond);
263*635a8641SAndroid Build Coastguard Worker }
264*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,ZeroIsSymmetric)265*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, ZeroIsSymmetric) {
266*635a8641SAndroid Build Coastguard Worker Time zero_time(Time::FromTimeT(0));
267*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, zero_time.ToTimeT());
268*635a8641SAndroid Build Coastguard Worker
269*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0.0, zero_time.ToDoubleT());
270*635a8641SAndroid Build Coastguard Worker }
271*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,LocalExplode)272*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, LocalExplode) {
273*635a8641SAndroid Build Coastguard Worker Time a = Time::Now();
274*635a8641SAndroid Build Coastguard Worker Time::Exploded exploded;
275*635a8641SAndroid Build Coastguard Worker a.LocalExplode(&exploded);
276*635a8641SAndroid Build Coastguard Worker
277*635a8641SAndroid Build Coastguard Worker Time b;
278*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromLocalExploded(exploded, &b));
279*635a8641SAndroid Build Coastguard Worker
280*635a8641SAndroid Build Coastguard Worker // The exploded structure doesn't have microseconds, and on Mac & Linux, the
281*635a8641SAndroid Build Coastguard Worker // internal OS conversion uses seconds, which will cause truncation. So we
282*635a8641SAndroid Build Coastguard Worker // can only make sure that the delta is within one second.
283*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE((a - b) < TimeDelta::FromSeconds(1));
284*635a8641SAndroid Build Coastguard Worker }
285*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,UTCExplode)286*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, UTCExplode) {
287*635a8641SAndroid Build Coastguard Worker Time a = Time::Now();
288*635a8641SAndroid Build Coastguard Worker Time::Exploded exploded;
289*635a8641SAndroid Build Coastguard Worker a.UTCExplode(&exploded);
290*635a8641SAndroid Build Coastguard Worker
291*635a8641SAndroid Build Coastguard Worker Time b;
292*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromUTCExploded(exploded, &b));
293*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE((a - b) < TimeDelta::FromSeconds(1));
294*635a8641SAndroid Build Coastguard Worker }
295*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,LocalMidnight)296*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, LocalMidnight) {
297*635a8641SAndroid Build Coastguard Worker Time::Exploded exploded;
298*635a8641SAndroid Build Coastguard Worker Time::Now().LocalMidnight().LocalExplode(&exploded);
299*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, exploded.hour);
300*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, exploded.minute);
301*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, exploded.second);
302*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, exploded.millisecond);
303*635a8641SAndroid Build Coastguard Worker }
304*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,ParseTimeTest1)305*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, ParseTimeTest1) {
306*635a8641SAndroid Build Coastguard Worker time_t current_time = 0;
307*635a8641SAndroid Build Coastguard Worker time(¤t_time);
308*635a8641SAndroid Build Coastguard Worker
309*635a8641SAndroid Build Coastguard Worker struct tm local_time = {};
310*635a8641SAndroid Build Coastguard Worker char time_buf[64] = {};
311*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
312*635a8641SAndroid Build Coastguard Worker localtime_s(&local_time, ¤t_time);
313*635a8641SAndroid Build Coastguard Worker asctime_s(time_buf, arraysize(time_buf), &local_time);
314*635a8641SAndroid Build Coastguard Worker #elif defined(OS_POSIX) || defined(OS_FUCHSIA)
315*635a8641SAndroid Build Coastguard Worker localtime_r(¤t_time, &local_time);
316*635a8641SAndroid Build Coastguard Worker asctime_r(&local_time, time_buf);
317*635a8641SAndroid Build Coastguard Worker #endif
318*635a8641SAndroid Build Coastguard Worker
319*635a8641SAndroid Build Coastguard Worker Time parsed_time;
320*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString(time_buf, &parsed_time));
321*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(current_time, parsed_time.ToTimeT());
322*635a8641SAndroid Build Coastguard Worker }
323*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,DayOfWeekSunday)324*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, DayOfWeekSunday) {
325*635a8641SAndroid Build Coastguard Worker Time time;
326*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("Sun, 06 May 2012 12:00:00 GMT", &time));
327*635a8641SAndroid Build Coastguard Worker Time::Exploded exploded;
328*635a8641SAndroid Build Coastguard Worker time.UTCExplode(&exploded);
329*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, exploded.day_of_week);
330*635a8641SAndroid Build Coastguard Worker }
331*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,DayOfWeekWednesday)332*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, DayOfWeekWednesday) {
333*635a8641SAndroid Build Coastguard Worker Time time;
334*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("Wed, 09 May 2012 12:00:00 GMT", &time));
335*635a8641SAndroid Build Coastguard Worker Time::Exploded exploded;
336*635a8641SAndroid Build Coastguard Worker time.UTCExplode(&exploded);
337*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(3, exploded.day_of_week);
338*635a8641SAndroid Build Coastguard Worker }
339*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,DayOfWeekSaturday)340*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, DayOfWeekSaturday) {
341*635a8641SAndroid Build Coastguard Worker Time time;
342*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("Sat, 12 May 2012 12:00:00 GMT", &time));
343*635a8641SAndroid Build Coastguard Worker Time::Exploded exploded;
344*635a8641SAndroid Build Coastguard Worker time.UTCExplode(&exploded);
345*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(6, exploded.day_of_week);
346*635a8641SAndroid Build Coastguard Worker }
347*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,ParseTimeTest2)348*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, ParseTimeTest2) {
349*635a8641SAndroid Build Coastguard Worker Time parsed_time;
350*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("Mon, 15 Oct 2007 19:45:00 GMT", &parsed_time));
351*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(comparison_time_pdt_, parsed_time);
352*635a8641SAndroid Build Coastguard Worker }
353*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,ParseTimeTest3)354*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, ParseTimeTest3) {
355*635a8641SAndroid Build Coastguard Worker Time parsed_time;
356*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("15 Oct 07 12:45:00", &parsed_time));
357*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(comparison_time_local_, parsed_time);
358*635a8641SAndroid Build Coastguard Worker }
359*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,ParseTimeTest4)360*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, ParseTimeTest4) {
361*635a8641SAndroid Build Coastguard Worker Time parsed_time;
362*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("15 Oct 07 19:45 GMT", &parsed_time));
363*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(comparison_time_pdt_, parsed_time);
364*635a8641SAndroid Build Coastguard Worker }
365*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,ParseTimeTest5)366*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, ParseTimeTest5) {
367*635a8641SAndroid Build Coastguard Worker Time parsed_time;
368*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("Mon Oct 15 12:45 PDT 2007", &parsed_time));
369*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(comparison_time_pdt_, parsed_time);
370*635a8641SAndroid Build Coastguard Worker }
371*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,ParseTimeTest6)372*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, ParseTimeTest6) {
373*635a8641SAndroid Build Coastguard Worker Time parsed_time;
374*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("Monday, Oct 15, 2007 12:45 PM", &parsed_time));
375*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(comparison_time_local_, parsed_time);
376*635a8641SAndroid Build Coastguard Worker }
377*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,ParseTimeTest7)378*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, ParseTimeTest7) {
379*635a8641SAndroid Build Coastguard Worker Time parsed_time;
380*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("10/15/07 12:45:00 PM", &parsed_time));
381*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(comparison_time_local_, parsed_time);
382*635a8641SAndroid Build Coastguard Worker }
383*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,ParseTimeTest8)384*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, ParseTimeTest8) {
385*635a8641SAndroid Build Coastguard Worker Time parsed_time;
386*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("15-OCT-2007 12:45pm", &parsed_time));
387*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(comparison_time_local_, parsed_time);
388*635a8641SAndroid Build Coastguard Worker }
389*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,ParseTimeTest9)390*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, ParseTimeTest9) {
391*635a8641SAndroid Build Coastguard Worker Time parsed_time;
392*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("16 Oct 2007 4:45-JST (Tuesday)", &parsed_time));
393*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(comparison_time_pdt_, parsed_time);
394*635a8641SAndroid Build Coastguard Worker }
395*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,ParseTimeTest10)396*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, ParseTimeTest10) {
397*635a8641SAndroid Build Coastguard Worker Time parsed_time;
398*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("15/10/07 12:45", &parsed_time));
399*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(parsed_time, comparison_time_local_);
400*635a8641SAndroid Build Coastguard Worker }
401*635a8641SAndroid Build Coastguard Worker
402*635a8641SAndroid Build Coastguard Worker // Test some of edge cases around epoch, etc.
TEST_F(TimeTest,ParseTimeTestEpoch0)403*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, ParseTimeTestEpoch0) {
404*635a8641SAndroid Build Coastguard Worker Time parsed_time;
405*635a8641SAndroid Build Coastguard Worker
406*635a8641SAndroid Build Coastguard Worker // time_t == epoch == 0
407*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("Thu Jan 01 01:00:00 +0100 1970",
408*635a8641SAndroid Build Coastguard Worker &parsed_time));
409*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, parsed_time.ToTimeT());
410*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("Thu Jan 01 00:00:00 GMT 1970",
411*635a8641SAndroid Build Coastguard Worker &parsed_time));
412*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, parsed_time.ToTimeT());
413*635a8641SAndroid Build Coastguard Worker }
414*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,ParseTimeTestEpoch1)415*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, ParseTimeTestEpoch1) {
416*635a8641SAndroid Build Coastguard Worker Time parsed_time;
417*635a8641SAndroid Build Coastguard Worker
418*635a8641SAndroid Build Coastguard Worker // time_t == 1 second after epoch == 1
419*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("Thu Jan 01 01:00:01 +0100 1970",
420*635a8641SAndroid Build Coastguard Worker &parsed_time));
421*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, parsed_time.ToTimeT());
422*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("Thu Jan 01 00:00:01 GMT 1970",
423*635a8641SAndroid Build Coastguard Worker &parsed_time));
424*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, parsed_time.ToTimeT());
425*635a8641SAndroid Build Coastguard Worker }
426*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,ParseTimeTestEpoch2)427*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, ParseTimeTestEpoch2) {
428*635a8641SAndroid Build Coastguard Worker Time parsed_time;
429*635a8641SAndroid Build Coastguard Worker
430*635a8641SAndroid Build Coastguard Worker // time_t == 2 seconds after epoch == 2
431*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("Thu Jan 01 01:00:02 +0100 1970",
432*635a8641SAndroid Build Coastguard Worker &parsed_time));
433*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2, parsed_time.ToTimeT());
434*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("Thu Jan 01 00:00:02 GMT 1970",
435*635a8641SAndroid Build Coastguard Worker &parsed_time));
436*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2, parsed_time.ToTimeT());
437*635a8641SAndroid Build Coastguard Worker }
438*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,ParseTimeTestEpochNeg1)439*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, ParseTimeTestEpochNeg1) {
440*635a8641SAndroid Build Coastguard Worker Time parsed_time;
441*635a8641SAndroid Build Coastguard Worker
442*635a8641SAndroid Build Coastguard Worker // time_t == 1 second before epoch == -1
443*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("Thu Jan 01 00:59:59 +0100 1970",
444*635a8641SAndroid Build Coastguard Worker &parsed_time));
445*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(-1, parsed_time.ToTimeT());
446*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("Wed Dec 31 23:59:59 GMT 1969",
447*635a8641SAndroid Build Coastguard Worker &parsed_time));
448*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(-1, parsed_time.ToTimeT());
449*635a8641SAndroid Build Coastguard Worker }
450*635a8641SAndroid Build Coastguard Worker
451*635a8641SAndroid Build Coastguard Worker // If time_t is 32 bits, a date after year 2038 will overflow time_t and
452*635a8641SAndroid Build Coastguard Worker // cause timegm() to return -1. The parsed time should not be 1 second
453*635a8641SAndroid Build Coastguard Worker // before epoch.
TEST_F(TimeTest,ParseTimeTestEpochNotNeg1)454*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, ParseTimeTestEpochNotNeg1) {
455*635a8641SAndroid Build Coastguard Worker Time parsed_time;
456*635a8641SAndroid Build Coastguard Worker
457*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("Wed Dec 31 23:59:59 GMT 2100",
458*635a8641SAndroid Build Coastguard Worker &parsed_time));
459*635a8641SAndroid Build Coastguard Worker EXPECT_NE(-1, parsed_time.ToTimeT());
460*635a8641SAndroid Build Coastguard Worker }
461*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,ParseTimeTestEpochNeg2)462*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, ParseTimeTestEpochNeg2) {
463*635a8641SAndroid Build Coastguard Worker Time parsed_time;
464*635a8641SAndroid Build Coastguard Worker
465*635a8641SAndroid Build Coastguard Worker // time_t == 2 seconds before epoch == -2
466*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("Thu Jan 01 00:59:58 +0100 1970",
467*635a8641SAndroid Build Coastguard Worker &parsed_time));
468*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(-2, parsed_time.ToTimeT());
469*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("Wed Dec 31 23:59:58 GMT 1969",
470*635a8641SAndroid Build Coastguard Worker &parsed_time));
471*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(-2, parsed_time.ToTimeT());
472*635a8641SAndroid Build Coastguard Worker }
473*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,ParseTimeTestEpoch1960)474*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, ParseTimeTestEpoch1960) {
475*635a8641SAndroid Build Coastguard Worker Time parsed_time;
476*635a8641SAndroid Build Coastguard Worker
477*635a8641SAndroid Build Coastguard Worker // time_t before Epoch, in 1960
478*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("Wed Jun 29 19:40:01 +0100 1960",
479*635a8641SAndroid Build Coastguard Worker &parsed_time));
480*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(-299999999, parsed_time.ToTimeT());
481*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("Wed Jun 29 18:40:01 GMT 1960",
482*635a8641SAndroid Build Coastguard Worker &parsed_time));
483*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(-299999999, parsed_time.ToTimeT());
484*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromString("Wed Jun 29 17:40:01 GMT 1960",
485*635a8641SAndroid Build Coastguard Worker &parsed_time));
486*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(-300003599, parsed_time.ToTimeT());
487*635a8641SAndroid Build Coastguard Worker }
488*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,ParseTimeTestEmpty)489*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, ParseTimeTestEmpty) {
490*635a8641SAndroid Build Coastguard Worker Time parsed_time;
491*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(Time::FromString("", &parsed_time));
492*635a8641SAndroid Build Coastguard Worker }
493*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,ParseTimeTestInvalidString)494*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, ParseTimeTestInvalidString) {
495*635a8641SAndroid Build Coastguard Worker Time parsed_time;
496*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(Time::FromString("Monday morning 2000", &parsed_time));
497*635a8641SAndroid Build Coastguard Worker }
498*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,ExplodeBeforeUnixEpoch)499*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, ExplodeBeforeUnixEpoch) {
500*635a8641SAndroid Build Coastguard Worker static const int kUnixEpochYear = 1970; // In case this changes (ha!).
501*635a8641SAndroid Build Coastguard Worker Time t;
502*635a8641SAndroid Build Coastguard Worker Time::Exploded exploded;
503*635a8641SAndroid Build Coastguard Worker
504*635a8641SAndroid Build Coastguard Worker t = Time::UnixEpoch() - TimeDelta::FromMicroseconds(1);
505*635a8641SAndroid Build Coastguard Worker t.UTCExplode(&exploded);
506*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(exploded.HasValidValues());
507*635a8641SAndroid Build Coastguard Worker // Should be 1969-12-31 23:59:59 999 milliseconds (and 999 microseconds).
508*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kUnixEpochYear - 1, exploded.year);
509*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(12, exploded.month);
510*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(31, exploded.day_of_month);
511*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(23, exploded.hour);
512*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(59, exploded.minute);
513*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(59, exploded.second);
514*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(999, exploded.millisecond);
515*635a8641SAndroid Build Coastguard Worker
516*635a8641SAndroid Build Coastguard Worker t = Time::UnixEpoch() - TimeDelta::FromMicroseconds(1000);
517*635a8641SAndroid Build Coastguard Worker t.UTCExplode(&exploded);
518*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(exploded.HasValidValues());
519*635a8641SAndroid Build Coastguard Worker // Should be 1969-12-31 23:59:59 999 milliseconds.
520*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kUnixEpochYear - 1, exploded.year);
521*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(12, exploded.month);
522*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(31, exploded.day_of_month);
523*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(23, exploded.hour);
524*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(59, exploded.minute);
525*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(59, exploded.second);
526*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(999, exploded.millisecond);
527*635a8641SAndroid Build Coastguard Worker
528*635a8641SAndroid Build Coastguard Worker t = Time::UnixEpoch() - TimeDelta::FromMicroseconds(1001);
529*635a8641SAndroid Build Coastguard Worker t.UTCExplode(&exploded);
530*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(exploded.HasValidValues());
531*635a8641SAndroid Build Coastguard Worker // Should be 1969-12-31 23:59:59 998 milliseconds (and 999 microseconds).
532*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kUnixEpochYear - 1, exploded.year);
533*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(12, exploded.month);
534*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(31, exploded.day_of_month);
535*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(23, exploded.hour);
536*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(59, exploded.minute);
537*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(59, exploded.second);
538*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(998, exploded.millisecond);
539*635a8641SAndroid Build Coastguard Worker
540*635a8641SAndroid Build Coastguard Worker t = Time::UnixEpoch() - TimeDelta::FromMilliseconds(1000);
541*635a8641SAndroid Build Coastguard Worker t.UTCExplode(&exploded);
542*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(exploded.HasValidValues());
543*635a8641SAndroid Build Coastguard Worker // Should be 1969-12-31 23:59:59.
544*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kUnixEpochYear - 1, exploded.year);
545*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(12, exploded.month);
546*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(31, exploded.day_of_month);
547*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(23, exploded.hour);
548*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(59, exploded.minute);
549*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(59, exploded.second);
550*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, exploded.millisecond);
551*635a8641SAndroid Build Coastguard Worker
552*635a8641SAndroid Build Coastguard Worker t = Time::UnixEpoch() - TimeDelta::FromMilliseconds(1001);
553*635a8641SAndroid Build Coastguard Worker t.UTCExplode(&exploded);
554*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(exploded.HasValidValues());
555*635a8641SAndroid Build Coastguard Worker // Should be 1969-12-31 23:59:58 999 milliseconds.
556*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kUnixEpochYear - 1, exploded.year);
557*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(12, exploded.month);
558*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(31, exploded.day_of_month);
559*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(23, exploded.hour);
560*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(59, exploded.minute);
561*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(58, exploded.second);
562*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(999, exploded.millisecond);
563*635a8641SAndroid Build Coastguard Worker
564*635a8641SAndroid Build Coastguard Worker // Make sure we still handle at/after Unix epoch correctly.
565*635a8641SAndroid Build Coastguard Worker t = Time::UnixEpoch();
566*635a8641SAndroid Build Coastguard Worker t.UTCExplode(&exploded);
567*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(exploded.HasValidValues());
568*635a8641SAndroid Build Coastguard Worker // Should be 1970-12-31 00:00:00 0 milliseconds.
569*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kUnixEpochYear, exploded.year);
570*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, exploded.month);
571*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, exploded.day_of_month);
572*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, exploded.hour);
573*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, exploded.minute);
574*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, exploded.second);
575*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, exploded.millisecond);
576*635a8641SAndroid Build Coastguard Worker
577*635a8641SAndroid Build Coastguard Worker t = Time::UnixEpoch() + TimeDelta::FromMicroseconds(1);
578*635a8641SAndroid Build Coastguard Worker t.UTCExplode(&exploded);
579*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(exploded.HasValidValues());
580*635a8641SAndroid Build Coastguard Worker // Should be 1970-01-01 00:00:00 0 milliseconds (and 1 microsecond).
581*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kUnixEpochYear, exploded.year);
582*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, exploded.month);
583*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, exploded.day_of_month);
584*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, exploded.hour);
585*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, exploded.minute);
586*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, exploded.second);
587*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, exploded.millisecond);
588*635a8641SAndroid Build Coastguard Worker
589*635a8641SAndroid Build Coastguard Worker t = Time::UnixEpoch() + TimeDelta::FromMicroseconds(1000);
590*635a8641SAndroid Build Coastguard Worker t.UTCExplode(&exploded);
591*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(exploded.HasValidValues());
592*635a8641SAndroid Build Coastguard Worker // Should be 1970-01-01 00:00:00 1 millisecond.
593*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kUnixEpochYear, exploded.year);
594*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, exploded.month);
595*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, exploded.day_of_month);
596*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, exploded.hour);
597*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, exploded.minute);
598*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, exploded.second);
599*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, exploded.millisecond);
600*635a8641SAndroid Build Coastguard Worker
601*635a8641SAndroid Build Coastguard Worker t = Time::UnixEpoch() + TimeDelta::FromMilliseconds(1000);
602*635a8641SAndroid Build Coastguard Worker t.UTCExplode(&exploded);
603*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(exploded.HasValidValues());
604*635a8641SAndroid Build Coastguard Worker // Should be 1970-01-01 00:00:01.
605*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kUnixEpochYear, exploded.year);
606*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, exploded.month);
607*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, exploded.day_of_month);
608*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, exploded.hour);
609*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, exploded.minute);
610*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, exploded.second);
611*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, exploded.millisecond);
612*635a8641SAndroid Build Coastguard Worker
613*635a8641SAndroid Build Coastguard Worker t = Time::UnixEpoch() + TimeDelta::FromMilliseconds(1001);
614*635a8641SAndroid Build Coastguard Worker t.UTCExplode(&exploded);
615*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(exploded.HasValidValues());
616*635a8641SAndroid Build Coastguard Worker // Should be 1970-01-01 00:00:01 1 millisecond.
617*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kUnixEpochYear, exploded.year);
618*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, exploded.month);
619*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, exploded.day_of_month);
620*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, exploded.hour);
621*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, exploded.minute);
622*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, exploded.second);
623*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1, exploded.millisecond);
624*635a8641SAndroid Build Coastguard Worker }
625*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,Max)626*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, Max) {
627*635a8641SAndroid Build Coastguard Worker Time max = Time::Max();
628*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(max.is_max());
629*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(max, Time::Max());
630*635a8641SAndroid Build Coastguard Worker EXPECT_GT(max, Time::Now());
631*635a8641SAndroid Build Coastguard Worker EXPECT_GT(max, Time());
632*635a8641SAndroid Build Coastguard Worker }
633*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,MaxConversions)634*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, MaxConversions) {
635*635a8641SAndroid Build Coastguard Worker Time t = Time::Max();
636*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(std::numeric_limits<int64_t>::max(), t.ToInternalValue());
637*635a8641SAndroid Build Coastguard Worker
638*635a8641SAndroid Build Coastguard Worker t = Time::FromDoubleT(std::numeric_limits<double>::infinity());
639*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(t.is_max());
640*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(std::numeric_limits<double>::infinity(), t.ToDoubleT());
641*635a8641SAndroid Build Coastguard Worker
642*635a8641SAndroid Build Coastguard Worker t = Time::FromJsTime(std::numeric_limits<double>::infinity());
643*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(t.is_max());
644*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(std::numeric_limits<double>::infinity(), t.ToJsTime());
645*635a8641SAndroid Build Coastguard Worker
646*635a8641SAndroid Build Coastguard Worker t = Time::FromTimeT(std::numeric_limits<time_t>::max());
647*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(t.is_max());
648*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(std::numeric_limits<time_t>::max(), t.ToTimeT());
649*635a8641SAndroid Build Coastguard Worker
650*635a8641SAndroid Build Coastguard Worker #if defined(OS_POSIX) || defined(OS_FUCHSIA)
651*635a8641SAndroid Build Coastguard Worker struct timeval tval;
652*635a8641SAndroid Build Coastguard Worker tval.tv_sec = std::numeric_limits<time_t>::max();
653*635a8641SAndroid Build Coastguard Worker tval.tv_usec = static_cast<suseconds_t>(Time::kMicrosecondsPerSecond) - 1;
654*635a8641SAndroid Build Coastguard Worker t = Time::FromTimeVal(tval);
655*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(t.is_max());
656*635a8641SAndroid Build Coastguard Worker tval = t.ToTimeVal();
657*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(std::numeric_limits<time_t>::max(), tval.tv_sec);
658*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(static_cast<suseconds_t>(Time::kMicrosecondsPerSecond) - 1,
659*635a8641SAndroid Build Coastguard Worker tval.tv_usec);
660*635a8641SAndroid Build Coastguard Worker #endif
661*635a8641SAndroid Build Coastguard Worker
662*635a8641SAndroid Build Coastguard Worker #if defined(OS_MACOSX)
663*635a8641SAndroid Build Coastguard Worker t = Time::FromCFAbsoluteTime(std::numeric_limits<CFAbsoluteTime>::infinity());
664*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(t.is_max());
665*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(std::numeric_limits<CFAbsoluteTime>::infinity(),
666*635a8641SAndroid Build Coastguard Worker t.ToCFAbsoluteTime());
667*635a8641SAndroid Build Coastguard Worker #endif
668*635a8641SAndroid Build Coastguard Worker
669*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
670*635a8641SAndroid Build Coastguard Worker FILETIME ftime;
671*635a8641SAndroid Build Coastguard Worker ftime.dwHighDateTime = std::numeric_limits<DWORD>::max();
672*635a8641SAndroid Build Coastguard Worker ftime.dwLowDateTime = std::numeric_limits<DWORD>::max();
673*635a8641SAndroid Build Coastguard Worker t = Time::FromFileTime(ftime);
674*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(t.is_max());
675*635a8641SAndroid Build Coastguard Worker ftime = t.ToFileTime();
676*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(std::numeric_limits<DWORD>::max(), ftime.dwHighDateTime);
677*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(std::numeric_limits<DWORD>::max(), ftime.dwLowDateTime);
678*635a8641SAndroid Build Coastguard Worker #endif
679*635a8641SAndroid Build Coastguard Worker }
680*635a8641SAndroid Build Coastguard Worker
681*635a8641SAndroid Build Coastguard Worker #if defined(OS_MACOSX)
TEST_F(TimeTest,TimeTOverflow)682*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, TimeTOverflow) {
683*635a8641SAndroid Build Coastguard Worker Time t = Time::FromInternalValue(std::numeric_limits<int64_t>::max() - 1);
684*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(t.is_max());
685*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(std::numeric_limits<time_t>::max(), t.ToTimeT());
686*635a8641SAndroid Build Coastguard Worker }
687*635a8641SAndroid Build Coastguard Worker #endif
688*635a8641SAndroid Build Coastguard Worker
689*635a8641SAndroid Build Coastguard Worker #if defined(OS_ANDROID)
TEST_F(TimeTest,FromLocalExplodedCrashOnAndroid)690*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, FromLocalExplodedCrashOnAndroid) {
691*635a8641SAndroid Build Coastguard Worker // This crashed inside Time:: FromLocalExploded() on Android 4.1.2.
692*635a8641SAndroid Build Coastguard Worker // See http://crbug.com/287821
693*635a8641SAndroid Build Coastguard Worker Time::Exploded midnight = {2013, // year
694*635a8641SAndroid Build Coastguard Worker 10, // month
695*635a8641SAndroid Build Coastguard Worker 0, // day_of_week
696*635a8641SAndroid Build Coastguard Worker 13, // day_of_month
697*635a8641SAndroid Build Coastguard Worker 0, // hour
698*635a8641SAndroid Build Coastguard Worker 0, // minute
699*635a8641SAndroid Build Coastguard Worker 0, // second
700*635a8641SAndroid Build Coastguard Worker };
701*635a8641SAndroid Build Coastguard Worker // The string passed to putenv() must be a char* and the documentation states
702*635a8641SAndroid Build Coastguard Worker // that it 'becomes part of the environment', so use a static buffer.
703*635a8641SAndroid Build Coastguard Worker static char buffer[] = "TZ=America/Santiago";
704*635a8641SAndroid Build Coastguard Worker putenv(buffer);
705*635a8641SAndroid Build Coastguard Worker tzset();
706*635a8641SAndroid Build Coastguard Worker Time t;
707*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromLocalExploded(midnight, &t));
708*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(1381633200, t.ToTimeT());
709*635a8641SAndroid Build Coastguard Worker }
710*635a8641SAndroid Build Coastguard Worker #endif // OS_ANDROID
711*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,FromExploded_MinMax)712*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, FromExploded_MinMax) {
713*635a8641SAndroid Build Coastguard Worker Time::Exploded exploded = {0};
714*635a8641SAndroid Build Coastguard Worker exploded.month = 1;
715*635a8641SAndroid Build Coastguard Worker exploded.day_of_month = 1;
716*635a8641SAndroid Build Coastguard Worker
717*635a8641SAndroid Build Coastguard Worker Time parsed_time;
718*635a8641SAndroid Build Coastguard Worker
719*635a8641SAndroid Build Coastguard Worker if (Time::kExplodedMinYear != std::numeric_limits<int>::min()) {
720*635a8641SAndroid Build Coastguard Worker exploded.year = Time::kExplodedMinYear;
721*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromUTCExploded(exploded, &parsed_time));
722*635a8641SAndroid Build Coastguard Worker #if defined(OS_POSIX) || defined(OS_FUCHSIA)
723*635a8641SAndroid Build Coastguard Worker // On Windows, January 1, 1601 00:00:00 is actually the null time.
724*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(parsed_time.is_null());
725*635a8641SAndroid Build Coastguard Worker #endif
726*635a8641SAndroid Build Coastguard Worker
727*635a8641SAndroid Build Coastguard Worker #if !defined(OS_ANDROID) && !defined(OS_MACOSX)
728*635a8641SAndroid Build Coastguard Worker // The dates earlier than |kExplodedMinYear| that don't work are OS version
729*635a8641SAndroid Build Coastguard Worker // dependent on Android and Mac (for example, macOS 10.13 seems to support
730*635a8641SAndroid Build Coastguard Worker // dates before 1902).
731*635a8641SAndroid Build Coastguard Worker exploded.year--;
732*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(Time::FromUTCExploded(exploded, &parsed_time));
733*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(parsed_time.is_null());
734*635a8641SAndroid Build Coastguard Worker #endif
735*635a8641SAndroid Build Coastguard Worker }
736*635a8641SAndroid Build Coastguard Worker
737*635a8641SAndroid Build Coastguard Worker if (Time::kExplodedMaxYear != std::numeric_limits<int>::max()) {
738*635a8641SAndroid Build Coastguard Worker exploded.year = Time::kExplodedMaxYear;
739*635a8641SAndroid Build Coastguard Worker exploded.month = 12;
740*635a8641SAndroid Build Coastguard Worker exploded.day_of_month = 31;
741*635a8641SAndroid Build Coastguard Worker exploded.hour = 23;
742*635a8641SAndroid Build Coastguard Worker exploded.minute = 59;
743*635a8641SAndroid Build Coastguard Worker exploded.second = 59;
744*635a8641SAndroid Build Coastguard Worker exploded.millisecond = 999;
745*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromUTCExploded(exploded, &parsed_time));
746*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(parsed_time.is_null());
747*635a8641SAndroid Build Coastguard Worker
748*635a8641SAndroid Build Coastguard Worker exploded.year++;
749*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(Time::FromUTCExploded(exploded, &parsed_time));
750*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(parsed_time.is_null());
751*635a8641SAndroid Build Coastguard Worker }
752*635a8641SAndroid Build Coastguard Worker }
753*635a8641SAndroid Build Coastguard Worker
754*635a8641SAndroid Build Coastguard Worker class TimeOverride {
755*635a8641SAndroid Build Coastguard Worker public:
Now()756*635a8641SAndroid Build Coastguard Worker static Time Now() {
757*635a8641SAndroid Build Coastguard Worker now_time_ += TimeDelta::FromSeconds(1);
758*635a8641SAndroid Build Coastguard Worker return now_time_;
759*635a8641SAndroid Build Coastguard Worker }
760*635a8641SAndroid Build Coastguard Worker
761*635a8641SAndroid Build Coastguard Worker static Time now_time_;
762*635a8641SAndroid Build Coastguard Worker };
763*635a8641SAndroid Build Coastguard Worker
764*635a8641SAndroid Build Coastguard Worker // static
765*635a8641SAndroid Build Coastguard Worker Time TimeOverride::now_time_;
766*635a8641SAndroid Build Coastguard Worker
TEST_F(TimeTest,NowOverride)767*635a8641SAndroid Build Coastguard Worker TEST_F(TimeTest, NowOverride) {
768*635a8641SAndroid Build Coastguard Worker TimeOverride::now_time_ = Time::UnixEpoch();
769*635a8641SAndroid Build Coastguard Worker
770*635a8641SAndroid Build Coastguard Worker // Choose a reference time that we know to be in the past but close to now.
771*635a8641SAndroid Build Coastguard Worker Time build_time = GetBuildTime();
772*635a8641SAndroid Build Coastguard Worker
773*635a8641SAndroid Build Coastguard Worker // Override is not active. All Now() methods should return a time greater than
774*635a8641SAndroid Build Coastguard Worker // the build time.
775*635a8641SAndroid Build Coastguard Worker EXPECT_LT(build_time, Time::Now());
776*635a8641SAndroid Build Coastguard Worker EXPECT_GT(Time::Max(), Time::Now());
777*635a8641SAndroid Build Coastguard Worker EXPECT_LT(build_time, subtle::TimeNowIgnoringOverride());
778*635a8641SAndroid Build Coastguard Worker EXPECT_GT(Time::Max(), subtle::TimeNowIgnoringOverride());
779*635a8641SAndroid Build Coastguard Worker EXPECT_LT(build_time, Time::NowFromSystemTime());
780*635a8641SAndroid Build Coastguard Worker EXPECT_GT(Time::Max(), Time::NowFromSystemTime());
781*635a8641SAndroid Build Coastguard Worker EXPECT_LT(build_time, subtle::TimeNowFromSystemTimeIgnoringOverride());
782*635a8641SAndroid Build Coastguard Worker EXPECT_GT(Time::Max(), subtle::TimeNowFromSystemTimeIgnoringOverride());
783*635a8641SAndroid Build Coastguard Worker
784*635a8641SAndroid Build Coastguard Worker {
785*635a8641SAndroid Build Coastguard Worker // Set override.
786*635a8641SAndroid Build Coastguard Worker subtle::ScopedTimeClockOverrides overrides(&TimeOverride::Now, nullptr,
787*635a8641SAndroid Build Coastguard Worker nullptr);
788*635a8641SAndroid Build Coastguard Worker
789*635a8641SAndroid Build Coastguard Worker // Overridden value is returned and incremented when Now() or
790*635a8641SAndroid Build Coastguard Worker // NowFromSystemTime() is called.
791*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Time::UnixEpoch() + TimeDelta::FromSeconds(1), Time::Now());
792*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Time::UnixEpoch() + TimeDelta::FromSeconds(2), Time::Now());
793*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Time::UnixEpoch() + TimeDelta::FromSeconds(3),
794*635a8641SAndroid Build Coastguard Worker Time::NowFromSystemTime());
795*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Time::UnixEpoch() + TimeDelta::FromSeconds(4),
796*635a8641SAndroid Build Coastguard Worker Time::NowFromSystemTime());
797*635a8641SAndroid Build Coastguard Worker
798*635a8641SAndroid Build Coastguard Worker // IgnoringOverride methods still return real time.
799*635a8641SAndroid Build Coastguard Worker EXPECT_LT(build_time, subtle::TimeNowIgnoringOverride());
800*635a8641SAndroid Build Coastguard Worker EXPECT_GT(Time::Max(), subtle::TimeNowIgnoringOverride());
801*635a8641SAndroid Build Coastguard Worker EXPECT_LT(build_time, subtle::TimeNowFromSystemTimeIgnoringOverride());
802*635a8641SAndroid Build Coastguard Worker EXPECT_GT(Time::Max(), subtle::TimeNowFromSystemTimeIgnoringOverride());
803*635a8641SAndroid Build Coastguard Worker
804*635a8641SAndroid Build Coastguard Worker // IgnoringOverride methods didn't call NowOverrideClock::Now().
805*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Time::UnixEpoch() + TimeDelta::FromSeconds(5), Time::Now());
806*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(Time::UnixEpoch() + TimeDelta::FromSeconds(6),
807*635a8641SAndroid Build Coastguard Worker Time::NowFromSystemTime());
808*635a8641SAndroid Build Coastguard Worker }
809*635a8641SAndroid Build Coastguard Worker
810*635a8641SAndroid Build Coastguard Worker // All methods return real time again.
811*635a8641SAndroid Build Coastguard Worker EXPECT_LT(build_time, Time::Now());
812*635a8641SAndroid Build Coastguard Worker EXPECT_GT(Time::Max(), Time::Now());
813*635a8641SAndroid Build Coastguard Worker EXPECT_LT(build_time, subtle::TimeNowIgnoringOverride());
814*635a8641SAndroid Build Coastguard Worker EXPECT_GT(Time::Max(), subtle::TimeNowIgnoringOverride());
815*635a8641SAndroid Build Coastguard Worker EXPECT_LT(build_time, Time::NowFromSystemTime());
816*635a8641SAndroid Build Coastguard Worker EXPECT_GT(Time::Max(), Time::NowFromSystemTime());
817*635a8641SAndroid Build Coastguard Worker EXPECT_LT(build_time, subtle::TimeNowFromSystemTimeIgnoringOverride());
818*635a8641SAndroid Build Coastguard Worker EXPECT_GT(Time::Max(), subtle::TimeNowFromSystemTimeIgnoringOverride());
819*635a8641SAndroid Build Coastguard Worker }
820*635a8641SAndroid Build Coastguard Worker
TEST(TimeTicks,Deltas)821*635a8641SAndroid Build Coastguard Worker TEST(TimeTicks, Deltas) {
822*635a8641SAndroid Build Coastguard Worker for (int index = 0; index < 50; index++) {
823*635a8641SAndroid Build Coastguard Worker TimeTicks ticks_start = TimeTicks::Now();
824*635a8641SAndroid Build Coastguard Worker base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
825*635a8641SAndroid Build Coastguard Worker TimeTicks ticks_stop = TimeTicks::Now();
826*635a8641SAndroid Build Coastguard Worker TimeDelta delta = ticks_stop - ticks_start;
827*635a8641SAndroid Build Coastguard Worker // Note: Although we asked for a 10ms sleep, if the
828*635a8641SAndroid Build Coastguard Worker // time clock has a finer granularity than the Sleep()
829*635a8641SAndroid Build Coastguard Worker // clock, it is quite possible to wakeup early. Here
830*635a8641SAndroid Build Coastguard Worker // is how that works:
831*635a8641SAndroid Build Coastguard Worker // Time(ms timer) Time(us timer)
832*635a8641SAndroid Build Coastguard Worker // 5 5010
833*635a8641SAndroid Build Coastguard Worker // 6 6010
834*635a8641SAndroid Build Coastguard Worker // 7 7010
835*635a8641SAndroid Build Coastguard Worker // 8 8010
836*635a8641SAndroid Build Coastguard Worker // 9 9000
837*635a8641SAndroid Build Coastguard Worker // Elapsed 4ms 3990us
838*635a8641SAndroid Build Coastguard Worker //
839*635a8641SAndroid Build Coastguard Worker // Unfortunately, our InMilliseconds() function truncates
840*635a8641SAndroid Build Coastguard Worker // rather than rounds. We should consider fixing this
841*635a8641SAndroid Build Coastguard Worker // so that our averages come out better.
842*635a8641SAndroid Build Coastguard Worker EXPECT_GE(delta.InMilliseconds(), 9);
843*635a8641SAndroid Build Coastguard Worker EXPECT_GE(delta.InMicroseconds(), 9000);
844*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(delta.InSeconds(), 0);
845*635a8641SAndroid Build Coastguard Worker }
846*635a8641SAndroid Build Coastguard Worker }
847*635a8641SAndroid Build Coastguard Worker
HighResClockTest(TimeTicks (* GetTicks)())848*635a8641SAndroid Build Coastguard Worker static void HighResClockTest(TimeTicks (*GetTicks)()) {
849*635a8641SAndroid Build Coastguard Worker // IsHighResolution() is false on some systems. Since the product still works
850*635a8641SAndroid Build Coastguard Worker // even if it's false, it makes this entire test questionable.
851*635a8641SAndroid Build Coastguard Worker if (!TimeTicks::IsHighResolution())
852*635a8641SAndroid Build Coastguard Worker return;
853*635a8641SAndroid Build Coastguard Worker
854*635a8641SAndroid Build Coastguard Worker // Why do we loop here?
855*635a8641SAndroid Build Coastguard Worker // We're trying to measure that intervals increment in a VERY small amount
856*635a8641SAndroid Build Coastguard Worker // of time -- less than 15ms. Unfortunately, if we happen to have a
857*635a8641SAndroid Build Coastguard Worker // context switch in the middle of our test, the context switch could easily
858*635a8641SAndroid Build Coastguard Worker // exceed our limit. So, we iterate on this several times. As long as we're
859*635a8641SAndroid Build Coastguard Worker // able to detect the fine-granularity timers at least once, then the test
860*635a8641SAndroid Build Coastguard Worker // has succeeded.
861*635a8641SAndroid Build Coastguard Worker
862*635a8641SAndroid Build Coastguard Worker const int kTargetGranularityUs = 15000; // 15ms
863*635a8641SAndroid Build Coastguard Worker
864*635a8641SAndroid Build Coastguard Worker bool success = false;
865*635a8641SAndroid Build Coastguard Worker int retries = 100; // Arbitrary.
866*635a8641SAndroid Build Coastguard Worker TimeDelta delta;
867*635a8641SAndroid Build Coastguard Worker while (!success && retries--) {
868*635a8641SAndroid Build Coastguard Worker TimeTicks ticks_start = GetTicks();
869*635a8641SAndroid Build Coastguard Worker // Loop until we can detect that the clock has changed. Non-HighRes timers
870*635a8641SAndroid Build Coastguard Worker // will increment in chunks, e.g. 15ms. By spinning until we see a clock
871*635a8641SAndroid Build Coastguard Worker // change, we detect the minimum time between measurements.
872*635a8641SAndroid Build Coastguard Worker do {
873*635a8641SAndroid Build Coastguard Worker delta = GetTicks() - ticks_start;
874*635a8641SAndroid Build Coastguard Worker } while (delta.InMilliseconds() == 0);
875*635a8641SAndroid Build Coastguard Worker
876*635a8641SAndroid Build Coastguard Worker if (delta.InMicroseconds() <= kTargetGranularityUs)
877*635a8641SAndroid Build Coastguard Worker success = true;
878*635a8641SAndroid Build Coastguard Worker }
879*635a8641SAndroid Build Coastguard Worker
880*635a8641SAndroid Build Coastguard Worker // In high resolution mode, we expect to see the clock increment
881*635a8641SAndroid Build Coastguard Worker // in intervals less than 15ms.
882*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(success);
883*635a8641SAndroid Build Coastguard Worker }
884*635a8641SAndroid Build Coastguard Worker
TEST(TimeTicks,HighRes)885*635a8641SAndroid Build Coastguard Worker TEST(TimeTicks, HighRes) {
886*635a8641SAndroid Build Coastguard Worker HighResClockTest(&TimeTicks::Now);
887*635a8641SAndroid Build Coastguard Worker }
888*635a8641SAndroid Build Coastguard Worker
889*635a8641SAndroid Build Coastguard Worker class TimeTicksOverride {
890*635a8641SAndroid Build Coastguard Worker public:
Now()891*635a8641SAndroid Build Coastguard Worker static TimeTicks Now() {
892*635a8641SAndroid Build Coastguard Worker now_ticks_ += TimeDelta::FromSeconds(1);
893*635a8641SAndroid Build Coastguard Worker return now_ticks_;
894*635a8641SAndroid Build Coastguard Worker }
895*635a8641SAndroid Build Coastguard Worker
896*635a8641SAndroid Build Coastguard Worker static TimeTicks now_ticks_;
897*635a8641SAndroid Build Coastguard Worker };
898*635a8641SAndroid Build Coastguard Worker
899*635a8641SAndroid Build Coastguard Worker // static
900*635a8641SAndroid Build Coastguard Worker TimeTicks TimeTicksOverride::now_ticks_;
901*635a8641SAndroid Build Coastguard Worker
TEST(TimeTicks,NowOverride)902*635a8641SAndroid Build Coastguard Worker TEST(TimeTicks, NowOverride) {
903*635a8641SAndroid Build Coastguard Worker TimeTicksOverride::now_ticks_ = TimeTicks::Min();
904*635a8641SAndroid Build Coastguard Worker
905*635a8641SAndroid Build Coastguard Worker // Override is not active. All Now() methods should return a sensible value.
906*635a8641SAndroid Build Coastguard Worker EXPECT_LT(TimeTicks::Min(), TimeTicks::UnixEpoch());
907*635a8641SAndroid Build Coastguard Worker EXPECT_LT(TimeTicks::UnixEpoch(), TimeTicks::Now());
908*635a8641SAndroid Build Coastguard Worker EXPECT_GT(TimeTicks::Max(), TimeTicks::Now());
909*635a8641SAndroid Build Coastguard Worker EXPECT_LT(TimeTicks::UnixEpoch(), subtle::TimeTicksNowIgnoringOverride());
910*635a8641SAndroid Build Coastguard Worker EXPECT_GT(TimeTicks::Max(), subtle::TimeTicksNowIgnoringOverride());
911*635a8641SAndroid Build Coastguard Worker
912*635a8641SAndroid Build Coastguard Worker {
913*635a8641SAndroid Build Coastguard Worker // Set override.
914*635a8641SAndroid Build Coastguard Worker subtle::ScopedTimeClockOverrides overrides(nullptr, &TimeTicksOverride::Now,
915*635a8641SAndroid Build Coastguard Worker nullptr);
916*635a8641SAndroid Build Coastguard Worker
917*635a8641SAndroid Build Coastguard Worker // Overridden value is returned and incremented when Now() is called.
918*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeTicks::Min() + TimeDelta::FromSeconds(1), TimeTicks::Now());
919*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeTicks::Min() + TimeDelta::FromSeconds(2), TimeTicks::Now());
920*635a8641SAndroid Build Coastguard Worker
921*635a8641SAndroid Build Coastguard Worker // NowIgnoringOverride() still returns real ticks.
922*635a8641SAndroid Build Coastguard Worker EXPECT_LT(TimeTicks::UnixEpoch(), subtle::TimeTicksNowIgnoringOverride());
923*635a8641SAndroid Build Coastguard Worker EXPECT_GT(TimeTicks::Max(), subtle::TimeTicksNowIgnoringOverride());
924*635a8641SAndroid Build Coastguard Worker
925*635a8641SAndroid Build Coastguard Worker // IgnoringOverride methods didn't call NowOverrideTickClock::NowTicks().
926*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeTicks::Min() + TimeDelta::FromSeconds(3), TimeTicks::Now());
927*635a8641SAndroid Build Coastguard Worker }
928*635a8641SAndroid Build Coastguard Worker
929*635a8641SAndroid Build Coastguard Worker // All methods return real ticks again.
930*635a8641SAndroid Build Coastguard Worker EXPECT_LT(TimeTicks::UnixEpoch(), TimeTicks::Now());
931*635a8641SAndroid Build Coastguard Worker EXPECT_GT(TimeTicks::Max(), TimeTicks::Now());
932*635a8641SAndroid Build Coastguard Worker EXPECT_LT(TimeTicks::UnixEpoch(), subtle::TimeTicksNowIgnoringOverride());
933*635a8641SAndroid Build Coastguard Worker EXPECT_GT(TimeTicks::Max(), subtle::TimeTicksNowIgnoringOverride());
934*635a8641SAndroid Build Coastguard Worker }
935*635a8641SAndroid Build Coastguard Worker
936*635a8641SAndroid Build Coastguard Worker class ThreadTicksOverride {
937*635a8641SAndroid Build Coastguard Worker public:
Now()938*635a8641SAndroid Build Coastguard Worker static ThreadTicks Now() {
939*635a8641SAndroid Build Coastguard Worker now_ticks_ += TimeDelta::FromSeconds(1);
940*635a8641SAndroid Build Coastguard Worker return now_ticks_;
941*635a8641SAndroid Build Coastguard Worker }
942*635a8641SAndroid Build Coastguard Worker
943*635a8641SAndroid Build Coastguard Worker static ThreadTicks now_ticks_;
944*635a8641SAndroid Build Coastguard Worker };
945*635a8641SAndroid Build Coastguard Worker
946*635a8641SAndroid Build Coastguard Worker // static
947*635a8641SAndroid Build Coastguard Worker ThreadTicks ThreadTicksOverride::now_ticks_;
948*635a8641SAndroid Build Coastguard Worker
949*635a8641SAndroid Build Coastguard Worker // IOS doesn't support ThreadTicks::Now().
950*635a8641SAndroid Build Coastguard Worker #if defined(OS_IOS)
951*635a8641SAndroid Build Coastguard Worker #define MAYBE_NowOverride DISABLED_NowOverride
952*635a8641SAndroid Build Coastguard Worker #else
953*635a8641SAndroid Build Coastguard Worker #define MAYBE_NowOverride NowOverride
954*635a8641SAndroid Build Coastguard Worker #endif
TEST(ThreadTicks,MAYBE_NowOverride)955*635a8641SAndroid Build Coastguard Worker TEST(ThreadTicks, MAYBE_NowOverride) {
956*635a8641SAndroid Build Coastguard Worker ThreadTicksOverride::now_ticks_ = ThreadTicks::Min();
957*635a8641SAndroid Build Coastguard Worker
958*635a8641SAndroid Build Coastguard Worker // Override is not active. All Now() methods should return a sensible value.
959*635a8641SAndroid Build Coastguard Worker ThreadTicks initial_thread_ticks = ThreadTicks::Now();
960*635a8641SAndroid Build Coastguard Worker EXPECT_LE(initial_thread_ticks, ThreadTicks::Now());
961*635a8641SAndroid Build Coastguard Worker EXPECT_GT(ThreadTicks::Max(), ThreadTicks::Now());
962*635a8641SAndroid Build Coastguard Worker EXPECT_LE(initial_thread_ticks, subtle::ThreadTicksNowIgnoringOverride());
963*635a8641SAndroid Build Coastguard Worker EXPECT_GT(ThreadTicks::Max(), subtle::ThreadTicksNowIgnoringOverride());
964*635a8641SAndroid Build Coastguard Worker
965*635a8641SAndroid Build Coastguard Worker {
966*635a8641SAndroid Build Coastguard Worker // Set override.
967*635a8641SAndroid Build Coastguard Worker subtle::ScopedTimeClockOverrides overrides(nullptr, nullptr,
968*635a8641SAndroid Build Coastguard Worker &ThreadTicksOverride::Now);
969*635a8641SAndroid Build Coastguard Worker
970*635a8641SAndroid Build Coastguard Worker // Overridden value is returned and incremented when Now() is called.
971*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ThreadTicks::Min() + TimeDelta::FromSeconds(1),
972*635a8641SAndroid Build Coastguard Worker ThreadTicks::Now());
973*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ThreadTicks::Min() + TimeDelta::FromSeconds(2),
974*635a8641SAndroid Build Coastguard Worker ThreadTicks::Now());
975*635a8641SAndroid Build Coastguard Worker
976*635a8641SAndroid Build Coastguard Worker // NowIgnoringOverride() still returns real ticks.
977*635a8641SAndroid Build Coastguard Worker EXPECT_LE(initial_thread_ticks, subtle::ThreadTicksNowIgnoringOverride());
978*635a8641SAndroid Build Coastguard Worker EXPECT_GT(ThreadTicks::Max(), subtle::ThreadTicksNowIgnoringOverride());
979*635a8641SAndroid Build Coastguard Worker
980*635a8641SAndroid Build Coastguard Worker // IgnoringOverride methods didn't call NowOverrideTickClock::NowTicks().
981*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ThreadTicks::Min() + TimeDelta::FromSeconds(3),
982*635a8641SAndroid Build Coastguard Worker ThreadTicks::Now());
983*635a8641SAndroid Build Coastguard Worker }
984*635a8641SAndroid Build Coastguard Worker
985*635a8641SAndroid Build Coastguard Worker // All methods return real ticks again.
986*635a8641SAndroid Build Coastguard Worker EXPECT_LE(initial_thread_ticks, ThreadTicks::Now());
987*635a8641SAndroid Build Coastguard Worker EXPECT_GT(ThreadTicks::Max(), ThreadTicks::Now());
988*635a8641SAndroid Build Coastguard Worker EXPECT_LE(initial_thread_ticks, subtle::ThreadTicksNowIgnoringOverride());
989*635a8641SAndroid Build Coastguard Worker EXPECT_GT(ThreadTicks::Max(), subtle::ThreadTicksNowIgnoringOverride());
990*635a8641SAndroid Build Coastguard Worker }
991*635a8641SAndroid Build Coastguard Worker
TEST(ThreadTicks,ThreadNow)992*635a8641SAndroid Build Coastguard Worker TEST(ThreadTicks, ThreadNow) {
993*635a8641SAndroid Build Coastguard Worker if (ThreadTicks::IsSupported()) {
994*635a8641SAndroid Build Coastguard Worker ThreadTicks::WaitUntilInitialized();
995*635a8641SAndroid Build Coastguard Worker TimeTicks begin = TimeTicks::Now();
996*635a8641SAndroid Build Coastguard Worker ThreadTicks begin_thread = ThreadTicks::Now();
997*635a8641SAndroid Build Coastguard Worker // Make sure that ThreadNow value is non-zero.
998*635a8641SAndroid Build Coastguard Worker EXPECT_GT(begin_thread, ThreadTicks());
999*635a8641SAndroid Build Coastguard Worker // Sleep for 10 milliseconds to get the thread de-scheduled.
1000*635a8641SAndroid Build Coastguard Worker base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
1001*635a8641SAndroid Build Coastguard Worker ThreadTicks end_thread = ThreadTicks::Now();
1002*635a8641SAndroid Build Coastguard Worker TimeTicks end = TimeTicks::Now();
1003*635a8641SAndroid Build Coastguard Worker TimeDelta delta = end - begin;
1004*635a8641SAndroid Build Coastguard Worker TimeDelta delta_thread = end_thread - begin_thread;
1005*635a8641SAndroid Build Coastguard Worker // Make sure that some thread time have elapsed.
1006*635a8641SAndroid Build Coastguard Worker EXPECT_GE(delta_thread.InMicroseconds(), 0);
1007*635a8641SAndroid Build Coastguard Worker // But the thread time is at least 9ms less than clock time.
1008*635a8641SAndroid Build Coastguard Worker TimeDelta difference = delta - delta_thread;
1009*635a8641SAndroid Build Coastguard Worker EXPECT_GE(difference.InMicroseconds(), 9000);
1010*635a8641SAndroid Build Coastguard Worker }
1011*635a8641SAndroid Build Coastguard Worker }
1012*635a8641SAndroid Build Coastguard Worker
TEST(TimeTicks,SnappedToNextTickBasic)1013*635a8641SAndroid Build Coastguard Worker TEST(TimeTicks, SnappedToNextTickBasic) {
1014*635a8641SAndroid Build Coastguard Worker base::TimeTicks phase = base::TimeTicks::FromInternalValue(4000);
1015*635a8641SAndroid Build Coastguard Worker base::TimeDelta interval = base::TimeDelta::FromMicroseconds(1000);
1016*635a8641SAndroid Build Coastguard Worker base::TimeTicks timestamp;
1017*635a8641SAndroid Build Coastguard Worker
1018*635a8641SAndroid Build Coastguard Worker // Timestamp in previous interval.
1019*635a8641SAndroid Build Coastguard Worker timestamp = base::TimeTicks::FromInternalValue(3500);
1020*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(4000,
1021*635a8641SAndroid Build Coastguard Worker timestamp.SnappedToNextTick(phase, interval).ToInternalValue());
1022*635a8641SAndroid Build Coastguard Worker
1023*635a8641SAndroid Build Coastguard Worker // Timestamp in next interval.
1024*635a8641SAndroid Build Coastguard Worker timestamp = base::TimeTicks::FromInternalValue(4500);
1025*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(5000,
1026*635a8641SAndroid Build Coastguard Worker timestamp.SnappedToNextTick(phase, interval).ToInternalValue());
1027*635a8641SAndroid Build Coastguard Worker
1028*635a8641SAndroid Build Coastguard Worker // Timestamp multiple intervals before.
1029*635a8641SAndroid Build Coastguard Worker timestamp = base::TimeTicks::FromInternalValue(2500);
1030*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(3000,
1031*635a8641SAndroid Build Coastguard Worker timestamp.SnappedToNextTick(phase, interval).ToInternalValue());
1032*635a8641SAndroid Build Coastguard Worker
1033*635a8641SAndroid Build Coastguard Worker // Timestamp multiple intervals after.
1034*635a8641SAndroid Build Coastguard Worker timestamp = base::TimeTicks::FromInternalValue(6500);
1035*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(7000,
1036*635a8641SAndroid Build Coastguard Worker timestamp.SnappedToNextTick(phase, interval).ToInternalValue());
1037*635a8641SAndroid Build Coastguard Worker
1038*635a8641SAndroid Build Coastguard Worker // Timestamp on previous interval.
1039*635a8641SAndroid Build Coastguard Worker timestamp = base::TimeTicks::FromInternalValue(3000);
1040*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(3000,
1041*635a8641SAndroid Build Coastguard Worker timestamp.SnappedToNextTick(phase, interval).ToInternalValue());
1042*635a8641SAndroid Build Coastguard Worker
1043*635a8641SAndroid Build Coastguard Worker // Timestamp on next interval.
1044*635a8641SAndroid Build Coastguard Worker timestamp = base::TimeTicks::FromInternalValue(5000);
1045*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(5000,
1046*635a8641SAndroid Build Coastguard Worker timestamp.SnappedToNextTick(phase, interval).ToInternalValue());
1047*635a8641SAndroid Build Coastguard Worker
1048*635a8641SAndroid Build Coastguard Worker // Timestamp equal to phase.
1049*635a8641SAndroid Build Coastguard Worker timestamp = base::TimeTicks::FromInternalValue(4000);
1050*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(4000,
1051*635a8641SAndroid Build Coastguard Worker timestamp.SnappedToNextTick(phase, interval).ToInternalValue());
1052*635a8641SAndroid Build Coastguard Worker }
1053*635a8641SAndroid Build Coastguard Worker
TEST(TimeTicks,SnappedToNextTickOverflow)1054*635a8641SAndroid Build Coastguard Worker TEST(TimeTicks, SnappedToNextTickOverflow) {
1055*635a8641SAndroid Build Coastguard Worker // int(big_timestamp / interval) < 0, so this causes a crash if the number of
1056*635a8641SAndroid Build Coastguard Worker // intervals elapsed is attempted to be stored in an int.
1057*635a8641SAndroid Build Coastguard Worker base::TimeTicks phase = base::TimeTicks::FromInternalValue(0);
1058*635a8641SAndroid Build Coastguard Worker base::TimeDelta interval = base::TimeDelta::FromMicroseconds(4000);
1059*635a8641SAndroid Build Coastguard Worker base::TimeTicks big_timestamp =
1060*635a8641SAndroid Build Coastguard Worker base::TimeTicks::FromInternalValue(8635916564000);
1061*635a8641SAndroid Build Coastguard Worker
1062*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(8635916564000,
1063*635a8641SAndroid Build Coastguard Worker big_timestamp.SnappedToNextTick(phase, interval).ToInternalValue());
1064*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(8635916564000,
1065*635a8641SAndroid Build Coastguard Worker big_timestamp.SnappedToNextTick(big_timestamp, interval)
1066*635a8641SAndroid Build Coastguard Worker .ToInternalValue());
1067*635a8641SAndroid Build Coastguard Worker }
1068*635a8641SAndroid Build Coastguard Worker
1069*635a8641SAndroid Build Coastguard Worker #if defined(OS_ANDROID)
TEST(TimeTicks,Android_FromUptimeMillis_ClocksMatch)1070*635a8641SAndroid Build Coastguard Worker TEST(TimeTicks, Android_FromUptimeMillis_ClocksMatch) {
1071*635a8641SAndroid Build Coastguard Worker JNIEnv* const env = android::AttachCurrentThread();
1072*635a8641SAndroid Build Coastguard Worker android::ScopedJavaLocalRef<jclass> clazz(
1073*635a8641SAndroid Build Coastguard Worker android::GetClass(env, "android/os/SystemClock"));
1074*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(clazz.obj());
1075*635a8641SAndroid Build Coastguard Worker const jmethodID method_id =
1076*635a8641SAndroid Build Coastguard Worker android::MethodID::Get<android::MethodID::TYPE_STATIC>(
1077*635a8641SAndroid Build Coastguard Worker env, clazz.obj(), "uptimeMillis", "()J");
1078*635a8641SAndroid Build Coastguard Worker ASSERT_FALSE(!method_id);
1079*635a8641SAndroid Build Coastguard Worker // Subtract 1ms from the expected lower bound to allow millisecon-level
1080*635a8641SAndroid Build Coastguard Worker // truncation performed in uptimeMillis().
1081*635a8641SAndroid Build Coastguard Worker const TimeTicks lower_bound_ticks =
1082*635a8641SAndroid Build Coastguard Worker TimeTicks::Now() - TimeDelta::FromMilliseconds(1);
1083*635a8641SAndroid Build Coastguard Worker const TimeTicks converted_ticks = TimeTicks::FromUptimeMillis(
1084*635a8641SAndroid Build Coastguard Worker env->CallStaticLongMethod(clazz.obj(), method_id));
1085*635a8641SAndroid Build Coastguard Worker const TimeTicks upper_bound_ticks = TimeTicks::Now();
1086*635a8641SAndroid Build Coastguard Worker EXPECT_LE(lower_bound_ticks, converted_ticks);
1087*635a8641SAndroid Build Coastguard Worker EXPECT_GE(upper_bound_ticks, converted_ticks);
1088*635a8641SAndroid Build Coastguard Worker }
1089*635a8641SAndroid Build Coastguard Worker #endif // OS_ANDROID
1090*635a8641SAndroid Build Coastguard Worker
TEST(TimeDelta,FromAndIn)1091*635a8641SAndroid Build Coastguard Worker TEST(TimeDelta, FromAndIn) {
1092*635a8641SAndroid Build Coastguard Worker // static_assert also checks that the contained expression is a constant
1093*635a8641SAndroid Build Coastguard Worker // expression, meaning all its components are suitable for initializing global
1094*635a8641SAndroid Build Coastguard Worker // variables.
1095*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromDays(2) == TimeDelta::FromHours(48), "");
1096*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromHours(3) == TimeDelta::FromMinutes(180), "");
1097*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromMinutes(2) == TimeDelta::FromSeconds(120), "");
1098*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromSeconds(2) == TimeDelta::FromMilliseconds(2000),
1099*635a8641SAndroid Build Coastguard Worker "");
1100*635a8641SAndroid Build Coastguard Worker static_assert(
1101*635a8641SAndroid Build Coastguard Worker TimeDelta::FromMilliseconds(2) == TimeDelta::FromMicroseconds(2000), "");
1102*635a8641SAndroid Build Coastguard Worker static_assert(
1103*635a8641SAndroid Build Coastguard Worker TimeDelta::FromSecondsD(2.3) == TimeDelta::FromMilliseconds(2300), "");
1104*635a8641SAndroid Build Coastguard Worker static_assert(
1105*635a8641SAndroid Build Coastguard Worker TimeDelta::FromMillisecondsD(2.5) == TimeDelta::FromMicroseconds(2500),
1106*635a8641SAndroid Build Coastguard Worker "");
1107*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromDays(13).InDays(), 13);
1108*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromHours(13).InHours(), 13);
1109*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMinutes(13).InMinutes(), 13);
1110*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromSeconds(13).InSeconds(), 13);
1111*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromSeconds(13).InSecondsF(), 13.0);
1112*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMilliseconds(13).InMilliseconds(), 13);
1113*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMilliseconds(13).InMillisecondsF(), 13.0);
1114*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromSecondsD(13.1).InSeconds(), 13);
1115*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromSecondsD(13.1).InSecondsF(), 13.1);
1116*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMillisecondsD(13.3).InMilliseconds(), 13);
1117*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMillisecondsD(13.3).InMillisecondsF(), 13.3);
1118*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMicroseconds(13).InMicroseconds(), 13);
1119*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMicrosecondsD(13.3).InMicroseconds(), 13);
1120*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMillisecondsD(3.45678).InMillisecondsF(), 3.456);
1121*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromNanoseconds(12345).InNanoseconds(), 12000);
1122*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromNanosecondsD(12345.678).InNanoseconds(), 12000);
1123*635a8641SAndroid Build Coastguard Worker }
1124*635a8641SAndroid Build Coastguard Worker
TEST(TimeDelta,InRoundsTowardsZero)1125*635a8641SAndroid Build Coastguard Worker TEST(TimeDelta, InRoundsTowardsZero) {
1126*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromHours(23).InDays(), 0);
1127*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromHours(-23).InDays(), 0);
1128*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMinutes(59).InHours(), 0);
1129*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMinutes(-59).InHours(), 0);
1130*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromSeconds(59).InMinutes(), 0);
1131*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromSeconds(-59).InMinutes(), 0);
1132*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMilliseconds(999).InSeconds(), 0);
1133*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMilliseconds(-999).InSeconds(), 0);
1134*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMicroseconds(999).InMilliseconds(), 0);
1135*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMicroseconds(-999).InMilliseconds(), 0);
1136*635a8641SAndroid Build Coastguard Worker }
1137*635a8641SAndroid Build Coastguard Worker
TEST(TimeDelta,InDaysFloored)1138*635a8641SAndroid Build Coastguard Worker TEST(TimeDelta, InDaysFloored) {
1139*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromHours(-25).InDaysFloored(), -2);
1140*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromHours(-24).InDaysFloored(), -1);
1141*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromHours(-23).InDaysFloored(), -1);
1142*635a8641SAndroid Build Coastguard Worker
1143*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromHours(-1).InDaysFloored(), -1);
1144*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromHours(0).InDaysFloored(), 0);
1145*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromHours(1).InDaysFloored(), 0);
1146*635a8641SAndroid Build Coastguard Worker
1147*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromHours(23).InDaysFloored(), 0);
1148*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromHours(24).InDaysFloored(), 1);
1149*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromHours(25).InDaysFloored(), 1);
1150*635a8641SAndroid Build Coastguard Worker }
1151*635a8641SAndroid Build Coastguard Worker
TEST(TimeDelta,InMillisecondsRoundedUp)1152*635a8641SAndroid Build Coastguard Worker TEST(TimeDelta, InMillisecondsRoundedUp) {
1153*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMicroseconds(-1001).InMillisecondsRoundedUp(), -1);
1154*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMicroseconds(-1000).InMillisecondsRoundedUp(), -1);
1155*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMicroseconds(-999).InMillisecondsRoundedUp(), 0);
1156*635a8641SAndroid Build Coastguard Worker
1157*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMicroseconds(-1).InMillisecondsRoundedUp(), 0);
1158*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMicroseconds(0).InMillisecondsRoundedUp(), 0);
1159*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMicroseconds(1).InMillisecondsRoundedUp(), 1);
1160*635a8641SAndroid Build Coastguard Worker
1161*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMicroseconds(999).InMillisecondsRoundedUp(), 1);
1162*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMicroseconds(1000).InMillisecondsRoundedUp(), 1);
1163*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMicroseconds(1001).InMillisecondsRoundedUp(), 2);
1164*635a8641SAndroid Build Coastguard Worker }
1165*635a8641SAndroid Build Coastguard Worker
1166*635a8641SAndroid Build Coastguard Worker #if defined(OS_POSIX) || defined(OS_FUCHSIA)
TEST(TimeDelta,TimeSpecConversion)1167*635a8641SAndroid Build Coastguard Worker TEST(TimeDelta, TimeSpecConversion) {
1168*635a8641SAndroid Build Coastguard Worker TimeDelta delta = TimeDelta::FromSeconds(0);
1169*635a8641SAndroid Build Coastguard Worker struct timespec result = delta.ToTimeSpec();
1170*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(result.tv_sec, 0);
1171*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(result.tv_nsec, 0);
1172*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(delta, TimeDelta::FromTimeSpec(result));
1173*635a8641SAndroid Build Coastguard Worker
1174*635a8641SAndroid Build Coastguard Worker delta = TimeDelta::FromSeconds(1);
1175*635a8641SAndroid Build Coastguard Worker result = delta.ToTimeSpec();
1176*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(result.tv_sec, 1);
1177*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(result.tv_nsec, 0);
1178*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(delta, TimeDelta::FromTimeSpec(result));
1179*635a8641SAndroid Build Coastguard Worker
1180*635a8641SAndroid Build Coastguard Worker delta = TimeDelta::FromMicroseconds(1);
1181*635a8641SAndroid Build Coastguard Worker result = delta.ToTimeSpec();
1182*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(result.tv_sec, 0);
1183*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(result.tv_nsec, 1000);
1184*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(delta, TimeDelta::FromTimeSpec(result));
1185*635a8641SAndroid Build Coastguard Worker
1186*635a8641SAndroid Build Coastguard Worker delta = TimeDelta::FromMicroseconds(Time::kMicrosecondsPerSecond + 1);
1187*635a8641SAndroid Build Coastguard Worker result = delta.ToTimeSpec();
1188*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(result.tv_sec, 1);
1189*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(result.tv_nsec, 1000);
1190*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(delta, TimeDelta::FromTimeSpec(result));
1191*635a8641SAndroid Build Coastguard Worker }
1192*635a8641SAndroid Build Coastguard Worker #endif // defined(OS_POSIX) || defined(OS_FUCHSIA)
1193*635a8641SAndroid Build Coastguard Worker
1194*635a8641SAndroid Build Coastguard Worker // Our internal time format is serialized in things like databases, so it's
1195*635a8641SAndroid Build Coastguard Worker // important that it's consistent across all our platforms. We use the 1601
1196*635a8641SAndroid Build Coastguard Worker // Windows epoch as the internal format across all platforms.
TEST(TimeDelta,WindowsEpoch)1197*635a8641SAndroid Build Coastguard Worker TEST(TimeDelta, WindowsEpoch) {
1198*635a8641SAndroid Build Coastguard Worker Time::Exploded exploded;
1199*635a8641SAndroid Build Coastguard Worker exploded.year = 1970;
1200*635a8641SAndroid Build Coastguard Worker exploded.month = 1;
1201*635a8641SAndroid Build Coastguard Worker exploded.day_of_week = 0; // Should be unusued.
1202*635a8641SAndroid Build Coastguard Worker exploded.day_of_month = 1;
1203*635a8641SAndroid Build Coastguard Worker exploded.hour = 0;
1204*635a8641SAndroid Build Coastguard Worker exploded.minute = 0;
1205*635a8641SAndroid Build Coastguard Worker exploded.second = 0;
1206*635a8641SAndroid Build Coastguard Worker exploded.millisecond = 0;
1207*635a8641SAndroid Build Coastguard Worker Time t;
1208*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(Time::FromUTCExploded(exploded, &t));
1209*635a8641SAndroid Build Coastguard Worker // Unix 1970 epoch.
1210*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(INT64_C(11644473600000000), t.ToInternalValue());
1211*635a8641SAndroid Build Coastguard Worker
1212*635a8641SAndroid Build Coastguard Worker // We can't test 1601 epoch, since the system time functions on Linux
1213*635a8641SAndroid Build Coastguard Worker // only compute years starting from 1900.
1214*635a8641SAndroid Build Coastguard Worker }
1215*635a8641SAndroid Build Coastguard Worker
1216*635a8641SAndroid Build Coastguard Worker // We could define this separately for Time, TimeTicks and TimeDelta but the
1217*635a8641SAndroid Build Coastguard Worker // definitions would be identical anyway.
1218*635a8641SAndroid Build Coastguard Worker template <class Any>
AnyToString(Any any)1219*635a8641SAndroid Build Coastguard Worker std::string AnyToString(Any any) {
1220*635a8641SAndroid Build Coastguard Worker std::ostringstream oss;
1221*635a8641SAndroid Build Coastguard Worker oss << any;
1222*635a8641SAndroid Build Coastguard Worker return oss.str();
1223*635a8641SAndroid Build Coastguard Worker }
1224*635a8641SAndroid Build Coastguard Worker
TEST(TimeDelta,Magnitude)1225*635a8641SAndroid Build Coastguard Worker TEST(TimeDelta, Magnitude) {
1226*635a8641SAndroid Build Coastguard Worker constexpr int64_t zero = 0;
1227*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromMicroseconds(zero) ==
1228*635a8641SAndroid Build Coastguard Worker TimeDelta::FromMicroseconds(zero).magnitude(),
1229*635a8641SAndroid Build Coastguard Worker "");
1230*635a8641SAndroid Build Coastguard Worker
1231*635a8641SAndroid Build Coastguard Worker constexpr int64_t one = 1;
1232*635a8641SAndroid Build Coastguard Worker constexpr int64_t negative_one = -1;
1233*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromMicroseconds(one) ==
1234*635a8641SAndroid Build Coastguard Worker TimeDelta::FromMicroseconds(one).magnitude(),
1235*635a8641SAndroid Build Coastguard Worker "");
1236*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromMicroseconds(one) ==
1237*635a8641SAndroid Build Coastguard Worker TimeDelta::FromMicroseconds(negative_one).magnitude(),
1238*635a8641SAndroid Build Coastguard Worker "");
1239*635a8641SAndroid Build Coastguard Worker
1240*635a8641SAndroid Build Coastguard Worker constexpr int64_t max_int64_minus_one =
1241*635a8641SAndroid Build Coastguard Worker std::numeric_limits<int64_t>::max() - 1;
1242*635a8641SAndroid Build Coastguard Worker constexpr int64_t min_int64_plus_two =
1243*635a8641SAndroid Build Coastguard Worker std::numeric_limits<int64_t>::min() + 2;
1244*635a8641SAndroid Build Coastguard Worker static_assert(
1245*635a8641SAndroid Build Coastguard Worker TimeDelta::FromMicroseconds(max_int64_minus_one) ==
1246*635a8641SAndroid Build Coastguard Worker TimeDelta::FromMicroseconds(max_int64_minus_one).magnitude(),
1247*635a8641SAndroid Build Coastguard Worker "");
1248*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromMicroseconds(max_int64_minus_one) ==
1249*635a8641SAndroid Build Coastguard Worker TimeDelta::FromMicroseconds(min_int64_plus_two).magnitude(),
1250*635a8641SAndroid Build Coastguard Worker "");
1251*635a8641SAndroid Build Coastguard Worker }
1252*635a8641SAndroid Build Coastguard Worker
TEST(TimeDelta,ZeroMinMax)1253*635a8641SAndroid Build Coastguard Worker TEST(TimeDelta, ZeroMinMax) {
1254*635a8641SAndroid Build Coastguard Worker constexpr TimeDelta kZero;
1255*635a8641SAndroid Build Coastguard Worker static_assert(kZero.is_zero(), "");
1256*635a8641SAndroid Build Coastguard Worker
1257*635a8641SAndroid Build Coastguard Worker constexpr TimeDelta kMax = TimeDelta::Max();
1258*635a8641SAndroid Build Coastguard Worker static_assert(kMax.is_max(), "");
1259*635a8641SAndroid Build Coastguard Worker static_assert(kMax == TimeDelta::Max(), "");
1260*635a8641SAndroid Build Coastguard Worker static_assert(kMax > TimeDelta::FromDays(100 * 365), "");
1261*635a8641SAndroid Build Coastguard Worker static_assert(kMax > kZero, "");
1262*635a8641SAndroid Build Coastguard Worker
1263*635a8641SAndroid Build Coastguard Worker constexpr TimeDelta kMin = TimeDelta::Min();
1264*635a8641SAndroid Build Coastguard Worker static_assert(kMin.is_min(), "");
1265*635a8641SAndroid Build Coastguard Worker static_assert(kMin == TimeDelta::Min(), "");
1266*635a8641SAndroid Build Coastguard Worker static_assert(kMin < TimeDelta::FromDays(-100 * 365), "");
1267*635a8641SAndroid Build Coastguard Worker static_assert(kMin < kZero, "");
1268*635a8641SAndroid Build Coastguard Worker }
1269*635a8641SAndroid Build Coastguard Worker
TEST(TimeDelta,MaxConversions)1270*635a8641SAndroid Build Coastguard Worker TEST(TimeDelta, MaxConversions) {
1271*635a8641SAndroid Build Coastguard Worker // static_assert also confirms constexpr works as intended.
1272*635a8641SAndroid Build Coastguard Worker constexpr TimeDelta kMax = TimeDelta::Max();
1273*635a8641SAndroid Build Coastguard Worker static_assert(kMax.ToInternalValue() == std::numeric_limits<int64_t>::max(),
1274*635a8641SAndroid Build Coastguard Worker "");
1275*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kMax.InDays(), std::numeric_limits<int>::max());
1276*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kMax.InHours(), std::numeric_limits<int>::max());
1277*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kMax.InMinutes(), std::numeric_limits<int>::max());
1278*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kMax.InSecondsF(), std::numeric_limits<double>::infinity());
1279*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kMax.InSeconds(), std::numeric_limits<int64_t>::max());
1280*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kMax.InMillisecondsF(), std::numeric_limits<double>::infinity());
1281*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kMax.InMilliseconds(), std::numeric_limits<int64_t>::max());
1282*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kMax.InMillisecondsRoundedUp(), std::numeric_limits<int64_t>::max());
1283*635a8641SAndroid Build Coastguard Worker
1284*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromDays(std::numeric_limits<int>::max()).is_max(),
1285*635a8641SAndroid Build Coastguard Worker "");
1286*635a8641SAndroid Build Coastguard Worker
1287*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromHours(std::numeric_limits<int>::max()).is_max(),
1288*635a8641SAndroid Build Coastguard Worker "");
1289*635a8641SAndroid Build Coastguard Worker
1290*635a8641SAndroid Build Coastguard Worker static_assert(
1291*635a8641SAndroid Build Coastguard Worker TimeDelta::FromMinutes(std::numeric_limits<int>::max()).is_max(), "");
1292*635a8641SAndroid Build Coastguard Worker
1293*635a8641SAndroid Build Coastguard Worker constexpr int64_t max_int = std::numeric_limits<int64_t>::max();
1294*635a8641SAndroid Build Coastguard Worker constexpr int64_t min_int = std::numeric_limits<int64_t>::min();
1295*635a8641SAndroid Build Coastguard Worker
1296*635a8641SAndroid Build Coastguard Worker static_assert(
1297*635a8641SAndroid Build Coastguard Worker TimeDelta::FromSeconds(max_int / Time::kMicrosecondsPerSecond + 1)
1298*635a8641SAndroid Build Coastguard Worker .is_max(),
1299*635a8641SAndroid Build Coastguard Worker "");
1300*635a8641SAndroid Build Coastguard Worker
1301*635a8641SAndroid Build Coastguard Worker static_assert(
1302*635a8641SAndroid Build Coastguard Worker TimeDelta::FromMilliseconds(max_int / Time::kMillisecondsPerSecond + 1)
1303*635a8641SAndroid Build Coastguard Worker .is_max(),
1304*635a8641SAndroid Build Coastguard Worker "");
1305*635a8641SAndroid Build Coastguard Worker
1306*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromMicroseconds(max_int).is_max(), "");
1307*635a8641SAndroid Build Coastguard Worker
1308*635a8641SAndroid Build Coastguard Worker static_assert(
1309*635a8641SAndroid Build Coastguard Worker TimeDelta::FromSeconds(min_int / Time::kMicrosecondsPerSecond - 1)
1310*635a8641SAndroid Build Coastguard Worker .is_min(),
1311*635a8641SAndroid Build Coastguard Worker "");
1312*635a8641SAndroid Build Coastguard Worker
1313*635a8641SAndroid Build Coastguard Worker static_assert(
1314*635a8641SAndroid Build Coastguard Worker TimeDelta::FromMilliseconds(min_int / Time::kMillisecondsPerSecond - 1)
1315*635a8641SAndroid Build Coastguard Worker .is_min(),
1316*635a8641SAndroid Build Coastguard Worker "");
1317*635a8641SAndroid Build Coastguard Worker
1318*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromMicroseconds(min_int).is_min(), "");
1319*635a8641SAndroid Build Coastguard Worker
1320*635a8641SAndroid Build Coastguard Worker static_assert(
1321*635a8641SAndroid Build Coastguard Worker TimeDelta::FromMicroseconds(std::numeric_limits<int64_t>::min()).is_min(),
1322*635a8641SAndroid Build Coastguard Worker "");
1323*635a8641SAndroid Build Coastguard Worker
1324*635a8641SAndroid Build Coastguard Worker // Floating point arithmetic resulting in infinity isn't constexpr in C++14.
1325*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(TimeDelta::FromSecondsD(std::numeric_limits<double>::infinity())
1326*635a8641SAndroid Build Coastguard Worker .is_max());
1327*635a8641SAndroid Build Coastguard Worker
1328*635a8641SAndroid Build Coastguard Worker // Note that max_int/min_int will be rounded when converted to doubles - they
1329*635a8641SAndroid Build Coastguard Worker // can't be exactly represented.
1330*635a8641SAndroid Build Coastguard Worker constexpr double max_d = static_cast<double>(max_int);
1331*635a8641SAndroid Build Coastguard Worker constexpr double min_d = static_cast<double>(min_int);
1332*635a8641SAndroid Build Coastguard Worker
1333*635a8641SAndroid Build Coastguard Worker static_assert(
1334*635a8641SAndroid Build Coastguard Worker TimeDelta::FromSecondsD(max_d / Time::kMicrosecondsPerSecond + 1)
1335*635a8641SAndroid Build Coastguard Worker .is_max(),
1336*635a8641SAndroid Build Coastguard Worker "");
1337*635a8641SAndroid Build Coastguard Worker
1338*635a8641SAndroid Build Coastguard Worker static_assert(
1339*635a8641SAndroid Build Coastguard Worker TimeDelta::FromMicrosecondsD(max_d).is_max(),
1340*635a8641SAndroid Build Coastguard Worker "Make sure that 2^63 correctly gets clamped to `max` (crbug.com/612601)");
1341*635a8641SAndroid Build Coastguard Worker
1342*635a8641SAndroid Build Coastguard Worker // Floating point arithmetic resulting in infinity isn't constexpr in C++14.
1343*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(
1344*635a8641SAndroid Build Coastguard Worker TimeDelta::FromMillisecondsD(std::numeric_limits<double>::infinity())
1345*635a8641SAndroid Build Coastguard Worker .is_max());
1346*635a8641SAndroid Build Coastguard Worker
1347*635a8641SAndroid Build Coastguard Worker static_assert(
1348*635a8641SAndroid Build Coastguard Worker TimeDelta::FromMillisecondsD(max_d / Time::kMillisecondsPerSecond * 2)
1349*635a8641SAndroid Build Coastguard Worker .is_max(),
1350*635a8641SAndroid Build Coastguard Worker "");
1351*635a8641SAndroid Build Coastguard Worker
1352*635a8641SAndroid Build Coastguard Worker static_assert(
1353*635a8641SAndroid Build Coastguard Worker TimeDelta::FromSecondsD(min_d / Time::kMicrosecondsPerSecond - 1)
1354*635a8641SAndroid Build Coastguard Worker .is_min(),
1355*635a8641SAndroid Build Coastguard Worker "");
1356*635a8641SAndroid Build Coastguard Worker
1357*635a8641SAndroid Build Coastguard Worker static_assert(
1358*635a8641SAndroid Build Coastguard Worker TimeDelta::FromMillisecondsD(min_d / Time::kMillisecondsPerSecond * 2)
1359*635a8641SAndroid Build Coastguard Worker .is_min(),
1360*635a8641SAndroid Build Coastguard Worker "");
1361*635a8641SAndroid Build Coastguard Worker }
1362*635a8641SAndroid Build Coastguard Worker
TEST(TimeDelta,NumericOperators)1363*635a8641SAndroid Build Coastguard Worker TEST(TimeDelta, NumericOperators) {
1364*635a8641SAndroid Build Coastguard Worker constexpr double d = 0.5;
1365*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMilliseconds(500),
1366*635a8641SAndroid Build Coastguard Worker (TimeDelta::FromMilliseconds(1000) * d));
1367*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromMilliseconds(2000) ==
1368*635a8641SAndroid Build Coastguard Worker (TimeDelta::FromMilliseconds(1000) / d),
1369*635a8641SAndroid Build Coastguard Worker "");
1370*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMilliseconds(500),
1371*635a8641SAndroid Build Coastguard Worker (TimeDelta::FromMilliseconds(1000) *= d));
1372*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromMilliseconds(2000) ==
1373*635a8641SAndroid Build Coastguard Worker (TimeDelta::FromMilliseconds(1000) /= d),
1374*635a8641SAndroid Build Coastguard Worker "");
1375*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMilliseconds(500),
1376*635a8641SAndroid Build Coastguard Worker (d * TimeDelta::FromMilliseconds(1000)));
1377*635a8641SAndroid Build Coastguard Worker
1378*635a8641SAndroid Build Coastguard Worker constexpr float f = 0.5;
1379*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMilliseconds(500),
1380*635a8641SAndroid Build Coastguard Worker (TimeDelta::FromMilliseconds(1000) * f));
1381*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromMilliseconds(2000) ==
1382*635a8641SAndroid Build Coastguard Worker (TimeDelta::FromMilliseconds(1000) / f),
1383*635a8641SAndroid Build Coastguard Worker "");
1384*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMilliseconds(500),
1385*635a8641SAndroid Build Coastguard Worker (TimeDelta::FromMilliseconds(1000) *= f));
1386*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromMilliseconds(2000) ==
1387*635a8641SAndroid Build Coastguard Worker (TimeDelta::FromMilliseconds(1000) /= f),
1388*635a8641SAndroid Build Coastguard Worker "");
1389*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMilliseconds(500),
1390*635a8641SAndroid Build Coastguard Worker (f * TimeDelta::FromMilliseconds(1000)));
1391*635a8641SAndroid Build Coastguard Worker
1392*635a8641SAndroid Build Coastguard Worker constexpr int i = 2;
1393*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
1394*635a8641SAndroid Build Coastguard Worker (TimeDelta::FromMilliseconds(1000) * i));
1395*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromMilliseconds(500) ==
1396*635a8641SAndroid Build Coastguard Worker (TimeDelta::FromMilliseconds(1000) / i),
1397*635a8641SAndroid Build Coastguard Worker "");
1398*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
1399*635a8641SAndroid Build Coastguard Worker (TimeDelta::FromMilliseconds(1000) *= i));
1400*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromMilliseconds(500) ==
1401*635a8641SAndroid Build Coastguard Worker (TimeDelta::FromMilliseconds(1000) /= i),
1402*635a8641SAndroid Build Coastguard Worker "");
1403*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
1404*635a8641SAndroid Build Coastguard Worker (i * TimeDelta::FromMilliseconds(1000)));
1405*635a8641SAndroid Build Coastguard Worker
1406*635a8641SAndroid Build Coastguard Worker constexpr int64_t i64 = 2;
1407*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
1408*635a8641SAndroid Build Coastguard Worker (TimeDelta::FromMilliseconds(1000) * i64));
1409*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromMilliseconds(500) ==
1410*635a8641SAndroid Build Coastguard Worker (TimeDelta::FromMilliseconds(1000) / i64),
1411*635a8641SAndroid Build Coastguard Worker "");
1412*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
1413*635a8641SAndroid Build Coastguard Worker (TimeDelta::FromMilliseconds(1000) *= i64));
1414*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromMilliseconds(500) ==
1415*635a8641SAndroid Build Coastguard Worker (TimeDelta::FromMilliseconds(1000) /= i64),
1416*635a8641SAndroid Build Coastguard Worker "");
1417*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
1418*635a8641SAndroid Build Coastguard Worker (i64 * TimeDelta::FromMilliseconds(1000)));
1419*635a8641SAndroid Build Coastguard Worker
1420*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMilliseconds(500),
1421*635a8641SAndroid Build Coastguard Worker (TimeDelta::FromMilliseconds(1000) * 0.5));
1422*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromMilliseconds(2000) ==
1423*635a8641SAndroid Build Coastguard Worker (TimeDelta::FromMilliseconds(1000) / 0.5),
1424*635a8641SAndroid Build Coastguard Worker "");
1425*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMilliseconds(500),
1426*635a8641SAndroid Build Coastguard Worker (TimeDelta::FromMilliseconds(1000) *= 0.5));
1427*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromMilliseconds(2000) ==
1428*635a8641SAndroid Build Coastguard Worker (TimeDelta::FromMilliseconds(1000) /= 0.5),
1429*635a8641SAndroid Build Coastguard Worker "");
1430*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMilliseconds(500),
1431*635a8641SAndroid Build Coastguard Worker (0.5 * TimeDelta::FromMilliseconds(1000)));
1432*635a8641SAndroid Build Coastguard Worker
1433*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
1434*635a8641SAndroid Build Coastguard Worker (TimeDelta::FromMilliseconds(1000) * 2));
1435*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromMilliseconds(500) ==
1436*635a8641SAndroid Build Coastguard Worker (TimeDelta::FromMilliseconds(1000) / 2),
1437*635a8641SAndroid Build Coastguard Worker "");
1438*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
1439*635a8641SAndroid Build Coastguard Worker (TimeDelta::FromMilliseconds(1000) *= 2));
1440*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromMilliseconds(500) ==
1441*635a8641SAndroid Build Coastguard Worker (TimeDelta::FromMilliseconds(1000) /= 2),
1442*635a8641SAndroid Build Coastguard Worker "");
1443*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
1444*635a8641SAndroid Build Coastguard Worker (2 * TimeDelta::FromMilliseconds(1000)));
1445*635a8641SAndroid Build Coastguard Worker }
1446*635a8641SAndroid Build Coastguard Worker
1447*635a8641SAndroid Build Coastguard Worker // Basic test of operators between TimeDeltas (without overflow -- next test
1448*635a8641SAndroid Build Coastguard Worker // handles overflow).
TEST(TimeDelta,TimeDeltaOperators)1449*635a8641SAndroid Build Coastguard Worker TEST(TimeDelta, TimeDeltaOperators) {
1450*635a8641SAndroid Build Coastguard Worker constexpr TimeDelta kElevenSeconds = TimeDelta::FromSeconds(11);
1451*635a8641SAndroid Build Coastguard Worker constexpr TimeDelta kThreeSeconds = TimeDelta::FromSeconds(3);
1452*635a8641SAndroid Build Coastguard Worker
1453*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromSeconds(14), kElevenSeconds + kThreeSeconds);
1454*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromSeconds(14), kThreeSeconds + kElevenSeconds);
1455*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromSeconds(8), kElevenSeconds - kThreeSeconds);
1456*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta::FromSeconds(-8), kThreeSeconds - kElevenSeconds);
1457*635a8641SAndroid Build Coastguard Worker static_assert(3 == kElevenSeconds / kThreeSeconds, "");
1458*635a8641SAndroid Build Coastguard Worker static_assert(0 == kThreeSeconds / kElevenSeconds, "");
1459*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::FromSeconds(2) == kElevenSeconds % kThreeSeconds,
1460*635a8641SAndroid Build Coastguard Worker "");
1461*635a8641SAndroid Build Coastguard Worker }
1462*635a8641SAndroid Build Coastguard Worker
TEST(TimeDelta,Overflows)1463*635a8641SAndroid Build Coastguard Worker TEST(TimeDelta, Overflows) {
1464*635a8641SAndroid Build Coastguard Worker // Some sanity checks. static_assert's used were possible to verify constexpr
1465*635a8641SAndroid Build Coastguard Worker // evaluation at the same time.
1466*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta::Max().is_max(), "");
1467*635a8641SAndroid Build Coastguard Worker static_assert(-TimeDelta::Max() < TimeDelta(), "");
1468*635a8641SAndroid Build Coastguard Worker static_assert(-TimeDelta::Max() > TimeDelta::Min(), "");
1469*635a8641SAndroid Build Coastguard Worker static_assert(TimeDelta() > -TimeDelta::Max(), "");
1470*635a8641SAndroid Build Coastguard Worker
1471*635a8641SAndroid Build Coastguard Worker TimeDelta large_delta = TimeDelta::Max() - TimeDelta::FromMilliseconds(1);
1472*635a8641SAndroid Build Coastguard Worker TimeDelta large_negative = -large_delta;
1473*635a8641SAndroid Build Coastguard Worker EXPECT_GT(TimeDelta(), large_negative);
1474*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(large_delta.is_max());
1475*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE((-large_negative).is_min());
1476*635a8641SAndroid Build Coastguard Worker constexpr TimeDelta kOneSecond = TimeDelta::FromSeconds(1);
1477*635a8641SAndroid Build Coastguard Worker
1478*635a8641SAndroid Build Coastguard Worker // Test +, -, * and / operators.
1479*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE((large_delta + kOneSecond).is_max());
1480*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE((large_negative + (-kOneSecond)).is_min());
1481*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE((large_negative - kOneSecond).is_min());
1482*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE((large_delta - (-kOneSecond)).is_max());
1483*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE((large_delta * 2).is_max());
1484*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE((large_delta * -2).is_min());
1485*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE((large_delta / 0.5).is_max());
1486*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE((large_delta / -0.5).is_min());
1487*635a8641SAndroid Build Coastguard Worker
1488*635a8641SAndroid Build Coastguard Worker // Test that double conversions overflow to infinity.
1489*635a8641SAndroid Build Coastguard Worker EXPECT_EQ((large_delta + kOneSecond).InSecondsF(),
1490*635a8641SAndroid Build Coastguard Worker std::numeric_limits<double>::infinity());
1491*635a8641SAndroid Build Coastguard Worker EXPECT_EQ((large_delta + kOneSecond).InMillisecondsF(),
1492*635a8641SAndroid Build Coastguard Worker std::numeric_limits<double>::infinity());
1493*635a8641SAndroid Build Coastguard Worker EXPECT_EQ((large_delta + kOneSecond).InMicrosecondsF(),
1494*635a8641SAndroid Build Coastguard Worker std::numeric_limits<double>::infinity());
1495*635a8641SAndroid Build Coastguard Worker
1496*635a8641SAndroid Build Coastguard Worker // Test +=, -=, *= and /= operators.
1497*635a8641SAndroid Build Coastguard Worker TimeDelta delta = large_delta;
1498*635a8641SAndroid Build Coastguard Worker delta += kOneSecond;
1499*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(delta.is_max());
1500*635a8641SAndroid Build Coastguard Worker delta = large_negative;
1501*635a8641SAndroid Build Coastguard Worker delta += -kOneSecond;
1502*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE((delta).is_min());
1503*635a8641SAndroid Build Coastguard Worker
1504*635a8641SAndroid Build Coastguard Worker delta = large_negative;
1505*635a8641SAndroid Build Coastguard Worker delta -= kOneSecond;
1506*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE((delta).is_min());
1507*635a8641SAndroid Build Coastguard Worker delta = large_delta;
1508*635a8641SAndroid Build Coastguard Worker delta -= -kOneSecond;
1509*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(delta.is_max());
1510*635a8641SAndroid Build Coastguard Worker
1511*635a8641SAndroid Build Coastguard Worker delta = large_delta;
1512*635a8641SAndroid Build Coastguard Worker delta *= 2;
1513*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(delta.is_max());
1514*635a8641SAndroid Build Coastguard Worker delta = large_negative;
1515*635a8641SAndroid Build Coastguard Worker delta *= 1.5;
1516*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE((delta).is_min());
1517*635a8641SAndroid Build Coastguard Worker
1518*635a8641SAndroid Build Coastguard Worker delta = large_delta;
1519*635a8641SAndroid Build Coastguard Worker delta /= 0.5;
1520*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(delta.is_max());
1521*635a8641SAndroid Build Coastguard Worker delta = large_negative;
1522*635a8641SAndroid Build Coastguard Worker delta /= 0.5;
1523*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE((delta).is_min());
1524*635a8641SAndroid Build Coastguard Worker
1525*635a8641SAndroid Build Coastguard Worker // Test operations with Time and TimeTicks.
1526*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE((large_delta + Time::Now()).is_max());
1527*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE((large_delta + TimeTicks::Now()).is_max());
1528*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE((Time::Now() + large_delta).is_max());
1529*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE((TimeTicks::Now() + large_delta).is_max());
1530*635a8641SAndroid Build Coastguard Worker
1531*635a8641SAndroid Build Coastguard Worker Time time_now = Time::Now();
1532*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kOneSecond, (time_now + kOneSecond) - time_now);
1533*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(-kOneSecond, (time_now - kOneSecond) - time_now);
1534*635a8641SAndroid Build Coastguard Worker
1535*635a8641SAndroid Build Coastguard Worker TimeTicks ticks_now = TimeTicks::Now();
1536*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(-kOneSecond, (ticks_now - kOneSecond) - ticks_now);
1537*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(kOneSecond, (ticks_now + kOneSecond) - ticks_now);
1538*635a8641SAndroid Build Coastguard Worker }
1539*635a8641SAndroid Build Coastguard Worker
TEST(TimeDeltaLogging,DCheckEqCompiles)1540*635a8641SAndroid Build Coastguard Worker TEST(TimeDeltaLogging, DCheckEqCompiles) {
1541*635a8641SAndroid Build Coastguard Worker DCHECK_EQ(TimeDelta(), TimeDelta());
1542*635a8641SAndroid Build Coastguard Worker }
1543*635a8641SAndroid Build Coastguard Worker
TEST(TimeDeltaLogging,EmptyIsZero)1544*635a8641SAndroid Build Coastguard Worker TEST(TimeDeltaLogging, EmptyIsZero) {
1545*635a8641SAndroid Build Coastguard Worker constexpr TimeDelta kZero;
1546*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("0 s", AnyToString(kZero));
1547*635a8641SAndroid Build Coastguard Worker }
1548*635a8641SAndroid Build Coastguard Worker
TEST(TimeDeltaLogging,FiveHundredMs)1549*635a8641SAndroid Build Coastguard Worker TEST(TimeDeltaLogging, FiveHundredMs) {
1550*635a8641SAndroid Build Coastguard Worker constexpr TimeDelta kFiveHundredMs = TimeDelta::FromMilliseconds(500);
1551*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("0.5 s", AnyToString(kFiveHundredMs));
1552*635a8641SAndroid Build Coastguard Worker }
1553*635a8641SAndroid Build Coastguard Worker
TEST(TimeDeltaLogging,MinusTenSeconds)1554*635a8641SAndroid Build Coastguard Worker TEST(TimeDeltaLogging, MinusTenSeconds) {
1555*635a8641SAndroid Build Coastguard Worker constexpr TimeDelta kMinusTenSeconds = TimeDelta::FromSeconds(-10);
1556*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("-10 s", AnyToString(kMinusTenSeconds));
1557*635a8641SAndroid Build Coastguard Worker }
1558*635a8641SAndroid Build Coastguard Worker
TEST(TimeDeltaLogging,DoesNotMessUpFormattingFlags)1559*635a8641SAndroid Build Coastguard Worker TEST(TimeDeltaLogging, DoesNotMessUpFormattingFlags) {
1560*635a8641SAndroid Build Coastguard Worker std::ostringstream oss;
1561*635a8641SAndroid Build Coastguard Worker std::ios_base::fmtflags flags_before = oss.flags();
1562*635a8641SAndroid Build Coastguard Worker oss << TimeDelta();
1563*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(flags_before, oss.flags());
1564*635a8641SAndroid Build Coastguard Worker }
1565*635a8641SAndroid Build Coastguard Worker
TEST(TimeDeltaLogging,DoesNotMakeStreamBad)1566*635a8641SAndroid Build Coastguard Worker TEST(TimeDeltaLogging, DoesNotMakeStreamBad) {
1567*635a8641SAndroid Build Coastguard Worker std::ostringstream oss;
1568*635a8641SAndroid Build Coastguard Worker oss << TimeDelta();
1569*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(oss.good());
1570*635a8641SAndroid Build Coastguard Worker }
1571*635a8641SAndroid Build Coastguard Worker
TEST(TimeLogging,DCheckEqCompiles)1572*635a8641SAndroid Build Coastguard Worker TEST(TimeLogging, DCheckEqCompiles) {
1573*635a8641SAndroid Build Coastguard Worker DCHECK_EQ(Time(), Time());
1574*635a8641SAndroid Build Coastguard Worker }
1575*635a8641SAndroid Build Coastguard Worker
TEST(TimeLogging,ChromeBirthdate)1576*635a8641SAndroid Build Coastguard Worker TEST(TimeLogging, ChromeBirthdate) {
1577*635a8641SAndroid Build Coastguard Worker Time birthdate;
1578*635a8641SAndroid Build Coastguard Worker ASSERT_TRUE(Time::FromString("Tue, 02 Sep 2008 09:42:18 GMT", &birthdate));
1579*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("2008-09-02 09:42:18.000 UTC", AnyToString(birthdate));
1580*635a8641SAndroid Build Coastguard Worker }
1581*635a8641SAndroid Build Coastguard Worker
TEST(TimeLogging,DoesNotMessUpFormattingFlags)1582*635a8641SAndroid Build Coastguard Worker TEST(TimeLogging, DoesNotMessUpFormattingFlags) {
1583*635a8641SAndroid Build Coastguard Worker std::ostringstream oss;
1584*635a8641SAndroid Build Coastguard Worker std::ios_base::fmtflags flags_before = oss.flags();
1585*635a8641SAndroid Build Coastguard Worker oss << Time();
1586*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(flags_before, oss.flags());
1587*635a8641SAndroid Build Coastguard Worker }
1588*635a8641SAndroid Build Coastguard Worker
TEST(TimeLogging,DoesNotMakeStreamBad)1589*635a8641SAndroid Build Coastguard Worker TEST(TimeLogging, DoesNotMakeStreamBad) {
1590*635a8641SAndroid Build Coastguard Worker std::ostringstream oss;
1591*635a8641SAndroid Build Coastguard Worker oss << Time();
1592*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(oss.good());
1593*635a8641SAndroid Build Coastguard Worker }
1594*635a8641SAndroid Build Coastguard Worker
TEST(TimeTicksLogging,DCheckEqCompiles)1595*635a8641SAndroid Build Coastguard Worker TEST(TimeTicksLogging, DCheckEqCompiles) {
1596*635a8641SAndroid Build Coastguard Worker DCHECK_EQ(TimeTicks(), TimeTicks());
1597*635a8641SAndroid Build Coastguard Worker }
1598*635a8641SAndroid Build Coastguard Worker
TEST(TimeTicksLogging,ZeroTime)1599*635a8641SAndroid Build Coastguard Worker TEST(TimeTicksLogging, ZeroTime) {
1600*635a8641SAndroid Build Coastguard Worker TimeTicks zero;
1601*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("0 bogo-microseconds", AnyToString(zero));
1602*635a8641SAndroid Build Coastguard Worker }
1603*635a8641SAndroid Build Coastguard Worker
TEST(TimeTicksLogging,FortyYearsLater)1604*635a8641SAndroid Build Coastguard Worker TEST(TimeTicksLogging, FortyYearsLater) {
1605*635a8641SAndroid Build Coastguard Worker TimeTicks forty_years_later =
1606*635a8641SAndroid Build Coastguard Worker TimeTicks() + TimeDelta::FromDays(365.25 * 40);
1607*635a8641SAndroid Build Coastguard Worker EXPECT_EQ("1262304000000000 bogo-microseconds",
1608*635a8641SAndroid Build Coastguard Worker AnyToString(forty_years_later));
1609*635a8641SAndroid Build Coastguard Worker }
1610*635a8641SAndroid Build Coastguard Worker
TEST(TimeTicksLogging,DoesNotMessUpFormattingFlags)1611*635a8641SAndroid Build Coastguard Worker TEST(TimeTicksLogging, DoesNotMessUpFormattingFlags) {
1612*635a8641SAndroid Build Coastguard Worker std::ostringstream oss;
1613*635a8641SAndroid Build Coastguard Worker std::ios_base::fmtflags flags_before = oss.flags();
1614*635a8641SAndroid Build Coastguard Worker oss << TimeTicks();
1615*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(flags_before, oss.flags());
1616*635a8641SAndroid Build Coastguard Worker }
1617*635a8641SAndroid Build Coastguard Worker
TEST(TimeTicksLogging,DoesNotMakeStreamBad)1618*635a8641SAndroid Build Coastguard Worker TEST(TimeTicksLogging, DoesNotMakeStreamBad) {
1619*635a8641SAndroid Build Coastguard Worker std::ostringstream oss;
1620*635a8641SAndroid Build Coastguard Worker oss << TimeTicks();
1621*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(oss.good());
1622*635a8641SAndroid Build Coastguard Worker }
1623*635a8641SAndroid Build Coastguard Worker
1624*635a8641SAndroid Build Coastguard Worker } // namespace
1625*635a8641SAndroid Build Coastguard Worker
1626*635a8641SAndroid Build Coastguard Worker } // namespace base
1627