xref: /llvm-project/libc/test/src/time/gmtime_r_test.cpp (revision f9c2377fb68e5051b3061186c507f7b87db2a8b2)
18b35159aSRaman Tenneti //===-- Unittests for gmtime_r --------------------------------------------===//
28b35159aSRaman Tenneti //
38b35159aSRaman Tenneti // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
48b35159aSRaman Tenneti // See https://llvm.org/LICENSE.txt for license information.
58b35159aSRaman Tenneti // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
68b35159aSRaman Tenneti //
78b35159aSRaman Tenneti //===----------------------------------------------------------------------===//
88b35159aSRaman Tenneti 
98b35159aSRaman Tenneti #include "src/time/gmtime_r.h"
10*f9c2377fSMichael Jones #include "src/time/time_constants.h"
11af1315c2SSiva Chandra Reddy #include "test/UnitTest/Test.h"
128b35159aSRaman Tenneti #include "test/src/time/TmMatcher.h"
138b35159aSRaman Tenneti 
148b35159aSRaman Tenneti // gmtime and gmtime_r share the same code and thus didn't repeat all the tests
158b35159aSRaman Tenneti // from gmtime. Added couple of validation tests.
168b35159aSRaman Tenneti TEST(LlvmLibcGmTimeR, EndOf32BitEpochYear) {
178b35159aSRaman Tenneti   // Test for maximum value of a signed 32-bit integer.
188b35159aSRaman Tenneti   // Test implementation can encode time for Tue 19 January 2038 03:14:07 UTC.
198b35159aSRaman Tenneti   time_t seconds = 0x7FFFFFFF;
208b35159aSRaman Tenneti   struct tm tm_data;
218b35159aSRaman Tenneti   struct tm *tm_data_ptr;
22b6bc9d72SGuillaume Chatelet   tm_data_ptr = LIBC_NAMESPACE::gmtime_r(&seconds, &tm_data);
23*f9c2377fSMichael Jones   EXPECT_TM_EQ(
24*f9c2377fSMichael Jones       (tm{7,  // sec
258b35159aSRaman Tenneti           14, // min
268b35159aSRaman Tenneti           3,  // hr
278b35159aSRaman Tenneti           19, // day
288b35159aSRaman Tenneti           0,  // tm_mon starts with 0 for Jan
29*f9c2377fSMichael Jones           2038 - LIBC_NAMESPACE::time_constants::TIME_YEAR_BASE, // year
308b35159aSRaman Tenneti           2,                                                     // wday
318b35159aSRaman Tenneti           7,                                                     // yday
328b35159aSRaman Tenneti           0}),
338b35159aSRaman Tenneti       *tm_data_ptr);
348b35159aSRaman Tenneti   EXPECT_TM_EQ(*tm_data_ptr, tm_data);
358b35159aSRaman Tenneti }
368b35159aSRaman Tenneti 
378b35159aSRaman Tenneti TEST(LlvmLibcGmTimeR, Max64BitYear) {
388b35159aSRaman Tenneti   if (sizeof(time_t) == 4)
398b35159aSRaman Tenneti     return;
408b35159aSRaman Tenneti   // Test for Tue Jan 1 12:50:50 in 2,147,483,647th year.
418b35159aSRaman Tenneti   time_t seconds = 67767976202043050;
428b35159aSRaman Tenneti   struct tm tm_data;
438b35159aSRaman Tenneti   struct tm *tm_data_ptr;
44b6bc9d72SGuillaume Chatelet   tm_data_ptr = LIBC_NAMESPACE::gmtime_r(&seconds, &tm_data);
45*f9c2377fSMichael Jones   EXPECT_TM_EQ(
46*f9c2377fSMichael Jones       (tm{50, // sec
478b35159aSRaman Tenneti           50, // min
488b35159aSRaman Tenneti           12, // hr
498b35159aSRaman Tenneti           1,  // day
508b35159aSRaman Tenneti           0,  // tm_mon starts with 0 for Jan
51*f9c2377fSMichael Jones           2147483647 - LIBC_NAMESPACE::time_constants::TIME_YEAR_BASE, // year
528b35159aSRaman Tenneti           2,                                                           // wday
538b35159aSRaman Tenneti           50,                                                          // yday
548b35159aSRaman Tenneti           0}),
558b35159aSRaman Tenneti       *tm_data_ptr);
568b35159aSRaman Tenneti   EXPECT_TM_EQ(*tm_data_ptr, tm_data);
578b35159aSRaman Tenneti }
58