16f0f844eSRaman Tenneti //===-- Unittests for mktime ----------------------------------------------===//
26f0f844eSRaman Tenneti //
36f0f844eSRaman Tenneti // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
46f0f844eSRaman Tenneti // See https://llvm.org/LICENSE.txt for license information.
56f0f844eSRaman Tenneti // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66f0f844eSRaman Tenneti //
76f0f844eSRaman Tenneti //===----------------------------------------------------------------------===//
86f0f844eSRaman Tenneti 
96f0f844eSRaman Tenneti #include "src/time/mktime.h"
10034f5629SRaman Tenneti #include "src/time/time_utils.h"
116f0f844eSRaman Tenneti #include "test/ErrnoSetterMatcher.h"
12a72499e4SRaman Tenneti #include "test/src/time/TmHelper.h"
13034f5629SRaman Tenneti #include "test/src/time/TmMatcher.h"
146f0f844eSRaman Tenneti #include "utils/UnitTest/Test.h"
156f0f844eSRaman Tenneti 
166f0f844eSRaman Tenneti #include <errno.h>
17034f5629SRaman Tenneti #include <limits.h>
186f0f844eSRaman Tenneti #include <string.h>
196f0f844eSRaman Tenneti 
206f0f844eSRaman Tenneti using __llvm_libc::testing::ErrnoSetterMatcher::Fails;
21034f5629SRaman Tenneti using __llvm_libc::testing::ErrnoSetterMatcher::Succeeds;
22034f5629SRaman Tenneti using __llvm_libc::time_utils::TimeConstants;
236f0f844eSRaman Tenneti 
call_mktime(struct tm * tm_data,int year,int month,int mday,int hour,int min,int sec,int wday,int yday)246f0f844eSRaman Tenneti static inline time_t call_mktime(struct tm *tm_data, int year, int month,
25034f5629SRaman Tenneti                                  int mday, int hour, int min, int sec, int wday,
26034f5629SRaman Tenneti                                  int yday) {
27*25226f3eSMichael Jones   __llvm_libc::tmhelper::testing::initialize_tm_data(
28*25226f3eSMichael Jones       tm_data, year, month, mday, hour, min, sec, wday, yday);
296f0f844eSRaman Tenneti   return __llvm_libc::mktime(tm_data);
306f0f844eSRaman Tenneti }
316f0f844eSRaman Tenneti 
TEST(LlvmLibcMkTime,FailureSetsErrno)321df0dbfcSMichael Jones TEST(LlvmLibcMkTime, FailureSetsErrno) {
336f0f844eSRaman Tenneti   struct tm tm_data;
34*25226f3eSMichael Jones   __llvm_libc::tmhelper::testing::initialize_tm_data(
35a72499e4SRaman Tenneti       &tm_data, INT_MAX, INT_MAX, INT_MAX, INT_MAX, INT_MAX, -1, 0, 0);
366f0f844eSRaman Tenneti   EXPECT_THAT(__llvm_libc::mktime(&tm_data), Fails(EOVERFLOW));
376f0f844eSRaman Tenneti }
386f0f844eSRaman Tenneti 
TEST(LlvmLibcMkTime,InvalidSeconds)39eaae52c1SRaman Tenneti TEST(LlvmLibcMkTime, InvalidSeconds) {
406f0f844eSRaman Tenneti   struct tm tm_data;
41034f5629SRaman Tenneti   // -1 second from 1970-01-01 00:00:00 returns 1969-12-31 23:59:59.
42034f5629SRaman Tenneti   EXPECT_THAT(call_mktime(&tm_data,
43034f5629SRaman Tenneti                           1970, // year
44034f5629SRaman Tenneti                           1,    // month
45034f5629SRaman Tenneti                           1,    // day
46034f5629SRaman Tenneti                           0,    // hr
47034f5629SRaman Tenneti                           0,    // min
48034f5629SRaman Tenneti                           -1,   // sec
49034f5629SRaman Tenneti                           0,    // wday
50034f5629SRaman Tenneti                           0),   // yday
51034f5629SRaman Tenneti               Succeeds(-1));
52034f5629SRaman Tenneti   EXPECT_TM_EQ((tm{59,     // sec
53034f5629SRaman Tenneti                    59,     // min
54034f5629SRaman Tenneti                    23,     // hr
55034f5629SRaman Tenneti                    31,     // day
56034f5629SRaman Tenneti                    12 - 1, // tm_mon starts with 0 for Jan
571c92911eSMichael Jones                    1969 - TimeConstants::TIME_YEAR_BASE, // year
58034f5629SRaman Tenneti                    3,                                    // wday
59034f5629SRaman Tenneti                    364,                                  // yday
60034f5629SRaman Tenneti                    0}),
61034f5629SRaman Tenneti                tm_data);
62034f5629SRaman Tenneti   // 60 seconds from 1970-01-01 00:00:00 returns 1970-01-01 00:01:00.
63034f5629SRaman Tenneti   EXPECT_THAT(call_mktime(&tm_data,
64034f5629SRaman Tenneti                           1970, // year
65034f5629SRaman Tenneti                           1,    // month
66034f5629SRaman Tenneti                           1,    // day
67034f5629SRaman Tenneti                           0,    // hr
68034f5629SRaman Tenneti                           0,    // min
69034f5629SRaman Tenneti                           60,   // sec
70034f5629SRaman Tenneti                           0,    // wday
71034f5629SRaman Tenneti                           0),   // yday
72034f5629SRaman Tenneti               Succeeds(60));
73034f5629SRaman Tenneti   EXPECT_TM_EQ((tm{0, // sec
74034f5629SRaman Tenneti                    1, // min
75034f5629SRaman Tenneti                    0, // hr
76034f5629SRaman Tenneti                    1, // day
77034f5629SRaman Tenneti                    0, // tm_mon starts with 0 for Jan
781c92911eSMichael Jones                    1970 - TimeConstants::TIME_YEAR_BASE, // year
79034f5629SRaman Tenneti                    4,                                    // wday
80034f5629SRaman Tenneti                    0,                                    // yday
81034f5629SRaman Tenneti                    0}),
82034f5629SRaman Tenneti                tm_data);
836f0f844eSRaman Tenneti }
846f0f844eSRaman Tenneti 
TEST(LlvmLibcMkTime,InvalidMinutes)85eaae52c1SRaman Tenneti TEST(LlvmLibcMkTime, InvalidMinutes) {
866f0f844eSRaman Tenneti   struct tm tm_data;
87034f5629SRaman Tenneti   // -1 minute from 1970-01-01 00:00:00 returns 1969-12-31 23:59:00.
88034f5629SRaman Tenneti   EXPECT_THAT(call_mktime(&tm_data,
89034f5629SRaman Tenneti                           1970, // year
90034f5629SRaman Tenneti                           1,    // month
91034f5629SRaman Tenneti                           1,    // day
92034f5629SRaman Tenneti                           0,    // hr
93034f5629SRaman Tenneti                           -1,   // min
94034f5629SRaman Tenneti                           0,    // sec
95034f5629SRaman Tenneti                           0,    // wday
96034f5629SRaman Tenneti                           0),   // yday
971c92911eSMichael Jones               Succeeds(-TimeConstants::SECONDS_PER_MIN));
98034f5629SRaman Tenneti   EXPECT_TM_EQ((tm{0,  // sec
99034f5629SRaman Tenneti                    59, // min
100034f5629SRaman Tenneti                    23, // hr
101034f5629SRaman Tenneti                    31, // day
102034f5629SRaman Tenneti                    11, // tm_mon starts with 0 for Jan
1031c92911eSMichael Jones                    1969 - TimeConstants::TIME_YEAR_BASE, // year
104034f5629SRaman Tenneti                    3,                                    // wday
105034f5629SRaman Tenneti                    0,                                    // yday
106034f5629SRaman Tenneti                    0}),
107034f5629SRaman Tenneti                tm_data);
108034f5629SRaman Tenneti   // 60 minutes from 1970-01-01 00:00:00 returns 1970-01-01 01:00:00.
109034f5629SRaman Tenneti   EXPECT_THAT(call_mktime(&tm_data,
110034f5629SRaman Tenneti                           1970, // year
111034f5629SRaman Tenneti                           1,    // month
112034f5629SRaman Tenneti                           1,    // day
113034f5629SRaman Tenneti                           0,    // hr
114034f5629SRaman Tenneti                           60,   // min
115034f5629SRaman Tenneti                           0,    // sec
116034f5629SRaman Tenneti                           0,    // wday
117034f5629SRaman Tenneti                           0),   // yday
1181c92911eSMichael Jones               Succeeds(60 * TimeConstants::SECONDS_PER_MIN));
119034f5629SRaman Tenneti   EXPECT_TM_EQ((tm{0, // sec
120034f5629SRaman Tenneti                    0, // min
121034f5629SRaman Tenneti                    1, // hr
122034f5629SRaman Tenneti                    1, // day
123034f5629SRaman Tenneti                    0, // tm_mon starts with 0 for Jan
1241c92911eSMichael Jones                    1970 - TimeConstants::TIME_YEAR_BASE, // year
125034f5629SRaman Tenneti                    4,                                    // wday
126034f5629SRaman Tenneti                    0,                                    // yday
127034f5629SRaman Tenneti                    0}),
128034f5629SRaman Tenneti                tm_data);
1296f0f844eSRaman Tenneti }
1306f0f844eSRaman Tenneti 
TEST(LlvmLibcMkTime,InvalidHours)131eaae52c1SRaman Tenneti TEST(LlvmLibcMkTime, InvalidHours) {
1326f0f844eSRaman Tenneti   struct tm tm_data;
133034f5629SRaman Tenneti   // -1 hour from 1970-01-01 00:00:00 returns 1969-12-31 23:00:00.
134034f5629SRaman Tenneti   EXPECT_THAT(call_mktime(&tm_data,
135034f5629SRaman Tenneti                           1970, // year
136034f5629SRaman Tenneti                           1,    // month
137034f5629SRaman Tenneti                           1,    // day
138034f5629SRaman Tenneti                           -1,   // hr
139034f5629SRaman Tenneti                           0,    // min
140034f5629SRaman Tenneti                           0,    // sec
141034f5629SRaman Tenneti                           0,    // wday
142034f5629SRaman Tenneti                           0),   // yday
1431c92911eSMichael Jones               Succeeds(-TimeConstants::SECONDS_PER_HOUR));
144034f5629SRaman Tenneti   EXPECT_TM_EQ((tm{0,  // sec
145034f5629SRaman Tenneti                    0,  // min
146034f5629SRaman Tenneti                    23, // hr
147034f5629SRaman Tenneti                    31, // day
148034f5629SRaman Tenneti                    11, // tm_mon starts with 0 for Jan
1491c92911eSMichael Jones                    1969 - TimeConstants::TIME_YEAR_BASE, // year
150034f5629SRaman Tenneti                    3,                                    // wday
151034f5629SRaman Tenneti                    0,                                    // yday
152034f5629SRaman Tenneti                    0}),
153034f5629SRaman Tenneti                tm_data);
154034f5629SRaman Tenneti   // 24 hours from 1970-01-01 00:00:00 returns 1970-01-02 00:00:00.
155034f5629SRaman Tenneti   EXPECT_THAT(call_mktime(&tm_data,
156034f5629SRaman Tenneti                           1970, // year
157034f5629SRaman Tenneti                           1,    // month
158034f5629SRaman Tenneti                           1,    // day
159034f5629SRaman Tenneti                           24,   // hr
160034f5629SRaman Tenneti                           0,    // min
161034f5629SRaman Tenneti                           0,    // sec
162034f5629SRaman Tenneti                           0,    // wday
163034f5629SRaman Tenneti                           0),   // yday
1641c92911eSMichael Jones               Succeeds(24 * TimeConstants::SECONDS_PER_HOUR));
165034f5629SRaman Tenneti   EXPECT_TM_EQ((tm{0, // sec
166034f5629SRaman Tenneti                    0, // min
167034f5629SRaman Tenneti                    0, // hr
168034f5629SRaman Tenneti                    2, // day
169034f5629SRaman Tenneti                    0, // tm_mon starts with 0 for Jan
1701c92911eSMichael Jones                    1970 - TimeConstants::TIME_YEAR_BASE, // year
171034f5629SRaman Tenneti                    5,                                    // wday
172034f5629SRaman Tenneti                    0,                                    // yday
173034f5629SRaman Tenneti                    0}),
174034f5629SRaman Tenneti                tm_data);
1756f0f844eSRaman Tenneti }
1766f0f844eSRaman Tenneti 
TEST(LlvmLibcMkTime,InvalidYear)177eaae52c1SRaman Tenneti TEST(LlvmLibcMkTime, InvalidYear) {
1786f0f844eSRaman Tenneti   struct tm tm_data;
179034f5629SRaman Tenneti   // -1 year from 1970-01-01 00:00:00 returns 1969-01-01 00:00:00.
180034f5629SRaman Tenneti   EXPECT_THAT(call_mktime(&tm_data,
181034f5629SRaman Tenneti                           1969, // year
182034f5629SRaman Tenneti                           1,    // month
183034f5629SRaman Tenneti                           1,    // day
184034f5629SRaman Tenneti                           0,    // hr
185034f5629SRaman Tenneti                           0,    // min
186034f5629SRaman Tenneti                           0,    // sec
187034f5629SRaman Tenneti                           0,    // wday
188034f5629SRaman Tenneti                           0),   // yday
1891c92911eSMichael Jones               Succeeds(-TimeConstants::DAYS_PER_NON_LEAP_YEAR *
1901c92911eSMichael Jones                        TimeConstants::SECONDS_PER_DAY));
191034f5629SRaman Tenneti   EXPECT_TM_EQ((tm{0, // sec
192034f5629SRaman Tenneti                    0, // min
193034f5629SRaman Tenneti                    0, // hr
194034f5629SRaman Tenneti                    1, // day
195034f5629SRaman Tenneti                    0, // tm_mon starts with 0 for Jan
1961c92911eSMichael Jones                    1969 - TimeConstants::TIME_YEAR_BASE, // year
197034f5629SRaman Tenneti                    3,                                    // wday
198034f5629SRaman Tenneti                    0,                                    // yday
199034f5629SRaman Tenneti                    0}),
200034f5629SRaman Tenneti                tm_data);
2016f0f844eSRaman Tenneti }
2026f0f844eSRaman Tenneti 
TEST(LlvmLibcMkTime,InvalidEndOf32BitEpochYear)203eaae52c1SRaman Tenneti TEST(LlvmLibcMkTime, InvalidEndOf32BitEpochYear) {
204034f5629SRaman Tenneti   if (sizeof(size_t) != 4)
2056f0f844eSRaman Tenneti     return;
2066f0f844eSRaman Tenneti   struct tm tm_data;
2076f0f844eSRaman Tenneti   // 2038-01-19 03:14:08 tests overflow of the second in 2038.
208034f5629SRaman Tenneti   EXPECT_THAT(call_mktime(&tm_data, 2038, 1, 19, 3, 14, 8, 0, 0),
2091c92911eSMichael Jones               Succeeds(TimeConstants::OUT_OF_RANGE_RETURN_VALUE));
2106f0f844eSRaman Tenneti   // 2038-01-19 03:15:07 tests overflow of the minute in 2038.
211034f5629SRaman Tenneti   EXPECT_THAT(call_mktime(&tm_data, 2038, 1, 19, 3, 15, 7, 0, 0),
2121c92911eSMichael Jones               Succeeds(TimeConstants::OUT_OF_RANGE_RETURN_VALUE));
2136f0f844eSRaman Tenneti   // 2038-01-19 04:14:07 tests overflow of the hour in 2038.
214034f5629SRaman Tenneti   EXPECT_THAT(call_mktime(&tm_data, 2038, 1, 19, 4, 14, 7, 0, 0),
2151c92911eSMichael Jones               Succeeds(TimeConstants::OUT_OF_RANGE_RETURN_VALUE));
2166f0f844eSRaman Tenneti   // 2038-01-20 03:14:07 tests overflow of the day in 2038.
217034f5629SRaman Tenneti   EXPECT_THAT(call_mktime(&tm_data, 2038, 1, 20, 3, 14, 7, 0, 0),
2181c92911eSMichael Jones               Succeeds(TimeConstants::OUT_OF_RANGE_RETURN_VALUE));
2196f0f844eSRaman Tenneti   // 2038-02-19 03:14:07 tests overflow of the month in 2038.
220034f5629SRaman Tenneti   EXPECT_THAT(call_mktime(&tm_data, 2038, 2, 19, 3, 14, 7, 0, 0),
2211c92911eSMichael Jones               Succeeds(TimeConstants::OUT_OF_RANGE_RETURN_VALUE));
2226f0f844eSRaman Tenneti   // 2039-01-19 03:14:07 tests overflow of the year.
223034f5629SRaman Tenneti   EXPECT_THAT(call_mktime(&tm_data, 2039, 1, 19, 3, 14, 7, 0, 0),
2241c92911eSMichael Jones               Succeeds(TimeConstants::OUT_OF_RANGE_RETURN_VALUE));
2256f0f844eSRaman Tenneti }
2266f0f844eSRaman Tenneti 
TEST(LlvmLibcMkTime,InvalidMonths)227eaae52c1SRaman Tenneti TEST(LlvmLibcMkTime, InvalidMonths) {
2286f0f844eSRaman Tenneti   struct tm tm_data;
229034f5629SRaman Tenneti   // -1 month from 1970-01-01 00:00:00 returns 1969-12-01 00:00:00.
230034f5629SRaman Tenneti   EXPECT_THAT(call_mktime(&tm_data,
231034f5629SRaman Tenneti                           1970, // year
232034f5629SRaman Tenneti                           0,    // month
233034f5629SRaman Tenneti                           1,    // day
234034f5629SRaman Tenneti                           0,    // hr
235034f5629SRaman Tenneti                           0,    // min
236034f5629SRaman Tenneti                           0,    // sec
237034f5629SRaman Tenneti                           0,    // wday
238034f5629SRaman Tenneti                           0),   // yday
2391c92911eSMichael Jones               Succeeds(-31 * TimeConstants::SECONDS_PER_DAY));
240034f5629SRaman Tenneti   EXPECT_TM_EQ((tm{0,      // sec
241034f5629SRaman Tenneti                    0,      // min
242034f5629SRaman Tenneti                    0,      // hr
243034f5629SRaman Tenneti                    1,      // day
244034f5629SRaman Tenneti                    12 - 1, // tm_mon starts with 0 for Jan
2451c92911eSMichael Jones                    1969 - TimeConstants::TIME_YEAR_BASE, // year
246034f5629SRaman Tenneti                    1,                                    // wday
247034f5629SRaman Tenneti                    0,                                    // yday
248034f5629SRaman Tenneti                    0}),
249034f5629SRaman Tenneti                tm_data);
250034f5629SRaman Tenneti   // 1970-13-01 00:00:00 returns 1971-01-01 00:00:00.
251034f5629SRaman Tenneti   EXPECT_THAT(call_mktime(&tm_data,
252034f5629SRaman Tenneti                           1970, // year
253034f5629SRaman Tenneti                           13,   // month
254034f5629SRaman Tenneti                           1,    // day
255034f5629SRaman Tenneti                           0,    // hr
256034f5629SRaman Tenneti                           0,    // min
257034f5629SRaman Tenneti                           0,    // sec
258034f5629SRaman Tenneti                           0,    // wday
259034f5629SRaman Tenneti                           0),   // yday
2601c92911eSMichael Jones               Succeeds(TimeConstants::DAYS_PER_NON_LEAP_YEAR *
2611c92911eSMichael Jones                        TimeConstants::SECONDS_PER_DAY));
262034f5629SRaman Tenneti   EXPECT_TM_EQ((tm{0, // sec
263034f5629SRaman Tenneti                    0, // min
264034f5629SRaman Tenneti                    0, // hr
265034f5629SRaman Tenneti                    1, // day
266034f5629SRaman Tenneti                    0, // tm_mon starts with 0 for Jan
2671c92911eSMichael Jones                    1971 - TimeConstants::TIME_YEAR_BASE, // year
268034f5629SRaman Tenneti                    5,                                    // wday
269034f5629SRaman Tenneti                    0,                                    // yday
270034f5629SRaman Tenneti                    0}),
271034f5629SRaman Tenneti                tm_data);
2726f0f844eSRaman Tenneti }
2736f0f844eSRaman Tenneti 
TEST(LlvmLibcMkTime,InvalidDays)274eaae52c1SRaman Tenneti TEST(LlvmLibcMkTime, InvalidDays) {
2756f0f844eSRaman Tenneti   struct tm tm_data;
276034f5629SRaman Tenneti   // -1 day from 1970-01-01 00:00:00 returns 1969-12-31 00:00:00.
277034f5629SRaman Tenneti   EXPECT_THAT(call_mktime(&tm_data,
278034f5629SRaman Tenneti                           1970, // year
279034f5629SRaman Tenneti                           1,    // month
280034f5629SRaman Tenneti                           0,    // day
281034f5629SRaman Tenneti                           0,    // hr
282034f5629SRaman Tenneti                           0,    // min
283034f5629SRaman Tenneti                           0,    // sec
284034f5629SRaman Tenneti                           0,    // wday
285034f5629SRaman Tenneti                           0),   // yday
2861c92911eSMichael Jones               Succeeds(-1 * TimeConstants::SECONDS_PER_DAY));
287034f5629SRaman Tenneti   EXPECT_TM_EQ((tm{0,  // sec
288034f5629SRaman Tenneti                    0,  // min
289034f5629SRaman Tenneti                    0,  // hr
290034f5629SRaman Tenneti                    31, // day
291034f5629SRaman Tenneti                    11, // tm_mon starts with 0 for Jan
2921c92911eSMichael Jones                    1969 - TimeConstants::TIME_YEAR_BASE, // year
293034f5629SRaman Tenneti                    3,                                    // wday
294034f5629SRaman Tenneti                    0,                                    // yday
295034f5629SRaman Tenneti                    0}),
296034f5629SRaman Tenneti                tm_data);
2976f0f844eSRaman Tenneti 
298034f5629SRaman Tenneti   // 1970-01-32 00:00:00 returns 1970-02-01 00:00:00.
299034f5629SRaman Tenneti   EXPECT_THAT(call_mktime(&tm_data,
300034f5629SRaman Tenneti                           1970, // year
301034f5629SRaman Tenneti                           1,    // month
302034f5629SRaman Tenneti                           32,   // day
303034f5629SRaman Tenneti                           0,    // hr
304034f5629SRaman Tenneti                           0,    // min
305034f5629SRaman Tenneti                           0,    // sec
306034f5629SRaman Tenneti                           0,    // wday
307034f5629SRaman Tenneti                           0),   // yday
3081c92911eSMichael Jones               Succeeds(31 * TimeConstants::SECONDS_PER_DAY));
309034f5629SRaman Tenneti   EXPECT_TM_EQ((tm{0, // sec
310034f5629SRaman Tenneti                    0, // min
311034f5629SRaman Tenneti                    0, // hr
312034f5629SRaman Tenneti                    1, // day
313034f5629SRaman Tenneti                    0, // tm_mon starts with 0 for Jan
3141c92911eSMichael Jones                    1970 - TimeConstants::TIME_YEAR_BASE, // year
315034f5629SRaman Tenneti                    0,                                    // wday
316034f5629SRaman Tenneti                    0,                                    // yday
317034f5629SRaman Tenneti                    0}),
318034f5629SRaman Tenneti                tm_data);
3196f0f844eSRaman Tenneti 
320034f5629SRaman Tenneti   // 1970-02-29 00:00:00 returns 1970-03-01 00:00:00.
321034f5629SRaman Tenneti   EXPECT_THAT(call_mktime(&tm_data,
322034f5629SRaman Tenneti                           1970, // year
323034f5629SRaman Tenneti                           2,    // month
324034f5629SRaman Tenneti                           29,   // day
325034f5629SRaman Tenneti                           0,    // hr
326034f5629SRaman Tenneti                           0,    // min
327034f5629SRaman Tenneti                           0,    // sec
328034f5629SRaman Tenneti                           0,    // wday
329034f5629SRaman Tenneti                           0),   // yday
3301c92911eSMichael Jones               Succeeds(59 * TimeConstants::SECONDS_PER_DAY));
331034f5629SRaman Tenneti   EXPECT_TM_EQ((tm{0, // sec
332034f5629SRaman Tenneti                    0, // min
333034f5629SRaman Tenneti                    0, // hr
334034f5629SRaman Tenneti                    1, // day
335034f5629SRaman Tenneti                    2, // tm_mon starts with 0 for Jan
3361c92911eSMichael Jones                    1970 - TimeConstants::TIME_YEAR_BASE, // year
337034f5629SRaman Tenneti                    0,                                    // wday
338034f5629SRaman Tenneti                    0,                                    // yday
339034f5629SRaman Tenneti                    0}),
340034f5629SRaman Tenneti                tm_data);
341034f5629SRaman Tenneti 
342034f5629SRaman Tenneti   // 1972-02-30 00:00:00 returns 1972-03-01 00:00:00.
343034f5629SRaman Tenneti   EXPECT_THAT(call_mktime(&tm_data,
344034f5629SRaman Tenneti                           1972, // year
345034f5629SRaman Tenneti                           2,    // month
346034f5629SRaman Tenneti                           30,   // day
347034f5629SRaman Tenneti                           0,    // hr
348034f5629SRaman Tenneti                           0,    // min
349034f5629SRaman Tenneti                           0,    // sec
350034f5629SRaman Tenneti                           0,    // wday
351034f5629SRaman Tenneti                           0),   // yday
3521c92911eSMichael Jones               Succeeds(((2 * TimeConstants::DAYS_PER_NON_LEAP_YEAR) + 60) *
3531c92911eSMichael Jones                        TimeConstants::SECONDS_PER_DAY));
354034f5629SRaman Tenneti   EXPECT_TM_EQ((tm{0, // sec
355034f5629SRaman Tenneti                    0, // min
356034f5629SRaman Tenneti                    0, // hr
357034f5629SRaman Tenneti                    1, // day
358034f5629SRaman Tenneti                    2, // tm_mon starts with 0 for Jan
3591c92911eSMichael Jones                    1972 - TimeConstants::TIME_YEAR_BASE, // year
360034f5629SRaman Tenneti                    3,                                    // wday
361034f5629SRaman Tenneti                    0,                                    // yday
362034f5629SRaman Tenneti                    0}),
363034f5629SRaman Tenneti                tm_data);
3646f0f844eSRaman Tenneti }
3656f0f844eSRaman Tenneti 
TEST(LlvmLibcMkTime,EndOf32BitEpochYear)366eaae52c1SRaman Tenneti TEST(LlvmLibcMkTime, EndOf32BitEpochYear) {
3676f0f844eSRaman Tenneti   struct tm tm_data;
3686f0f844eSRaman Tenneti   // Test for maximum value of a signed 32-bit integer.
3696f0f844eSRaman Tenneti   // Test implementation can encode time for Tue 19 January 2038 03:14:07 UTC.
370034f5629SRaman Tenneti   EXPECT_THAT(call_mktime(&tm_data,
371034f5629SRaman Tenneti                           2038, // year
372034f5629SRaman Tenneti                           1,    // month
373034f5629SRaman Tenneti                           19,   // day
374034f5629SRaman Tenneti                           3,    // hr
375034f5629SRaman Tenneti                           14,   // min
376034f5629SRaman Tenneti                           7,    // sec
377034f5629SRaman Tenneti                           0,    // wday
378034f5629SRaman Tenneti                           0),   // yday
379034f5629SRaman Tenneti               Succeeds(0x7FFFFFFF));
380034f5629SRaman Tenneti   EXPECT_TM_EQ((tm{7,  // sec
381034f5629SRaman Tenneti                    14, // min
382034f5629SRaman Tenneti                    3,  // hr
383034f5629SRaman Tenneti                    19, // day
384034f5629SRaman Tenneti                    0,  // tm_mon starts with 0 for Jan
3851c92911eSMichael Jones                    2038 - TimeConstants::TIME_YEAR_BASE, // year
386034f5629SRaman Tenneti                    2,                                    // wday
387034f5629SRaman Tenneti                    7,                                    // yday
388034f5629SRaman Tenneti                    0}),
389034f5629SRaman Tenneti                tm_data);
3906f0f844eSRaman Tenneti }
3916f0f844eSRaman Tenneti 
TEST(LlvmLibcMkTime,Max64BitYear)392eaae52c1SRaman Tenneti TEST(LlvmLibcMkTime, Max64BitYear) {
3936f0f844eSRaman Tenneti   if (sizeof(time_t) == 4)
3946f0f844eSRaman Tenneti     return;
395034f5629SRaman Tenneti   // Mon Jan 1 12:50:50 2170 (200 years from 1970),
3966f0f844eSRaman Tenneti   struct tm tm_data;
397034f5629SRaman Tenneti   EXPECT_THAT(call_mktime(&tm_data,
398034f5629SRaman Tenneti                           2170, // year
399034f5629SRaman Tenneti                           1,    // month
400034f5629SRaman Tenneti                           1,    // day
401034f5629SRaman Tenneti                           12,   // hr
402034f5629SRaman Tenneti                           50,   // min
403034f5629SRaman Tenneti                           50,   // sec
404034f5629SRaman Tenneti                           0,    // wday
405034f5629SRaman Tenneti                           0),   // yday
406034f5629SRaman Tenneti               Succeeds(6311479850));
407034f5629SRaman Tenneti   EXPECT_TM_EQ((tm{50, // sec
408034f5629SRaman Tenneti                    50, // min
409034f5629SRaman Tenneti                    12, // hr
410034f5629SRaman Tenneti                    1,  // day
411034f5629SRaman Tenneti                    0,  // tm_mon starts with 0 for Jan
4121c92911eSMichael Jones                    2170 - TimeConstants::TIME_YEAR_BASE, // year
413034f5629SRaman Tenneti                    1,                                    // wday
414034f5629SRaman Tenneti                    50,                                   // yday
415034f5629SRaman Tenneti                    0}),
416034f5629SRaman Tenneti                tm_data);
4176f0f844eSRaman Tenneti 
4186f0f844eSRaman Tenneti   // Test for Tue Jan 1 12:50:50 in 2,147,483,647th year.
419034f5629SRaman Tenneti   EXPECT_THAT(call_mktime(&tm_data, 2147483647, 1, 1, 12, 50, 50, 0, 0),
420034f5629SRaman Tenneti               Succeeds(67767976202043050));
421034f5629SRaman Tenneti   EXPECT_TM_EQ((tm{50, // sec
422034f5629SRaman Tenneti                    50, // min
423034f5629SRaman Tenneti                    12, // hr
424034f5629SRaman Tenneti                    1,  // day
425034f5629SRaman Tenneti                    0,  // tm_mon starts with 0 for Jan
4261c92911eSMichael Jones                    2147483647 - TimeConstants::TIME_YEAR_BASE, // year
427034f5629SRaman Tenneti                    2,                                          // wday
428034f5629SRaman Tenneti                    50,                                         // yday
429034f5629SRaman Tenneti                    0}),
430034f5629SRaman Tenneti                tm_data);
4316f0f844eSRaman Tenneti }
432