1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <stdio.h>
17 #include <stdlib.h>
18 #include <time.h>
19
20 #include <limits.h>
21 #include "gtest/gtest.h"
22 #include "log.h"
23
24 using namespace testing::ext;
25 time_t g_time = 18880;
26 size_t g_zero = 0;
27 class TimeUtilsTest : public testing::Test {
28 };
29
30 /**
31 * @tc.number SUB_KERNEL_TIME_API_ASCTIME_0100
32 * @tc.name test asctime api
33 * @tc.desc [C- SOFTWARE -0200]
34 */
HWTEST_F(TimeUtilsTest, testAscTime, Function | MediumTest | Level1)35 HWTEST_F(TimeUtilsTest, testAscTime, Function | MediumTest | Level1)
36 {
37 struct tm timeptr = {0};
38 timeptr.tm_sec = 0;
39 timeptr.tm_min = 10;
40 timeptr.tm_hour = 10;
41 timeptr.tm_mday = 9;
42 timeptr.tm_mon = 7;
43 timeptr.tm_year = 120;
44 timeptr.tm_wday = 7;
45
46 char * returnStr = asctime(&timeptr);
47 LOG(" asctime &timeptr:='{timeptr.tm_year=%d timeptr.tm_mon=%d timeptr.tm_mday=%d}' "
48 "--> returnStr:='%s'\n", timeptr.tm_year, timeptr.tm_mon, timeptr.tm_mday, returnStr);
49 EXPECT_STREQ("Sun Aug 9 10:10:00 2020\n", returnStr)
50 << "ErrInfo: asctime &timeptr:='{timeptr.tm_year=" << timeptr.tm_year
51 << " timeptr.tm_mon=" << timeptr.tm_mon << "' timeptr.tm_mday=" << timeptr.tm_mday
52 << "}' --> returnStr:='" << returnStr << "'";
53 }
54
55 /**
56 * @tc.number SUB_KERNEL_TIME_API_ASCTIMER_0100
57 * @tc.name test asctimer api
58 * @tc.desc [C- SOFTWARE -0200]
59 */
HWTEST_F(TimeUtilsTest, testAscTimeR, Function | MediumTest | Level1)60 HWTEST_F(TimeUtilsTest, testAscTimeR, Function | MediumTest | Level1)
61 {
62 struct tm timeptr = {0};
63 timeptr.tm_sec = 0;
64 timeptr.tm_min = 10;
65 timeptr.tm_hour = 10;
66 timeptr.tm_mday = 9;
67 timeptr.tm_mon = 7;
68 timeptr.tm_year = 120;
69 timeptr.tm_wday = 7;
70
71 char str[26];
72 char *returnStr = asctime_r(&timeptr, str);
73 EXPECT_STREQ("Sun Aug 9 10:10:00 2020\n", returnStr) << "asctime_r return error!";
74 EXPECT_STREQ(returnStr, str) << "asctime_r buf return error!";
75 }
76
77 /**
78 * @tc.number SUB_KERNEL_TIME_API_CTIME_0100
79 * @tc.name test ctime api
80 * @tc.desc [C- SOFTWARE -0200]
81 */
HWTEST_F(TimeUtilsTest, testCtime, Function | MediumTest | Level2)82 HWTEST_F(TimeUtilsTest, testCtime, Function | MediumTest | Level2)
83 {
84 time_t curClock;
85 time(&curClock);
86 char* returnStr = ctime(&curClock);
87 LOG("returnStr = %s\n", returnStr);
88 EXPECT_STRNE(returnStr, "") << "ctime return error!";
89
90 returnStr = ctime(&g_time);
91 EXPECT_STREQ(returnStr, "Thu Jan 1 05:14:40 1970\n") << "ctime return error!";
92 }
93
94 /**
95 * @tc.number SUB_KERNEL_TIME_API_CTIME_R_0100
96 * @tc.name test ctime_r api
97 * @tc.desc [C- SOFTWARE -0200]
98 */
HWTEST_F(TimeUtilsTest, testCtimeR, Function | MediumTest | Level3)99 HWTEST_F(TimeUtilsTest, testCtimeR, Function | MediumTest | Level3)
100 {
101 time_t curClock;
102 time(&curClock);
103 char str[26];
104 char *returnStr = ctime_r(&curClock, str);
105 LOG("str = %s", str);
106 EXPECT_STRNE(returnStr, "") << "ctime_r return error!";
107 EXPECT_STREQ(returnStr, str) << "ctime_r returns not equal";
108
109 returnStr = ctime_r(&g_time, str);
110 EXPECT_STREQ(returnStr, "Thu Jan 1 05:14:40 1970\n") << "ctime_r return error!";
111 EXPECT_STREQ(returnStr, str) << "ctime_r returns not equal";
112 }
113
114 /**
115 * @tc.number SUB_KERNEL_NDKAPI_TIME_DIFFTIME_0100
116 * @tc.name test difftime api
117 * @tc.desc [C- SOFTWARE -0200]
118 */
HWTEST_F(TimeUtilsTest, testDifftime, Function | MediumTest | Level2)119 HWTEST_F(TimeUtilsTest, testDifftime, Function | MediumTest | Level2)
120 {
121 time_t timeStart, timeEnd;
122 double returnVal;
123 time(&timeStart);
124 sleep(1);
125 time(&timeEnd);
126 returnVal = difftime(timeEnd, timeStart);
127 LOG(" difftime timeEnd:='%lld' timeStart:='%lld' "
128 "--> returnVal:='%f'\n", timeEnd, timeStart, returnVal);
129 LOG(" sizeof timeEnd:='%d' sizeof timeStart:='%d'\n", sizeof(timeEnd), sizeof(timeStart));
130 EXPECT_GE(returnVal, 0)
131 << "ErrInfo: difftime timeEnd:='" << timeEnd << "' timeStart:='"
132 << timeStart << "' --> returnVal:='" << returnVal << "'";
133 EXPECT_LE(returnVal, 2)
134 << "ErrInfo: difftime timeEnd:='" << timeEnd << "' timeStart:='"
135 << timeStart << "' --> returnVal:='" << returnVal << "'";
136 }
137
138 /**
139 * @tc.number SUB_KERNEL_NDKAPI_TIME_TIMEGM_0100
140 * @tc.name test timegm api
141 * @tc.desc [C- SOFTWARE -0200]
142 */
HWTEST_F(TimeUtilsTest, testTimegm, Function | MediumTest | Level3)143 HWTEST_F(TimeUtilsTest, testTimegm, Function | MediumTest | Level3)
144 {
145 struct tm timeptr = {0};
146 time_t timeThis;
147 timeptr.tm_sec = 0;
148 timeptr.tm_min = 10;
149 timeptr.tm_hour = 10;
150 timeptr.tm_mday = 9;
151 timeptr.tm_mon = 7;
152 timeptr.tm_year = 120;
153 timeptr.tm_wday = 5;
154
155 timeThis = timegm(&timeptr);
156 LOG(" timegm &timeptr:='{timeptr.tm_year=%d timeptr.tm_mon=%d timeptr.tm_mday=%d}' "
157 "--> return timeThis:='%lld'\n", timeptr.tm_year, timeptr.tm_mon, timeptr.tm_mday, timeThis);
158 EXPECT_GE(timeThis, 1)
159 << "ErrInfo: timegm &timeptr:='{timeptr.tm_year=" << timeptr.tm_year
160 << " timeptr.tm_mon=" << timeptr.tm_mon << " timeptr.tm_mday="
161 << timeptr.tm_mday << "}' --> return timeThis:='" << timeThis << "'";
162
163 struct tm *stm2 = gmtime(&g_time);
164 time_t timep = timegm(stm2);
165 LOG("stm = %s;mktime:%ld\n", asctime(stm2), (long)timep);
166 EXPECT_EQ(timep, g_time) << "timegm return error!";
167 }
168
169 /**
170 * @tc.number SUB_KERNEL_TIME_API_GMTIME_0100
171 * @tc.name test gmtime api
172 * @tc.desc [C- SOFTWARE -0200]
173 */
HWTEST_F(TimeUtilsTest, testGmtime, Function | MediumTest | Level3)174 HWTEST_F(TimeUtilsTest, testGmtime, Function | MediumTest | Level3)
175 {
176 time_t time1 = 18880;
177 struct tm *stm = gmtime(&time1);
178 ASSERT_NE(nullptr, stm);
179 EXPECT_EQ(stm->tm_hour, 05) << "gmtime return error!";
180 EXPECT_STREQ(asctime(stm), "Thu Jan 1 05:14:40 1970\n") << "gmtime return error!";
181
182 time1 = LONG_MAX;
183 stm = gmtime(&time1);
184 ASSERT_NE(nullptr, stm);
185 EXPECT_STREQ(asctime(stm), "Tue Jan 19 03:14:07 2038\n") << "gmtime return error!";
186
187 time1 = 253402300799;
188 stm = gmtime(&time1);
189 ASSERT_NE(nullptr, stm);
190 EXPECT_STREQ(asctime(stm), "Fri Dec 31 23:59:59 9999\n") << "gmtime return error!";
191
192 time1 = LONG_MIN;
193 stm = gmtime(&time1);
194 ASSERT_NE(nullptr, stm);
195 EXPECT_STREQ(asctime(stm), "Fri Dec 13 20:45:52 1901\n") << "gmtime return error!";
196 }
197
198 /**
199 * @tc.number SUB_KERNEL_TIME_API_GMTIMER_0100
200 * @tc.name test gmtime_r api
201 * @tc.desc [C- SOFTWARE -0200]
202 */
HWTEST_F(TimeUtilsTest, testGmtimeR, Function | MediumTest | Level3)203 HWTEST_F(TimeUtilsTest, testGmtimeR, Function | MediumTest | Level3)
204 {
205 struct tm res = {0};
206 struct tm *stm = gmtime_r(&g_time, &res);
207 ASSERT_NE(nullptr, stm);
208 EXPECT_EQ(stm->tm_hour, 05) << "gmtime_r return error!";
209 EXPECT_STREQ(asctime(stm), "Thu Jan 1 05:14:40 1970\n") << "gmtime_r return error!";
210 EXPECT_TRUE(stm == &res) << "gmtime_r returns not equal";
211
212 time_t timeNow;
213 time(&timeNow);
214 stm = gmtime_r(&timeNow, &res);
215 ASSERT_NE(nullptr, stm);
216 EXPECT_EQ(stm->tm_year, 70) << "gmtime_r return error!";
217 EXPECT_STRNE(asctime(stm), "") << "gmtime_r return error!";
218 EXPECT_TRUE(stm == &res) << "gmtime_r returns not equal";
219 }
220
221 /**
222 * @tc.number SUB_KERNEL_TIME_API_MKTIME_0100
223 * @tc.name test mktime api
224 * @tc.desc [C- SOFTWARE -0200]
225 */
HWTEST_F(TimeUtilsTest, testMktime, Function | MediumTest | Level2)226 HWTEST_F(TimeUtilsTest, testMktime, Function | MediumTest | Level2)
227 {
228 struct tm *localTime;
229 struct tm timeptr = {0};
230 timeptr.tm_sec = 0;
231 timeptr.tm_min = 10;
232 timeptr.tm_hour = 10;
233 timeptr.tm_mday = 9;
234 timeptr.tm_mon = 7;
235 timeptr.tm_year = 120;
236 timeptr.tm_wday = 7;
237 EXPECT_EQ(mktime(&timeptr), 1596967800) << "mktime return error!";
238
239 localTime = localtime(&g_time);
240 ASSERT_NE(nullptr, localTime);
241 time_t timep = mktime(localTime);
242 EXPECT_EQ(timep, 18880) << "mktime return error!";
243 }
244
245 /**
246 * @tc.number SUB_KERNEL_TIME_API_STRFTIME_0100
247 * @tc.name test strftime api
248 * @tc.desc [C- SOFTWARE -0200]
249 */
HWTEST_F(TimeUtilsTest, testStrftime, Function | MediumTest | Level3)250 HWTEST_F(TimeUtilsTest, testStrftime, Function | MediumTest | Level3)
251 {
252 size_t strftimeBytes = 19;
253 char buffer[80] = {0};
254 time_t mtime = 18880;
255 struct tm *localTime = localtime(&mtime);
256 if (localTime == nullptr) {
257 LOG("localtime errno ");
258 ADD_FAILURE();
259 }
260 size_t ftime = strftime(buffer, sizeof(buffer) - 1, "%Ex %EX %A", localTime);
261 EXPECT_GT(ftime, g_zero) << "strftime return error!";
262 EXPECT_STREQ(buffer, "01/01/70 05:14:40 Thursday") << "buffer return error!";
263
264 mtime = LONG_MAX;
265 localTime = localtime(&mtime);
266 ASSERT_NE(nullptr, localTime);
267 ftime = strftime(buffer, sizeof(buffer) - 1, "%y-%m-%d %H:%M:%S", localTime);
268 EXPECT_STREQ(buffer, "38-01-19 03:14:07") << "buffer return error!";
269
270 mtime = 253402300799;
271 localTime = localtime(&mtime);
272 ASSERT_NE(nullptr, localTime);
273 ftime = strftime(buffer, sizeof(buffer) - 1, "%Y-%m-%d %H:%M:%S", localTime);
274 EXPECT_STREQ(buffer, "9999-12-31 23:59:59") << "buffer return error!";
275
276 mtime = LONG_MIN;
277 localTime = localtime(&mtime);
278 ASSERT_NE(nullptr, localTime);
279 ftime = strftime(buffer, sizeof(buffer) - 1, "%x %X", localTime);
280 EXPECT_STREQ(buffer, "12/13/01 20:45:52") << "buffer return error!";
281
282 ftime = strftime(buffer, sizeof(buffer) - 1, "%Y-%m-%d %H:%M:%S", localTime);
283 EXPECT_EQ(ftime, strftimeBytes) << "strftime return error!";
284 EXPECT_STREQ(buffer, "1901-12-13 20:45:52") << "buffer return error!";
285 }
286
287 /**
288 * @tc.number SUB_KERNEL_TIME_API_STRFTIMEL_0100
289 * @tc.name test strftime_l api
290 * @tc.desc [C- SOFTWARE -0200]
291 */
HWTEST_F(TimeUtilsTest, testStrftimeL, Function | MediumTest | Level2)292 HWTEST_F(TimeUtilsTest, testStrftimeL, Function | MediumTest | Level2)
293 {
294 struct tm *tm1;
295 char buffer[80] = {0};
296
297 tm1 = localtime(&g_time);
298 ASSERT_NE(nullptr, tm1);
299 size_t ftime = strftime_l(buffer, sizeof(buffer) - 1, "%F %T %Z", tm1, nullptr);
300 EXPECT_GT(ftime, g_zero) << "strftime return error!";
301 EXPECT_STREQ(buffer, "1970-01-01 05:14:40 UTC") << "buffer return error!";
302 }
303
304 /**
305 * @tc.number SUB_KERNEL_TIME_API_WCSFTIME_0100
306 * @tc.name test wcsftime api
307 * @tc.desc [C- SOFTWARE -0200]
308 */
HWTEST_F(TimeUtilsTest, testWcsftime, Function | MediumTest | Level2)309 HWTEST_F(TimeUtilsTest, testWcsftime, Function | MediumTest | Level2)
310 {
311 size_t wcsftimeBytes = 33;
312 wchar_t buff[48] = {0};
313 struct tm *localTime = localtime(&g_time);
314 ASSERT_NE(nullptr, localTime);
315 size_t len = wcsftime(buff, sizeof(buff) - 1, L"%A %c", localTime);
316 LOG("buff = %ls, len = %ld\n", buff, (long)len);
317 EXPECT_EQ(len, wcsftimeBytes) << "wcsftime return error!";
318 EXPECT_STREQ(buff, L"Thursday Thu Jan 1 05:14:40 1970") << "buff return error!";
319
320 localTime = localtime(&g_time);
321 ASSERT_NE(nullptr, localTime);
322 len = wcsftime(buff, sizeof(buff) - 1, L"%A %c", localTime);
323 LOG("buff = %ls, len = %ld\n", buff, (long)len);
324 EXPECT_EQ(len, wcsftimeBytes) << "wcsftime return error!";
325 EXPECT_STREQ(buff, L"Thursday Thu Jan 1 05:14:40 1970") << "buff return error!";
326 }
327