1 #include <errno.h>
2 #include <gtest/gtest.h>
3 #include <sys/timeb.h>
4 #include <thread>
5 using namespace testing::ext;
6
7 class TimeTest : public testing::Test {
8 void SetUp() override {}
9 void TearDown() override {}
10 };
11
12 const constexpr int BUFLEN = 512;
13
14 /**
15 * @tc.name: clock_001
16 * @tc.desc: Assess the accuracy of the clock function by comparing the CPU time measurements before and after a known
17 * delay, and verifying that the difference falls within an acceptable threshold of precision.
18 * @tc.type: FUNC
19 **/
HWTEST_F(TimeTest, clock_001, TestSize.Level1)20 HWTEST_F(TimeTest, clock_001, TestSize.Level1)
21 {
22 clock_t time0 = clock();
23 std::this_thread::sleep_for(std::chrono::seconds(1));
24 clock_t time1 = clock();
25 // 1s sleep should cost less than 5ms
26 EXPECT_GT(5 * (CLOCKS_PER_SEC / 1000), time1 - time0);
27 }
28
29 /**
30 * @tc.name: time_001
31 * @tc.desc: Verify the correctness and behavior of the time function by comparing the retrieved system time values,
32 * checking the relationship between consecutive measurements, and validating the functionality of
33 * time(nullptr) in obtaining the current system time.
34 * @tc.type: FUNC
35 **/
HWTEST_F(TimeTest, time_001, TestSize.Level1)36 HWTEST_F(TimeTest, time_001, TestSize.Level1)
37 {
38 time_t time1;
39 time_t p1 = time(&time1);
40 EXPECT_NE(0, static_cast<int>(time1));
41 EXPECT_NE(-1, static_cast<int>(time1));
42 EXPECT_EQ(time1, p1);
43
44 std::this_thread::sleep_for(std::chrono::milliseconds(1001));
45 time_t time2;
46 time_t p2 = time(&time2);
47 EXPECT_NE(0, static_cast<int>(time2));
48 EXPECT_NE(-1, static_cast<int>(time2));
49 EXPECT_EQ(time2, p2);
50
51 EXPECT_GT(p2, p1);
52 EXPECT_GT(2, static_cast<int>(time2 - time1));
53
54 EXPECT_LE(time(nullptr), p2);
55 EXPECT_GE(1, static_cast<int>(time(nullptr) - time2));
56 }
57
58 /**
59 * @tc.name: mktime_001
60 * @tc.desc: Verify the correctness of the mktime function by checking the conversion of a struct tm to a time_t value
61 * in two different timezones. It validates that the function produces the expected time_t values for specific
62 * date and time inputs, considering the appropriate timezone information.
63 * @tc.type: FUNC
64 **/
HWTEST_F(TimeTest, mktime_001, TestSize.Level1)65 HWTEST_F(TimeTest, mktime_001, TestSize.Level1)
66 {
67 struct tm time;
68 memset(&time, 0, sizeof(tm));
69 time.tm_year = 2023 - 1900;
70 time.tm_mon = 10;
71 time.tm_mday = 16;
72
73 setenv("TZ", "Asia/Shanghai", 1);
74 tzset();
75 EXPECT_EQ(mktime(&time), static_cast<time_t>(1700064000));
76
77 memset(&time, 0, sizeof(tm));
78 time.tm_year = 2023 - 1900;
79 time.tm_mon = 10;
80 time.tm_mday = 16;
81
82 setenv("TZ", "", 1);
83 tzset();
84 EXPECT_EQ(mktime(&time), static_cast<time_t>(1700092800));
85 }
86
87 /**
88 * @tc.name: mktime_002
89 * @tc.desc: Verify the behavior of the mktime function when converting a struct tm representing a future date to a
90 * time_t value. It checks the correctness of the conversion in different timezones ("Asia/Shanghai" and
91 *"UTC") and ensures that no errors occur during the process by checking the value of errno.
92 * @tc.type: FUNC
93 **/
HWTEST_F(TimeTest, mktime_002, TestSize.Level1)94 HWTEST_F(TimeTest, mktime_002, TestSize.Level1)
95 {
96 struct tm time;
97 memset(&time, 0, sizeof(tm));
98 time.tm_year = 2123 - 1900;
99 time.tm_mon = 10;
100 time.tm_mday = 16;
101 EXPECT_LE(64U, sizeof(time_t) * 8);
102
103 setenv("TZ", "Asia/Shanghai", 1);
104 tzset();
105 errno = 0;
106 EXPECT_EQ(mktime(&time), static_cast<time_t>(4855737600U));
107 EXPECT_EQ(errno, 0);
108
109 setenv("TZ", "UTC", 1);
110 tzset();
111 errno = 0;
112 EXPECT_EQ(mktime(&time), static_cast<time_t>(4855766400U));
113 EXPECT_EQ(errno, 0);
114 }
115
116 /**
117 * @tc.name: strftime_001
118 * @tc.desc: Verify the behavior of the strftime function in correctly formatting a given struct tm time value into a
119 * string representation. It checks the correctness of the formatted string using different format specifiers
120 * ("%s" and "%c") and ensures that the output matches the expected results in the UTC timezone.
121 * @tc.type: FUNC
122 **/
HWTEST_F(TimeTest, strftime_001, TestSize.Level1)123 HWTEST_F(TimeTest, strftime_001, TestSize.Level1)
124 {
125 setenv("TZ", "UTC", 1);
126 tzset();
127
128 struct tm time;
129 memset(&time, 0, sizeof(tm));
130 time.tm_year = 2123 - 1900;
131 time.tm_mon = 9;
132 time.tm_mday = 16;
133 char buf[BUFLEN];
134 memset(&buf, 0, sizeof(buf));
135 EXPECT_EQ(24U, strftime(buf, sizeof(buf), "%c", &time));
136 EXPECT_STREQ("Sun Oct 16 00:00:00 2123", buf);
137 }
138
139 /**
140 * @tc.name: strftime_002
141 * @tc.desc: Verify the behavior of the strftime function in formatting the time zone information using
142 * the %Z specifier. It ensures that the formatted string reflects the correct time zone based on the local
143 * timezone settings,with the expected results for both the Shanghai and UTC timezones.
144 * @tc.type: FUNC
145 **/
HWTEST_F(TimeTest, strftime_002, TestSize.Level1)146 HWTEST_F(TimeTest, strftime_002, TestSize.Level1)
147 {
148 setenv("TZ", "Asia/Shanghai", 1);
149 tzset();
150 time_t currentTime = time(nullptr);
151 struct tm* tmInfo = localtime(¤tTime);
152 char buf[BUFLEN];
153 memset(&buf, 0, sizeof(buf));
154
155 EXPECT_EQ(5U, strftime(buf, sizeof(buf), "<%Z>", tmInfo));
156 EXPECT_STREQ("<CST>", buf);
157
158 setenv("TZ", "UTC", 1);
159 tzset();
160 EXPECT_EQ(5U, strftime(buf, sizeof(buf), "<%Z>", tmInfo));
161 EXPECT_STREQ("<UTC>", buf);
162 }
163
164 /**
165 * @tc.name: strftime_003
166 * @tc.desc: Verify the behavior of strftime and strptime functions in handling time zone information and converting
167 * between Unix time and struct tm representations. It ensures that the generated Unix time and resulting
168 * struct tm representations are correct for both the Los Angeles timezone and UTC.
169 * @tc.type: FUNC
170 **/
HWTEST_F(TimeTest, strftime_003, TestSize.Level1)171 HWTEST_F(TimeTest, strftime_003, TestSize.Level1)
172 {
173 char buf[BUFLEN];
174 memset(&buf, 0, sizeof(buf));
175 const struct tm tim = { .tm_year = 2023 - 1900, .tm_mon = 9, .tm_mday = 16 };
176 setenv("TZ", "Americe/Logs_Angeles", 1);
177 strftime(buf, sizeof(buf), "<%s>", &tim);
178 EXPECT_STREQ("<1697414400>", buf);
179
180 setenv("TZ", "UTC", 1);
181 strftime(buf, sizeof(buf), "<%s>", &tim);
182 EXPECT_STREQ("<1697414400>", buf);
183
184 struct tm tm;
185 setenv("TZ", "Asia/Shanghai", 1);
186 tzset();
187 memset(&tm, 0xff, sizeof(tm));
188
189 char* p = strptime("1697414400x", "%s", &tm);
190 EXPECT_EQ('x', *p);
191 EXPECT_EQ(0, tm.tm_sec);
192 EXPECT_EQ(0, tm.tm_min);
193 EXPECT_EQ(8, tm.tm_hour);
194 EXPECT_EQ(16, tm.tm_mday);
195 EXPECT_EQ(9, tm.tm_mon);
196 EXPECT_EQ(123, tm.tm_year);
197 EXPECT_EQ(1, tm.tm_wday);
198 EXPECT_EQ(288, tm.tm_yday);
199 EXPECT_EQ(0, tm.tm_isdst);
200 }
201
202 /**
203 * @tc.name: gmtime_001
204 * @tc.desc: Ensure that the gmtime function correctly converts the time value of 0 to a struct tm representation in
205 * UTC, with the expected values for the epoch.
206 * @tc.type: FUNC
207 **/
HWTEST_F(TimeTest, gmtime_001, TestSize.Level1)208 HWTEST_F(TimeTest, gmtime_001, TestSize.Level1)
209 {
210 time_t tim = 2000000000;
211 struct tm* time = gmtime(&tim);
212 ASSERT_NE(time, nullptr);
213 EXPECT_EQ(20, time->tm_sec);
214 EXPECT_EQ(33, time->tm_min);
215 EXPECT_EQ(3, time->tm_hour);
216 EXPECT_EQ(18, time->tm_mday);
217 EXPECT_EQ(4, time->tm_mon);
218 EXPECT_EQ(2033, time->tm_year + 1900);
219 }
220
221 /**
222 * @tc.name: localtime_001
223 * @tc.desc: Ensure that the localtime function can correctly convert a Unix time value to a struct tm representation
224 * in two different time zones (Asia/Shanghai and America/Atka) using the TZ environment variable.
225 * @tc.type: FUNC
226 **/
HWTEST_F(TimeTest, localtime_001, TestSize.Level1)227 HWTEST_F(TimeTest, localtime_001, TestSize.Level1)
228 {
229 time_t tim = 2000000000;
230 setenv("TZ", "Asia/Shanghai", 1);
231 tzset();
232 struct tm* tmC = localtime(&tim);
233 int ctime = tmC->tm_min;
234 EXPECT_EQ(33, ctime);
235
236 setenv("TZ", "America/Atka", 1);
237 struct tm* tmA = localtime(&tim);
238 int atime = tmA->tm_min;
239 EXPECT_EQ(33, atime);
240 }
241
242 /**
243 * @tc.name: asctime_001
244 * @tc.desc: Ensure that the asctime function correctly converts a struct tm representation of a time value with all
245 * fields set to 0 to a string representation using the standard format.
246 * @tc.type: FUNC
247 **/
HWTEST_F(TimeTest, asctime_001, TestSize.Level1)248 HWTEST_F(TimeTest, asctime_001, TestSize.Level1)
249 {
250 struct tm time;
251 memset(&time, 0, sizeof(tm));
252 char* result = asctime(&time);
253 EXPECT_STREQ("Sun Jan 0 00:00:00 1900\n", result);
254 }
255
256 /**
257 * @tc.name: ctime_001
258 * @tc.desc: Verify that the ctime function correctly converts a Unix time value (0) to a string representation using
259 * the standard format when operating in the UTC timezone.
260 * @tc.type: FUNC
261 **/
HWTEST_F(TimeTest, ctime_001, TestSize.Level1)262 HWTEST_F(TimeTest, ctime_001, TestSize.Level1)
263 {
264 setenv("TZ", "UTC", 1);
265 tzset();
266 const time_t tim = 0;
267 char* result = ctime(&tim);
268 EXPECT_STREQ("Thu Jan 1 00:00:00 1970\n", result);
269 }
270
271 /**
272 * @tc.name: timespec_get_001
273 * @tc.desc: Verify that the timespec_get function can correctly retrieve the current time in the UTC format and store
274 * it in a struct timespec variable.
275 * @tc.type: FUNC
276 **/
HWTEST_F(TimeTest, timespec_get_001, TestSize.Level1)277 HWTEST_F(TimeTest, timespec_get_001, TestSize.Level1)
278 {
279 struct timespec ts;
280 int result = timespec_get(&ts, TIME_UTC);
281 EXPECT_EQ(1, result);
282 }
283
284 /**
285 * @tc.name: strftime_l_001
286 * @tc.desc: Verify that the strftime_l function correctly formats a struct tm time value to a string representation
287 * using the specified locale.
288 * @tc.type: FUNC
289 **/
HWTEST_F(TimeTest, strftime_l_001, TestSize.Level1)290 HWTEST_F(TimeTest, strftime_l_001, TestSize.Level1)
291 {
292 char s[BUFLEN];
293 memset(&s, 0, sizeof(s));
294 size_t maxsize = sizeof(s);
295 setenv("TZ", "UTC", 1);
296 struct tm tp;
297 memset(&tp, 0, sizeof(tm));
298 tp.tm_year = 2023 - 1900;
299 tp.tm_mon = 9;
300 tp.tm_mday = 16;
301 locale_t loc = newlocale(LC_ALL, "C.UTF-8", nullptr);
302 locale_t oldLoc = uselocale(loc);
303 size_t result = strftime_l(s, maxsize, "%c", &tp, loc);
304 EXPECT_EQ(24U, result);
305 EXPECT_STREQ("Sun Oct 16 00:00:00 2023", s);
306
307 uselocale(oldLoc);
308 freelocale(loc);
309 }
310
311 /**
312 * @tc.name: gmtime_r_001
313 * @tc.desc: Verify that the gmtime_r function correctly converts a given time in seconds since the epoch into a
314 * struct tm representation in UTC
315 * @tc.type: FUNC
316 **/
HWTEST_F(TimeTest, gmtime_r_001, TestSize.Level1)317 HWTEST_F(TimeTest, gmtime_r_001, TestSize.Level1)
318 {
319 time_t tim = 2000000000;
320 struct tm tm = {};
321
322 struct tm* time = gmtime_r(&tim, &tm);
323 EXPECT_EQ(time, &tm);
324 EXPECT_EQ(20, time->tm_sec);
325 EXPECT_EQ(33, time->tm_min);
326 EXPECT_EQ(3, time->tm_hour);
327 EXPECT_EQ(18, time->tm_mday);
328 EXPECT_EQ(4, time->tm_mon);
329 EXPECT_EQ(2033, time->tm_year + 1900);
330 }
331
332 /**
333 * @tc.name: localtime_r_001
334 * @tc.desc: Determine when the time zone is "Asia/Shanghai" When "localtime_r" Can correctly return to local time
335 * @tc.type: FUNC
336 **/
HWTEST_F(TimeTest, localtime_r_001, TestSize.Level1)337 HWTEST_F(TimeTest, localtime_r_001, TestSize.Level1)
338 {
339 time_t tim = 2000000000;
340 struct tm tm;
341
342 setenv("TZ", "Asia/Shanghai", 1);
343 tzset();
344 ASSERT_NE(localtime_r(&tim, &tm), nullptr);
345 EXPECT_EQ(18, tm.tm_mday);
346 }
347
348 /**
349 * @tc.name: localtime_r_002
350 * @tc.desc: Determine when the time zone is "America/Los_Angeles" When "localtime_r" Can correctly return to local time
351 * @tc.type: FUNC
352 **/
HWTEST_F(TimeTest, localtime_r_002, TestSize.Level1)353 HWTEST_F(TimeTest, localtime_r_002, TestSize.Level1)
354 {
355 time_t tim = 2000000000;
356 struct tm tm;
357 setenv("TZ", "America/Los_Angeles", 1);
358 tzset();
359 ASSERT_NE(localtime_r(&tim, &tm), nullptr);
360 EXPECT_EQ(17, tm.tm_mday);
361 }
362
363 /**
364 * @tc.name: localtime_r_003
365 * @tc.desc: Determine when the time zone is "Europe/London" When "localtime_r" Can correctly return to local time
366 * @tc.type: FUNC
367 **/
HWTEST_F(TimeTest, localtime_r_003, TestSize.Level1)368 HWTEST_F(TimeTest, localtime_r_003, TestSize.Level1)
369 {
370 time_t tim = 2000000000;
371 struct tm tm;
372 setenv("TZ", "Europe/London", 1);
373 tzset();
374 ASSERT_NE(localtime_r(&tim, &tm), nullptr);
375 EXPECT_EQ(18, tm.tm_mday);
376 }
377
378 /**
379 * @tc.name: localtime_r_004
380 * @tc.desc: Determine when the time zone is "Pacific/Apia" When "localtime_r" Can correctly return to local time
381 * @tc.type: FUNC
382 **/
HWTEST_F(TimeTest, localtime_r_004, TestSize.Level1)383 HWTEST_F(TimeTest, localtime_r_004, TestSize.Level1)
384 {
385 time_t tim = 2000000000;
386 struct tm tm;
387 setenv("TZ", "Pacific/Apia", 1);
388 tzset();
389 ASSERT_NE(localtime_r(&tim, &tm), nullptr);
390 EXPECT_EQ(18, tm.tm_mday);
391 }
392
393 /**
394 * @tc.name: localtime_r_005
395 * @tc.desc: Determine when the time zone is "Pacific/Honolulu" When "localtime_r" Can correctly return to local time
396 * @tc.type: FUNC
397 **/
HWTEST_F(TimeTest, localtime_r_005, TestSize.Level1)398 HWTEST_F(TimeTest, localtime_r_005, TestSize.Level1)
399 {
400 time_t tim = 2000000000;
401 struct tm tm;
402 setenv("TZ", "Pacific/Honolulu", 1);
403 tzset();
404 ASSERT_NE(localtime_r(&tim, &tm), nullptr);
405 EXPECT_EQ(17, tm.tm_mday);
406 }
407
408 /**
409 * @tc.name: localtime_r_006
410 * @tc.desc: Determine when the time zone is "Asia/Magadan" When "localtime_r" Can correctly return to local time
411 * @tc.type: FUNC
412 **/
HWTEST_F(TimeTest, localtime_r_006, TestSize.Level1)413 HWTEST_F(TimeTest, localtime_r_006, TestSize.Level1)
414 {
415 time_t tim = 2000000000;
416 struct tm tm;
417 setenv("TZ", "Asia/Magadan", 1);
418 tzset();
419 ASSERT_NE(localtime_r(&tim, &tm), nullptr);
420 EXPECT_EQ(18, tm.tm_mday);
421 }
422
423 /**
424 * @tc.name: asctime_r_001
425 * @tc.desc: Verify that the asctime_r function correctly converts a struct tm representation of a time into a
426 * formatted string
427 * @tc.type: FUNC
428 **/
HWTEST_F(TimeTest, asctime_r_001, TestSize.Level1)429 HWTEST_F(TimeTest, asctime_r_001, TestSize.Level1)
430 {
431 const struct tm tm = {};
432 char buf[BUFLEN];
433 memset(&buf, 0, sizeof(buf));
434 char* result = asctime_r(&tm, buf);
435 EXPECT_EQ(buf, result);
436 EXPECT_STREQ("Sun Jan 0 00:00:00 1900\n", buf);
437 }
438
439 /**
440 * @tc.name: ctime_r_001
441 * @tc.desc: Verify that the ctime_r function correctly converts a time value in seconds since the epoch into a
442 * formatted string.
443 * @tc.type: FUNC
444 **/
HWTEST_F(TimeTest, ctime_r_001, TestSize.Level1)445 HWTEST_F(TimeTest, ctime_r_001, TestSize.Level1)
446 {
447 setenv("TZ", "UTC", 1);
448 const time_t tim = 0;
449 char buf[BUFLEN];
450 memset(&buf, 0, sizeof(buf));
451 char* result = ctime_r(&tim, buf);
452 EXPECT_EQ(buf, result);
453 EXPECT_STREQ("Thu Jan 1 00:00:00 1970\n", buf);
454 }
455
456 /**
457 * @tc.name: nanosleep_001
458 * @tc.desc: Verify that the nanosleep function correctly suspends the execution of a thread for a specified duration.
459 * It checks that the function returns 0 when the sleep completes uninterrupted.
460 * @tc.type: FUNC
461 **/
HWTEST_F(TimeTest, nanosleep_001, TestSize.Level1)462 HWTEST_F(TimeTest, nanosleep_001, TestSize.Level1)
463 {
464 time_t time0 = time(nullptr);
465 const timespec ts = { .tv_sec = 1 };
466 int result = nanosleep(&ts, nullptr);
467 EXPECT_EQ(0, result);
468 time_t time1 = time(nullptr);
469 EXPECT_LE(static_cast<int>(1), time1 - time0);
470 }
471
472 /**
473 * @tc.name: nanosleep_002
474 * @tc.desc: Verify that the nanosleep function correctly handles an invalid sleep duration. It checks that the
475 * function returns -1 and sets errno to EINVAL when provided with a negative nanosecond value.
476 * @tc.type: FUNC
477 **/
HWTEST_F(TimeTest, nanosleep_002, TestSize.Level1)478 HWTEST_F(TimeTest, nanosleep_002, TestSize.Level1)
479 {
480 timespec ts = { .tv_nsec = -10000000 };
481 errno = 0;
482 int result = nanosleep(&ts, nullptr);
483 EXPECT_EQ(-1, result);
484 EXPECT_EQ(EINVAL, errno);
485 }
486
487 /**
488 * @tc.name: strptime_001
489 * @tc.desc: Verify the correct behavior of the strptime and strftime functions in parsing and formatting time strings.
490 * It checks that the functions correctly parse the provided time strings according to the specified format
491 * and generate accurate formatted time strings.
492 * @tc.type: FUNC
493 **/
HWTEST_F(TimeTest, strptime_001, TestSize.Level1)494 HWTEST_F(TimeTest, strptime_001, TestSize.Level1)
495 {
496 setenv("TZ", "UTC", 1);
497 struct tm tim;
498 char buf[BUFLEN];
499 memset(&buf, 0, sizeof(buf));
500
501 memset(&tim, 0, sizeof(tim));
502 strptime("09:57", "%R", &tim);
503 strftime(buf, sizeof(buf), "%H:%M", &tim);
504 EXPECT_STREQ("09:57", buf);
505
506 memset(&tim, 0, sizeof(tim));
507 strptime("09:58:55", "%T", &tim);
508 strftime(buf, sizeof(buf), "%H:%M:%S", &tim);
509 EXPECT_STREQ("09:58:55", buf);
510 }
511
512 /**
513 * @tc.name: strptime_002
514 * @tc.desc: Ensure that the "strptime" function correctly parses dates in the "%F" format and produces the expected
515 * output, which is important for various applications that require date/time processing.
516 * @tc.type: FUNC
517 **/
HWTEST_F(TimeTest, strptime_002, TestSize.Level1)518 HWTEST_F(TimeTest, strptime_002, TestSize.Level1)
519 {
520 setenv("TZ", "UTC", 1);
521 struct tm tim = {};
522 char* result = strptime("2023-10-20", "%F", &tim);
523 EXPECT_EQ('\0', *result);
524 EXPECT_EQ(123, tim.tm_year);
525 EXPECT_EQ(9, tim.tm_mon);
526 EXPECT_EQ(20, tim.tm_mday);
527 }
528
529 /**
530 * @tc.name: strftime_003
531 * @tc.desc: Ensure that the 'strptime' function correctly parses the timestamp in the '% s' format and generates
532 * the expected output
533 * @tc.type: FUNC
534 **/
HWTEST_F(TimeTest, strptime_003, TestSize.Level1)535 HWTEST_F(TimeTest, strptime_003, TestSize.Level1)
536 {
537 char buf[BUFLEN];
538 memset(&buf, 0, sizeof(buf));
539 struct tm tim = { .tm_year = 2023 - 1900, .tm_mon = 9, .tm_mday = 16, .tm_isdst = -1 };
540 setenv("TZ", "Americe/Los_Angeles", 1);
541 strftime(buf, sizeof(buf), "<%s>", &tim);
542 EXPECT_STREQ("<1697414400>", buf);
543
544 setenv("TZ", "UTC", 1);
545 strftime(buf, sizeof(buf), "<%s>", &tim);
546 EXPECT_STREQ("<1697414400>", buf);
547
548 struct tm tm;
549
550 setenv("TZ", "Asia/Shanghai", 1);
551 tzset();
552 memset(&tm, 0xff, sizeof(tm));
553
554 char* p = strptime("1697414400x", "%s", &tm);
555 EXPECT_EQ('x', *p);
556 EXPECT_EQ(0, tm.tm_sec);
557 EXPECT_EQ(0, tm.tm_min);
558 EXPECT_EQ(8, tm.tm_hour);
559 EXPECT_EQ(16, tm.tm_mday);
560 EXPECT_EQ(9, tm.tm_mon);
561 EXPECT_EQ(123, tm.tm_year);
562 EXPECT_EQ(1, tm.tm_wday);
563 EXPECT_EQ(288, tm.tm_yday);
564 EXPECT_EQ(0, tm.tm_isdst);
565 }
566
567 /**
568 * @tc.name: strptime_004
569 * @tc.desc: Ensure that the "strptime" function correctly handles different representations of the AM/PM indicator
570 * ("%p" and "%P") and does not modify the hour field when the indicator is parsed.
571 * @tc.type: FUNC
572 **/
HWTEST_F(TimeTest, strptime_004, TestSize.Level1)573 HWTEST_F(TimeTest, strptime_004, TestSize.Level1)
574 {
575 setenv("TZ", "UTC", 1);
576
577 struct tm tim = { .tm_hour = 12 };
578 EXPECT_EQ('\0', *strptime("AM", "%p", &tim));
579 EXPECT_EQ(0, tim.tm_hour);
580
581 tim = { .tm_hour = 12 };
582 EXPECT_EQ('\0', *strptime("am", "%p", &tim));
583 EXPECT_EQ(0, tim.tm_hour);
584
585 tim = { .tm_hour = 12 };
586 EXPECT_EQ('\0', *strptime("AM", "%P", &tim));
587 EXPECT_EQ(0, tim.tm_hour);
588
589 tim = { .tm_hour = 12 };
590 EXPECT_EQ('\0', *strptime("am", "%P", &tim));
591 EXPECT_EQ(0, tim.tm_hour);
592 }
593
594 /**
595 * @tc.name: strptime_005
596 * @tc.desc: Ensure that the "strptime" function correctly parses and assigns the weekday information based on the "%u"
597 * format specifier, allowing for accurate conversions between weekday representations and "struct tm"
598 *objects.
599 * @tc.type: FUNC
600 **/
HWTEST_F(TimeTest, strptime_005, TestSize.Level1)601 HWTEST_F(TimeTest, strptime_005, TestSize.Level1)
602 {
603 setenv("TZ", "UTC", 1);
604 struct tm tim = {};
605 char* result = strptime("5", "%u", &tim);
606 EXPECT_EQ('\0', *result);
607 EXPECT_EQ(5, tim.tm_wday);
608 }
609
610 /**
611 * @tc.name: strptime_006
612 * @tc.desc: Verify that the "strptime" function correctly parses and assigns the date components based on the "%v"
613 * format specifier, allowing for accurate conversions between date representations and "struct tm" objects.
614 * @tc.type: FUNC
615 **/
HWTEST_F(TimeTest, strptime_006, TestSize.Level1)616 HWTEST_F(TimeTest, strptime_006, TestSize.Level1)
617 {
618 setenv("TZ", "UTC", 1);
619 struct tm tim = {};
620 char* result = strptime("25-Mar-2023", "%v", &tim);
621 EXPECT_EQ('\0', *result);
622 EXPECT_EQ(123, tim.tm_year);
623 EXPECT_EQ(2, tim.tm_mon);
624 EXPECT_EQ(25, tim.tm_mday);
625 }
626
627 /**
628 * @tc.name: strptime_007
629 * @tc.desc: Verify that the "strptime" function properly handles invalid inputs and does not assign any
630 * values to the "struct tm" object in such cases.
631 * @tc.type: FUNC
632 **/
HWTEST_F(TimeTest, strptime_007, TestSize.Level1)633 HWTEST_F(TimeTest, strptime_007, TestSize.Level1)
634 {
635 struct tm tim;
636 char* result = strptime("x", "%s", &tim);
637 EXPECT_EQ(nullptr, result);
638 }
639
640 /**
641 * @tc.name: wcsftime_001
642 * @tc.desc: Verify that the "wcsftime" function correctly formats a "struct tm" object as a wide character string
643 * according to the specified format specifier and the current locale.
644 * @tc.type: FUNC
645 **/
HWTEST_F(TimeTest, wcsftime_001, TestSize.Level1)646 HWTEST_F(TimeTest, wcsftime_001, TestSize.Level1)
647 {
648 setenv("TZ", "UTC", 1);
649 struct tm tim;
650 memset(&tim, 0, sizeof(tm));
651 tim.tm_year = 2023 - 1900;
652 tim.tm_mon = 9;
653 tim.tm_mday = 16;
654
655 wchar_t buf[BUFLEN];
656 memset(&buf, 0, sizeof(buf));
657 size_t result = wcsftime(buf, sizeof(buf), L"%c", &tim);
658 EXPECT_EQ(24U, result);
659 EXPECT_STREQ(L"Sun Oct 16 00:00:00 2023", buf);
660 }
661
662 /**
663 * @tc.name: gettimeofday_001
664 * @tc.desc: Verify that the "gettimeofday" function is correctly retrieving the current time and that the obtained
665 * values are reasonably close to the system time obtained through other means.
666 * @tc.type: FUNC
667 **/
HWTEST_F(TimeTest, gettimeofday_001, TestSize.Level1)668 HWTEST_F(TimeTest, gettimeofday_001, TestSize.Level1)
669 {
670 timeval tv1;
671 EXPECT_EQ(gettimeofday(&tv1, nullptr), 0);
672 auto currentTime = std::chrono::system_clock::now();
673 auto duration = currentTime.time_since_epoch();
674
675 auto sec = std::chrono::duration_cast<std::chrono::seconds>(duration).count();
676 auto usec = std::chrono::duration_cast<std::chrono::microseconds>(duration).count() % 1000000;
677
678 long secDiff = sec - tv1.tv_sec;
679 long usecDiff = usec - tv1.tv_usec;
680
681 if (usecDiff < 0) {
682 --secDiff;
683 usecDiff += 1000000;
684 }
685 long maxSecDiff = 0;
686 EXPECT_LE(secDiff, maxSecDiff);
687 }