blob: aad0ccb07d427781f1fbafe6619660ca96af8999 [file] [log] [blame]
license.botf003cfe2008-08-24 09:55:55 +09001// 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.commit3f4a7322008-07-27 06:49:38 +09004
mmentovai@google.com9d0fbde2008-08-13 01:04:02 +09005#include <time.h>
6
initial.commit3f4a7322008-07-27 06:49:38 +09007#include "base/logging.h"
8#include "base/third_party/nspr/prtime.h"
9#include "base/time.h"
10#include "testing/gtest/include/gtest/gtest.h"
11
initial.commit3f4a7322008-07-27 06:49:38 +090012namespace {
13
initial.commit3f4a7322008-07-27 06:49:38 +090014// time_t representation of 15th Oct 2007 12:45:00 PDT
mmentovai@google.com9d0fbde2008-08-13 01:04:02 +090015PRTime comparison_time_pdt = 1192477500 * Time::kMicrosecondsPerSecond;
initial.commit3f4a7322008-07-27 06:49:38 +090016
17// Specialized test fixture allowing time strings without timezones to be
18// tested by comparing them to a known time in the local zone.
19class PRTimeTest : public testing::Test {
20 protected:
21 virtual void SetUp() {
22 // Use mktime to get a time_t, and turn it into a PRTime by converting
23 // seconds to microseconds. Use 15th Oct 2007 12:45:00 local. This
24 // must be a time guaranteed to be outside of a DST fallback hour in
25 // any timezone.
26 struct tm local_comparison_tm = {
27 0, // second
28 45, // minute
29 12, // hour
30 15, // day of month
31 10 - 1, // month
32 2007 - 1900, // year
33 0, // day of week (ignored, output only)
34 0, // day of year (ignored, output only)
35 -1 // DST in effect, -1 tells mktime to figure it out
36 };
37 comparison_time_local_ = mktime(&local_comparison_tm) *
mmentovai@google.com9d0fbde2008-08-13 01:04:02 +090038 Time::kMicrosecondsPerSecond;
initial.commit3f4a7322008-07-27 06:49:38 +090039 ASSERT_GT(comparison_time_local_, 0);
40 }
41
42 PRTime comparison_time_local_;
43};
44
45} // namespace
46
47// Tests the PR_ParseTimeString nspr helper function for
48// a variety of time strings.
49TEST_F(PRTimeTest, ParseTimeTest1) {
pinkerton@google.com54907a82008-08-12 08:07:19 +090050 time_t current_time = 0;
initial.commit3f4a7322008-07-27 06:49:38 +090051 time(&current_time);
52
pinkerton@google.com54907a82008-08-12 08:07:19 +090053 const int BUFFER_SIZE = 64;
mmentovai@google.com9d0fbde2008-08-13 01:04:02 +090054 struct tm local_time = {0};
pinkerton@google.com54907a82008-08-12 08:07:19 +090055 char time_buf[BUFFER_SIZE] = {0};
56#if defined(OS_WIN)
mmentovai@google.com9d0fbde2008-08-13 01:04:02 +090057 localtime_s(&local_time, &current_time);
initial.commit3f4a7322008-07-27 06:49:38 +090058 asctime_s(time_buf, arraysize(time_buf), &local_time);
pinkerton@google.com54907a82008-08-12 08:07:19 +090059#elif defined(OS_POSIX)
mmentovai@google.com9d0fbde2008-08-13 01:04:02 +090060 localtime_r(&current_time, &local_time);
pinkerton@google.com54907a82008-08-12 08:07:19 +090061 asctime_r(&local_time, time_buf);
62#endif
mmentovai@google.com9d0fbde2008-08-13 01:04:02 +090063
pinkerton@google.com54907a82008-08-12 08:07:19 +090064 PRTime current_time64 = static_cast<PRTime>(current_time) * PR_USEC_PER_SEC;
initial.commit3f4a7322008-07-27 06:49:38 +090065
66 PRTime parsed_time = 0;
67 PRStatus result = PR_ParseTimeString(time_buf, PR_FALSE, &parsed_time);
68 EXPECT_EQ(PR_SUCCESS, result);
pinkerton@google.com54907a82008-08-12 08:07:19 +090069 EXPECT_EQ(current_time64, parsed_time);
initial.commit3f4a7322008-07-27 06:49:38 +090070}
71
72TEST_F(PRTimeTest, ParseTimeTest2) {
73 PRTime parsed_time = 0;
74 PRStatus result = PR_ParseTimeString("Mon, 15 Oct 2007 19:45:00 GMT",
75 PR_FALSE, &parsed_time);
76 EXPECT_EQ(PR_SUCCESS, result);
77 EXPECT_EQ(parsed_time, comparison_time_pdt);
78}
79
80TEST_F(PRTimeTest, ParseTimeTest3) {
81 PRTime parsed_time = 0;
82 PRStatus result = PR_ParseTimeString("15 Oct 07 12:45:00", PR_FALSE,
83 &parsed_time);
84 EXPECT_EQ(PR_SUCCESS, result);
85 EXPECT_EQ(parsed_time, comparison_time_local_);
86}
87
88TEST_F(PRTimeTest, ParseTimeTest4) {
89 PRTime parsed_time = 0;
90 PRStatus result = PR_ParseTimeString("15 Oct 07 19:45 GMT", PR_FALSE,
91 &parsed_time);
92 EXPECT_EQ(PR_SUCCESS, result);
93 EXPECT_EQ(parsed_time, comparison_time_pdt);
94}
95
96TEST_F(PRTimeTest, ParseTimeTest5) {
97 PRTime parsed_time = 0;
98 PRStatus result = PR_ParseTimeString("Mon Oct 15 12:45 PDT 2007",
99 PR_FALSE, &parsed_time);
100 EXPECT_EQ(PR_SUCCESS, result);
101 EXPECT_EQ(parsed_time, comparison_time_pdt);
102}
103
104TEST_F(PRTimeTest, ParseTimeTest6) {
105 PRTime parsed_time = 0;
106 PRStatus result = PR_ParseTimeString("Monday, Oct 15, 2007 12:45 PM",
107 PR_FALSE, &parsed_time);
108 EXPECT_EQ(PR_SUCCESS, result);
109 EXPECT_EQ(parsed_time, comparison_time_local_);
110}
111
112TEST_F(PRTimeTest, ParseTimeTest7) {
113 PRTime parsed_time = 0;
114 PRStatus result = PR_ParseTimeString("10/15/07 12:45:00 PM", PR_FALSE,
115 &parsed_time);
116 EXPECT_EQ(PR_SUCCESS, result);
117 EXPECT_EQ(parsed_time, comparison_time_local_);
118}
119
120TEST_F(PRTimeTest, ParseTimeTest8) {
121 PRTime parsed_time = 0;
122 PRStatus result = PR_ParseTimeString("15-OCT-2007 12:45pm", PR_FALSE,
123 &parsed_time);
124 EXPECT_EQ(PR_SUCCESS, result);
125 EXPECT_EQ(parsed_time, comparison_time_local_);
126}
127
128TEST_F(PRTimeTest, ParseTimeTest9) {
129 PRTime parsed_time = 0;
130 PRStatus result = PR_ParseTimeString("16 Oct 2007 4:45-JST (Tuesday)",
131 PR_FALSE, &parsed_time);
132 EXPECT_EQ(PR_SUCCESS, result);
133 EXPECT_EQ(parsed_time, comparison_time_pdt);
134}
135
136// This tests the Time::FromString wrapper over PR_ParseTimeString
137TEST_F(PRTimeTest, ParseTimeTest10) {
138 Time parsed_time;
139 bool result = Time::FromString(L"15/10/07 12:45",&parsed_time);
140 EXPECT_EQ(true, result);
141
142 time_t computed_time = parsed_time.ToTimeT();
mmentovai@google.com9d0fbde2008-08-13 01:04:02 +0900143 time_t time_to_compare = comparison_time_local_ /
144 Time::kMicrosecondsPerSecond;
initial.commit3f4a7322008-07-27 06:49:38 +0900145 EXPECT_EQ(computed_time, time_to_compare);
146}
147
148// This tests the Time::FromString wrapper over PR_ParseTimeString
149TEST_F(PRTimeTest, ParseTimeTest11) {
150 Time parsed_time;
151 bool result = Time::FromString(L"Mon, 15 Oct 2007 19:45:00 GMT",
152 &parsed_time);
153 EXPECT_EQ(true, result);
154
155 time_t computed_time = parsed_time.ToTimeT();
mmentovai@google.com9d0fbde2008-08-13 01:04:02 +0900156 time_t time_to_compare = comparison_time_pdt / Time::kMicrosecondsPerSecond;
initial.commit3f4a7322008-07-27 06:49:38 +0900157 EXPECT_EQ(computed_time, time_to_compare);
158}
deanm@google.com52e68b92008-08-18 21:50:48 +0900159
160// Test some of edge cases around epoch, etc.
161TEST_F(PRTimeTest, ParseTimeTestEpoch0) {
162 Time parsed_time;
163
164 // time_t == epoch == 0
165 EXPECT_EQ(true, Time::FromString(L"Thu Jan 01 01:00:00 +0100 1970",
166 &parsed_time));
167 EXPECT_EQ(0, parsed_time.ToTimeT());
168 EXPECT_EQ(true, Time::FromString(L"Thu Jan 01 00:00:00 GMT 1970",
169 &parsed_time));
170 EXPECT_EQ(0, parsed_time.ToTimeT());
171}
172
173TEST_F(PRTimeTest, ParseTimeTestEpoch1) {
174 Time parsed_time;
175
176 // time_t == 1 second after epoch == 1
177 EXPECT_EQ(true, Time::FromString(L"Thu Jan 01 01:00:01 +0100 1970",
178 &parsed_time));
179 EXPECT_EQ(1, parsed_time.ToTimeT());
180 EXPECT_EQ(true, Time::FromString(L"Thu Jan 01 00:00:01 GMT 1970",
181 &parsed_time));
182 EXPECT_EQ(1, parsed_time.ToTimeT());
183}
184
185TEST_F(PRTimeTest, ParseTimeTestEpoch2) {
186 Time parsed_time;
187
188 // time_t == 2 seconds after epoch == 2
189 EXPECT_EQ(true, Time::FromString(L"Thu Jan 01 01:00:02 +0100 1970",
190 &parsed_time));
191 EXPECT_EQ(2, parsed_time.ToTimeT());
192 EXPECT_EQ(true, Time::FromString(L"Thu Jan 01 00:00:02 GMT 1970",
193 &parsed_time));
194 EXPECT_EQ(2, parsed_time.ToTimeT());
195}
196
197TEST_F(PRTimeTest, ParseTimeTestEpochNeg1) {
198 Time parsed_time;
199
200 // time_t == 1 second before epoch == -1
201 EXPECT_EQ(true, Time::FromString(L"Thu Jan 01 00:59:59 +0100 1970",
202 &parsed_time));
203 EXPECT_EQ(-1, parsed_time.ToTimeT());
204 EXPECT_EQ(true, Time::FromString(L"Wed Dec 31 23:59:59 GMT 1969",
205 &parsed_time));
206 EXPECT_EQ(-1, parsed_time.ToTimeT());
207}
208
209TEST_F(PRTimeTest, ParseTimeTestEpochNeg2) {
210 Time parsed_time;
211
212 // time_t == 2 seconds before epoch == -2
213 EXPECT_EQ(true, Time::FromString(L"Thu Jan 01 00:59:58 +0100 1970",
214 &parsed_time));
215 EXPECT_EQ(-2, parsed_time.ToTimeT());
216 EXPECT_EQ(true, Time::FromString(L"Wed Dec 31 23:59:58 GMT 1969",
217 &parsed_time));
218 EXPECT_EQ(-2, parsed_time.ToTimeT());
219}
220
221TEST_F(PRTimeTest, ParseTimeTestEpoch1960) {
222 Time parsed_time;
223
224 // time_t before Epoch, in 1960
225 EXPECT_EQ(true, Time::FromString(L"Wed Jun 29 19:40:01 +0100 1960",
226 &parsed_time));
227 EXPECT_EQ(-299999999, parsed_time.ToTimeT());
228 EXPECT_EQ(true, Time::FromString(L"Wed Jun 29 18:40:01 GMT 1960",
229 &parsed_time));
230 EXPECT_EQ(-299999999, parsed_time.ToTimeT());
231 EXPECT_EQ(true, Time::FromString(L"Wed Jun 29 17:40:01 GMT 1960",
232 &parsed_time));
233 EXPECT_EQ(-300003599, parsed_time.ToTimeT());
234}
deanm@google.com02781222008-08-19 18:16:49 +0900235
236TEST_F(PRTimeTest, ParseTimeTestEmpty) {
237 Time parsed_time;
238 EXPECT_FALSE(Time::FromString(L"", &parsed_time));
239}
license.botf003cfe2008-08-24 09:55:55 +0900240