1f6603c60Sopenharmony_ci/*
2f6603c60Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
3f6603c60Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4f6603c60Sopenharmony_ci * you may not use this file except in compliance with the License.
5f6603c60Sopenharmony_ci * You may obtain a copy of the License at
6f6603c60Sopenharmony_ci *
7f6603c60Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8f6603c60Sopenharmony_ci *
9f6603c60Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10f6603c60Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11f6603c60Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12f6603c60Sopenharmony_ci * See the License for the specific language governing permissions and
13f6603c60Sopenharmony_ci * limitations under the License.
14f6603c60Sopenharmony_ci */
15f6603c60Sopenharmony_ci
16f6603c60Sopenharmony_ci#include <sys/uio.h>
17f6603c60Sopenharmony_ci
18f6603c60Sopenharmony_ci#include <grp.h>
19f6603c60Sopenharmony_ci#include <shadow.h>
20f6603c60Sopenharmony_ci#include <pwd.h>
21f6603c60Sopenharmony_ci#include <inttypes.h>
22f6603c60Sopenharmony_ci#include <iconv.h>
23f6603c60Sopenharmony_ci
24f6603c60Sopenharmony_ci#include "IoTest.h"
25f6603c60Sopenharmony_ci#include <securec.h>
26f6603c60Sopenharmony_ci
27f6603c60Sopenharmony_ciusing namespace testing::ext;
28f6603c60Sopenharmony_ci
29f6603c60Sopenharmony_ci/**
30f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_OTHER_0400
31f6603c60Sopenharmony_ci * @tc.name   toupper basic function test
32f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
33f6603c60Sopenharmony_ci */
34f6603c60Sopenharmony_ciHWTEST_F(IoTest, testToupper, Function | MediumTest | Level1)
35f6603c60Sopenharmony_ci{
36f6603c60Sopenharmony_ci    for (int i = 0; i < 26; i++) {
37f6603c60Sopenharmony_ci        int ret = _toupper('a' + i);
38f6603c60Sopenharmony_ci        EXPECT_EQ(ret, 'A' + i);
39f6603c60Sopenharmony_ci    }
40f6603c60Sopenharmony_ci}
41f6603c60Sopenharmony_ci
42f6603c60Sopenharmony_ci/**
43f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_OTHER_0500
44f6603c60Sopenharmony_ci * @tc.name   strtoimax basic function test
45f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
46f6603c60Sopenharmony_ci */
47f6603c60Sopenharmony_ciHWTEST_F(IoTest, testStrtuimax, Function | MediumTest | Level1)
48f6603c60Sopenharmony_ci{
49f6603c60Sopenharmony_ci    char nPtr[] = "12 0110 0XDEFE 0666 -1.6";
50f6603c60Sopenharmony_ci    char *endPtr = nullptr;
51f6603c60Sopenharmony_ci    intmax_t ret = strtoimax(nPtr, &endPtr, 10);
52f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 12) << "> strtoimax fail, errno = " << errno;
53f6603c60Sopenharmony_ci    EXPECT_STREQ(endPtr, " 0110 0XDEFE 0666 -1.6");
54f6603c60Sopenharmony_ci
55f6603c60Sopenharmony_ci    ret = strtoimax(endPtr, &endPtr, 2);
56f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 6) << "> strtoimax fail, errno = " << errno;
57f6603c60Sopenharmony_ci    EXPECT_STREQ(endPtr, " 0XDEFE 0666 -1.6");
58f6603c60Sopenharmony_ci
59f6603c60Sopenharmony_ci    ret = strtoimax(endPtr, &endPtr, 16);
60f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 0XDEFE) << "> strtoimax fail, errno = " << errno;
61f6603c60Sopenharmony_ci    EXPECT_STREQ(endPtr, " 0666 -1.6");
62f6603c60Sopenharmony_ci
63f6603c60Sopenharmony_ci
64f6603c60Sopenharmony_ci    ret = strtoimax(endPtr, &endPtr, 8);
65f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 0666) << "> strtoimax fail, errno = " << errno;
66f6603c60Sopenharmony_ci    EXPECT_STREQ(endPtr, " -1.6");
67f6603c60Sopenharmony_ci
68f6603c60Sopenharmony_ci    ret = strtoimax(endPtr, &endPtr, 65);
69f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 0) << "> strtoimax fail, errno = " << errno;
70f6603c60Sopenharmony_ci    EXPECT_STREQ(endPtr, " -1.6");
71f6603c60Sopenharmony_ci
72f6603c60Sopenharmony_ci    ret = strtoimax(endPtr, &endPtr, 10);
73f6603c60Sopenharmony_ci    EXPECT_EQ(ret, -1) << "> strtoimax fail, errno = " << errno;
74f6603c60Sopenharmony_ci    EXPECT_STREQ(endPtr, ".6");
75f6603c60Sopenharmony_ci
76f6603c60Sopenharmony_ci    ret = strtoimax(endPtr, &endPtr, 10);
77f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 0) << "> strtoimax fail, errno = " << errno;
78f6603c60Sopenharmony_ci    EXPECT_STREQ(endPtr, ".6");
79f6603c60Sopenharmony_ci
80f6603c60Sopenharmony_ci    char nPtr1[] = "9223372036854775807 9223372036854775808 -9223372036854775807"; // 2^63-1
81f6603c60Sopenharmony_ci    ret = strtoimax(nPtr1, &endPtr, 10);
82f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 9223372036854775807) << "> strtoimax fail, errno = " << errno;
83f6603c60Sopenharmony_ci    EXPECT_STREQ(endPtr, " 9223372036854775808 -9223372036854775807");
84f6603c60Sopenharmony_ci
85f6603c60Sopenharmony_ci    ret = strtoimax(endPtr, &endPtr, 10);
86f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 9223372036854775807) << "> strtoimax fail, errno = " << errno;
87f6603c60Sopenharmony_ci    EXPECT_STREQ(endPtr, " -9223372036854775807");
88f6603c60Sopenharmony_ci
89f6603c60Sopenharmony_ci    ret = strtoimax(endPtr, &endPtr, 10);
90f6603c60Sopenharmony_ci    EXPECT_EQ(ret, -9223372036854775807) << "> strtoimax fail, errno = " << errno;
91f6603c60Sopenharmony_ci    EXPECT_STREQ(endPtr, "");
92f6603c60Sopenharmony_ci}
93f6603c60Sopenharmony_ci
94f6603c60Sopenharmony_ci/**
95f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_OTHER_0600
96f6603c60Sopenharmony_ci * @tc.name   strtoumax basic function test
97f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
98f6603c60Sopenharmony_ci */
99f6603c60Sopenharmony_ciHWTEST_F(IoTest, testStrtoumax, Function | MediumTest | Level1)
100f6603c60Sopenharmony_ci{
101f6603c60Sopenharmony_ci    char nPtr[] = "12 0110 0XDEFE 0666 1.6";
102f6603c60Sopenharmony_ci    char *endPtr = nullptr;
103f6603c60Sopenharmony_ci    uintmax_t ret = strtoumax(nPtr, &endPtr, 10);
104f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 12ULL) << "> strtoumax fail, errno = " << errno;
105f6603c60Sopenharmony_ci    EXPECT_STREQ(endPtr, " 0110 0XDEFE 0666 1.6");
106f6603c60Sopenharmony_ci
107f6603c60Sopenharmony_ci    ret = strtoumax(endPtr, &endPtr, 2);
108f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 6ULL) << "> strtoumax fail, errno = " << errno;
109f6603c60Sopenharmony_ci    EXPECT_STREQ(endPtr, " 0XDEFE 0666 1.6");
110f6603c60Sopenharmony_ci
111f6603c60Sopenharmony_ci    ret = strtoumax(endPtr, &endPtr, 16);
112f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 57086ULL) << "> strtoumax fail, errno = " << errno;
113f6603c60Sopenharmony_ci    EXPECT_STREQ(endPtr, " 0666 1.6");
114f6603c60Sopenharmony_ci
115f6603c60Sopenharmony_ci
116f6603c60Sopenharmony_ci    ret = strtoumax(endPtr, &endPtr, 8);
117f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 438ULL) << "> strtoumax fail, errno = " << errno;
118f6603c60Sopenharmony_ci    EXPECT_STREQ(endPtr, " 1.6");
119f6603c60Sopenharmony_ci
120f6603c60Sopenharmony_ci    ret = strtoumax(endPtr, &endPtr, 65);
121f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 0ULL) << "> strtoumax fail, errno = " << errno;
122f6603c60Sopenharmony_ci    EXPECT_STREQ(endPtr, " 1.6");
123f6603c60Sopenharmony_ci
124f6603c60Sopenharmony_ci    ret = strtoumax(endPtr, &endPtr, 10);
125f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 1ULL) << "> strtoumax fail, errno = " << errno;
126f6603c60Sopenharmony_ci    EXPECT_STREQ(endPtr, ".6");
127f6603c60Sopenharmony_ci
128f6603c60Sopenharmony_ci    ret = strtoumax(endPtr, &endPtr, 10);
129f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 0ULL) << "> strtoumax fail, errno = " << errno;
130f6603c60Sopenharmony_ci    EXPECT_STREQ(endPtr, ".6");
131f6603c60Sopenharmony_ci
132f6603c60Sopenharmony_ci    char nPtr1[] = "18446744073709551615 18446744073709551616"; // 2^64-1
133f6603c60Sopenharmony_ci    ret = strtoumax(nPtr1, &endPtr, 10);
134f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 18446744073709551615ULL) << "> strtoumax fail, errno = " << errno;
135f6603c60Sopenharmony_ci    EXPECT_STREQ(endPtr, " 18446744073709551616");
136f6603c60Sopenharmony_ci
137f6603c60Sopenharmony_ci    ret = strtoumax(endPtr, &endPtr, 10);
138f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 18446744073709551615ULL) << "> strtoumax fail, errno = " << errno;
139f6603c60Sopenharmony_ci    EXPECT_STREQ(endPtr, "");
140f6603c60Sopenharmony_ci}
141f6603c60Sopenharmony_ci
142f6603c60Sopenharmony_ci/**
143f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_OTHER_0700
144f6603c60Sopenharmony_ci * @tc.name   writev basic function test
145f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
146f6603c60Sopenharmony_ci */
147f6603c60Sopenharmony_ciHWTEST_F(IoTest, testWritev, Function | MediumTest | Level1)
148f6603c60Sopenharmony_ci{
149f6603c60Sopenharmony_ci    struct iovec iov[2];
150f6603c60Sopenharmony_ci    char buf1[6] = {0};
151f6603c60Sopenharmony_ci    iov[0].iov_base = buf1;
152f6603c60Sopenharmony_ci    iov[0].iov_len = sizeof(buf1) - 1;
153f6603c60Sopenharmony_ci
154f6603c60Sopenharmony_ci    char buf2[6] = {0};
155f6603c60Sopenharmony_ci    iov[1].iov_base = buf2;
156f6603c60Sopenharmony_ci    iov[1].iov_len = sizeof(buf2) - 1;
157f6603c60Sopenharmony_ci
158f6603c60Sopenharmony_ci    FILE *fp = nullptr;
159f6603c60Sopenharmony_ci    INIT_TEST_FILE(fp);
160f6603c60Sopenharmony_ci    FOPEN_READ(fp);
161f6603c60Sopenharmony_ci    int fd = 0;
162f6603c60Sopenharmony_ci    FILENO(fp);
163f6603c60Sopenharmony_ci    ssize_t ret = readv(fd, iov, 2);
164f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 10);
165f6603c60Sopenharmony_ci    EXPECT_STREQ(buf1, "hello");
166f6603c60Sopenharmony_ci    EXPECT_STREQ(buf2, " worl");
167f6603c60Sopenharmony_ci    EXPECT_NE(fclose(fp), -1) << "> fclose fail, errno = " << errno;
168f6603c60Sopenharmony_ci
169f6603c60Sopenharmony_ci    FOPEN_WRITE(fp);
170f6603c60Sopenharmony_ci    FILENO(fp);
171f6603c60Sopenharmony_ci    ret = writev(fd, iov, 2);
172f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 10);
173f6603c60Sopenharmony_ci    EXPECT_NE(fclose(fp), -1) << "> fclose fail, errno = " << errno;
174f6603c60Sopenharmony_ci
175f6603c60Sopenharmony_ci    FOPEN_READ(fp);
176f6603c60Sopenharmony_ci    char str[50] = {0};
177f6603c60Sopenharmony_ci    char *gStr = fgets(str, sizeof(str), fp);
178f6603c60Sopenharmony_ci    EXPECT_STREQ(gStr, str);
179f6603c60Sopenharmony_ci    EXPECT_STREQ(str, "hello worl");
180f6603c60Sopenharmony_ci    EXPECT_NE(fclose(fp), -1) << "> fclose fail, errno = " << errno;
181f6603c60Sopenharmony_ci}
182f6603c60Sopenharmony_ci
183f6603c60Sopenharmony_ci/**
184f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_OTHER_0800
185f6603c60Sopenharmony_ci * @tc.name   pread basic function test
186f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
187f6603c60Sopenharmony_ci */
188f6603c60Sopenharmony_ciHWTEST_F(IoTest, testPread, Function | MediumTest | Level1)
189f6603c60Sopenharmony_ci{
190f6603c60Sopenharmony_ci    FILE *fp = nullptr;
191f6603c60Sopenharmony_ci    FOPEN_WRITE(fp);
192f6603c60Sopenharmony_ci    int fd = 0;
193f6603c60Sopenharmony_ci    FILENO(fp);
194f6603c60Sopenharmony_ci    char str[50] = "hello world";
195f6603c60Sopenharmony_ci    ssize_t retR = pwrite(fd, str, strlen(str), 6);
196f6603c60Sopenharmony_ci    EXPECT_EQ(retR, 11);
197f6603c60Sopenharmony_ci    EXPECT_NE(fclose(fp), -1) << "> fclose fail, errno = " << errno;
198f6603c60Sopenharmony_ci
199f6603c60Sopenharmony_ci    FOPEN_READ(fp);
200f6603c60Sopenharmony_ci    FILENO(fp);
201f6603c60Sopenharmony_ci    char buf[50] = {0};
202f6603c60Sopenharmony_ci    retR = pread(fd, buf, strlen(str), 6);
203f6603c60Sopenharmony_ci    EXPECT_EQ(retR, 11);
204f6603c60Sopenharmony_ci    EXPECT_STREQ(buf, "hello world");
205f6603c60Sopenharmony_ci    EXPECT_NE(fclose(fp), -1) << "> fclose fail, errno = " << errno;
206f6603c60Sopenharmony_ci}
207f6603c60Sopenharmony_ci
208f6603c60Sopenharmony_ci/**
209f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_OTHER_0900
210f6603c60Sopenharmony_ci * @tc.name   strptime basic function test
211f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
212f6603c60Sopenharmony_ci */
213f6603c60Sopenharmony_ciHWTEST_F(IoTest, testStrptime, Function | MediumTest | Level1)
214f6603c60Sopenharmony_ci{
215f6603c60Sopenharmony_ci    struct tm tm;
216f6603c60Sopenharmony_ci    int memRet = -1;
217f6603c60Sopenharmony_ci    memRet = memset_s(&tm, sizeof(struct tm), 0, sizeof(struct tm));
218f6603c60Sopenharmony_ci    EXPECT_EQ(0, memRet);
219f6603c60Sopenharmony_ci    char *ret = strptime("2020-10-29 21:24:00abc", "%Y-%m-%d %H:%M:%S", &tm);
220f6603c60Sopenharmony_ci    EXPECT_STREQ(ret, "abc");
221f6603c60Sopenharmony_ci    EXPECT_EQ(tm.tm_year, 120);
222f6603c60Sopenharmony_ci    EXPECT_EQ(tm.tm_mon, 9);
223f6603c60Sopenharmony_ci    EXPECT_EQ(tm.tm_mday, 29);
224f6603c60Sopenharmony_ci    EXPECT_EQ(tm.tm_hour, 21);
225f6603c60Sopenharmony_ci    EXPECT_EQ(tm.tm_min, 24);
226f6603c60Sopenharmony_ci
227f6603c60Sopenharmony_ci    ret = strptime("14 Oct October 20 09:24:00 Sat Saturday 363", "%d %b %B %y %I:%M:%S %a %A %j", &tm);
228f6603c60Sopenharmony_ci    EXPECT_STREQ(ret, "");
229f6603c60Sopenharmony_ci    EXPECT_EQ(tm.tm_year, 120);
230f6603c60Sopenharmony_ci    EXPECT_EQ(tm.tm_mon, 9);
231f6603c60Sopenharmony_ci    EXPECT_EQ(tm.tm_mday, 14);
232f6603c60Sopenharmony_ci    EXPECT_EQ(tm.tm_hour, 9);
233f6603c60Sopenharmony_ci    EXPECT_EQ(tm.tm_wday, 6);
234f6603c60Sopenharmony_ci    EXPECT_EQ(tm.tm_yday, 362);
235f6603c60Sopenharmony_ci}
236f6603c60Sopenharmony_ci
237f6603c60Sopenharmony_ci/**
238f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_IO_OTHER_1000
239f6603c60Sopenharmony_ci * @tc.name   iconv basic function test
240f6603c60Sopenharmony_ci * @tc.desc   [C- SOFTWARE -0200]
241f6603c60Sopenharmony_ci */
242f6603c60Sopenharmony_ciHWTEST_F(IoTest, testIconv, Function | MediumTest | Level1)
243f6603c60Sopenharmony_ci{
244f6603c60Sopenharmony_ci    char inBuf[50] = "hello";
245f6603c60Sopenharmony_ci    size_t inLen = strlen(inBuf);
246f6603c60Sopenharmony_ci    char outBuf[50] = {0};
247f6603c60Sopenharmony_ci    size_t outLen = sizeof(outBuf);
248f6603c60Sopenharmony_ci    char *inSrc = inBuf;
249f6603c60Sopenharmony_ci    char *outSrc = outBuf;
250f6603c60Sopenharmony_ci    iconv_t cd = iconv_open("UTF_32", "UTF_16");
251f6603c60Sopenharmony_ci    size_t ret = iconv(cd, &inSrc, &inLen, &outSrc, &outLen);
252f6603c60Sopenharmony_ci    EXPECT_EQ(ret, 4294967295U) << "iconv fail, errno = " << errno;
253f6603c60Sopenharmony_ci    EXPECT_STREQ(inSrc, "o") << "iconv fail, errno = " << errno;
254f6603c60Sopenharmony_ci    EXPECT_EQ(inLen, 1U) << "iconv fail, errno = " << errno;
255f6603c60Sopenharmony_ci    EXPECT_STREQ(outSrc, "") << "iconv fail, errno = " << errno;
256f6603c60Sopenharmony_ci    EXPECT_EQ(outLen, 42U) << "iconv fail, errno = " << errno;
257f6603c60Sopenharmony_ci    EXPECT_STREQ(outBuf, "") << "iconv fail, errno = " << errno;
258f6603c60Sopenharmony_ci    EXPECT_EQ(iconv_close(cd), 0) << "iconv_close fail, errn = " << errno;
259f6603c60Sopenharmony_ci}