13f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <time.h>
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
73f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/platform_thread.h"
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/time.h"
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "build/build_config.h"
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h"
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottusing base::Time;
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottusing base::TimeDelta;
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottusing base::TimeTicks;
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Test conversions to/from time_t and exploding/unexploding.
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(Time, TimeT) {
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // C library time and exploded time.
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  time_t now_t_1 = time(NULL);
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  struct tm tms;
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_WIN)
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  localtime_s(&tms, &now_t_1);
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(OS_POSIX)
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  localtime_r(&now_t_1, &tms);
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Convert to ours.
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time our_time_1 = Time::FromTimeT(now_t_1);
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time::Exploded exploded;
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  our_time_1.LocalExplode(&exploded);
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // This will test both our exploding and our time_t -> Time conversion.
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(tms.tm_year + 1900, exploded.year);
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(tms.tm_mon + 1, exploded.month);
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(tms.tm_mday, exploded.day_of_month);
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(tms.tm_hour, exploded.hour);
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(tms.tm_min, exploded.minute);
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(tms.tm_sec, exploded.second);
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Convert exploded back to the time struct.
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time our_time_2 = Time::FromLocalExploded(exploded);
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(our_time_1 == our_time_2);
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  time_t now_t_2 = our_time_2.ToTimeT();
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(now_t_1, now_t_2);
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(10, Time().FromTimeT(10).ToTimeT());
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(10.0, Time().FromTimeT(10).ToDoubleT());
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Conversions of 0 should stay 0.
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, Time().ToTimeT());
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, Time::FromTimeT(0).ToInternalValue());
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochTEST(Time, FromExplodedWithMilliseconds) {
564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Some platform implementations of FromExploded are liable to drop
574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // milliseconds if we aren't careful.
584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  Time now = Time::NowFromSystemTime();
594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  Time::Exploded exploded1 = {0};
604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  now.UTCExplode(&exploded1);
614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  exploded1.millisecond = 500;
624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  Time time = Time::FromUTCExploded(exploded1);
634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  Time::Exploded exploded2 = {0};
644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  time.UTCExplode(&exploded2);
654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  EXPECT_EQ(exploded1.millisecond, exploded2.millisecond);
664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(Time, ZeroIsSymmetric) {
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time zero_time(Time::FromTimeT(0));
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, zero_time.ToTimeT());
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0.0, zero_time.ToDoubleT());
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(Time, LocalExplode) {
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time a = Time::Now();
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time::Exploded exploded;
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  a.LocalExplode(&exploded);
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time b = Time::FromLocalExploded(exploded);
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The exploded structure doesn't have microseconds, and on Mac & Linux, the
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // internal OS conversion uses seconds, which will cause truncation. So we
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // can only make sure that the delta is within one second.
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE((a - b) < TimeDelta::FromSeconds(1));
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(Time, UTCExplode) {
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time a = Time::Now();
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time::Exploded exploded;
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  a.UTCExplode(&exploded);
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time b = Time::FromUTCExploded(exploded);
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE((a - b) < TimeDelta::FromSeconds(1));
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(Time, LocalMidnight) {
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time::Exploded exploded;
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time::Now().LocalMidnight().LocalExplode(&exploded);
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, exploded.hour);
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, exploded.minute);
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, exploded.second);
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, exploded.millisecond);
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(TimeTicks, Deltas) {
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (int index = 0; index < 50; index++) {
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    TimeTicks ticks_start = TimeTicks::Now();
1093f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    base::PlatformThread::Sleep(10);
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    TimeTicks ticks_stop = TimeTicks::Now();
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    TimeDelta delta = ticks_stop - ticks_start;
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Note:  Although we asked for a 10ms sleep, if the
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // time clock has a finer granularity than the Sleep()
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // clock, it is quite possible to wakeup early.  Here
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // is how that works:
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    //      Time(ms timer)      Time(us timer)
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    //          5                   5010
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    //          6                   6010
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    //          7                   7010
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    //          8                   8010
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    //          9                   9000
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Elapsed  4ms                 3990us
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    //
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Unfortunately, our InMilliseconds() function truncates
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // rather than rounds.  We should consider fixing this
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // so that our averages come out better.
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_GE(delta.InMilliseconds(), 9);
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_GE(delta.InMicroseconds(), 9000);
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(delta.InSeconds(), 0);
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
133731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickTEST(TimeTicks, HighResNow) {
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN)
135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // HighResNow doesn't work on some systems.  Since the product still works
136731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // even if it doesn't work, it makes this entire test questionable.
137731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (!TimeTicks::IsHighResClockWorking())
138731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Why do we loop here?
142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // We're trying to measure that intervals increment in a VERY small amount
143731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // of time --  less than 15ms.  Unfortunately, if we happen to have a
144731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // context switch in the middle of our test, the context switch could easily
145731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // exceed our limit.  So, we iterate on this several times.  As long as we're
146731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // able to detect the fine-granularity timers at least once, then the test
147731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // has succeeded.
148731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  const int kTargetGranularityUs = 15000;  // 15ms
150731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
151731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool success = false;
152731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int retries = 100;  // Arbitrary.
153731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  TimeDelta delta;
154731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  while (!success && retries--) {
155731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    TimeTicks ticks_start = TimeTicks::HighResNow();
156731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // Loop until we can detect that the clock has changed.  Non-HighRes timers
157731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // will increment in chunks, e.g. 15ms.  By spinning until we see a clock
158731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // change, we detect the minimum time between measurements.
159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    do {
160731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      delta = TimeTicks::HighResNow() - ticks_start;
161731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    } while (delta.InMilliseconds() == 0);
162731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
163731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    if (delta.InMicroseconds() <= kTargetGranularityUs)
164731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      success = true;
165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // In high resolution mode, we expect to see the clock increment
168731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // in intervals less than 15ms.
169731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_TRUE(success);
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(TimeDelta, FromAndIn) {
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(TimeDelta::FromDays(2) == TimeDelta::FromHours(48));
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(TimeDelta::FromHours(3) == TimeDelta::FromMinutes(180));
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(TimeDelta::FromMinutes(2) == TimeDelta::FromSeconds(120));
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(TimeDelta::FromSeconds(2) == TimeDelta::FromMilliseconds(2000));
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(TimeDelta::FromMilliseconds(2) ==
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott              TimeDelta::FromMicroseconds(2000));
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(13, TimeDelta::FromDays(13).InDays());
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(13, TimeDelta::FromHours(13).InHours());
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(13, TimeDelta::FromMinutes(13).InMinutes());
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(13, TimeDelta::FromSeconds(13).InSeconds());
183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(13.0, TimeDelta::FromSeconds(13).InSecondsF());
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(13, TimeDelta::FromMilliseconds(13).InMilliseconds());
185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(13.0, TimeDelta::FromMilliseconds(13).InMillisecondsF());
186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(13, TimeDelta::FromMicroseconds(13).InMicroseconds());
187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_POSIX)
190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(TimeDelta, TimeSpecConversion) {
191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  struct timespec result = TimeDelta::FromSeconds(0).ToTimeSpec();
192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(result.tv_sec, 0);
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(result.tv_nsec, 0);
194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  result = TimeDelta::FromSeconds(1).ToTimeSpec();
196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(result.tv_sec, 1);
197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(result.tv_nsec, 0);
198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  result = TimeDelta::FromMicroseconds(1).ToTimeSpec();
200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(result.tv_sec, 0);
201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(result.tv_nsec, 1000);
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  result = TimeDelta::FromMicroseconds(
204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      Time::kMicrosecondsPerSecond + 1).ToTimeSpec();
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(result.tv_sec, 1);
206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(result.tv_nsec, 1000);
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // OS_POSIX
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Our internal time format is serialized in things like databases, so it's
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// important that it's consistent across all our platforms.  We use the 1601
212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Windows epoch as the internal format across all platforms.
213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(TimeDelta, WindowsEpoch) {
214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time::Exploded exploded;
215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  exploded.year = 1970;
216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  exploded.month = 1;
217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  exploded.day_of_week = 0;  // Should be unusued.
218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  exploded.day_of_month = 1;
219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  exploded.hour = 0;
220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  exploded.minute = 0;
221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  exploded.second = 0;
222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  exploded.millisecond = 0;
223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time t = Time::FromUTCExploded(exploded);
224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Unix 1970 epoch.
225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(GG_INT64_C(11644473600000000), t.ToInternalValue());
226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // We can't test 1601 epoch, since the system time functions on Linux
228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // only compute years starting from 1900.
229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
230