blob: db0990f42754665405bfa8eebb1162b8e8745813 [file] [log] [blame]
license.botbf09a502008-08-24 00:55:551// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commitd7cae122008-07-26 21:49:384
initial.commitd7cae122008-07-26 21:49:385#include <time.h>
6
[email protected]f7189d012008-08-13 22:55:457#include "base/platform_thread.h"
[email protected]5f6eee532008-09-02 08:28:378#include "base/time.h"
9#include "build/build_config.h"
initial.commitd7cae122008-07-26 21:49:3810#include "testing/gtest/include/gtest/gtest.h"
11
12// Test conversions to/from time_t and exploding/unexploding.
13TEST(Time, TimeT) {
14 // C library time and exploded time.
15 time_t now_t_1 = time(NULL);
16 struct tm tms;
[email protected]f7189d012008-08-13 22:55:4517#if defined(OS_WIN)
initial.commitd7cae122008-07-26 21:49:3818 localtime_s(&tms, &now_t_1);
[email protected]f7189d012008-08-13 22:55:4519#elif defined(OS_POSIX)
20 localtime_r(&now_t_1, &tms);
21#endif
initial.commitd7cae122008-07-26 21:49:3822
23 // Convert to ours.
24 Time our_time_1 = Time::FromTimeT(now_t_1);
25 Time::Exploded exploded;
26 our_time_1.LocalExplode(&exploded);
27
28 // This will test both our exploding and our time_t -> Time conversion.
29 EXPECT_EQ(tms.tm_year + 1900, exploded.year);
30 EXPECT_EQ(tms.tm_mon + 1, exploded.month);
31 EXPECT_EQ(tms.tm_mday, exploded.day_of_month);
32 EXPECT_EQ(tms.tm_hour, exploded.hour);
33 EXPECT_EQ(tms.tm_min, exploded.minute);
34 EXPECT_EQ(tms.tm_sec, exploded.second);
35
36 // Convert exploded back to the time struct.
37 Time our_time_2 = Time::FromLocalExploded(exploded);
38 EXPECT_TRUE(our_time_1 == our_time_2);
39
40 time_t now_t_2 = our_time_2.ToTimeT();
41 EXPECT_EQ(now_t_1, now_t_2);
42
[email protected]9f251302008-08-19 09:16:4943 EXPECT_EQ(10, Time().FromTimeT(10).ToTimeT());
44 EXPECT_EQ(10.0, Time().FromTimeT(10).ToDoubleT());
45
initial.commitd7cae122008-07-26 21:49:3846 // Conversions of 0 should stay 0.
47 EXPECT_EQ(0, Time().ToTimeT());
48 EXPECT_EQ(0, Time::FromTimeT(0).ToInternalValue());
49}
50
51TEST(Time, ZeroIsSymmetric) {
[email protected]9f251302008-08-19 09:16:4952 Time zero_time(Time::FromTimeT(0));
53 EXPECT_EQ(0, zero_time.ToTimeT());
54
55 EXPECT_EQ(0.0, zero_time.ToDoubleT());
initial.commitd7cae122008-07-26 21:49:3856}
57
58TEST(Time, LocalExplode) {
59 Time a = Time::Now();
60 Time::Exploded exploded;
61 a.LocalExplode(&exploded);
62
63 Time b = Time::FromLocalExploded(exploded);
64
65 // The exploded structure doesn't have microseconds, so the result will be
66 // rounded to the nearest millisecond.
67 EXPECT_TRUE((a - b) < TimeDelta::FromMilliseconds(1));
68}
69
70TEST(Time, UTCExplode) {
71 Time a = Time::Now();
72 Time::Exploded exploded;
73 a.UTCExplode(&exploded);
74
75 Time b = Time::FromUTCExploded(exploded);
76 EXPECT_TRUE((a - b) < TimeDelta::FromMilliseconds(1));
77}
78
[email protected]9f251302008-08-19 09:16:4979TEST(Time, LocalMidnight) {
80 Time::Exploded exploded;
81 Time::Now().LocalMidnight().LocalExplode(&exploded);
82 EXPECT_EQ(0, exploded.hour);
83 EXPECT_EQ(0, exploded.minute);
84 EXPECT_EQ(0, exploded.second);
85 EXPECT_EQ(0, exploded.millisecond);
86}
87
initial.commitd7cae122008-07-26 21:49:3888TEST(TimeTicks, Deltas) {
[email protected]de592d32008-09-26 03:00:0089 for (int index = 0; index < 500; index++) {
90 TimeTicks ticks_start = TimeTicks::Now();
91 PlatformThread::Sleep(10);
92 TimeTicks ticks_stop = TimeTicks::Now();
93 TimeDelta delta = ticks_stop - ticks_start;
94 // Note: Although we asked for a 10ms sleep, if the
95 // time clock has a finer granularity than the Sleep()
96 // clock, it is quite possible to wakeup early. Here
97 // is how that works:
98 // Time(ms timer) Time(us timer)
99 // 5 5010
100 // 6 6010
101 // 7 7010
102 // 8 8010
103 // 9 9000
104 // Elapsed 4ms 3990us
105 //
106 // Unfortunately, our InMilliseconds() function truncates
107 // rather than rounds. We should consider fixing this
108 // so that our averages come out better.
109 EXPECT_GE(delta.InMilliseconds(), 9);
110 EXPECT_GE(delta.InMicroseconds(), 9000);
111 EXPECT_EQ(delta.InSeconds(), 0);
112 }
initial.commitd7cae122008-07-26 21:49:38113}
114
[email protected]de592d32008-09-26 03:00:00115TEST(TimeTicks, HighResNow) {
116 TimeTicks ticks_start = TimeTicks::HighResNow();
[email protected]736f4342008-09-03 18:18:32117 PlatformThread::Sleep(10);
[email protected]de592d32008-09-26 03:00:00118 TimeTicks ticks_stop = TimeTicks::HighResNow();
[email protected]736f4342008-09-03 18:18:32119 TimeDelta delta = ticks_stop - ticks_start;
[email protected]de592d32008-09-26 03:00:00120 EXPECT_GE(delta.InMicroseconds(), 9000);
[email protected]736f4342008-09-03 18:18:32121}
122
[email protected]9f251302008-08-19 09:16:49123TEST(TimeDelta, FromAndIn) {
124 EXPECT_TRUE(TimeDelta::FromDays(2) == TimeDelta::FromHours(48));
125 EXPECT_TRUE(TimeDelta::FromHours(3) == TimeDelta::FromMinutes(180));
126 EXPECT_TRUE(TimeDelta::FromMinutes(2) == TimeDelta::FromSeconds(120));
127 EXPECT_TRUE(TimeDelta::FromSeconds(2) == TimeDelta::FromMilliseconds(2000));
128 EXPECT_TRUE(TimeDelta::FromMilliseconds(2) ==
129 TimeDelta::FromMicroseconds(2000));
130 EXPECT_EQ(13, TimeDelta::FromDays(13).InDays());
131 EXPECT_EQ(13, TimeDelta::FromHours(13).InHours());
132 EXPECT_EQ(13, TimeDelta::FromMinutes(13).InMinutes());
133 EXPECT_EQ(13, TimeDelta::FromSeconds(13).InSeconds());
134 EXPECT_EQ(13.0, TimeDelta::FromSeconds(13).InSecondsF());
135 EXPECT_EQ(13, TimeDelta::FromMilliseconds(13).InMilliseconds());
136 EXPECT_EQ(13.0, TimeDelta::FromMilliseconds(13).InMillisecondsF());
137 EXPECT_EQ(13, TimeDelta::FromMicroseconds(13).InMicroseconds());
138}