license.bot | bf09a50 | 2008-08-24 00:55:55 | [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 | d7cae12 | 2008-07-26 21:49:38 | [diff] [blame] | 4 | |
[email protected] | 2352de9 | 2008-08-12 16:04:02 | [diff] [blame] | 5 | #include <time.h> |
| 6 | |
initial.commit | d7cae12 | 2008-07-26 21:49:38 | [diff] [blame] | 7 | #include "base/third_party/nspr/prtime.h" |
| 8 | #include "base/time.h" |
| 9 | #include "testing/gtest/include/gtest/gtest.h" |
| 10 | |
[email protected] | e1acf6f | 2008-10-27 20:43:33 | [diff] [blame] | 11 | using base::Time; |
| 12 | |
initial.commit | d7cae12 | 2008-07-26 21:49:38 | [diff] [blame] | 13 | namespace { |
| 14 | |
initial.commit | d7cae12 | 2008-07-26 21:49:38 | [diff] [blame] | 15 | // time_t representation of 15th Oct 2007 12:45:00 PDT |
[email protected] | 2352de9 | 2008-08-12 16:04:02 | [diff] [blame] | 16 | PRTime comparison_time_pdt = 1192477500 * Time::kMicrosecondsPerSecond; |
initial.commit | d7cae12 | 2008-07-26 21:49:38 | [diff] [blame] | 17 | |
| 18 | // Specialized test fixture allowing time strings without timezones to be |
| 19 | // tested by comparing them to a known time in the local zone. |
| 20 | class PRTimeTest : public testing::Test { |
| 21 | protected: |
| 22 | virtual void SetUp() { |
| 23 | // Use mktime to get a time_t, and turn it into a PRTime by converting |
| 24 | // seconds to microseconds. Use 15th Oct 2007 12:45:00 local. This |
| 25 | // must be a time guaranteed to be outside of a DST fallback hour in |
| 26 | // any timezone. |
| 27 | struct tm local_comparison_tm = { |
| 28 | 0, // second |
| 29 | 45, // minute |
| 30 | 12, // hour |
| 31 | 15, // day of month |
| 32 | 10 - 1, // month |
| 33 | 2007 - 1900, // year |
| 34 | 0, // day of week (ignored, output only) |
| 35 | 0, // day of year (ignored, output only) |
| 36 | -1 // DST in effect, -1 tells mktime to figure it out |
| 37 | }; |
| 38 | comparison_time_local_ = mktime(&local_comparison_tm) * |
[email protected] | 2352de9 | 2008-08-12 16:04:02 | [diff] [blame] | 39 | Time::kMicrosecondsPerSecond; |
initial.commit | d7cae12 | 2008-07-26 21:49:38 | [diff] [blame] | 40 | ASSERT_GT(comparison_time_local_, 0); |
| 41 | } |
| 42 | |
| 43 | PRTime comparison_time_local_; |
| 44 | }; |
| 45 | |
initial.commit | d7cae12 | 2008-07-26 21:49:38 | [diff] [blame] | 46 | // Tests the PR_ParseTimeString nspr helper function for |
| 47 | // a variety of time strings. |
| 48 | TEST_F(PRTimeTest, ParseTimeTest1) { |
[email protected] | 0d6033c | 2008-08-11 23:07:19 | [diff] [blame] | 49 | time_t current_time = 0; |
initial.commit | d7cae12 | 2008-07-26 21:49:38 | [diff] [blame] | 50 | time(¤t_time); |
| 51 | |
[email protected] | 0d6033c | 2008-08-11 23:07:19 | [diff] [blame] | 52 | const int BUFFER_SIZE = 64; |
[email protected] | 2352de9 | 2008-08-12 16:04:02 | [diff] [blame] | 53 | struct tm local_time = {0}; |
[email protected] | 0d6033c | 2008-08-11 23:07:19 | [diff] [blame] | 54 | char time_buf[BUFFER_SIZE] = {0}; |
| 55 | #if defined(OS_WIN) |
[email protected] | 2352de9 | 2008-08-12 16:04:02 | [diff] [blame] | 56 | localtime_s(&local_time, ¤t_time); |
initial.commit | d7cae12 | 2008-07-26 21:49:38 | [diff] [blame] | 57 | asctime_s(time_buf, arraysize(time_buf), &local_time); |
[email protected] | 0d6033c | 2008-08-11 23:07:19 | [diff] [blame] | 58 | #elif defined(OS_POSIX) |
[email protected] | 2352de9 | 2008-08-12 16:04:02 | [diff] [blame] | 59 | localtime_r(¤t_time, &local_time); |
[email protected] | 0d6033c | 2008-08-11 23:07:19 | [diff] [blame] | 60 | asctime_r(&local_time, time_buf); |
| 61 | #endif |
[email protected] | 2352de9 | 2008-08-12 16:04:02 | [diff] [blame] | 62 | |
[email protected] | 0d6033c | 2008-08-11 23:07:19 | [diff] [blame] | 63 | PRTime current_time64 = static_cast<PRTime>(current_time) * PR_USEC_PER_SEC; |
initial.commit | d7cae12 | 2008-07-26 21:49:38 | [diff] [blame] | 64 | |
| 65 | PRTime parsed_time = 0; |
| 66 | PRStatus result = PR_ParseTimeString(time_buf, PR_FALSE, &parsed_time); |
| 67 | EXPECT_EQ(PR_SUCCESS, result); |
[email protected] | 0d6033c | 2008-08-11 23:07:19 | [diff] [blame] | 68 | EXPECT_EQ(current_time64, parsed_time); |
initial.commit | d7cae12 | 2008-07-26 21:49:38 | [diff] [blame] | 69 | } |
| 70 | |
| 71 | TEST_F(PRTimeTest, ParseTimeTest2) { |
| 72 | PRTime parsed_time = 0; |
| 73 | PRStatus result = PR_ParseTimeString("Mon, 15 Oct 2007 19:45:00 GMT", |
| 74 | PR_FALSE, &parsed_time); |
| 75 | EXPECT_EQ(PR_SUCCESS, result); |
| 76 | EXPECT_EQ(parsed_time, comparison_time_pdt); |
| 77 | } |
| 78 | |
| 79 | TEST_F(PRTimeTest, ParseTimeTest3) { |
| 80 | PRTime parsed_time = 0; |
| 81 | PRStatus result = PR_ParseTimeString("15 Oct 07 12:45:00", PR_FALSE, |
| 82 | &parsed_time); |
| 83 | EXPECT_EQ(PR_SUCCESS, result); |
| 84 | EXPECT_EQ(parsed_time, comparison_time_local_); |
| 85 | } |
| 86 | |
| 87 | TEST_F(PRTimeTest, ParseTimeTest4) { |
| 88 | PRTime parsed_time = 0; |
| 89 | PRStatus result = PR_ParseTimeString("15 Oct 07 19:45 GMT", PR_FALSE, |
| 90 | &parsed_time); |
| 91 | EXPECT_EQ(PR_SUCCESS, result); |
| 92 | EXPECT_EQ(parsed_time, comparison_time_pdt); |
| 93 | } |
| 94 | |
| 95 | TEST_F(PRTimeTest, ParseTimeTest5) { |
| 96 | PRTime parsed_time = 0; |
| 97 | PRStatus result = PR_ParseTimeString("Mon Oct 15 12:45 PDT 2007", |
| 98 | PR_FALSE, &parsed_time); |
| 99 | EXPECT_EQ(PR_SUCCESS, result); |
| 100 | EXPECT_EQ(parsed_time, comparison_time_pdt); |
| 101 | } |
| 102 | |
| 103 | TEST_F(PRTimeTest, ParseTimeTest6) { |
| 104 | PRTime parsed_time = 0; |
| 105 | PRStatus result = PR_ParseTimeString("Monday, Oct 15, 2007 12:45 PM", |
| 106 | PR_FALSE, &parsed_time); |
| 107 | EXPECT_EQ(PR_SUCCESS, result); |
| 108 | EXPECT_EQ(parsed_time, comparison_time_local_); |
| 109 | } |
| 110 | |
| 111 | TEST_F(PRTimeTest, ParseTimeTest7) { |
| 112 | PRTime parsed_time = 0; |
| 113 | PRStatus result = PR_ParseTimeString("10/15/07 12:45:00 PM", PR_FALSE, |
| 114 | &parsed_time); |
| 115 | EXPECT_EQ(PR_SUCCESS, result); |
| 116 | EXPECT_EQ(parsed_time, comparison_time_local_); |
| 117 | } |
| 118 | |
| 119 | TEST_F(PRTimeTest, ParseTimeTest8) { |
| 120 | PRTime parsed_time = 0; |
| 121 | PRStatus result = PR_ParseTimeString("15-OCT-2007 12:45pm", PR_FALSE, |
| 122 | &parsed_time); |
| 123 | EXPECT_EQ(PR_SUCCESS, result); |
| 124 | EXPECT_EQ(parsed_time, comparison_time_local_); |
| 125 | } |
| 126 | |
| 127 | TEST_F(PRTimeTest, ParseTimeTest9) { |
| 128 | PRTime parsed_time = 0; |
| 129 | PRStatus result = PR_ParseTimeString("16 Oct 2007 4:45-JST (Tuesday)", |
| 130 | PR_FALSE, &parsed_time); |
| 131 | EXPECT_EQ(PR_SUCCESS, result); |
| 132 | EXPECT_EQ(parsed_time, comparison_time_pdt); |
| 133 | } |
| 134 | |
| 135 | // This tests the Time::FromString wrapper over PR_ParseTimeString |
| 136 | TEST_F(PRTimeTest, ParseTimeTest10) { |
| 137 | Time parsed_time; |
[email protected] | 1e031a1 | 2009-03-03 01:24:01 | [diff] [blame] | 138 | bool result = Time::FromString(L"15/10/07 12:45", &parsed_time); |
initial.commit | d7cae12 | 2008-07-26 21:49:38 | [diff] [blame] | 139 | EXPECT_EQ(true, result); |
| 140 | |
| 141 | time_t computed_time = parsed_time.ToTimeT(); |
[email protected] | 2352de9 | 2008-08-12 16:04:02 | [diff] [blame] | 142 | time_t time_to_compare = comparison_time_local_ / |
| 143 | Time::kMicrosecondsPerSecond; |
initial.commit | d7cae12 | 2008-07-26 21:49:38 | [diff] [blame] | 144 | EXPECT_EQ(computed_time, time_to_compare); |
| 145 | } |
| 146 | |
| 147 | // This tests the Time::FromString wrapper over PR_ParseTimeString |
| 148 | TEST_F(PRTimeTest, ParseTimeTest11) { |
| 149 | Time parsed_time; |
| 150 | bool result = Time::FromString(L"Mon, 15 Oct 2007 19:45:00 GMT", |
| 151 | &parsed_time); |
| 152 | EXPECT_EQ(true, result); |
| 153 | |
| 154 | time_t computed_time = parsed_time.ToTimeT(); |
[email protected] | 2352de9 | 2008-08-12 16:04:02 | [diff] [blame] | 155 | time_t time_to_compare = comparison_time_pdt / Time::kMicrosecondsPerSecond; |
initial.commit | d7cae12 | 2008-07-26 21:49:38 | [diff] [blame] | 156 | EXPECT_EQ(computed_time, time_to_compare); |
| 157 | } |
[email protected] | e123327 | 2008-08-18 12:50:48 | [diff] [blame] | 158 | |
| 159 | // Test some of edge cases around epoch, etc. |
| 160 | TEST_F(PRTimeTest, ParseTimeTestEpoch0) { |
| 161 | Time parsed_time; |
| 162 | |
| 163 | // time_t == epoch == 0 |
| 164 | EXPECT_EQ(true, Time::FromString(L"Thu Jan 01 01:00:00 +0100 1970", |
| 165 | &parsed_time)); |
| 166 | EXPECT_EQ(0, parsed_time.ToTimeT()); |
| 167 | EXPECT_EQ(true, Time::FromString(L"Thu Jan 01 00:00:00 GMT 1970", |
| 168 | &parsed_time)); |
| 169 | EXPECT_EQ(0, parsed_time.ToTimeT()); |
| 170 | } |
| 171 | |
| 172 | TEST_F(PRTimeTest, ParseTimeTestEpoch1) { |
| 173 | Time parsed_time; |
[email protected] | 1e031a1 | 2009-03-03 01:24:01 | [diff] [blame] | 174 | |
[email protected] | e123327 | 2008-08-18 12:50:48 | [diff] [blame] | 175 | // time_t == 1 second after epoch == 1 |
| 176 | EXPECT_EQ(true, Time::FromString(L"Thu Jan 01 01:00:01 +0100 1970", |
| 177 | &parsed_time)); |
| 178 | EXPECT_EQ(1, parsed_time.ToTimeT()); |
| 179 | EXPECT_EQ(true, Time::FromString(L"Thu Jan 01 00:00:01 GMT 1970", |
| 180 | &parsed_time)); |
| 181 | EXPECT_EQ(1, parsed_time.ToTimeT()); |
| 182 | } |
| 183 | |
| 184 | TEST_F(PRTimeTest, ParseTimeTestEpoch2) { |
| 185 | Time parsed_time; |
[email protected] | 1e031a1 | 2009-03-03 01:24:01 | [diff] [blame] | 186 | |
[email protected] | e123327 | 2008-08-18 12:50:48 | [diff] [blame] | 187 | // time_t == 2 seconds after epoch == 2 |
| 188 | EXPECT_EQ(true, Time::FromString(L"Thu Jan 01 01:00:02 +0100 1970", |
| 189 | &parsed_time)); |
| 190 | EXPECT_EQ(2, parsed_time.ToTimeT()); |
| 191 | EXPECT_EQ(true, Time::FromString(L"Thu Jan 01 00:00:02 GMT 1970", |
| 192 | &parsed_time)); |
| 193 | EXPECT_EQ(2, parsed_time.ToTimeT()); |
| 194 | } |
| 195 | |
| 196 | TEST_F(PRTimeTest, ParseTimeTestEpochNeg1) { |
| 197 | Time parsed_time; |
| 198 | |
| 199 | // time_t == 1 second before epoch == -1 |
| 200 | EXPECT_EQ(true, Time::FromString(L"Thu Jan 01 00:59:59 +0100 1970", |
| 201 | &parsed_time)); |
| 202 | EXPECT_EQ(-1, parsed_time.ToTimeT()); |
| 203 | EXPECT_EQ(true, Time::FromString(L"Wed Dec 31 23:59:59 GMT 1969", |
| 204 | &parsed_time)); |
| 205 | EXPECT_EQ(-1, parsed_time.ToTimeT()); |
| 206 | } |
| 207 | |
| 208 | TEST_F(PRTimeTest, ParseTimeTestEpochNeg2) { |
| 209 | Time parsed_time; |
| 210 | |
| 211 | // time_t == 2 seconds before epoch == -2 |
| 212 | EXPECT_EQ(true, Time::FromString(L"Thu Jan 01 00:59:58 +0100 1970", |
| 213 | &parsed_time)); |
| 214 | EXPECT_EQ(-2, parsed_time.ToTimeT()); |
| 215 | EXPECT_EQ(true, Time::FromString(L"Wed Dec 31 23:59:58 GMT 1969", |
| 216 | &parsed_time)); |
| 217 | EXPECT_EQ(-2, parsed_time.ToTimeT()); |
| 218 | } |
| 219 | |
| 220 | TEST_F(PRTimeTest, ParseTimeTestEpoch1960) { |
| 221 | Time parsed_time; |
| 222 | |
| 223 | // time_t before Epoch, in 1960 |
| 224 | EXPECT_EQ(true, Time::FromString(L"Wed Jun 29 19:40:01 +0100 1960", |
| 225 | &parsed_time)); |
| 226 | EXPECT_EQ(-299999999, parsed_time.ToTimeT()); |
| 227 | EXPECT_EQ(true, Time::FromString(L"Wed Jun 29 18:40:01 GMT 1960", |
| 228 | &parsed_time)); |
| 229 | EXPECT_EQ(-299999999, parsed_time.ToTimeT()); |
| 230 | EXPECT_EQ(true, Time::FromString(L"Wed Jun 29 17:40:01 GMT 1960", |
| 231 | &parsed_time)); |
| 232 | EXPECT_EQ(-300003599, parsed_time.ToTimeT()); |
| 233 | } |
[email protected] | 9f25130 | 2008-08-19 09:16:49 | [diff] [blame] | 234 | |
| 235 | TEST_F(PRTimeTest, ParseTimeTestEmpty) { |
| 236 | Time parsed_time; |
| 237 | EXPECT_FALSE(Time::FromString(L"", &parsed_time)); |
| 238 | } |
license.bot | bf09a50 | 2008-08-24 00:55:55 | [diff] [blame] | 239 | |
[email protected] | 1e031a1 | 2009-03-03 01:24:01 | [diff] [blame] | 240 | // This test should not crash when compiled with Visual C++ 2005 (see |
| 241 | // http://crbug.com/4387). |
| 242 | TEST_F(PRTimeTest, ParseTimeTestOutOfRange) { |
| 243 | PRTime parsed_time = 0; |
| 244 | // Note the lack of timezone in the time string. The year has to be 3001. |
| 245 | // The date has to be after 23:59:59, December 31, 3000, US Pacific Time, so |
| 246 | // we use January 2, 3001 to make sure it's after the magic maximum in any |
| 247 | // timezone. |
| 248 | PRStatus result = PR_ParseTimeString("Sun Jan 2 00:00:00 3001", |
| 249 | PR_FALSE, &parsed_time); |
| 250 | EXPECT_EQ(PR_SUCCESS, result); |
| 251 | } |
| 252 | |
| 253 | TEST_F(PRTimeTest, ParseTimeTestNotNormalized1) { |
| 254 | PRTime parsed_time = 0; |
| 255 | PRStatus result = PR_ParseTimeString("Mon Oct 15 12:44:60 PDT 2007", |
| 256 | PR_FALSE, &parsed_time); |
| 257 | EXPECT_EQ(PR_SUCCESS, result); |
| 258 | EXPECT_EQ(comparison_time_pdt, parsed_time); |
| 259 | } |
| 260 | |
| 261 | TEST_F(PRTimeTest, ParseTimeTestNotNormalized2) { |
| 262 | PRTime parsed_time = 0; |
| 263 | PRStatus result = PR_ParseTimeString("Sun Oct 14 36:45 PDT 2007", |
| 264 | PR_FALSE, &parsed_time); |
| 265 | EXPECT_EQ(PR_SUCCESS, result); |
| 266 | EXPECT_EQ(comparison_time_pdt, parsed_time); |
| 267 | } |
| 268 | |
[email protected] | 11b901ee | 2008-09-10 00:16:28 | [diff] [blame] | 269 | } // namespace |