1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 2006-2008 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
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/third_party/nspr/prtime.h"
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/time.h"
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h"
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottusing base::Time;
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace {
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// time_t representation of 15th Oct 2007 12:45:00 PDT
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottPRTime comparison_time_pdt = 1192477500 * Time::kMicrosecondsPerSecond;
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Specialized test fixture allowing time strings without timezones to be
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// tested by comparing them to a known time in the local zone.
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass PRTimeTest : public testing::Test {
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott protected:
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual void SetUp() {
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // Use mktime to get a time_t, and turn it into a PRTime by converting
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // seconds to microseconds.  Use 15th Oct 2007 12:45:00 local.  This
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // must be a time guaranteed to be outside of a DST fallback hour in
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // any timezone.
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    struct tm local_comparison_tm = {
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      0,            // second
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      45,           // minute
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      12,           // hour
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      15,           // day of month
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      10 - 1,       // month
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      2007 - 1900,  // year
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      0,            // day of week (ignored, output only)
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      0,            // day of year (ignored, output only)
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      -1            // DST in effect, -1 tells mktime to figure it out
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    };
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    comparison_time_local_ = mktime(&local_comparison_tm) *
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                             Time::kMicrosecondsPerSecond;
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ASSERT_GT(comparison_time_local_, 0);
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRTime comparison_time_local_;
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Tests the PR_ParseTimeString nspr helper function for
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// a variety of time strings.
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(PRTimeTest, ParseTimeTest1) {
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  time_t current_time = 0;
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  time(&current_time);
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const int BUFFER_SIZE = 64;
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  struct tm local_time = {0};
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  char time_buf[BUFFER_SIZE] = {0};
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_WIN)
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  localtime_s(&local_time, &current_time);
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  asctime_s(time_buf, arraysize(time_buf), &local_time);
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(OS_POSIX)
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  localtime_r(&current_time, &local_time);
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  asctime_r(&local_time, time_buf);
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRTime current_time64 = static_cast<PRTime>(current_time) * PR_USEC_PER_SEC;
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRTime parsed_time = 0;
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRStatus result = PR_ParseTimeString(time_buf, PR_FALSE, &parsed_time);
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(PR_SUCCESS, result);
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(current_time64, parsed_time);
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(PRTimeTest, ParseTimeTest2) {
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRTime parsed_time = 0;
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRStatus result = PR_ParseTimeString("Mon, 15 Oct 2007 19:45:00 GMT",
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       PR_FALSE, &parsed_time);
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(PR_SUCCESS, result);
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(parsed_time, comparison_time_pdt);
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(PRTimeTest, ParseTimeTest3) {
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRTime parsed_time = 0;
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRStatus result = PR_ParseTimeString("15 Oct 07 12:45:00", PR_FALSE,
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       &parsed_time);
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(PR_SUCCESS, result);
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(parsed_time, comparison_time_local_);
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(PRTimeTest, ParseTimeTest4) {
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRTime parsed_time = 0;
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRStatus result = PR_ParseTimeString("15 Oct 07 19:45 GMT", PR_FALSE,
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       &parsed_time);
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(PR_SUCCESS, result);
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(parsed_time, comparison_time_pdt);
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(PRTimeTest, ParseTimeTest5) {
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRTime parsed_time = 0;
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRStatus result = PR_ParseTimeString("Mon Oct 15 12:45 PDT 2007",
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       PR_FALSE, &parsed_time);
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(PR_SUCCESS, result);
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(parsed_time, comparison_time_pdt);
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(PRTimeTest, ParseTimeTest6) {
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRTime parsed_time = 0;
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRStatus result = PR_ParseTimeString("Monday, Oct 15, 2007 12:45 PM",
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       PR_FALSE, &parsed_time);
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(PR_SUCCESS, result);
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(parsed_time, comparison_time_local_);
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(PRTimeTest, ParseTimeTest7) {
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRTime parsed_time = 0;
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRStatus result = PR_ParseTimeString("10/15/07 12:45:00 PM", PR_FALSE,
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       &parsed_time);
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(PR_SUCCESS, result);
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(parsed_time, comparison_time_local_);
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(PRTimeTest, ParseTimeTest8) {
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRTime parsed_time = 0;
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRStatus result = PR_ParseTimeString("15-OCT-2007 12:45pm", PR_FALSE,
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       &parsed_time);
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(PR_SUCCESS, result);
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(parsed_time, comparison_time_local_);
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(PRTimeTest, ParseTimeTest9) {
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRTime parsed_time = 0;
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRStatus result = PR_ParseTimeString("16 Oct 2007 4:45-JST (Tuesday)",
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       PR_FALSE, &parsed_time);
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(PR_SUCCESS, result);
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(parsed_time, comparison_time_pdt);
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This tests the Time::FromString wrapper over PR_ParseTimeString
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(PRTimeTest, ParseTimeTest10) {
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time parsed_time;
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool result = Time::FromString(L"15/10/07 12:45", &parsed_time);
13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(result);
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  time_t computed_time = parsed_time.ToTimeT();
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  time_t time_to_compare = comparison_time_local_ /
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                           Time::kMicrosecondsPerSecond;
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(computed_time, time_to_compare);
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This tests the Time::FromString wrapper over PR_ParseTimeString
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(PRTimeTest, ParseTimeTest11) {
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time parsed_time;
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool result = Time::FromString(L"Mon, 15 Oct 2007 19:45:00 GMT",
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                 &parsed_time);
15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(result);
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  time_t computed_time = parsed_time.ToTimeT();
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  time_t time_to_compare = comparison_time_pdt / Time::kMicrosecondsPerSecond;
156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(computed_time, time_to_compare);
157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Test some of edge cases around epoch, etc.
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(PRTimeTest, ParseTimeTestEpoch0) {
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time parsed_time;
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // time_t == epoch == 0
16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(Time::FromString(L"Thu Jan 01 01:00:00 +0100 1970",
16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                               &parsed_time));
166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, parsed_time.ToTimeT());
16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(Time::FromString(L"Thu Jan 01 00:00:00 GMT 1970",
16872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                               &parsed_time));
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, parsed_time.ToTimeT());
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(PRTimeTest, ParseTimeTestEpoch1) {
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time parsed_time;
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // time_t == 1 second after epoch == 1
17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(Time::FromString(L"Thu Jan 01 01:00:01 +0100 1970",
17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                               &parsed_time));
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(1, parsed_time.ToTimeT());
17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(Time::FromString(L"Thu Jan 01 00:00:01 GMT 1970",
18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                               &parsed_time));
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(1, parsed_time.ToTimeT());
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(PRTimeTest, ParseTimeTestEpoch2) {
185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time parsed_time;
186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // time_t == 2 seconds after epoch == 2
18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(Time::FromString(L"Thu Jan 01 01:00:02 +0100 1970",
18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                               &parsed_time));
190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(2, parsed_time.ToTimeT());
19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(Time::FromString(L"Thu Jan 01 00:00:02 GMT 1970",
19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                               &parsed_time));
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(2, parsed_time.ToTimeT());
194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(PRTimeTest, ParseTimeTestEpochNeg1) {
197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time parsed_time;
198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // time_t == 1 second before epoch == -1
20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(Time::FromString(L"Thu Jan 01 00:59:59 +0100 1970",
20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                               &parsed_time));
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(-1, parsed_time.ToTimeT());
20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(Time::FromString(L"Wed Dec 31 23:59:59 GMT 1969",
20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                               &parsed_time));
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(-1, parsed_time.ToTimeT());
206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// If time_t is 32 bits, a date after year 2038 will overflow time_t and
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// cause timegm() to return -1.  The parsed time should not be 1 second
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// before epoch.
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(PRTimeTest, ParseTimeTestEpochNotNeg1) {
212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time parsed_time;
213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(Time::FromString(L"Wed Dec 31 23:59:59 GMT 2100",
21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                               &parsed_time));
216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_NE(-1, parsed_time.ToTimeT());
217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(PRTimeTest, ParseTimeTestEpochNeg2) {
220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time parsed_time;
221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // time_t == 2 seconds before epoch == -2
22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(Time::FromString(L"Thu Jan 01 00:59:58 +0100 1970",
22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                               &parsed_time));
225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(-2, parsed_time.ToTimeT());
22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(Time::FromString(L"Wed Dec 31 23:59:58 GMT 1969",
22772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                               &parsed_time));
228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(-2, parsed_time.ToTimeT());
229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(PRTimeTest, ParseTimeTestEpoch1960) {
232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time parsed_time;
233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // time_t before Epoch, in 1960
23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(Time::FromString(L"Wed Jun 29 19:40:01 +0100 1960",
23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                               &parsed_time));
237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(-299999999, parsed_time.ToTimeT());
23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(Time::FromString(L"Wed Jun 29 18:40:01 GMT 1960",
23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                               &parsed_time));
240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(-299999999, parsed_time.ToTimeT());
24172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_TRUE(Time::FromString(L"Wed Jun 29 17:40:01 GMT 1960",
24272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                               &parsed_time));
243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(-300003599, parsed_time.ToTimeT());
244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(PRTimeTest, ParseTimeTestEmpty) {
247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Time parsed_time;
248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(Time::FromString(L"", &parsed_time));
249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This test should not crash when compiled with Visual C++ 2005 (see
252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// http://crbug.com/4387).
253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(PRTimeTest, ParseTimeTestOutOfRange) {
254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRTime parsed_time = 0;
255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Note the lack of timezone in the time string.  The year has to be 3001.
256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The date has to be after 23:59:59, December 31, 3000, US Pacific Time, so
257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // we use January 2, 3001 to make sure it's after the magic maximum in any
258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // timezone.
259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRStatus result = PR_ParseTimeString("Sun Jan  2 00:00:00 3001",
260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       PR_FALSE, &parsed_time);
261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(PR_SUCCESS, result);
262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(PRTimeTest, ParseTimeTestNotNormalized1) {
265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRTime parsed_time = 0;
266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRStatus result = PR_ParseTimeString("Mon Oct 15 12:44:60 PDT 2007",
267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       PR_FALSE, &parsed_time);
268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(PR_SUCCESS, result);
269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(comparison_time_pdt, parsed_time);
270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(PRTimeTest, ParseTimeTestNotNormalized2) {
273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRTime parsed_time = 0;
274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PRStatus result = PR_ParseTimeString("Sun Oct 14 36:45 PDT 2007",
275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       PR_FALSE, &parsed_time);
276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(PR_SUCCESS, result);
277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(comparison_time_pdt, parsed_time);
278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace
281