pr_time_unittest.cc 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. // Copyright (c) 2012 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.
  4. #include <stdint.h>
  5. #include <time.h>
  6. #include "base/compiler_specific.h"
  7. #include "base/third_party/nspr/prtime.h"
  8. #include "base/time/time.h"
  9. #include "build/build_config.h"
  10. #include "testing/gtest/include/gtest/gtest.h"
  11. using base::Time;
  12. namespace {
  13. // time_t representation of 15th Oct 2007 12:45:00 PDT
  14. PRTime comparison_time_pdt = 1192477500 * Time::kMicrosecondsPerSecond;
  15. // Time with positive tz offset and fractional seconds:
  16. // 2013-07-08T11:28:12.441381+02:00
  17. PRTime comparison_time_2 = INT64_C(1373275692441381); // represented as GMT
  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. void SetUp() override {
  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_ =
  39. mktime(&local_comparison_tm) * Time::kMicrosecondsPerSecond;
  40. ASSERT_GT(comparison_time_local_, 0);
  41. const int microseconds = 441381;
  42. struct tm local_comparison_tm_2 = {
  43. 12, // second
  44. 28, // minute
  45. 11, // hour
  46. 8, // day of month
  47. 7 - 1, // month
  48. 2013 - 1900, // year
  49. 0, // day of week (ignored, output only)
  50. 0, // day of year (ignored, output only)
  51. -1 // DST in effect, -1 tells mktime to figure it out
  52. };
  53. comparison_time_local_2_ =
  54. mktime(&local_comparison_tm_2) * Time::kMicrosecondsPerSecond;
  55. ASSERT_GT(comparison_time_local_2_, 0);
  56. comparison_time_local_2_ += microseconds;
  57. }
  58. PRTime comparison_time_local_;
  59. PRTime comparison_time_local_2_;
  60. };
  61. // Tests the PR_ParseTimeString nspr helper function for
  62. // a variety of time strings.
  63. TEST_F(PRTimeTest, ParseTimeTest1) {
  64. time_t current_time = 0;
  65. time(&current_time);
  66. struct tm local_time = {};
  67. char time_buf[64] = {};
  68. #if BUILDFLAG(IS_WIN)
  69. localtime_s(&local_time, &current_time);
  70. asctime_s(time_buf, std::size(time_buf), &local_time);
  71. #elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
  72. localtime_r(&current_time, &local_time);
  73. asctime_r(&local_time, time_buf);
  74. #endif
  75. PRTime current_time64 = static_cast<PRTime>(current_time) * PR_USEC_PER_SEC;
  76. PRTime parsed_time = 0;
  77. PRStatus result = PR_ParseTimeString(time_buf, PR_FALSE, &parsed_time);
  78. EXPECT_EQ(PR_SUCCESS, result);
  79. EXPECT_EQ(current_time64, parsed_time);
  80. }
  81. TEST_F(PRTimeTest, ParseTimeTest2) {
  82. PRTime parsed_time = 0;
  83. PRStatus result = PR_ParseTimeString("Mon, 15 Oct 2007 19:45:00 GMT",
  84. PR_FALSE, &parsed_time);
  85. EXPECT_EQ(PR_SUCCESS, result);
  86. EXPECT_EQ(comparison_time_pdt, parsed_time);
  87. }
  88. TEST_F(PRTimeTest, ParseTimeTest3) {
  89. PRTime parsed_time = 0;
  90. PRStatus result = PR_ParseTimeString("15 Oct 07 12:45:00", PR_FALSE,
  91. &parsed_time);
  92. EXPECT_EQ(PR_SUCCESS, result);
  93. EXPECT_EQ(comparison_time_local_, parsed_time);
  94. }
  95. TEST_F(PRTimeTest, ParseTimeTest4) {
  96. PRTime parsed_time = 0;
  97. PRStatus result = PR_ParseTimeString("15 Oct 07 19:45 GMT", PR_FALSE,
  98. &parsed_time);
  99. EXPECT_EQ(PR_SUCCESS, result);
  100. EXPECT_EQ(comparison_time_pdt, parsed_time);
  101. }
  102. TEST_F(PRTimeTest, ParseTimeTest5) {
  103. PRTime parsed_time = 0;
  104. PRStatus result = PR_ParseTimeString("Mon Oct 15 12:45 PDT 2007",
  105. PR_FALSE, &parsed_time);
  106. EXPECT_EQ(PR_SUCCESS, result);
  107. EXPECT_EQ(comparison_time_pdt, parsed_time);
  108. }
  109. TEST_F(PRTimeTest, ParseTimeTest6) {
  110. PRTime parsed_time = 0;
  111. PRStatus result = PR_ParseTimeString("Monday, Oct 15, 2007 12:45 PM",
  112. PR_FALSE, &parsed_time);
  113. EXPECT_EQ(PR_SUCCESS, result);
  114. EXPECT_EQ(comparison_time_local_, parsed_time);
  115. }
  116. TEST_F(PRTimeTest, ParseTimeTest7) {
  117. PRTime parsed_time = 0;
  118. PRStatus result = PR_ParseTimeString("10/15/07 12:45:00 PM", PR_FALSE,
  119. &parsed_time);
  120. EXPECT_EQ(PR_SUCCESS, result);
  121. EXPECT_EQ(comparison_time_local_, parsed_time);
  122. }
  123. TEST_F(PRTimeTest, ParseTimeTest8) {
  124. PRTime parsed_time = 0;
  125. PRStatus result = PR_ParseTimeString("10/15/07 12:45:00. PM", PR_FALSE,
  126. &parsed_time);
  127. EXPECT_EQ(PR_SUCCESS, result);
  128. EXPECT_EQ(comparison_time_local_, parsed_time);
  129. }
  130. TEST_F(PRTimeTest, ParseTimeTest9) {
  131. PRTime parsed_time = 0;
  132. PRStatus result = PR_ParseTimeString("10/15/07 12:45:00.0 PM", PR_FALSE,
  133. &parsed_time);
  134. EXPECT_EQ(PR_SUCCESS, result);
  135. EXPECT_EQ(comparison_time_local_, parsed_time);
  136. }
  137. TEST_F(PRTimeTest, ParseTimeTest10) {
  138. PRTime parsed_time = 0;
  139. PRStatus result = PR_ParseTimeString("15-OCT-2007 12:45pm", PR_FALSE,
  140. &parsed_time);
  141. EXPECT_EQ(PR_SUCCESS, result);
  142. EXPECT_EQ(comparison_time_local_, parsed_time);
  143. }
  144. TEST_F(PRTimeTest, ParseTimeTest11) {
  145. PRTime parsed_time = 0;
  146. PRStatus result = PR_ParseTimeString("16 Oct 2007 4:45-JST (Tuesday)",
  147. PR_FALSE, &parsed_time);
  148. EXPECT_EQ(PR_SUCCESS, result);
  149. EXPECT_EQ(comparison_time_pdt, parsed_time);
  150. }
  151. // hh:mm timezone offset.
  152. TEST_F(PRTimeTest, ParseTimeTest12) {
  153. PRTime parsed_time = 0;
  154. PRStatus result = PR_ParseTimeString("2013-07-08T11:28:12.441381+02:00",
  155. PR_FALSE, &parsed_time);
  156. EXPECT_EQ(PR_SUCCESS, result);
  157. EXPECT_EQ(comparison_time_2, parsed_time);
  158. }
  159. // hhmm timezone offset.
  160. TEST_F(PRTimeTest, ParseTimeTest13) {
  161. PRTime parsed_time = 0;
  162. PRStatus result = PR_ParseTimeString("2013-07-08T11:28:12.441381+0200",
  163. PR_FALSE, &parsed_time);
  164. EXPECT_EQ(PR_SUCCESS, result);
  165. EXPECT_EQ(comparison_time_2, parsed_time);
  166. }
  167. // hh timezone offset.
  168. TEST_F(PRTimeTest, ParseTimeTest14) {
  169. PRTime parsed_time = 0;
  170. PRStatus result = PR_ParseTimeString("2013-07-08T11:28:12.4413819+02",
  171. PR_FALSE, &parsed_time);
  172. EXPECT_EQ(PR_SUCCESS, result);
  173. EXPECT_EQ(comparison_time_2, parsed_time);
  174. }
  175. // 5 digits fractional second.
  176. TEST_F(PRTimeTest, ParseTimeTest15) {
  177. PRTime parsed_time = 0;
  178. PRStatus result = PR_ParseTimeString("2013-07-08T09:28:12.44138Z",
  179. PR_FALSE, &parsed_time);
  180. EXPECT_EQ(PR_SUCCESS, result);
  181. EXPECT_EQ(comparison_time_2-1, parsed_time);
  182. }
  183. // Fractional seconds, local timezone.
  184. TEST_F(PRTimeTest, ParseTimeTest16) {
  185. PRTime parsed_time = 0;
  186. PRStatus result = PR_ParseTimeString("2013-07-08T11:28:12.441381",
  187. PR_FALSE, &parsed_time);
  188. EXPECT_EQ(PR_SUCCESS, result);
  189. EXPECT_EQ(comparison_time_local_2_, parsed_time);
  190. }
  191. // "Z" (=GMT) timezone.
  192. TEST_F(PRTimeTest, ParseTimeTest17) {
  193. PRTime parsed_time = 0;
  194. PRStatus result = PR_ParseTimeString("2013-07-08T09:28:12.441381Z",
  195. PR_FALSE, &parsed_time);
  196. EXPECT_EQ(PR_SUCCESS, result);
  197. EXPECT_EQ(comparison_time_2, parsed_time);
  198. }
  199. // "T" delimiter replaced by space.
  200. TEST_F(PRTimeTest, ParseTimeTest18) {
  201. PRTime parsed_time = 0;
  202. PRStatus result = PR_ParseTimeString("2013-07-08 09:28:12.441381Z",
  203. PR_FALSE, &parsed_time);
  204. EXPECT_EQ(PR_SUCCESS, result);
  205. EXPECT_EQ(comparison_time_2, parsed_time);
  206. }
  207. TEST_F(PRTimeTest, ParseTimeTestInvalid1) {
  208. PRTime parsed_time = 0;
  209. PRStatus result = PR_ParseTimeString("201-07-08T09:28:12.441381Z",
  210. PR_FALSE, &parsed_time);
  211. EXPECT_EQ(PR_FAILURE, result);
  212. }
  213. TEST_F(PRTimeTest, ParseTimeTestInvalid2) {
  214. PRTime parsed_time = 0;
  215. PRStatus result = PR_ParseTimeString("2013-007-08T09:28:12.441381Z",
  216. PR_FALSE, &parsed_time);
  217. EXPECT_EQ(PR_FAILURE, result);
  218. }
  219. TEST_F(PRTimeTest, ParseTimeTestInvalid3) {
  220. PRTime parsed_time = 0;
  221. PRStatus result = PR_ParseTimeString("2013-07-008T09:28:12.441381Z",
  222. PR_FALSE, &parsed_time);
  223. EXPECT_EQ(PR_FAILURE, result);
  224. }
  225. // This test should not crash when compiled with Visual C++ 2005 (see
  226. // http://crbug.com/4387).
  227. TEST_F(PRTimeTest, ParseTimeTestOutOfRange) {
  228. PRTime parsed_time = 0;
  229. // Note the lack of timezone in the time string. The year has to be 3001.
  230. // The date has to be after 23:59:59, December 31, 3000, US Pacific Time, so
  231. // we use January 2, 3001 to make sure it's after the magic maximum in any
  232. // timezone.
  233. PRStatus result = PR_ParseTimeString("Sun Jan 2 00:00:00 3001",
  234. PR_FALSE, &parsed_time);
  235. EXPECT_EQ(PR_SUCCESS, result);
  236. }
  237. TEST_F(PRTimeTest, ParseTimeTestNotNormalized1) {
  238. PRTime parsed_time = 0;
  239. PRStatus result = PR_ParseTimeString("Mon Oct 15 12:44:60 PDT 2007",
  240. PR_FALSE, &parsed_time);
  241. EXPECT_EQ(PR_SUCCESS, result);
  242. EXPECT_EQ(comparison_time_pdt, parsed_time);
  243. }
  244. TEST_F(PRTimeTest, ParseTimeTestNotNormalized2) {
  245. PRTime parsed_time = 0;
  246. PRStatus result = PR_ParseTimeString("Sun Oct 14 36:45 PDT 2007",
  247. PR_FALSE, &parsed_time);
  248. EXPECT_EQ(PR_SUCCESS, result);
  249. EXPECT_EQ(comparison_time_pdt, parsed_time);
  250. }
  251. } // namespace