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(&current_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, &current_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(&current_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