time_util_test.cc 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. // Protocol Buffers - Google's data interchange format
  2. // Copyright 2008 Google Inc. All rights reserved.
  3. // https://developers.google.com/protocol-buffers/
  4. //
  5. // Redistribution and use in source and binary forms, with or without
  6. // modification, are permitted provided that the following conditions are
  7. // met:
  8. //
  9. // * Redistributions of source code must retain the above copyright
  10. // notice, this list of conditions and the following disclaimer.
  11. // * Redistributions in binary form must reproduce the above
  12. // copyright notice, this list of conditions and the following disclaimer
  13. // in the documentation and/or other materials provided with the
  14. // distribution.
  15. // * Neither the name of Google Inc. nor the names of its
  16. // contributors may be used to endorse or promote products derived from
  17. // this software without specific prior written permission.
  18. //
  19. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  20. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  21. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  22. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  23. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  24. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  25. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  26. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  27. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  28. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  29. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30. #include <google/protobuf/util/time_util.h>
  31. #include <ctime>
  32. #include <google/protobuf/timestamp.pb.h>
  33. #include <google/protobuf/duration.pb.h>
  34. #include <google/protobuf/testing/googletest.h>
  35. #include <gtest/gtest.h>
  36. namespace google {
  37. namespace protobuf {
  38. namespace util {
  39. using google::protobuf::Timestamp;
  40. using google::protobuf::Duration;
  41. namespace {
  42. TEST(TimeUtilTest, TimestampStringFormat) {
  43. Timestamp begin, end;
  44. EXPECT_TRUE(TimeUtil::FromString("0001-01-01T00:00:00Z", &begin));
  45. EXPECT_EQ(TimeUtil::kTimestampMinSeconds, begin.seconds());
  46. EXPECT_EQ(0, begin.nanos());
  47. EXPECT_TRUE(TimeUtil::FromString("9999-12-31T23:59:59.999999999Z", &end));
  48. EXPECT_EQ(TimeUtil::kTimestampMaxSeconds, end.seconds());
  49. EXPECT_EQ(999999999, end.nanos());
  50. EXPECT_EQ("0001-01-01T00:00:00Z", TimeUtil::ToString(begin));
  51. EXPECT_EQ("9999-12-31T23:59:59.999999999Z", TimeUtil::ToString(end));
  52. // Test negative timestamps.
  53. Timestamp time = TimeUtil::NanosecondsToTimestamp(-1);
  54. EXPECT_EQ(-1, time.seconds());
  55. // Timestamp's nano part is always non-negative.
  56. EXPECT_EQ(999999999, time.nanos());
  57. EXPECT_EQ("1969-12-31T23:59:59.999999999Z", TimeUtil::ToString(time));
  58. // Generated output should contain 3, 6, or 9 fractional digits.
  59. EXPECT_EQ("1970-01-01T00:00:00Z",
  60. TimeUtil::ToString(TimeUtil::NanosecondsToTimestamp(0)));
  61. EXPECT_EQ("1970-01-01T00:00:00.010Z",
  62. TimeUtil::ToString(TimeUtil::NanosecondsToTimestamp(10000000)));
  63. EXPECT_EQ("1970-01-01T00:00:00.000010Z",
  64. TimeUtil::ToString(TimeUtil::NanosecondsToTimestamp(10000)));
  65. EXPECT_EQ("1970-01-01T00:00:00.000000010Z",
  66. TimeUtil::ToString(TimeUtil::NanosecondsToTimestamp(10)));
  67. // Parsing accepts an fractional digits as long as they fit into nano
  68. // precision.
  69. EXPECT_TRUE(TimeUtil::FromString("1970-01-01T00:00:00.1Z", &time));
  70. EXPECT_EQ(100000000, TimeUtil::TimestampToNanoseconds(time));
  71. EXPECT_TRUE(TimeUtil::FromString("1970-01-01T00:00:00.0001Z", &time));
  72. EXPECT_EQ(100000, TimeUtil::TimestampToNanoseconds(time));
  73. EXPECT_TRUE(TimeUtil::FromString("1970-01-01T00:00:00.0000001Z", &time));
  74. EXPECT_EQ(100, TimeUtil::TimestampToNanoseconds(time));
  75. // Also accpets offsets.
  76. EXPECT_TRUE(TimeUtil::FromString("1970-01-01T00:00:00-08:00", &time));
  77. EXPECT_EQ(8 * 3600, TimeUtil::TimestampToSeconds(time));
  78. }
  79. TEST(TimeUtilTest, DurationStringFormat) {
  80. Timestamp begin, end;
  81. EXPECT_TRUE(TimeUtil::FromString("0001-01-01T00:00:00Z", &begin));
  82. EXPECT_TRUE(TimeUtil::FromString("9999-12-31T23:59:59.999999999Z", &end));
  83. EXPECT_EQ("315537897599.999999999s", TimeUtil::ToString(end - begin));
  84. EXPECT_EQ(999999999, (end - begin).nanos());
  85. EXPECT_EQ("-315537897599.999999999s", TimeUtil::ToString(begin - end));
  86. EXPECT_EQ(-999999999, (begin - end).nanos());
  87. // Generated output should contain 3, 6, or 9 fractional digits.
  88. EXPECT_EQ("1s", TimeUtil::ToString(TimeUtil::SecondsToDuration(1)));
  89. EXPECT_EQ("0.010s", TimeUtil::ToString(TimeUtil::MillisecondsToDuration(10)));
  90. EXPECT_EQ("0.000010s",
  91. TimeUtil::ToString(TimeUtil::MicrosecondsToDuration(10)));
  92. EXPECT_EQ("0.000000010s",
  93. TimeUtil::ToString(TimeUtil::NanosecondsToDuration(10)));
  94. // Parsing accepts an fractional digits as long as they fit into nano
  95. // precision.
  96. Duration d;
  97. EXPECT_TRUE(TimeUtil::FromString("0.1s", &d));
  98. EXPECT_EQ(100, TimeUtil::DurationToMilliseconds(d));
  99. EXPECT_TRUE(TimeUtil::FromString("0.0001s", &d));
  100. EXPECT_EQ(100, TimeUtil::DurationToMicroseconds(d));
  101. EXPECT_TRUE(TimeUtil::FromString("0.0000001s", &d));
  102. EXPECT_EQ(100, TimeUtil::DurationToNanoseconds(d));
  103. // Duration must support range from -315,576,000,000s to +315576000000s
  104. // which includes negative values.
  105. EXPECT_TRUE(TimeUtil::FromString("315576000000.999999999s", &d));
  106. EXPECT_EQ(315576000000LL, d.seconds());
  107. EXPECT_EQ(999999999, d.nanos());
  108. EXPECT_TRUE(TimeUtil::FromString("-315576000000.999999999s", &d));
  109. EXPECT_EQ(-315576000000LL, d.seconds());
  110. EXPECT_EQ(-999999999, d.nanos());
  111. }
  112. TEST(TimeUtilTest, GetEpoch) {
  113. EXPECT_EQ(0, TimeUtil::TimestampToNanoseconds(TimeUtil::GetEpoch()));
  114. }
  115. TEST(TimeUtilTest, DurationIntegerConversion) {
  116. EXPECT_EQ("0.000000001s",
  117. TimeUtil::ToString(TimeUtil::NanosecondsToDuration(1)));
  118. EXPECT_EQ("-0.000000001s",
  119. TimeUtil::ToString(TimeUtil::NanosecondsToDuration(-1)));
  120. EXPECT_EQ("0.000001s",
  121. TimeUtil::ToString(TimeUtil::MicrosecondsToDuration(1)));
  122. EXPECT_EQ("-0.000001s",
  123. TimeUtil::ToString(TimeUtil::MicrosecondsToDuration(-1)));
  124. EXPECT_EQ("0.001s", TimeUtil::ToString(TimeUtil::MillisecondsToDuration(1)));
  125. EXPECT_EQ("-0.001s",
  126. TimeUtil::ToString(TimeUtil::MillisecondsToDuration(-1)));
  127. EXPECT_EQ("1s", TimeUtil::ToString(TimeUtil::SecondsToDuration(1)));
  128. EXPECT_EQ("-1s", TimeUtil::ToString(TimeUtil::SecondsToDuration(-1)));
  129. EXPECT_EQ("60s", TimeUtil::ToString(TimeUtil::MinutesToDuration(1)));
  130. EXPECT_EQ("-60s", TimeUtil::ToString(TimeUtil::MinutesToDuration(-1)));
  131. EXPECT_EQ("3600s", TimeUtil::ToString(TimeUtil::HoursToDuration(1)));
  132. EXPECT_EQ("-3600s", TimeUtil::ToString(TimeUtil::HoursToDuration(-1)));
  133. EXPECT_EQ(
  134. 1, TimeUtil::DurationToNanoseconds(TimeUtil::NanosecondsToDuration(1)));
  135. EXPECT_EQ(
  136. -1, TimeUtil::DurationToNanoseconds(TimeUtil::NanosecondsToDuration(-1)));
  137. EXPECT_EQ(
  138. 1, TimeUtil::DurationToMicroseconds(TimeUtil::MicrosecondsToDuration(1)));
  139. EXPECT_EQ(-1, TimeUtil::DurationToMicroseconds(
  140. TimeUtil::MicrosecondsToDuration(-1)));
  141. EXPECT_EQ(
  142. 1, TimeUtil::DurationToMilliseconds(TimeUtil::MillisecondsToDuration(1)));
  143. EXPECT_EQ(-1, TimeUtil::DurationToMilliseconds(
  144. TimeUtil::MillisecondsToDuration(-1)));
  145. EXPECT_EQ(1, TimeUtil::DurationToSeconds(TimeUtil::SecondsToDuration(1)));
  146. EXPECT_EQ(-1, TimeUtil::DurationToSeconds(TimeUtil::SecondsToDuration(-1)));
  147. EXPECT_EQ(1, TimeUtil::DurationToMinutes(TimeUtil::MinutesToDuration(1)));
  148. EXPECT_EQ(-1, TimeUtil::DurationToMinutes(TimeUtil::MinutesToDuration(-1)));
  149. EXPECT_EQ(1, TimeUtil::DurationToHours(TimeUtil::HoursToDuration(1)));
  150. EXPECT_EQ(-1, TimeUtil::DurationToHours(TimeUtil::HoursToDuration(-1)));
  151. // Test truncation behavior.
  152. EXPECT_EQ(1, TimeUtil::DurationToMicroseconds(
  153. TimeUtil::NanosecondsToDuration(1999)));
  154. // For negative values, Duration will be rounded towards 0.
  155. EXPECT_EQ(-1, TimeUtil::DurationToMicroseconds(
  156. TimeUtil::NanosecondsToDuration(-1999)));
  157. }
  158. TEST(TestUtilTest, TimestampIntegerConversion) {
  159. EXPECT_EQ("1970-01-01T00:00:00.000000001Z",
  160. TimeUtil::ToString(TimeUtil::NanosecondsToTimestamp(1)));
  161. EXPECT_EQ("1969-12-31T23:59:59.999999999Z",
  162. TimeUtil::ToString(TimeUtil::NanosecondsToTimestamp(-1)));
  163. EXPECT_EQ("1970-01-01T00:00:00.000001Z",
  164. TimeUtil::ToString(TimeUtil::MicrosecondsToTimestamp(1)));
  165. EXPECT_EQ("1969-12-31T23:59:59.999999Z",
  166. TimeUtil::ToString(TimeUtil::MicrosecondsToTimestamp(-1)));
  167. EXPECT_EQ("1970-01-01T00:00:00.001Z",
  168. TimeUtil::ToString(TimeUtil::MillisecondsToTimestamp(1)));
  169. EXPECT_EQ("1969-12-31T23:59:59.999Z",
  170. TimeUtil::ToString(TimeUtil::MillisecondsToTimestamp(-1)));
  171. EXPECT_EQ("1970-01-01T00:00:01Z",
  172. TimeUtil::ToString(TimeUtil::SecondsToTimestamp(1)));
  173. EXPECT_EQ("1969-12-31T23:59:59Z",
  174. TimeUtil::ToString(TimeUtil::SecondsToTimestamp(-1)));
  175. EXPECT_EQ(
  176. 1, TimeUtil::TimestampToNanoseconds(TimeUtil::NanosecondsToTimestamp(1)));
  177. EXPECT_EQ(-1, TimeUtil::TimestampToNanoseconds(
  178. TimeUtil::NanosecondsToTimestamp(-1)));
  179. EXPECT_EQ(1, TimeUtil::TimestampToMicroseconds(
  180. TimeUtil::MicrosecondsToTimestamp(1)));
  181. EXPECT_EQ(-1, TimeUtil::TimestampToMicroseconds(
  182. TimeUtil::MicrosecondsToTimestamp(-1)));
  183. EXPECT_EQ(1, TimeUtil::TimestampToMilliseconds(
  184. TimeUtil::MillisecondsToTimestamp(1)));
  185. EXPECT_EQ(-1, TimeUtil::TimestampToMilliseconds(
  186. TimeUtil::MillisecondsToTimestamp(-1)));
  187. EXPECT_EQ(1, TimeUtil::TimestampToSeconds(TimeUtil::SecondsToTimestamp(1)));
  188. EXPECT_EQ(-1, TimeUtil::TimestampToSeconds(TimeUtil::SecondsToTimestamp(-1)));
  189. // Test truncation behavior.
  190. EXPECT_EQ(1, TimeUtil::TimestampToMicroseconds(
  191. TimeUtil::NanosecondsToTimestamp(1999)));
  192. // For negative values, Timestamp will be rounded down.
  193. // For example, "1969-12-31T23:59:59.5Z" (i.e., -0.5s) rounded to seconds
  194. // will be "1969-12-31T23:59:59Z" (i.e., -1s) rather than
  195. // "1970-01-01T00:00:00Z" (i.e., 0s).
  196. EXPECT_EQ(-2, TimeUtil::TimestampToMicroseconds(
  197. TimeUtil::NanosecondsToTimestamp(-1999)));
  198. }
  199. TEST(TimeUtilTest, TimeTConversion) {
  200. time_t value = time(NULL);
  201. EXPECT_EQ(value,
  202. TimeUtil::TimestampToTimeT(TimeUtil::TimeTToTimestamp(value)));
  203. EXPECT_EQ(
  204. 1, TimeUtil::TimestampToTimeT(TimeUtil::MillisecondsToTimestamp(1999)));
  205. }
  206. TEST(TimeUtilTest, TimevalConversion) {
  207. timeval value = TimeUtil::TimestampToTimeval(
  208. TimeUtil::NanosecondsToTimestamp(1999999999));
  209. EXPECT_EQ(1, value.tv_sec);
  210. EXPECT_EQ(999999, value.tv_usec);
  211. value = TimeUtil::TimestampToTimeval(
  212. TimeUtil::NanosecondsToTimestamp(-1999999999));
  213. EXPECT_EQ(-2, value.tv_sec);
  214. EXPECT_EQ(0, value.tv_usec);
  215. value =
  216. TimeUtil::DurationToTimeval(TimeUtil::NanosecondsToDuration(1999999999));
  217. EXPECT_EQ(1, value.tv_sec);
  218. EXPECT_EQ(999999, value.tv_usec);
  219. value =
  220. TimeUtil::DurationToTimeval(TimeUtil::NanosecondsToDuration(-1999999999));
  221. EXPECT_EQ(-2, value.tv_sec);
  222. EXPECT_EQ(1, value.tv_usec);
  223. }
  224. TEST(TimeUtilTest, DurationOperators) {
  225. Duration one_second = TimeUtil::SecondsToDuration(1);
  226. Duration one_nano = TimeUtil::NanosecondsToDuration(1);
  227. // Test +/-
  228. Duration a = one_second;
  229. a += one_second;
  230. a -= one_nano;
  231. EXPECT_EQ("1.999999999s", TimeUtil::ToString(a));
  232. Duration b = -a;
  233. EXPECT_EQ("-1.999999999s", TimeUtil::ToString(b));
  234. EXPECT_EQ("3.999999998s", TimeUtil::ToString(a + a));
  235. EXPECT_EQ("0s", TimeUtil::ToString(a + b));
  236. EXPECT_EQ("0s", TimeUtil::ToString(b + a));
  237. EXPECT_EQ("-3.999999998s", TimeUtil::ToString(b + b));
  238. EXPECT_EQ("3.999999998s", TimeUtil::ToString(a - b));
  239. EXPECT_EQ("0s", TimeUtil::ToString(a - a));
  240. EXPECT_EQ("0s", TimeUtil::ToString(b - b));
  241. EXPECT_EQ("-3.999999998s", TimeUtil::ToString(b - a));
  242. // Test *
  243. EXPECT_EQ(a + a, a * 2);
  244. EXPECT_EQ(b + b, a * (-2));
  245. EXPECT_EQ(b + b, b * 2);
  246. EXPECT_EQ(a + a, b * (-2));
  247. EXPECT_EQ("0.999999999s", TimeUtil::ToString(a * 0.5));
  248. EXPECT_EQ("-0.999999999s", TimeUtil::ToString(b * 0.5));
  249. // Multiplication should not overflow if the result fits into the supported
  250. // range of Duration (intermediate result may be larger than int64).
  251. EXPECT_EQ("315575999684.424s",
  252. TimeUtil::ToString((one_second - one_nano) * 315576000000LL));
  253. EXPECT_EQ("-315575999684.424s",
  254. TimeUtil::ToString((one_nano - one_second) * 315576000000LL));
  255. EXPECT_EQ("-315575999684.424s",
  256. TimeUtil::ToString((one_second - one_nano) * (-315576000000LL)));
  257. // Test / and %
  258. EXPECT_EQ("0.999999999s", TimeUtil::ToString(a / 2));
  259. EXPECT_EQ("-0.999999999s", TimeUtil::ToString(b / 2));
  260. Duration large = TimeUtil::SecondsToDuration(315576000000LL) - one_nano;
  261. // We have to handle division with values beyond 64 bits.
  262. EXPECT_EQ("0.999999999s", TimeUtil::ToString(large / 315576000000LL));
  263. EXPECT_EQ("-0.999999999s", TimeUtil::ToString((-large) / 315576000000LL));
  264. EXPECT_EQ("-0.999999999s", TimeUtil::ToString(large / (-315576000000LL)));
  265. Duration large2 = large + one_nano;
  266. EXPECT_EQ(large, large % large2);
  267. EXPECT_EQ(-large, (-large) % large2);
  268. EXPECT_EQ(large, large % (-large2));
  269. EXPECT_EQ(one_nano, large2 % large);
  270. EXPECT_EQ(-one_nano, (-large2) % large);
  271. EXPECT_EQ(one_nano, large2 % (-large));
  272. // Some corner cases about negative values.
  273. //
  274. // (-5) / 2 = -2, remainder = -1
  275. // (-5) / (-2) = 2, remainder = -1
  276. a = TimeUtil::NanosecondsToDuration(-5);
  277. EXPECT_EQ(TimeUtil::NanosecondsToDuration(-2), a / 2);
  278. EXPECT_EQ(TimeUtil::NanosecondsToDuration(2), a / (-2));
  279. b = TimeUtil::NanosecondsToDuration(2);
  280. EXPECT_EQ(-2, a / b);
  281. EXPECT_EQ(TimeUtil::NanosecondsToDuration(-1), a % b);
  282. EXPECT_EQ(2, a / (-b));
  283. EXPECT_EQ(TimeUtil::NanosecondsToDuration(-1), a % (-b));
  284. // Test relational operators.
  285. EXPECT_TRUE(one_nano < one_second);
  286. EXPECT_FALSE(one_second < one_second);
  287. EXPECT_FALSE(one_second < one_nano);
  288. EXPECT_FALSE(-one_nano < -one_second);
  289. EXPECT_FALSE(-one_second < -one_second);
  290. EXPECT_TRUE(-one_second < -one_nano);
  291. EXPECT_TRUE(-one_nano < one_nano);
  292. EXPECT_FALSE(one_nano < -one_nano);
  293. EXPECT_FALSE(one_nano > one_second);
  294. EXPECT_FALSE(one_nano > one_nano);
  295. EXPECT_TRUE(one_second > one_nano);
  296. EXPECT_FALSE(one_nano >= one_second);
  297. EXPECT_TRUE(one_nano >= one_nano);
  298. EXPECT_TRUE(one_second >= one_nano);
  299. EXPECT_TRUE(one_nano <= one_second);
  300. EXPECT_TRUE(one_nano <= one_nano);
  301. EXPECT_FALSE(one_second <= one_nano);
  302. EXPECT_TRUE(one_nano == one_nano);
  303. EXPECT_FALSE(one_nano == one_second);
  304. EXPECT_FALSE(one_nano != one_nano);
  305. EXPECT_TRUE(one_nano != one_second);
  306. }
  307. TEST(TimeUtilTest, TimestampOperators) {
  308. Timestamp begin, end;
  309. EXPECT_TRUE(TimeUtil::FromString("0001-01-01T00:00:00Z", &begin));
  310. EXPECT_TRUE(TimeUtil::FromString("9999-12-31T23:59:59.999999999Z", &end));
  311. Duration d = end - begin;
  312. EXPECT_TRUE(end == begin + d);
  313. EXPECT_TRUE(end == d + begin);
  314. EXPECT_TRUE(begin == end - d);
  315. // Test relational operators
  316. Timestamp t1 = begin + d / 4;
  317. Timestamp t2 = end - d / 4;
  318. EXPECT_TRUE(t1 < t2);
  319. EXPECT_FALSE(t1 < t1);
  320. EXPECT_FALSE(t2 < t1);
  321. EXPECT_FALSE(t1 > t2);
  322. EXPECT_FALSE(t1 > t1);
  323. EXPECT_TRUE(t2 > t1);
  324. EXPECT_FALSE(t1 >= t2);
  325. EXPECT_TRUE(t1 >= t1);
  326. EXPECT_TRUE(t2 >= t1);
  327. EXPECT_TRUE(t1 <= t2);
  328. EXPECT_TRUE(t1 <= t1);
  329. EXPECT_FALSE(t2 <= t1);
  330. EXPECT_FALSE(t1 == t2);
  331. EXPECT_TRUE(t1 == t1);
  332. EXPECT_FALSE(t2 == t1);
  333. EXPECT_TRUE(t1 != t2);
  334. EXPECT_FALSE(t1 != t1);
  335. EXPECT_TRUE(t2 != t1);
  336. }
  337. } // namespace
  338. } // namespace util
  339. } // namespace protobuf
  340. } // namespace google