1*71db0c75SAndroid Build Coastguard Worker //===-- Unittests for asctime ---------------------------------------------===//
2*71db0c75SAndroid Build Coastguard Worker //
3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*71db0c75SAndroid Build Coastguard Worker //
7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*71db0c75SAndroid Build Coastguard Worker
9*71db0c75SAndroid Build Coastguard Worker #include "src/errno/libc_errno.h"
10*71db0c75SAndroid Build Coastguard Worker #include "src/time/asctime.h"
11*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/Test.h"
12*71db0c75SAndroid Build Coastguard Worker #include "test/src/time/TmHelper.h"
13*71db0c75SAndroid Build Coastguard Worker
call_asctime(struct tm * tm_data,int year,int month,int mday,int hour,int min,int sec,int wday,int yday)14*71db0c75SAndroid Build Coastguard Worker static inline char *call_asctime(struct tm *tm_data, int year, int month,
15*71db0c75SAndroid Build Coastguard Worker int mday, int hour, int min, int sec, int wday,
16*71db0c75SAndroid Build Coastguard Worker int yday) {
17*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::tmhelper::testing::initialize_tm_data(
18*71db0c75SAndroid Build Coastguard Worker tm_data, year, month, mday, hour, min, sec, wday, yday);
19*71db0c75SAndroid Build Coastguard Worker return LIBC_NAMESPACE::asctime(tm_data);
20*71db0c75SAndroid Build Coastguard Worker }
21*71db0c75SAndroid Build Coastguard Worker
TEST(LlvmLibcAsctime,Nullptr)22*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcAsctime, Nullptr) {
23*71db0c75SAndroid Build Coastguard Worker char *result;
24*71db0c75SAndroid Build Coastguard Worker result = LIBC_NAMESPACE::asctime(nullptr);
25*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_EQ(EINVAL);
26*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ(nullptr, result);
27*71db0c75SAndroid Build Coastguard Worker }
28*71db0c75SAndroid Build Coastguard Worker
29*71db0c75SAndroid Build Coastguard Worker // Weekdays are in the range 0 to 6. Test passing invalid value in wday.
TEST(LlvmLibcAsctime,InvalidWday)30*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcAsctime, InvalidWday) {
31*71db0c75SAndroid Build Coastguard Worker struct tm tm_data;
32*71db0c75SAndroid Build Coastguard Worker
33*71db0c75SAndroid Build Coastguard Worker // Test with wday = -1.
34*71db0c75SAndroid Build Coastguard Worker call_asctime(&tm_data,
35*71db0c75SAndroid Build Coastguard Worker 1970, // year
36*71db0c75SAndroid Build Coastguard Worker 1, // month
37*71db0c75SAndroid Build Coastguard Worker 1, // day
38*71db0c75SAndroid Build Coastguard Worker 0, // hr
39*71db0c75SAndroid Build Coastguard Worker 0, // min
40*71db0c75SAndroid Build Coastguard Worker 0, // sec
41*71db0c75SAndroid Build Coastguard Worker -1, // wday
42*71db0c75SAndroid Build Coastguard Worker 0); // yday
43*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_EQ(EINVAL);
44*71db0c75SAndroid Build Coastguard Worker
45*71db0c75SAndroid Build Coastguard Worker // Test with wday = 7.
46*71db0c75SAndroid Build Coastguard Worker call_asctime(&tm_data,
47*71db0c75SAndroid Build Coastguard Worker 1970, // year
48*71db0c75SAndroid Build Coastguard Worker 1, // month
49*71db0c75SAndroid Build Coastguard Worker 1, // day
50*71db0c75SAndroid Build Coastguard Worker 0, // hr
51*71db0c75SAndroid Build Coastguard Worker 0, // min
52*71db0c75SAndroid Build Coastguard Worker 0, // sec
53*71db0c75SAndroid Build Coastguard Worker 7, // wday
54*71db0c75SAndroid Build Coastguard Worker 0); // yday
55*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_EQ(EINVAL);
56*71db0c75SAndroid Build Coastguard Worker }
57*71db0c75SAndroid Build Coastguard Worker
58*71db0c75SAndroid Build Coastguard Worker // Months are from January to December. Test passing invalid value in month.
TEST(LlvmLibcAsctime,InvalidMonth)59*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcAsctime, InvalidMonth) {
60*71db0c75SAndroid Build Coastguard Worker struct tm tm_data;
61*71db0c75SAndroid Build Coastguard Worker
62*71db0c75SAndroid Build Coastguard Worker // Test with month = 0.
63*71db0c75SAndroid Build Coastguard Worker call_asctime(&tm_data,
64*71db0c75SAndroid Build Coastguard Worker 1970, // year
65*71db0c75SAndroid Build Coastguard Worker 0, // month
66*71db0c75SAndroid Build Coastguard Worker 1, // day
67*71db0c75SAndroid Build Coastguard Worker 0, // hr
68*71db0c75SAndroid Build Coastguard Worker 0, // min
69*71db0c75SAndroid Build Coastguard Worker 0, // sec
70*71db0c75SAndroid Build Coastguard Worker 4, // wday
71*71db0c75SAndroid Build Coastguard Worker 0); // yday
72*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_EQ(EINVAL);
73*71db0c75SAndroid Build Coastguard Worker
74*71db0c75SAndroid Build Coastguard Worker // Test with month = 13.
75*71db0c75SAndroid Build Coastguard Worker call_asctime(&tm_data,
76*71db0c75SAndroid Build Coastguard Worker 1970, // year
77*71db0c75SAndroid Build Coastguard Worker 13, // month
78*71db0c75SAndroid Build Coastguard Worker 1, // day
79*71db0c75SAndroid Build Coastguard Worker 0, // hr
80*71db0c75SAndroid Build Coastguard Worker 0, // min
81*71db0c75SAndroid Build Coastguard Worker 0, // sec
82*71db0c75SAndroid Build Coastguard Worker 4, // wday
83*71db0c75SAndroid Build Coastguard Worker 0); // yday
84*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_EQ(EINVAL);
85*71db0c75SAndroid Build Coastguard Worker }
86*71db0c75SAndroid Build Coastguard Worker
TEST(LlvmLibcAsctime,ValidWeekdays)87*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcAsctime, ValidWeekdays) {
88*71db0c75SAndroid Build Coastguard Worker struct tm tm_data;
89*71db0c75SAndroid Build Coastguard Worker char *result;
90*71db0c75SAndroid Build Coastguard Worker // 1970-01-01 00:00:00.
91*71db0c75SAndroid Build Coastguard Worker result = call_asctime(&tm_data,
92*71db0c75SAndroid Build Coastguard Worker 1970, // year
93*71db0c75SAndroid Build Coastguard Worker 1, // month
94*71db0c75SAndroid Build Coastguard Worker 1, // day
95*71db0c75SAndroid Build Coastguard Worker 0, // hr
96*71db0c75SAndroid Build Coastguard Worker 0, // min
97*71db0c75SAndroid Build Coastguard Worker 0, // sec
98*71db0c75SAndroid Build Coastguard Worker 4, // wday
99*71db0c75SAndroid Build Coastguard Worker 0); // yday
100*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ("Thu Jan 1 00:00:00 1970\n", result);
101*71db0c75SAndroid Build Coastguard Worker
102*71db0c75SAndroid Build Coastguard Worker // 1970-01-03 00:00:00.
103*71db0c75SAndroid Build Coastguard Worker result = call_asctime(&tm_data,
104*71db0c75SAndroid Build Coastguard Worker 1970, // year
105*71db0c75SAndroid Build Coastguard Worker 1, // month
106*71db0c75SAndroid Build Coastguard Worker 3, // day
107*71db0c75SAndroid Build Coastguard Worker 0, // hr
108*71db0c75SAndroid Build Coastguard Worker 0, // min
109*71db0c75SAndroid Build Coastguard Worker 0, // sec
110*71db0c75SAndroid Build Coastguard Worker 6, // wday
111*71db0c75SAndroid Build Coastguard Worker 0); // yday
112*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ("Sat Jan 3 00:00:00 1970\n", result);
113*71db0c75SAndroid Build Coastguard Worker
114*71db0c75SAndroid Build Coastguard Worker // 1970-01-04 00:00:00.
115*71db0c75SAndroid Build Coastguard Worker result = call_asctime(&tm_data,
116*71db0c75SAndroid Build Coastguard Worker 1970, // year
117*71db0c75SAndroid Build Coastguard Worker 1, // month
118*71db0c75SAndroid Build Coastguard Worker 4, // day
119*71db0c75SAndroid Build Coastguard Worker 0, // hr
120*71db0c75SAndroid Build Coastguard Worker 0, // min
121*71db0c75SAndroid Build Coastguard Worker 0, // sec
122*71db0c75SAndroid Build Coastguard Worker 0, // wday
123*71db0c75SAndroid Build Coastguard Worker 0); // yday
124*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ("Sun Jan 4 00:00:00 1970\n", result);
125*71db0c75SAndroid Build Coastguard Worker }
126*71db0c75SAndroid Build Coastguard Worker
TEST(LlvmLibcAsctime,ValidMonths)127*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcAsctime, ValidMonths) {
128*71db0c75SAndroid Build Coastguard Worker struct tm tm_data;
129*71db0c75SAndroid Build Coastguard Worker char *result;
130*71db0c75SAndroid Build Coastguard Worker // 1970-01-01 00:00:00.
131*71db0c75SAndroid Build Coastguard Worker result = call_asctime(&tm_data,
132*71db0c75SAndroid Build Coastguard Worker 1970, // year
133*71db0c75SAndroid Build Coastguard Worker 1, // month
134*71db0c75SAndroid Build Coastguard Worker 1, // day
135*71db0c75SAndroid Build Coastguard Worker 0, // hr
136*71db0c75SAndroid Build Coastguard Worker 0, // min
137*71db0c75SAndroid Build Coastguard Worker 0, // sec
138*71db0c75SAndroid Build Coastguard Worker 4, // wday
139*71db0c75SAndroid Build Coastguard Worker 0); // yday
140*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ("Thu Jan 1 00:00:00 1970\n", result);
141*71db0c75SAndroid Build Coastguard Worker
142*71db0c75SAndroid Build Coastguard Worker // 1970-02-01 00:00:00.
143*71db0c75SAndroid Build Coastguard Worker result = call_asctime(&tm_data,
144*71db0c75SAndroid Build Coastguard Worker 1970, // year
145*71db0c75SAndroid Build Coastguard Worker 2, // month
146*71db0c75SAndroid Build Coastguard Worker 1, // day
147*71db0c75SAndroid Build Coastguard Worker 0, // hr
148*71db0c75SAndroid Build Coastguard Worker 0, // min
149*71db0c75SAndroid Build Coastguard Worker 0, // sec
150*71db0c75SAndroid Build Coastguard Worker 0, // wday
151*71db0c75SAndroid Build Coastguard Worker 0); // yday
152*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ("Sun Feb 1 00:00:00 1970\n", result);
153*71db0c75SAndroid Build Coastguard Worker
154*71db0c75SAndroid Build Coastguard Worker // 1970-12-31 23:59:59.
155*71db0c75SAndroid Build Coastguard Worker result = call_asctime(&tm_data,
156*71db0c75SAndroid Build Coastguard Worker 1970, // year
157*71db0c75SAndroid Build Coastguard Worker 12, // month
158*71db0c75SAndroid Build Coastguard Worker 31, // day
159*71db0c75SAndroid Build Coastguard Worker 23, // hr
160*71db0c75SAndroid Build Coastguard Worker 59, // min
161*71db0c75SAndroid Build Coastguard Worker 59, // sec
162*71db0c75SAndroid Build Coastguard Worker 4, // wday
163*71db0c75SAndroid Build Coastguard Worker 0); // yday
164*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ("Thu Dec 31 23:59:59 1970\n", result);
165*71db0c75SAndroid Build Coastguard Worker }
166*71db0c75SAndroid Build Coastguard Worker
TEST(LlvmLibcAsctime,EndOf32BitEpochYear)167*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcAsctime, EndOf32BitEpochYear) {
168*71db0c75SAndroid Build Coastguard Worker struct tm tm_data;
169*71db0c75SAndroid Build Coastguard Worker char *result;
170*71db0c75SAndroid Build Coastguard Worker // Test for maximum value of a signed 32-bit integer.
171*71db0c75SAndroid Build Coastguard Worker // Test implementation can encode time for Tue 19 January 2038 03:14:07 UTC.
172*71db0c75SAndroid Build Coastguard Worker result = call_asctime(&tm_data,
173*71db0c75SAndroid Build Coastguard Worker 2038, // year
174*71db0c75SAndroid Build Coastguard Worker 1, // month
175*71db0c75SAndroid Build Coastguard Worker 19, // day
176*71db0c75SAndroid Build Coastguard Worker 3, // hr
177*71db0c75SAndroid Build Coastguard Worker 14, // min
178*71db0c75SAndroid Build Coastguard Worker 7, // sec
179*71db0c75SAndroid Build Coastguard Worker 2, // wday
180*71db0c75SAndroid Build Coastguard Worker 7); // yday
181*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ("Tue Jan 19 03:14:07 2038\n", result);
182*71db0c75SAndroid Build Coastguard Worker }
183*71db0c75SAndroid Build Coastguard Worker
TEST(LlvmLibcAsctime,Max64BitYear)184*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcAsctime, Max64BitYear) {
185*71db0c75SAndroid Build Coastguard Worker if (sizeof(time_t) == 4)
186*71db0c75SAndroid Build Coastguard Worker return;
187*71db0c75SAndroid Build Coastguard Worker // Mon Jan 1 12:50:50 2170 (200 years from 1970),
188*71db0c75SAndroid Build Coastguard Worker struct tm tm_data;
189*71db0c75SAndroid Build Coastguard Worker char *result;
190*71db0c75SAndroid Build Coastguard Worker result = call_asctime(&tm_data,
191*71db0c75SAndroid Build Coastguard Worker 2170, // year
192*71db0c75SAndroid Build Coastguard Worker 1, // month
193*71db0c75SAndroid Build Coastguard Worker 1, // day
194*71db0c75SAndroid Build Coastguard Worker 12, // hr
195*71db0c75SAndroid Build Coastguard Worker 50, // min
196*71db0c75SAndroid Build Coastguard Worker 50, // sec
197*71db0c75SAndroid Build Coastguard Worker 1, // wday
198*71db0c75SAndroid Build Coastguard Worker 50); // yday
199*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ("Mon Jan 1 12:50:50 2170\n", result);
200*71db0c75SAndroid Build Coastguard Worker
201*71db0c75SAndroid Build Coastguard Worker // Test for Tue Jan 1 12:50:50 in 2,147,483,647th year.
202*71db0c75SAndroid Build Coastguard Worker // This test would cause buffer overflow and thus asctime returns nullptr.
203*71db0c75SAndroid Build Coastguard Worker result = call_asctime(&tm_data,
204*71db0c75SAndroid Build Coastguard Worker 2147483647, // year
205*71db0c75SAndroid Build Coastguard Worker 1, // month
206*71db0c75SAndroid Build Coastguard Worker 1, // day
207*71db0c75SAndroid Build Coastguard Worker 12, // hr
208*71db0c75SAndroid Build Coastguard Worker 50, // min
209*71db0c75SAndroid Build Coastguard Worker 50, // sec
210*71db0c75SAndroid Build Coastguard Worker 2, // wday
211*71db0c75SAndroid Build Coastguard Worker 50); // yday
212*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_EQ(EOVERFLOW);
213*71db0c75SAndroid Build Coastguard Worker ASSERT_STREQ(nullptr, result);
214*71db0c75SAndroid Build Coastguard Worker }
215