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 "functionalext.h"
19#include "timegm_data.h"
20
21#define __TEST_DATA_YEAR__ 121
22#define __TEST_DATA_MONTH__ 9
23#define __TEST_DATA_DAY__ 3
24#define __TEST_DATA_HOUR__ 9
25#define __TEST_DATA_MINUTE__ 12
26
27extern time_t __time64(time_t *);
28
29struct time_struct {
30    const char *tz;
31};
32
33static const struct time_struct gResultData[] = {
34    {"Asia/Shanghai"},
35    {"Asia/Tokyo"},
36    {"Europe/Moscow"},
37    {"America/New_York"},
38    {"Europe/Berlin"},
39};
40
41/**
42 * @tc.name      : time_0100
43 * @tc.desc      : according to different time zones, get time
44 * @tc.level     : Level 0
45 */
46void time_0100(void)
47{
48    for (int32_t i = 0; i < (int32_t)(sizeof(gResultData) / sizeof(gResultData[0])); i++) {
49        const char *handlerChar = test_handle_path(gResultData[i].tz);
50        if (!handlerChar) {
51            t_error("time_0100 failed: handlerChar is NULL\n");
52            continue;
53        }
54
55        setenv("TZ", handlerChar, 1);
56        tzset();
57        system("date '2021-10-3 9:12:12' > /dev/NULL");
58        time_t curClock;
59        time_t t = time(&curClock);
60        EXPECT_TRUE("time_0100", t > 0);
61        struct tm *localtm = localtime(&curClock);
62        if (!localtm) {
63            EXPECT_PTRNE("time_0100", localtm, NULL);
64            return;
65        }
66        EXPECT_EQ("time_0100", __TEST_DATA_YEAR__, localtm->tm_year);
67        EXPECT_EQ("time_0100", __TEST_DATA_MONTH__, localtm->tm_mon);
68        EXPECT_EQ("time_0100", __TEST_DATA_DAY__, localtm->tm_mday);
69        EXPECT_EQ("time_0100", __TEST_DATA_HOUR__, localtm->tm_hour);
70        EXPECT_EQ("time_0100", __TEST_DATA_MINUTE__, localtm->tm_min);
71    }
72}
73
74/**
75 * @tc.name      : time64_0100
76 * @tc.desc      : according to different time zones, get time
77 * @tc.level     : Level 0
78 */
79void time64_0100(void)
80{
81    for (int32_t i = 0; i < (int32_t)(sizeof(gResultData) / sizeof(gResultData[0])); i++) {
82        const char *handlerChar = test_handle_path(gResultData[i].tz);
83        if (!handlerChar) {
84            t_error("time64_0100 failed: handlerChar is NULL\n");
85            continue;
86        }
87
88        setenv("TZ", handlerChar, 1);
89        tzset();
90        system("date '2021-10-3 9:12:12' > /dev/NULL");
91        time_t curClock;
92        time_t t = __time64(&curClock);
93        EXPECT_TRUE("time64_0100", t > 0);
94        struct tm *localtm = localtime(&curClock);
95        if (!localtm) {
96            EXPECT_PTRNE("time64_0100", localtm, NULL);
97            return;
98        }
99        EXPECT_EQ("time64_0100", __TEST_DATA_YEAR__, localtm->tm_year);
100        EXPECT_EQ("time64_0100", __TEST_DATA_MONTH__, localtm->tm_mon);
101        EXPECT_EQ("time64_0100", __TEST_DATA_DAY__, localtm->tm_mday);
102        EXPECT_EQ("time64_0100", __TEST_DATA_HOUR__, localtm->tm_hour);
103        EXPECT_EQ("time64_0100", __TEST_DATA_MINUTE__, localtm->tm_min);
104    }
105}
106
107int main(void)
108{
109    time_0100();
110    time64_0100();
111    return t_status;
112}