16d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 26d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 36d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// found in the LICENSE file. 46d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 56d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include <stdint.h> 66d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include <time.h> 76d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/compiler_specific.h" 96d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/third_party/nspr/prtime.h" 106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/time/time.h" 116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)using base::Time; 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace { 166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// time_t representation of 15th Oct 2007 12:45:00 PDT 186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)PRTime comparison_time_pdt = 1192477500 * Time::kMicrosecondsPerSecond; 196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Time with positive tz offset and fractional seconds: 216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// 2013-07-08T11:28:12.441381+02:00 226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)PRTime comparison_time_2 = INT64_C(1373275692441381); // represented as GMT 236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Specialized test fixture allowing time strings without timezones to be 256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// tested by comparing them to a known time in the local zone. 266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class PRTimeTest : public testing::Test { 276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) protected: 286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void SetUp() OVERRIDE { 296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Use mktime to get a time_t, and turn it into a PRTime by converting 306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // seconds to microseconds. Use 15th Oct 2007 12:45:00 local. This 316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // must be a time guaranteed to be outside of a DST fallback hour in 326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // any timezone. 336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) struct tm local_comparison_tm = { 346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 0, // second 356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 45, // minute 366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 12, // hour 376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 15, // day of month 386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 10 - 1, // month 396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2007 - 1900, // year 406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 0, // day of week (ignored, output only) 416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 0, // day of year (ignored, output only) 426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) -1 // DST in effect, -1 tells mktime to figure it out 436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) }; 446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) comparison_time_local_ = 456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mktime(&local_comparison_tm) * Time::kMicrosecondsPerSecond; 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_GT(comparison_time_local_, 0); 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const int microseconds = 441381; 496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) struct tm local_comparison_tm_2 = { 506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 12, // second 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 28, // minute 526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 11, // hour 536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 8, // day of month 546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7 - 1, // month 556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2013 - 1900, // year 566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 0, // day of week (ignored, output only) 576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 0, // day of year (ignored, output only) 586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) -1 // DST in effect, -1 tells mktime to figure it out 5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) }; 6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) comparison_time_local_2_ = 616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mktime(&local_comparison_tm_2) * Time::kMicrosecondsPerSecond; 626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_GT(comparison_time_local_2_, 0); 636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) comparison_time_local_2_ += microseconds; 646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) PRTime comparison_time_local_; 676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) PRTime comparison_time_local_2_; 686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}; 696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Tests the PR_ParseTimeString nspr helper function for 716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// a variety of time strings. 726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(PRTimeTest, ParseTimeTest1) { 7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) time_t current_time = 0; 7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) time(¤t_time); 756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const int BUFFER_SIZE = 64; 776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) struct tm local_time = {0}; 786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) char time_buf[BUFFER_SIZE] = {0}; 796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(OS_WIN) 806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) localtime_s(&local_time, ¤t_time); 816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) asctime_s(time_buf, arraysize(time_buf), &local_time); 826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#elif defined(OS_POSIX) 836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) localtime_r(¤t_time, &local_time); 846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) asctime_r(&local_time, time_buf); 856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#endif 8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) PRTime current_time64 = static_cast<PRTime>(current_time) * PR_USEC_PER_SEC; 8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) PRTime parsed_time = 0; 906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) PRStatus result = PR_ParseTimeString(time_buf, PR_FALSE, &parsed_time); 916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_EQ(PR_SUCCESS, result); 926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_EQ(current_time64, parsed_time); 936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PRTimeTest, ParseTimeTest2) { 966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) PRTime parsed_time = 0; 976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) PRStatus result = PR_ParseTimeString("Mon, 15 Oct 2007 19:45:00 GMT", 986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) PR_FALSE, &parsed_time); 996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_EQ(PR_SUCCESS, result); 1006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_EQ(comparison_time_pdt, parsed_time); 1016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(PRTimeTest, ParseTimeTest3) { 10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) PRTime parsed_time = 0; 10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) PRStatus result = PR_ParseTimeString("15 Oct 07 12:45:00", PR_FALSE, 10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) &parsed_time); 1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(PR_SUCCESS, result); 1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(comparison_time_local_, parsed_time); 1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(PRTimeTest, ParseTimeTest4) { 1126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) PRTime parsed_time = 0; 1136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) PRStatus result = PR_ParseTimeString("15 Oct 07 19:45 GMT", PR_FALSE, 1146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) &parsed_time); 1156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_EQ(PR_SUCCESS, result); 1166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_EQ(comparison_time_pdt, parsed_time); 1176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PRTimeTest, ParseTimeTest5) { 1206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) PRTime parsed_time = 0; 1216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) PRStatus result = PR_ParseTimeString("Mon Oct 15 12:45 PDT 2007", 1226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) PR_FALSE, &parsed_time); 1236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_EQ(PR_SUCCESS, result); 1246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_EQ(comparison_time_pdt, parsed_time); 1256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PRTimeTest, ParseTimeTest6) { 1286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) PRTime parsed_time = 0; 12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) PRStatus result = PR_ParseTimeString("Monday, Oct 15, 2007 12:45 PM", 1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) PR_FALSE, &parsed_time); 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(PR_SUCCESS, result); 1326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_EQ(comparison_time_local_, parsed_time); 1336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PRTimeTest, ParseTimeTest7) { 1366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) PRTime parsed_time = 0; 1376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) PRStatus result = PR_ParseTimeString("10/15/07 12:45:00 PM", PR_FALSE, 1386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) &parsed_time); 13903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(PR_SUCCESS, result); 1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(comparison_time_local_, parsed_time); 1416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(PRTimeTest, ParseTimeTest8) { 1446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) PRTime parsed_time = 0; 1456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) PRStatus result = PR_ParseTimeString("10/15/07 12:45:00. PM", PR_FALSE, 1466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) &parsed_time); 1476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(PR_SUCCESS, result); 1486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(comparison_time_local_, parsed_time); 14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 1506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(PRTimeTest, ParseTimeTest9) { 15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) PRTime parsed_time = 0; 1536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) PRStatus result = PR_ParseTimeString("10/15/07 12:45:00.0 PM", PR_FALSE, 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &parsed_time); 1556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(PR_SUCCESS, result); 1566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(comparison_time_local_, parsed_time); 1576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(PRTimeTest, ParseTimeTest10) { 1606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) PRTime parsed_time = 0; 1616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) PRStatus result = PR_ParseTimeString("15-OCT-2007 12:45pm", PR_FALSE, 1626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) &parsed_time); 1636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(PR_SUCCESS, result); 1646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(comparison_time_local_, parsed_time); 1656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(PRTimeTest, ParseTimeTest11) { 1686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) PRTime parsed_time = 0; 1696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) PRStatus result = PR_ParseTimeString("16 Oct 2007 4:45-JST (Tuesday)", 1706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) PR_FALSE, &parsed_time); 1716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(PR_SUCCESS, result); 1726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(comparison_time_pdt, parsed_time); 1736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// hh:mm timezone offset. 1766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(PRTimeTest, ParseTimeTest12) { 1776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) PRTime parsed_time = 0; 1786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) PRStatus result = PR_ParseTimeString("2013-07-08T11:28:12.441381+02:00", 1796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) PR_FALSE, &parsed_time); 1806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(PR_SUCCESS, result); 1816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_EQ(comparison_time_2, parsed_time); 1826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// hhmm timezone offset. 1856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PRTimeTest, ParseTimeTest13) { 1866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) PRTime parsed_time = 0; 1876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) PRStatus result = PR_ParseTimeString("2013-07-08T11:28:12.441381+0200", 1886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) PR_FALSE, &parsed_time); 1896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_EQ(PR_SUCCESS, result); 1906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_EQ(comparison_time_2, parsed_time); 1916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 1926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// hh timezone offset. 1946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PRTimeTest, ParseTimeTest14) { 1956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) PRTime parsed_time = 0; 1966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) PRStatus result = PR_ParseTimeString("2013-07-08T11:28:12.4413819+02", 1976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) PR_FALSE, &parsed_time); 1986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_EQ(PR_SUCCESS, result); 1996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_EQ(comparison_time_2, parsed_time); 20003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 2016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// 5 digits fractional second. 2036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PRTimeTest, ParseTimeTest15) { 2046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) PRTime parsed_time = 0; 2056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) PRStatus result = PR_ParseTimeString("2013-07-08T09:28:12.44138Z", 2066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) PR_FALSE, &parsed_time); 2076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) EXPECT_EQ(PR_SUCCESS, result); 2086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(comparison_time_2-1, parsed_time); 2096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)} 2106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Fractional seconds, local timezone. 2126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PRTimeTest, ParseTimeTest16) { 213 PRTime parsed_time = 0; 214 PRStatus result = PR_ParseTimeString("2013-07-08T11:28:12.441381", 215 PR_FALSE, &parsed_time); 216 EXPECT_EQ(PR_SUCCESS, result); 217 EXPECT_EQ(comparison_time_local_2_, parsed_time); 218} 219 220// "Z" (=GMT) timezone. 221TEST_F(PRTimeTest, ParseTimeTest17) { 222 PRTime parsed_time = 0; 223 PRStatus result = PR_ParseTimeString("2013-07-08T09:28:12.441381Z", 224 PR_FALSE, &parsed_time); 225 EXPECT_EQ(PR_SUCCESS, result); 226 EXPECT_EQ(comparison_time_2, parsed_time); 227} 228 229// "T" delimiter replaced by space. 230TEST_F(PRTimeTest, ParseTimeTest18) { 231 PRTime parsed_time = 0; 232 PRStatus result = PR_ParseTimeString("2013-07-08 09:28:12.441381Z", 233 PR_FALSE, &parsed_time); 234 EXPECT_EQ(PR_SUCCESS, result); 235 EXPECT_EQ(comparison_time_2, parsed_time); 236} 237 238TEST_F(PRTimeTest, ParseTimeTestInvalid1) { 239 PRTime parsed_time = 0; 240 PRStatus result = PR_ParseTimeString("201-07-08T09:28:12.441381Z", 241 PR_FALSE, &parsed_time); 242 EXPECT_EQ(PR_FAILURE, result); 243} 244 245TEST_F(PRTimeTest, ParseTimeTestInvalid2) { 246 PRTime parsed_time = 0; 247 PRStatus result = PR_ParseTimeString("2013-007-08T09:28:12.441381Z", 248 PR_FALSE, &parsed_time); 249 EXPECT_EQ(PR_FAILURE, result); 250} 251 252TEST_F(PRTimeTest, ParseTimeTestInvalid3) { 253 PRTime parsed_time = 0; 254 PRStatus result = PR_ParseTimeString("2013-07-008T09:28:12.441381Z", 255 PR_FALSE, &parsed_time); 256 EXPECT_EQ(PR_FAILURE, result); 257} 258 259// This test should not crash when compiled with Visual C++ 2005 (see 260// http://crbug.com/4387). 261TEST_F(PRTimeTest, ParseTimeTestOutOfRange) { 262 PRTime parsed_time = 0; 263 // Note the lack of timezone in the time string. The year has to be 3001. 264 // The date has to be after 23:59:59, December 31, 3000, US Pacific Time, so 265 // we use January 2, 3001 to make sure it's after the magic maximum in any 266 // timezone. 267 PRStatus result = PR_ParseTimeString("Sun Jan 2 00:00:00 3001", 268 PR_FALSE, &parsed_time); 269 EXPECT_EQ(PR_SUCCESS, result); 270} 271 272TEST_F(PRTimeTest, ParseTimeTestNotNormalized1) { 273 PRTime parsed_time = 0; 274 PRStatus result = PR_ParseTimeString("Mon Oct 15 12:44:60 PDT 2007", 275 PR_FALSE, &parsed_time); 276 EXPECT_EQ(PR_SUCCESS, result); 277 EXPECT_EQ(comparison_time_pdt, parsed_time); 278} 279 280TEST_F(PRTimeTest, ParseTimeTestNotNormalized2) { 281 PRTime parsed_time = 0; 282 PRStatus result = PR_ParseTimeString("Sun Oct 14 36:45 PDT 2007", 283 PR_FALSE, &parsed_time); 284 EXPECT_EQ(PR_SUCCESS, result); 285 EXPECT_EQ(comparison_time_pdt, parsed_time); 286} 287 288} // namespace 289