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