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