1/**
2 * Copyright (c) 2022 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 <stdlib.h>
17#include <time.h>
18#include "localtime_data.h"
19#include "functionalext.h"
20
21static time_t gTime = 1659177614;
22static int16_t gYearBase = 1900;
23static int16_t gBufferSize = 500;
24
25extern struct tm *__localtime64 (const time_t *);
26
27/**
28 * @tc.name      : localtime_0100
29 * @tc.desc      : according to different time zones, converts the time in seconds from 1970-1-1 0:00
30 * to the current time system offset to local time
31 * @tc.level     : Level 0
32 */
33void localtime_0100(void)
34{
35    for (int32_t i = 0; i < (int32_t)(sizeof(test_localtime_data) / sizeof(test_localtime_data[0])); i++) {
36        const char *handlerChar = test_handle_path(test_localtime_data[i].tz);
37        if (!handlerChar) {
38            t_error("localtime_0100 failed: handlerChar is NULL\n");
39            continue;
40        }
41
42        setenv("TZ", handlerChar, 1);
43        tzset();
44        struct tm *localtm;
45        localtm = localtime(&gTime);
46        char buff[gBufferSize];
47        int cnt = sprintf(buff, "%d-%d-%d %d:%d:%d wday=%d,yday=%d,isdst=%d,gmtoff=%ld,zone=%s",
48            (localtm->tm_year+gYearBase), localtm->tm_mon, localtm->tm_mday, localtm->tm_hour,
49            localtm->tm_min, localtm->tm_sec, localtm->tm_wday, localtm->tm_yday, localtm->tm_isdst,
50            localtm->tm_gmtoff, localtm->tm_zone);
51        EXPECT_TRUE("localtime_0100", cnt > 0);
52        EXPECT_STREQ("localtime_0100", test_localtime_data[i].result, buff);
53    }
54}
55
56/**
57 * @tc.name      : localtime64_0100
58 * @tc.desc      : according to different time zones, converts the time in seconds from 1970-1-1 0:00
59 * to the current time system offset to local time
60 * @tc.level     : Level 0
61 */
62void localtime64_0100(void)
63{
64    for (int32_t i = 0; i < (int32_t)(sizeof(test_localtime_data) / sizeof(test_localtime_data[0])); i++) {
65        const char *handlerChar = test_handle_path(test_localtime_data[i].tz);
66        if (!handlerChar) {
67            t_error("localtime64_0100 failed: handlerChar is NULL\n");
68            continue;
69        }
70
71        setenv("TZ", handlerChar, 1);
72        tzset();
73        struct tm *localtm;
74        localtm = __localtime64(&gTime);
75        char buff[gBufferSize];
76        int cnt = sprintf(buff, "%d-%d-%d %d:%d:%d wday=%d,yday=%d,isdst=%d,gmtoff=%ld,zone=%s",
77            (localtm->tm_year+gYearBase), localtm->tm_mon, localtm->tm_mday, localtm->tm_hour,
78            localtm->tm_min, localtm->tm_sec, localtm->tm_wday, localtm->tm_yday, localtm->tm_isdst,
79            localtm->tm_gmtoff, localtm->tm_zone);
80        EXPECT_TRUE("localtime64_0100", cnt > 0);
81        EXPECT_STREQ("localtime64_0100", test_localtime_data[i].result, buff);
82    }
83}
84
85int main(void)
86{
87    localtime_0100();
88    localtime64_0100();
89    return t_status;
90}