license.bot | f003cfe | 2008-08-24 09:55:55 +0900 | [diff] [blame^] | 1 | // 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.commit | 3f4a732 | 2008-07-27 06:49:38 +0900 | [diff] [blame] | 4 | |
mmentovai@google.com | 9d0fbde | 2008-08-13 01:04:02 +0900 | [diff] [blame] | 5 | #include <time.h> |
| 6 | |
initial.commit | 3f4a732 | 2008-07-27 06:49:38 +0900 | [diff] [blame] | 7 | #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.commit | 3f4a732 | 2008-07-27 06:49:38 +0900 | [diff] [blame] | 12 | namespace { |
| 13 | |
initial.commit | 3f4a732 | 2008-07-27 06:49:38 +0900 | [diff] [blame] | 14 | // time_t representation of 15th Oct 2007 12:45:00 PDT |
mmentovai@google.com | 9d0fbde | 2008-08-13 01:04:02 +0900 | [diff] [blame] | 15 | PRTime comparison_time_pdt = 1192477500 * Time::kMicrosecondsPerSecond; |
initial.commit | 3f4a732 | 2008-07-27 06:49:38 +0900 | [diff] [blame] | 16 | |
| 17 | // Specialized test fixture allowing time strings without timezones to be |
| 18 | // tested by comparing them to a known time in the local zone. |
| 19 | class 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.com | 9d0fbde | 2008-08-13 01:04:02 +0900 | [diff] [blame] | 38 | Time::kMicrosecondsPerSecond; |
initial.commit | 3f4a732 | 2008-07-27 06:49:38 +0900 | [diff] [blame] | 39 | 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. |
| 49 | TEST_F(PRTimeTest, ParseTimeTest1) { |
pinkerton@google.com | 54907a8 | 2008-08-12 08:07:19 +0900 | [diff] [blame] | 50 | time_t current_time = 0; |
initial.commit | 3f4a732 | 2008-07-27 06:49:38 +0900 | [diff] [blame] | 51 | time(¤t_time); |
| 52 | |
pinkerton@google.com | 54907a8 | 2008-08-12 08:07:19 +0900 | [diff] [blame] | 53 | const int BUFFER_SIZE = 64; |
mmentovai@google.com | 9d0fbde | 2008-08-13 01:04:02 +0900 | [diff] [blame] | 54 | struct tm local_time = {0}; |
pinkerton@google.com | 54907a8 | 2008-08-12 08:07:19 +0900 | [diff] [blame] | 55 | char time_buf[BUFFER_SIZE] = {0}; |
| 56 | #if defined(OS_WIN) |
mmentovai@google.com | 9d0fbde | 2008-08-13 01:04:02 +0900 | [diff] [blame] | 57 | localtime_s(&local_time, ¤t_time); |
initial.commit | 3f4a732 | 2008-07-27 06:49:38 +0900 | [diff] [blame] | 58 | asctime_s(time_buf, arraysize(time_buf), &local_time); |
pinkerton@google.com | 54907a8 | 2008-08-12 08:07:19 +0900 | [diff] [blame] | 59 | #elif defined(OS_POSIX) |
mmentovai@google.com | 9d0fbde | 2008-08-13 01:04:02 +0900 | [diff] [blame] | 60 | localtime_r(¤t_time, &local_time); |
pinkerton@google.com | 54907a8 | 2008-08-12 08:07:19 +0900 | [diff] [blame] | 61 | asctime_r(&local_time, time_buf); |
| 62 | #endif |
mmentovai@google.com | 9d0fbde | 2008-08-13 01:04:02 +0900 | [diff] [blame] | 63 | |
pinkerton@google.com | 54907a8 | 2008-08-12 08:07:19 +0900 | [diff] [blame] | 64 | PRTime current_time64 = static_cast<PRTime>(current_time) * PR_USEC_PER_SEC; |
initial.commit | 3f4a732 | 2008-07-27 06:49:38 +0900 | [diff] [blame] | 65 | |
| 66 | PRTime parsed_time = 0; |
| 67 | PRStatus result = PR_ParseTimeString(time_buf, PR_FALSE, &parsed_time); |
| 68 | EXPECT_EQ(PR_SUCCESS, result); |
pinkerton@google.com | 54907a8 | 2008-08-12 08:07:19 +0900 | [diff] [blame] | 69 | EXPECT_EQ(current_time64, parsed_time); |
initial.commit | 3f4a732 | 2008-07-27 06:49:38 +0900 | [diff] [blame] | 70 | } |
| 71 | |
| 72 | TEST_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 | |
| 80 | TEST_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 | |
| 88 | TEST_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 | |
| 96 | TEST_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 | |
| 104 | TEST_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 | |
| 112 | TEST_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 | |
| 120 | TEST_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 | |
| 128 | TEST_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 |
| 137 | TEST_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.com | 9d0fbde | 2008-08-13 01:04:02 +0900 | [diff] [blame] | 143 | time_t time_to_compare = comparison_time_local_ / |
| 144 | Time::kMicrosecondsPerSecond; |
initial.commit | 3f4a732 | 2008-07-27 06:49:38 +0900 | [diff] [blame] | 145 | EXPECT_EQ(computed_time, time_to_compare); |
| 146 | } |
| 147 | |
| 148 | // This tests the Time::FromString wrapper over PR_ParseTimeString |
| 149 | TEST_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.com | 9d0fbde | 2008-08-13 01:04:02 +0900 | [diff] [blame] | 156 | time_t time_to_compare = comparison_time_pdt / Time::kMicrosecondsPerSecond; |
initial.commit | 3f4a732 | 2008-07-27 06:49:38 +0900 | [diff] [blame] | 157 | EXPECT_EQ(computed_time, time_to_compare); |
| 158 | } |
deanm@google.com | 52e68b9 | 2008-08-18 21:50:48 +0900 | [diff] [blame] | 159 | |
| 160 | // Test some of edge cases around epoch, etc. |
| 161 | TEST_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 | |
| 173 | TEST_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 | |
| 185 | TEST_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 | |
| 197 | TEST_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 | |
| 209 | TEST_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 | |
| 221 | TEST_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.com | 0278122 | 2008-08-19 18:16:49 +0900 | [diff] [blame] | 235 | |
| 236 | TEST_F(PRTimeTest, ParseTimeTestEmpty) { |
| 237 | Time parsed_time; |
| 238 | EXPECT_FALSE(Time::FromString(L"", &parsed_time)); |
| 239 | } |
license.bot | f003cfe | 2008-08-24 09:55:55 +0900 | [diff] [blame^] | 240 | |