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(¤t_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, ¤t_time); 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott asctime_s(time_buf, arraysize(time_buf), &local_time); 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(OS_POSIX) 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott localtime_r(¤t_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