1f6603c60Sopenharmony_ci/*
2f6603c60Sopenharmony_ci * Copyright (c) 2020-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 * limitations under the License.
13f6603c60Sopenharmony_ci */
14f6603c60Sopenharmony_ci#include "FileSystemTest.h"
15f6603c60Sopenharmony_ci#include <stdio.h>
16f6603c60Sopenharmony_ci#include <string.h>
17f6603c60Sopenharmony_ci#include <stdlib.h>
18f6603c60Sopenharmony_ci
19f6603c60Sopenharmony_ci#include <sys/stat.h>
20f6603c60Sopenharmony_ci#include <sys/types.h>
21f6603c60Sopenharmony_ci#include <fcntl.h>
22f6603c60Sopenharmony_ci#include <unistd.h>
23f6603c60Sopenharmony_ci#include <dirent.h>
24f6603c60Sopenharmony_ci#include <ftw.h>
25f6603c60Sopenharmony_ci#include <libgen.h>
26f6603c60Sopenharmony_ci
27f6603c60Sopenharmony_ci#include <gtest/gtest.h>
28f6603c60Sopenharmony_ci
29f6603c60Sopenharmony_ci#include "utils.h"
30f6603c60Sopenharmony_ci#include "log.h"
31f6603c60Sopenharmony_ci#include "KernelConstants.h"
32f6603c60Sopenharmony_ci#include "libfs.h"
33f6603c60Sopenharmony_ci
34f6603c60Sopenharmony_ciusing namespace testing::ext;
35f6603c60Sopenharmony_ci
36f6603c60Sopenharmony_ci/**
37f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_FS_UNISTD_0100
38f6603c60Sopenharmony_ci * @tc.name     basic function test : access check file exists.
39f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
40f6603c60Sopenharmony_ci */
41f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testAccess, Function | MediumTest | Level0)
42f6603c60Sopenharmony_ci{
43f6603c60Sopenharmony_ci    int fd = 0;
44f6603c60Sopenharmony_ci    fd = creat(FILE0, 0777);
45f6603c60Sopenharmony_ci    EXPECT_NE(fd, -1) << "> creat faild errno = " << errno;
46f6603c60Sopenharmony_ci    EXPECT_NE(close(fd), -1) << "> close errno = " << errno;
47f6603c60Sopenharmony_ci    EXPECT_EQ(access(FILE0, F_OK), 0) << "> access F_OK errno = " << errno;
48f6603c60Sopenharmony_ci}
49f6603c60Sopenharmony_ci
50f6603c60Sopenharmony_ci/**
51f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_FS_UNISTD_0110
52f6603c60Sopenharmony_ci * @tc.name     basic function test : test access with ENOENT
53f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
54f6603c60Sopenharmony_ci */
55f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testAccessEnoent, Function | MediumTest | Level0)
56f6603c60Sopenharmony_ci{
57f6603c60Sopenharmony_ci    EXPECT_EQ(access(FILE0, F_OK), -1) << "> access F_OK expect faild but success";
58f6603c60Sopenharmony_ci    EXPECT_EQ(errno, ENOENT);
59f6603c60Sopenharmony_ci}
60f6603c60Sopenharmony_ci
61f6603c60Sopenharmony_ci#if defined(LITE_FS_JFFS2)
62f6603c60Sopenharmony_ci/**
63f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_FS_UNISTD_0120
64f6603c60Sopenharmony_ci * @tc.name     basic function test : access check file R_OK.
65f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
66f6603c60Sopenharmony_ci */
67f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testAccessRok, Function | MediumTest | Level1)
68f6603c60Sopenharmony_ci{
69f6603c60Sopenharmony_ci    int fd = 0;
70f6603c60Sopenharmony_ci    fd = creat(FILE0, 0777);
71f6603c60Sopenharmony_ci    EXPECT_NE(fd, -1) << "> creat faild errno = " << errno;
72f6603c60Sopenharmony_ci    EXPECT_NE(close(fd), -1) << "> close errno = " << errno;
73f6603c60Sopenharmony_ci    EXPECT_EQ(access(FILE0, R_OK), 0) << "> access F_OK errno = " << errno;
74f6603c60Sopenharmony_ci}
75f6603c60Sopenharmony_ci#endif
76f6603c60Sopenharmony_ci
77f6603c60Sopenharmony_ci#if defined(LITE_FS_JFFS2)
78f6603c60Sopenharmony_ci/**
79f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_FS_UNISTD_0130
80f6603c60Sopenharmony_ci * @tc.name     basic function test : access check file W_OK.
81f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
82f6603c60Sopenharmony_ci */
83f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testAccessWok, Function | MediumTest | Level1)
84f6603c60Sopenharmony_ci{
85f6603c60Sopenharmony_ci    int fd = 0;
86f6603c60Sopenharmony_ci    fd = creat(FILE0, 0777);
87f6603c60Sopenharmony_ci    EXPECT_NE(fd, -1) << "> creat faild errno = " << errno;
88f6603c60Sopenharmony_ci    EXPECT_NE(close(fd), -1) << "> close errno = " << errno;
89f6603c60Sopenharmony_ci    EXPECT_EQ(access(FILE0, W_OK), 0) << "> access F_OK errno = " << errno;
90f6603c60Sopenharmony_ci}
91f6603c60Sopenharmony_ci#endif
92f6603c60Sopenharmony_ci
93f6603c60Sopenharmony_ci#if defined(LITE_FS_JFFS2)
94f6603c60Sopenharmony_ci/**
95f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_FS_UNISTD_0140
96f6603c60Sopenharmony_ci * @tc.name     basic function test : access check file X_OK
97f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
98f6603c60Sopenharmony_ci */
99f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testAccessXok, Function | MediumTest | Level1)
100f6603c60Sopenharmony_ci{
101f6603c60Sopenharmony_ci    int fd = 0;
102f6603c60Sopenharmony_ci    fd = creat(FILE0, 0777);
103f6603c60Sopenharmony_ci    EXPECT_NE(fd, -1) << "> creat faild errno = " << errno;
104f6603c60Sopenharmony_ci    EXPECT_NE(close(fd), -1) << "> close errno = " << errno;
105f6603c60Sopenharmony_ci    EXPECT_EQ(access(FILE0, X_OK), 0) << "> access F_OK errno = " << errno;
106f6603c60Sopenharmony_ci}
107f6603c60Sopenharmony_ci#endif
108f6603c60Sopenharmony_ci
109f6603c60Sopenharmony_ci/**
110f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_FS_UNISTD_0200
111f6603c60Sopenharmony_ci * @tc.name     basic function test : switch to the current working directory.
112f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
113f6603c60Sopenharmony_ci */
114f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testChdir, Function | MediumTest | Level1)
115f6603c60Sopenharmony_ci{
116f6603c60Sopenharmony_ci    char testDir[MAX_PATH_SIZE];
117f6603c60Sopenharmony_ci    const char *expectDirStandard = TOP_DIR "/" DIR0;
118f6603c60Sopenharmony_ci    EXPECT_NE(mkdir(DIR0, 0777), -1) << "> mkdir errno = " << errno;
119f6603c60Sopenharmony_ci    EXPECT_NE(chdir(DIR0), -1) << "> chdir errno = " << errno;
120f6603c60Sopenharmony_ci    EXPECT_NE(getcwd(testDir, sizeof(testDir)), nullptr) << "> getcwd errno = " << errno;
121f6603c60Sopenharmony_ci    EXPECT_NE(chdir(TOP_DIR), -1) << "> chdir errno = " << errno;
122f6603c60Sopenharmony_ci
123f6603c60Sopenharmony_ci    EXPECT_STREQ(testDir, expectDirStandard);
124f6603c60Sopenharmony_ci    LOG("> expectDirStandard  = %s", expectDirStandard);
125f6603c60Sopenharmony_ci    LOG("> testDir   = %s", testDir);
126f6603c60Sopenharmony_ci}
127f6603c60Sopenharmony_ci
128f6603c60Sopenharmony_ci/**
129f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_FS_UNISTD_0210
130f6603c60Sopenharmony_ci * @tc.name     basic function test : test chdir with ENOENT
131f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
132f6603c60Sopenharmony_ci */
133f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testChdirEnoent, Function | MediumTest | Level3)
134f6603c60Sopenharmony_ci{
135f6603c60Sopenharmony_ci    const char *fileName = "not_exist_file";
136f6603c60Sopenharmony_ci    EXPECT_EQ(chdir(fileName), -1) << "> chdir errno = " << errno;
137f6603c60Sopenharmony_ci    EXPECT_EQ(errno, ENOENT);
138f6603c60Sopenharmony_ci    EXPECT_NE(chdir(TOP_DIR), -1) << "> chdir errno = " << errno;
139f6603c60Sopenharmony_ci}
140f6603c60Sopenharmony_ci
141f6603c60Sopenharmony_ci/**
142f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_FS_UNISTD_0220
143f6603c60Sopenharmony_ci * @tc.name     basic function test : test chdir with ENAMETOOLONG
144f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
145f6603c60Sopenharmony_ci */
146f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testChdirEnametoolong, Function | MediumTest | Level3)
147f6603c60Sopenharmony_ci{
148f6603c60Sopenharmony_ci    const char *fileName = "12345678901234567890123456789012345678901234567890\
149f6603c60Sopenharmony_ci                            12345678901234567890123456789012345678901234567890\
150f6603c60Sopenharmony_ci                            12345678901234567890123456789012345678901234567890\
151f6603c60Sopenharmony_ci                            12345678901234567890123456789012345678901234567890\
152f6603c60Sopenharmony_ci                            12345678901234567890123456789012345678901234567890\
153f6603c60Sopenharmony_ci                            12345678901234567890123456789012345678901234567890\
154f6603c60Sopenharmony_ci                            12345678901234567890123456789012345678901234567890\
155f6603c60Sopenharmony_ci                            12345678901234567890123456789012345678901234567890";
156f6603c60Sopenharmony_ci    EXPECT_EQ(chdir(fileName), -1) << "> chdir errno = " << errno;
157f6603c60Sopenharmony_ci    EXPECT_EQ(errno, ENAMETOOLONG);
158f6603c60Sopenharmony_ci    EXPECT_NE(chdir(TOP_DIR), -1) << "> chdir errno = " << errno;
159f6603c60Sopenharmony_ci}
160f6603c60Sopenharmony_ci
161f6603c60Sopenharmony_ci/**
162f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_FS_UNISTD_0230
163f6603c60Sopenharmony_ci * @tc.name     basic function test : test chdir with ENOTDIR
164f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
165f6603c60Sopenharmony_ci */
166f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testChdirEnotdir, Function | MediumTest | Level3)
167f6603c60Sopenharmony_ci{
168f6603c60Sopenharmony_ci    int fd = 0;
169f6603c60Sopenharmony_ci    const char *fileName = FILE0;
170f6603c60Sopenharmony_ci    fd = creat(FILE0, 0777);
171f6603c60Sopenharmony_ci    EXPECT_NE(fd, -1) << "> creat faild errno = " << errno;
172f6603c60Sopenharmony_ci    EXPECT_NE(close(fd), -1) << "> close errno = " << errno;
173f6603c60Sopenharmony_ci    EXPECT_EQ(chdir(fileName), -1) << "> chdir errno = " << errno;
174f6603c60Sopenharmony_ci    EXPECT_EQ(errno, ENOTDIR);
175f6603c60Sopenharmony_ci    EXPECT_NE(chdir(TOP_DIR), -1) << "> chdir errno = " << errno;
176f6603c60Sopenharmony_ci}
177f6603c60Sopenharmony_ci#if defined(LITE_FS_VFAT)
178f6603c60Sopenharmony_ci/**
179f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_FS_UNISTD_0500
180f6603c60Sopenharmony_ci * @tc.name     basic function test : using ftruncate to change the file size
181f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
182f6603c60Sopenharmony_ci */
183f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testFtruncate, Function | MediumTest | Level1)
184f6603c60Sopenharmony_ci{
185f6603c60Sopenharmony_ci    struct stat statbuf;
186f6603c60Sopenharmony_ci    char writeBuf[] = "this is a file";
187f6603c60Sopenharmony_ci    int fd = 0;
188f6603c60Sopenharmony_ci
189f6603c60Sopenharmony_ci    fd = open(FILE0, O_CREAT | O_RDWR, 0777);
190f6603c60Sopenharmony_ci    EXPECT_NE(fd, -1) << "> open faild errno = " << errno;
191f6603c60Sopenharmony_ci    EXPECT_NE(write(fd, writeBuf, sizeof(writeBuf)), -1) << "> write errno = " << errno;
192f6603c60Sopenharmony_ci
193f6603c60Sopenharmony_ci    EXPECT_NE(ftruncate(fd, 1000), -1) << "truncate errno = " << errno;
194f6603c60Sopenharmony_ci    EXPECT_NE(close(fd), -1) << "> close errno = " << errno;
195f6603c60Sopenharmony_ci
196f6603c60Sopenharmony_ci    EXPECT_NE(stat(FILE0, &statbuf), -1) << "> fstat errno = " << errno;
197f6603c60Sopenharmony_ci    EXPECT_EQ(statbuf.st_size, 1000);
198f6603c60Sopenharmony_ci}
199f6603c60Sopenharmony_ci#endif
200f6603c60Sopenharmony_ci
201f6603c60Sopenharmony_ci#if defined(LITE_FS_VFAT)
202f6603c60Sopenharmony_ci/**
203f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_FS_UNISTD_0501
204f6603c60Sopenharmony_ci * @tc.name     basic function test : test ftruncate with EINVAL
205f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
206f6603c60Sopenharmony_ci */
207f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testFtruncateEinval, Function | MediumTest | Level3)
208f6603c60Sopenharmony_ci{
209f6603c60Sopenharmony_ci    char writeBuf[] = "this is a file";
210f6603c60Sopenharmony_ci    int fd = 0;
211f6603c60Sopenharmony_ci
212f6603c60Sopenharmony_ci    fd = open(FILE0, O_CREAT | O_RDWR, 0777);
213f6603c60Sopenharmony_ci    EXPECT_NE(fd, -1) << "> open faild errno = " << errno;
214f6603c60Sopenharmony_ci    EXPECT_NE(write(fd, writeBuf, sizeof(writeBuf)), -1) << "> write errno = " << errno;
215f6603c60Sopenharmony_ci
216f6603c60Sopenharmony_ci    EXPECT_EQ(ftruncate(fd, -1), -1);
217f6603c60Sopenharmony_ci    EXPECT_EQ(errno, EINVAL);
218f6603c60Sopenharmony_ci    EXPECT_NE(close(fd), -1) << "> close errno = " << errno;
219f6603c60Sopenharmony_ci}
220f6603c60Sopenharmony_ci#endif
221f6603c60Sopenharmony_ci
222f6603c60Sopenharmony_ci#if defined(LITE_FS_VFAT)
223f6603c60Sopenharmony_ci/**
224f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_FS_UNISTD_0502
225f6603c60Sopenharmony_ci * @tc.name     basic function test : test ftruncate with ENOSYS
226f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
227f6603c60Sopenharmony_ci */
228f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testFtruncateEacces, Function | MediumTest | Level3)
229f6603c60Sopenharmony_ci{
230f6603c60Sopenharmony_ci    EXPECT_EQ(ftruncate(STDERR_FILENO, 10), -1);
231f6603c60Sopenharmony_ci    EXPECT_EQ(errno, ENOSYS);
232f6603c60Sopenharmony_ci}
233f6603c60Sopenharmony_ci#endif
234f6603c60Sopenharmony_ci
235f6603c60Sopenharmony_ci#if defined(LITE_FS_VFAT)
236f6603c60Sopenharmony_ci/**
237f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_FS_UNISTD_0503
238f6603c60Sopenharmony_ci * @tc.name     basic function test : test ftruncate with EBADF
239f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
240f6603c60Sopenharmony_ci */
241f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testFtruncateEbadf, Function | MediumTest | Level3)
242f6603c60Sopenharmony_ci{
243f6603c60Sopenharmony_ci    int invalidFd = 99999;
244f6603c60Sopenharmony_ci    EXPECT_EQ(ftruncate(invalidFd, 10), -1);
245f6603c60Sopenharmony_ci    EXPECT_EQ(errno, EBADF);
246f6603c60Sopenharmony_ci}
247f6603c60Sopenharmony_ci#endif
248f6603c60Sopenharmony_ci
249f6603c60Sopenharmony_ci#if defined(LITE_FS_VFAT)
250f6603c60Sopenharmony_ci/**
251f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_FS_UNISTD_0510
252f6603c60Sopenharmony_ci * @tc.name     basic function test : using truncate functions to change the file size
253f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
254f6603c60Sopenharmony_ci */
255f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testTruncate, Function | MediumTest | Level1)
256f6603c60Sopenharmony_ci{
257f6603c60Sopenharmony_ci    struct stat statbuf;
258f6603c60Sopenharmony_ci    char writeBuf[] = "this is a file";
259f6603c60Sopenharmony_ci    int fd = 0;
260f6603c60Sopenharmony_ci
261f6603c60Sopenharmony_ci    fd = open(FILE0, O_CREAT | O_RDWR, 0777);
262f6603c60Sopenharmony_ci    EXPECT_NE(fd, -1) << "> open faild errno = " << errno;
263f6603c60Sopenharmony_ci    EXPECT_NE(write(fd, writeBuf, sizeof(writeBuf)), -1) << "> write errno = " << errno;
264f6603c60Sopenharmony_ci    EXPECT_NE(close(fd), -1) << "> close errno = " << errno;
265f6603c60Sopenharmony_ci
266f6603c60Sopenharmony_ci    EXPECT_NE(truncate(FILE0, 100), -1) << "truncate errno = " << errno;
267f6603c60Sopenharmony_ci    EXPECT_NE(stat(FILE0, &statbuf), -1) << "> fstat errno = " << errno;
268f6603c60Sopenharmony_ci    EXPECT_EQ(statbuf.st_size, 100);
269f6603c60Sopenharmony_ci}
270f6603c60Sopenharmony_ci#endif
271f6603c60Sopenharmony_ci
272f6603c60Sopenharmony_ci#if defined(LITE_FS_VFAT)
273f6603c60Sopenharmony_ci/**
274f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_FS_UNISTD_0511
275f6603c60Sopenharmony_ci * @tc.name     basic function test : test truncate with EINVAL
276f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
277f6603c60Sopenharmony_ci */
278f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testTruncateEinval, Function | MediumTest | Level3)
279f6603c60Sopenharmony_ci{
280f6603c60Sopenharmony_ci    char writeBuf[] = "this is a file";
281f6603c60Sopenharmony_ci    int fd = 0;
282f6603c60Sopenharmony_ci
283f6603c60Sopenharmony_ci    fd = open(FILE0, O_CREAT | O_RDWR, 0777);
284f6603c60Sopenharmony_ci    EXPECT_NE(fd, -1) << "> open faild errno = " << errno;
285f6603c60Sopenharmony_ci    EXPECT_NE(write(fd, writeBuf, sizeof(writeBuf)), -1) << "> write errno = " << errno;
286f6603c60Sopenharmony_ci    EXPECT_NE(close(fd), -1) << "> close errno = " << errno;
287f6603c60Sopenharmony_ci
288f6603c60Sopenharmony_ci    EXPECT_EQ(truncate(FILE0, -1), -1);
289f6603c60Sopenharmony_ci    EXPECT_EQ(errno, EINVAL);
290f6603c60Sopenharmony_ci}
291f6603c60Sopenharmony_ci#endif
292f6603c60Sopenharmony_ci
293f6603c60Sopenharmony_ci#if defined(LITE_FS_VFAT)
294f6603c60Sopenharmony_ci/**
295f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_FS_UNISTD_0512
296f6603c60Sopenharmony_ci * @tc.name     basic function test : test truncate with EACCES
297f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
298f6603c60Sopenharmony_ci */
299f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testTruncateEacces, Function | MediumTest | Level3)
300f6603c60Sopenharmony_ci{
301f6603c60Sopenharmony_ci    EXPECT_EQ(truncate("/", 10), -1);
302f6603c60Sopenharmony_ci    printf("errno = %d\n", errno);
303f6603c60Sopenharmony_ci    EXPECT_EQ(errno, EISDIR);
304f6603c60Sopenharmony_ci}
305f6603c60Sopenharmony_ci#endif
306f6603c60Sopenharmony_ci
307f6603c60Sopenharmony_ci#if defined(LITE_FS_VFAT)
308f6603c60Sopenharmony_ci/**
309f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_FS_UNISTD_0513
310f6603c60Sopenharmony_ci * @tc.name     basic function test : test truncate with ENAMETOOLONG
311f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
312f6603c60Sopenharmony_ci */
313f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testTruncateEnametoolong, Function | MediumTest | Level3)
314f6603c60Sopenharmony_ci{
315f6603c60Sopenharmony_ci    const char *fileName = "12345678901234567890123456789012345678901234567890\
316f6603c60Sopenharmony_ci                            12345678901234567890123456789012345678901234567890\
317f6603c60Sopenharmony_ci                            12345678901234567890123456789012345678901234567890\
318f6603c60Sopenharmony_ci                            12345678901234567890123456789012345678901234567890\
319f6603c60Sopenharmony_ci                            12345678901234567890123456789012345678901234567890\
320f6603c60Sopenharmony_ci                            12345678901234567890123456789012345678901234567890\
321f6603c60Sopenharmony_ci                            12345678901234567890123456789012345678901234567890\
322f6603c60Sopenharmony_ci                            12345678901234567890123456789012345678901234567890";
323f6603c60Sopenharmony_ci    EXPECT_EQ(truncate(fileName, 10), -1);
324f6603c60Sopenharmony_ci    EXPECT_EQ(errno, ENAMETOOLONG);
325f6603c60Sopenharmony_ci}
326f6603c60Sopenharmony_ci#endif
327f6603c60Sopenharmony_ci
328f6603c60Sopenharmony_ci#if defined(LITE_FS_VFAT)
329f6603c60Sopenharmony_ci/**
330f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_FS_UNISTD_0514
331f6603c60Sopenharmony_ci * @tc.name     basic function test : test truncate with ENOENT
332f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
333f6603c60Sopenharmony_ci */
334f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testTruncateEnoent, Function | MediumTest | Level3)
335f6603c60Sopenharmony_ci{
336f6603c60Sopenharmony_ci    const char invalidPath[] = "noExit";
337f6603c60Sopenharmony_ci    EXPECT_EQ(truncate(invalidPath, 10), -1);
338f6603c60Sopenharmony_ci    EXPECT_EQ(errno, ENOENT);
339f6603c60Sopenharmony_ci}
340f6603c60Sopenharmony_ci#endif
341f6603c60Sopenharmony_ci
342f6603c60Sopenharmony_ci#ifdef LITE_FS_PATHCONF
343f6603c60Sopenharmony_ci/**
344f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_FS_UNISTD_0600
345f6603c60Sopenharmony_ci * @tc.name     basic function test : Use the pathconf function to get the configuration value of the file
346f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
347f6603c60Sopenharmony_ci */
348f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testPathconf, Function | MediumTest | Level2)
349f6603c60Sopenharmony_ci{
350f6603c60Sopenharmony_ci    const char filePath[] = TOP_DIR "/" DIR0 "/" DIR0_FILE0;
351f6603c60Sopenharmony_ci    CreateTestFolder();
352f6603c60Sopenharmony_ci
353f6603c60Sopenharmony_ci    // use correctly
354f6603c60Sopenharmony_ci    int param[] = {
355f6603c60Sopenharmony_ci        _PC_LINK_MAX,
356f6603c60Sopenharmony_ci        _PC_MAX_CANON,
357f6603c60Sopenharmony_ci        _PC_MAX_INPUT,
358f6603c60Sopenharmony_ci        _PC_NAME_MAX,
359f6603c60Sopenharmony_ci        _PC_PATH_MAX,
360f6603c60Sopenharmony_ci        _PC_PIPE_BUF,
361f6603c60Sopenharmony_ci        _PC_CHOWN_RESTRICTED,
362f6603c60Sopenharmony_ci        _PC_NO_TRUNC,
363f6603c60Sopenharmony_ci        _PC_VDISABLE,
364f6603c60Sopenharmony_ci        _PC_SYNC_IO,
365f6603c60Sopenharmony_ci        _PC_ASYNC_IO,
366f6603c60Sopenharmony_ci        _PC_PRIO_IO,
367f6603c60Sopenharmony_ci        _PC_SOCK_MAXBUF,
368f6603c60Sopenharmony_ci        _PC_FILESIZEBITS,
369f6603c60Sopenharmony_ci        _PC_REC_INCR_XFER_SIZE,
370f6603c60Sopenharmony_ci        _PC_REC_MAX_XFER_SIZE,
371f6603c60Sopenharmony_ci        _PC_REC_MIN_XFER_SIZE,
372f6603c60Sopenharmony_ci        _PC_REC_XFER_ALIGN,
373f6603c60Sopenharmony_ci        _PC_ALLOC_SIZE_MIN,
374f6603c60Sopenharmony_ci        _PC_SYMLINK_MAX,
375f6603c60Sopenharmony_ci        _PC_2_SYMLINKS
376f6603c60Sopenharmony_ci    };
377f6603c60Sopenharmony_ci    int size = sizeof(param) / sizeof(int);
378f6603c60Sopenharmony_ci    for (int i = 0; i < size; i++) {
379f6603c60Sopenharmony_ci        errno = 0;
380f6603c60Sopenharmony_ci        if (pathconf(filePath, param[i]) == -1) {
381f6603c60Sopenharmony_ci            EXPECT_EQ(errno, 0) << "fpathconf i = " << i << " errno = " << errno;
382f6603c60Sopenharmony_ci        }
383f6603c60Sopenharmony_ci    }
384f6603c60Sopenharmony_ci}
385f6603c60Sopenharmony_ci#endif
386f6603c60Sopenharmony_ci
387f6603c60Sopenharmony_ci#ifdef LITE_FS_PATHCONF
388f6603c60Sopenharmony_ci/**
389f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_FS_UNISTD_0610
390f6603c60Sopenharmony_ci * @tc.name     basic function test : test pathconf function with error number EINVAL
391f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
392f6603c60Sopenharmony_ci */
393f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testPathconfEinval, Function | MediumTest | Level2)
394f6603c60Sopenharmony_ci{
395f6603c60Sopenharmony_ci    const char filePath[] = TOP_DIR "/" DIR0 "/" DIR0_FILE0;
396f6603c60Sopenharmony_ci    CreateTestFolder();
397f6603c60Sopenharmony_ci
398f6603c60Sopenharmony_ci    // invalid name
399f6603c60Sopenharmony_ci    EXPECT_EQ(pathconf(filePath, -100), -1);
400f6603c60Sopenharmony_ci    EXPECT_EQ(errno, EINVAL) << "fpathconf invalidPath errno = " << errno;
401f6603c60Sopenharmony_ci}
402f6603c60Sopenharmony_ci#endif
403f6603c60Sopenharmony_ci
404f6603c60Sopenharmony_ci#ifdef LITE_FS_PATHCONF
405f6603c60Sopenharmony_ci/**
406f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_FS_UNISTD_0620
407f6603c60Sopenharmony_ci * @tc.name     basic function test : test pathconf function with error number EFAULT
408f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
409f6603c60Sopenharmony_ci */
410f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testPathconfEfault, Function | MediumTest | Level2)
411f6603c60Sopenharmony_ci{
412f6603c60Sopenharmony_ci    // null path
413f6603c60Sopenharmony_ci    EXPECT_EQ(pathconf(nullptr, _PC_LINK_MAX), -1);
414f6603c60Sopenharmony_ci    EXPECT_EQ(errno, EFAULT) << "fpathconf invalidPath errno = " << errno;
415f6603c60Sopenharmony_ci}
416f6603c60Sopenharmony_ci#endif
417f6603c60Sopenharmony_ci
418f6603c60Sopenharmony_ci#ifdef LITE_FS_PATHCONF
419f6603c60Sopenharmony_ci/**
420f6603c60Sopenharmony_ci * @tc.number   SUB_KERNEL_FS_UNISTD_0630
421f6603c60Sopenharmony_ci * @tc.name     basic function test : test pathconf function with error number ENOENT
422f6603c60Sopenharmony_ci * @tc.desc     [C- SOFTWARE -0200]
423f6603c60Sopenharmony_ci */
424f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testPathconfEnoent, Function | MediumTest | Level2)
425f6603c60Sopenharmony_ci{
426f6603c60Sopenharmony_ci    // path not exit
427f6603c60Sopenharmony_ci    const char invalidPath[] = "noExit";
428f6603c60Sopenharmony_ci    EXPECT_EQ(pathconf(invalidPath, _PC_LINK_MAX), -1);
429f6603c60Sopenharmony_ci    EXPECT_EQ(errno, ENOENT) << "fpathconf invalidPath errno = " << errno;
430f6603c60Sopenharmony_ci}
431f6603c60Sopenharmony_ci#endif
432f6603c60Sopenharmony_ci
433f6603c60Sopenharmony_ci#ifdef LITE_FS_PATHCONF
434f6603c60Sopenharmony_ci/**
435f6603c60Sopenharmony_ci* @tc.number    SUB_KERNEL_FS_UNISTD_0700
436f6603c60Sopenharmony_ci* @tc.name      basic function test : Use the fpathconf function to get the configuration value of the file
437f6603c60Sopenharmony_ci* @tc.desc      [C- SOFTWARE -0200]
438f6603c60Sopenharmony_ci*/
439f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testFpathconf, Function | MediumTest | Level2)
440f6603c60Sopenharmony_ci{
441f6603c60Sopenharmony_ci    int fd = open(FILE0, O_CREAT | O_RDWR, 0777);
442f6603c60Sopenharmony_ci    EXPECT_NE(fd, -1) << "> open errno = " << errno;
443f6603c60Sopenharmony_ci
444f6603c60Sopenharmony_ci    // use correctly
445f6603c60Sopenharmony_ci    int param[] = {
446f6603c60Sopenharmony_ci        _PC_LINK_MAX,
447f6603c60Sopenharmony_ci        _PC_MAX_CANON,
448f6603c60Sopenharmony_ci        _PC_MAX_INPUT,
449f6603c60Sopenharmony_ci        _PC_NAME_MAX,
450f6603c60Sopenharmony_ci        _PC_PATH_MAX,
451f6603c60Sopenharmony_ci        _PC_PIPE_BUF,
452f6603c60Sopenharmony_ci        _PC_CHOWN_RESTRICTED,
453f6603c60Sopenharmony_ci        _PC_NO_TRUNC,
454f6603c60Sopenharmony_ci        _PC_VDISABLE,
455f6603c60Sopenharmony_ci        _PC_SYNC_IO,
456f6603c60Sopenharmony_ci        _PC_ASYNC_IO,
457f6603c60Sopenharmony_ci        _PC_PRIO_IO,
458f6603c60Sopenharmony_ci        _PC_SOCK_MAXBUF,
459f6603c60Sopenharmony_ci        _PC_FILESIZEBITS,
460f6603c60Sopenharmony_ci        _PC_REC_INCR_XFER_SIZE,
461f6603c60Sopenharmony_ci        _PC_REC_MAX_XFER_SIZE,
462f6603c60Sopenharmony_ci        _PC_REC_MIN_XFER_SIZE,
463f6603c60Sopenharmony_ci        _PC_REC_XFER_ALIGN,
464f6603c60Sopenharmony_ci        _PC_ALLOC_SIZE_MIN,
465f6603c60Sopenharmony_ci        _PC_SYMLINK_MAX,
466f6603c60Sopenharmony_ci        _PC_2_SYMLINKS
467f6603c60Sopenharmony_ci    };
468f6603c60Sopenharmony_ci    int size = sizeof(param) / sizeof(int);
469f6603c60Sopenharmony_ci    for (int i = 0; i < size; i++) {
470f6603c60Sopenharmony_ci        errno = 0;
471f6603c60Sopenharmony_ci        if (fpathconf(fd, param[i]) == -1) {
472f6603c60Sopenharmony_ci            EXPECT_EQ(errno, 0) << "fpathconf i = " << i << " errno = " << errno;
473f6603c60Sopenharmony_ci        }
474f6603c60Sopenharmony_ci    }
475f6603c60Sopenharmony_ci    EXPECT_NE(close(fd), -1) << "> close errno = " << errno;
476f6603c60Sopenharmony_ci}
477f6603c60Sopenharmony_ci#endif
478f6603c60Sopenharmony_ci
479f6603c60Sopenharmony_ci#ifdef LITE_FS_PATHCONF
480f6603c60Sopenharmony_ci/**
481f6603c60Sopenharmony_ci* @tc.number    SUB_KERNEL_FS_UNISTD_0710
482f6603c60Sopenharmony_ci* @tc.name      basic function test : test fpathconf function with error number EINVAL
483f6603c60Sopenharmony_ci* @tc.desc      [C- SOFTWARE -0200]
484f6603c60Sopenharmony_ci*/
485f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testFpathconfEinval, Function | MediumTest | Level2)
486f6603c60Sopenharmony_ci{
487f6603c60Sopenharmony_ci    int fd = open(FILE0, O_CREAT | O_RDWR, 0777);
488f6603c60Sopenharmony_ci    EXPECT_NE(fd, -1) << "> open errno = " << errno;
489f6603c60Sopenharmony_ci
490f6603c60Sopenharmony_ci    // invalid name
491f6603c60Sopenharmony_ci    errno = 0;
492f6603c60Sopenharmony_ci    EXPECT_EQ(fpathconf(fd, -100), -1);
493f6603c60Sopenharmony_ci    EXPECT_EQ(errno, EINVAL) << "fpathconf invalidPath errno = " << errno;
494f6603c60Sopenharmony_ci
495f6603c60Sopenharmony_ci    EXPECT_NE(close(fd), -1) << "> close errno = " << errno;
496f6603c60Sopenharmony_ci}
497f6603c60Sopenharmony_ci#endif
498f6603c60Sopenharmony_ci
499f6603c60Sopenharmony_ci#ifdef LITE_FS_PATHCONF
500f6603c60Sopenharmony_ci/**
501f6603c60Sopenharmony_ci* @tc.number    SUB_KERNEL_FS_UNISTD_0720
502f6603c60Sopenharmony_ci* @tc.name      basic function test : test fpathconf function with error number EBADF
503f6603c60Sopenharmony_ci* @tc.desc      [C- SOFTWARE -0200]
504f6603c60Sopenharmony_ci*/
505f6603c60Sopenharmony_ciHWTEST_F(FileSystemTest, testFpathconfEbadf, Function | MediumTest | Level2)
506f6603c60Sopenharmony_ci{
507f6603c60Sopenharmony_ci    // invalid file description
508f6603c60Sopenharmony_ci    EXPECT_EQ(fpathconf(-100, _PC_LINK_MAX), -1);
509f6603c60Sopenharmony_ci    EXPECT_EQ(errno, EBADF) << "fpathconf invalidPath errno = " << errno;
510f6603c60Sopenharmony_ci}
511f6603c60Sopenharmony_ci#endif
512