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 <unistd.h>
17#include <sys/stat.h>
18#include <fcntl.h>
19#include "functionalext.h"
20#include "filepath_util.h"
21
22const int SUCCESS = 0;
23
24extern int __fstatat_time64(int, const char *__restrict, struct stat *__restrict, int);
25
26/**
27 * @tc.name      : fstatat_0100
28 * @tc.desc      : The parameter fd is equal to AT_FDCWD, the flag is 0,
29 *                 and the information of the file can be obtained.
30 * @tc.level     : Level 0
31 */
32void fstatat_0100(void)
33{
34    const char *ptr = "fstatattest.txt";
35    struct stat st;
36    int fd = open(ptr, O_RDWR | O_CREAT, TEST_MODE);
37    EXPECT_TRUE("fstatat_0100", fd >= 0);
38    lseek(fd, 0, SEEK_SET);
39    int ret = fstatat(AT_FDCWD, ptr, &st, 0);
40    EXPECT_EQ("fstatat_0100", ret, SUCCESS);
41    uid_t uid = getuid();
42    EXPECT_EQ("fstatat_0100", st.st_uid, uid);
43    gid_t gid = getgid();
44    EXPECT_EQ("fstatat_0100", st.st_gid, gid);
45    close(fd);
46    remove(ptr);
47    ptr = NULL;
48}
49
50/**
51 * @tc.name      : fstatat_0200
52 * @tc.desc      : The parameter fd is equal to AT_FDCWD, the flag is AT_SYMLINK_NOFOLLOW,
53 *                 and the information of the file can be obtained.
54 * @tc.level     : Level 0
55 */
56void fstatat_0200(void)
57{
58    const char *ptr = "fstatattest.txt";
59    struct stat st;
60    int fd = open(ptr, O_RDWR | O_CREAT, TEST_MODE);
61    EXPECT_TRUE("fstatat_0200", fd >= 0);
62    lseek(fd, 0, SEEK_SET);
63    const char *softptr = "./fstatattest.txt.soft";
64    int link = symlink(ptr, softptr);
65    EXPECT_EQ("fstatat_0200", link, 0);
66    int ret = fstatat(AT_FDCWD, softptr, &st, AT_SYMLINK_NOFOLLOW);
67    EXPECT_EQ("fstatat_0200", ret, SUCCESS);
68    uid_t uid = getuid();
69    EXPECT_EQ("fstatat_0200", st.st_uid, uid);
70    gid_t gid = getgid();
71    EXPECT_EQ("fstatat_0200", st.st_gid, gid);
72    EXPECT_TRUE("fstatat_0200", st.st_mode);
73    close(fd);
74    remove(softptr);
75    remove(ptr);
76    softptr = NULL;
77    ptr = NULL;
78}
79
80/**
81 * @tc.name      : fstatat_0300
82 * @tc.desc      : The parameter fd is equal to the return value of opening the test file, the flag is 0,
83 *                 and the information of the file can be obtained.
84 * @tc.level     : Level 0
85 */
86void fstatat_0300(void)
87{
88    char ptr[PATH_MAX] = {0};
89    FILE_ABSOLUTE_PATH("fstatattest.txt", ptr);
90
91    struct stat st;
92    int fd = open(ptr, O_RDWR | O_CREAT, TEST_MODE);
93    EXPECT_TRUE("fstatat_0300", fd >= 0);
94    lseek(fd, 0, SEEK_SET);
95    int ret = fstatat(0, ptr, &st, 0);
96    EXPECT_EQ("fstatat_0300", ret, SUCCESS);
97    uid_t uid = getuid();
98    EXPECT_EQ("fstatat_0300", st.st_uid, uid);
99    gid_t gid = getgid();
100    EXPECT_EQ("fstatat_0300", st.st_gid, gid);
101    close(fd);
102    remove(ptr);
103}
104
105/**
106 * @tc.name      : fstatat_time64_0100
107 * @tc.desc      : The parameter fd is equal to AT_FDCWD, the flag is 0,
108 *                 and the information of the file can be obtained.
109 * @tc.level     : Level 0
110 */
111void fstatat_time64_0100(void)
112{
113    const char *ptr = "fstatat_time64_test.txt";
114    struct stat st;
115    int fd = open(ptr, O_RDWR | O_CREAT, TEST_MODE);
116    EXPECT_TRUE("fstatat_0100", fd >= 0);
117    lseek(fd, 0, SEEK_SET);
118    int ret = __fstatat_time64(AT_FDCWD, ptr, &st, 0);
119    EXPECT_EQ("fstatat_0100", ret, SUCCESS);
120    uid_t uid = getuid();
121    EXPECT_EQ("fstatat_0100", st.st_uid, uid);
122    gid_t gid = getgid();
123    EXPECT_EQ("fstatat_0100", st.st_gid, gid);
124    close(fd);
125    remove(ptr);
126    ptr = NULL;
127}
128
129int main(int argc, char *argv[])
130{
131    fstatat_0100();
132    fstatat_0200();
133    fstatat_0300();
134    fstatat_time64_0100();
135    return t_status;
136}