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