1 /*
2  * Copyright (C) 2024 HiHope Open Source Organization.
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 <cstdio>
17 #include <cstdlib>
18 #include <fcntl.h>
19 #include <string>
20 #include <unistd.h>
21 #include <vector>
22 #include <gtest/gtest.h>
23 #include <sys/stat.h>
24 #include <sys/types.h>
25 #include <sys/xattr.h>
26 #include "securec.h"
27 
28 using namespace testing::ext;
29 using namespace std;
30 
31 static const char *TEST_VALID_PATH = "/data/local/tmp/attr_test_dir";
32 static const char *TEST_VALID_FILE = "/data/local/tmp/attr_test_dir/attr_test.txt";
33 static const char *TEST_INVALID_PATH = "/data/local/abcd";
34 static const int MAX_LEN = 128;
35 
36 class AttrApiTest : public testing::Test {
37 public:
38     static void SetUpTestCase();
39     static void TearDownTestCase();
40     void SetUp();
41     void TearDown();
42 private:
43 };
SetUp()44 void AttrApiTest::SetUp()
45 {
46     int fd = -1;
47     if (access(TEST_VALID_PATH, F_OK) == 0) {
48         (void)remove(TEST_VALID_PATH);
49     }
50     (void)mkdir(TEST_VALID_PATH, S_IWUSR | S_IRUSR | S_IXUSR);
51     fd = open(TEST_VALID_FILE, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
52     close(fd);
53 }
TearDown()54 void AttrApiTest::TearDown()
55 {
56     (void)remove(TEST_VALID_FILE);
57     if (access(TEST_VALID_PATH, F_OK) == 0) {
58         (void)remove(TEST_VALID_PATH);
59     }
60 }
SetUpTestCase()61 void AttrApiTest::SetUpTestCase()
62 {
63 }
TearDownTestCase()64 void AttrApiTest::TearDownTestCase()
65 {
66 }
67 
68 /*
69  * @tc.number : SUB_KERNEL_SYSCALL_XATTR_0100
70  * @tc.name   : LsetAndListxattrValidFileTestSuccess_0001
71  * @tc.desc   : lsetxattr and listxattr test valid path and file extend properties success.
72  * @tc.size   : MediumTest
73  * @tc.type   : Function
74  * @tc.level  : Level 1
75  */
HWTEST_F(AttrApiTest, ListxattrFileExtendPropertiesTest_0001, Function | MediumTest | Level1)76 HWTEST_F(AttrApiTest, ListxattrFileExtendPropertiesTest_0001, Function | MediumTest | Level1)
77 {
78     char list[MAX_LEN] = { 0 };
79     const char *name = "user.path_attr";
80     const char *value = "path_attr_value";
81     size_t size = strlen(value);
82 
83     // set path xattr, success
84     int ret = lsetxattr(TEST_VALID_PATH, name, value, size, 0);
85     EXPECT_EQ(ret, 0);
86 
87     // get path xattr list, success
88     size = listxattr(TEST_VALID_PATH, list, sizeof(list));
89     EXPECT_TRUE(size > 0);
90 
91     // set file xattr, success
92     name = "user.file_attr";
93     value = "file_attr_value";
94     size = strlen(value);
95     ret = lsetxattr(TEST_VALID_FILE, name, value, size, 0);
96     EXPECT_EQ(ret, 0);
97 
98     // get file xattr list, success
99     size = listxattr(TEST_VALID_FILE, list, sizeof(list));
100     EXPECT_TRUE(size >= 0);
101 
102     // only get xattr size, success
103     size = listxattr(TEST_VALID_FILE, nullptr, 0);
104     EXPECT_TRUE(size >= 0);
105 }
106 
107 /*
108  * @tc.number : SUB_KERNEL_SYSCALL_XATTR_0200
109  * @tc.name   : LsetxattrInvalidPropertyFailed_0002
110  * @tc.desc   : lsetxattr set invalid xattr failed, errno EOPNOTSUPP.
111  * @tc.size   : MediumTest
112  * @tc.type   : Function
113  * @tc.level  : Level 2
114  */
HWTEST_F(AttrApiTest, LsetxattrInvalidPropertyFailed_0002, Function | MediumTest | Level2)115 HWTEST_F(AttrApiTest, LsetxattrInvalidPropertyFailed_0002, Function | MediumTest | Level2)
116 {
117     const char *name = "invalid_attr";
118     const char *value = "invalid_attr_value";
119     size_t size = strlen(value);
120 
121     // set invalid property
122     errno = 0;
123     int ret = lsetxattr(TEST_VALID_PATH, name, value, size, 0);
124     EXPECT_EQ(ret, -1);
125     EXPECT_EQ(errno, EOPNOTSUPP);
126 }
127 
128 /*
129  * @tc.number : SUB_KERNEL_SYSCALL_XATTR_0300
130  * @tc.name   : LsetAndListxattrInvalidFileFailed_0003
131  * @tc.desc   : lsetxattr and listxattr test use invalid path or file failed, errno ENOENT.
132  * @tc.size   : MediumTest
133  * @tc.type   : Function
134  * @tc.level  : Level 2
135  */
HWTEST_F(AttrApiTest, LsetAndListxattrInvalidFileFailed_0003, Function | MediumTest | Level2)136 HWTEST_F(AttrApiTest, LsetAndListxattrInvalidFileFailed_0003, Function | MediumTest | Level2)
137 {
138     char list[MAX_LEN] = { 0 };
139     const char *name = "user.path_attr";
140     const char *value = "path_attr_value";
141     size_t size = strlen(value);
142 
143     errno = 0;
144     int ret = lsetxattr(TEST_INVALID_PATH, name, value, size, 0);
145     EXPECT_EQ(ret, -1);
146     EXPECT_EQ(errno, ENOENT);
147 
148     errno = 0;
149     size = listxattr(TEST_INVALID_PATH, list, sizeof(list));
150     EXPECT_EQ(size, -1);
151     EXPECT_EQ(errno, ENOENT);
152 }
153 
154 /*
155  * @tc.number : SUB_KERNEL_SYSCALL_XATTR_0400
156  * @tc.name   : RemovexattrRemoveNotExistAttrFailed_0004
157  * @tc.desc   : Removexattr removes attribute that does not exist failed, errno ENOENT.
158  * @tc.size   : MediumTest
159  * @tc.type   : Function
160  * @tc.level  : Level 2
161  */
HWTEST_F(AttrApiTest, RemovexattrRemoveNotExistAttrFailed_0004, Function | MediumTest | Level2)162 HWTEST_F(AttrApiTest, RemovexattrRemoveNotExistAttrFailed_0004, Function | MediumTest | Level2)
163 {
164     const char *name = "user.invalid_attr";
165     errno = 0;
166     int ret = removexattr(TEST_VALID_PATH, name);
167     EXPECT_EQ(ret, -1);
168     EXPECT_EQ(errno, ENODATA);
169 }
170 
171 /*
172  * @tc.number : SUB_KERNEL_SYSCALL_XATTR_0500
173  * @tc.name   : RemovexattrExistAttrSuccess_0005
174  * @tc.desc   : Removexattr removes exist attribute success.
175  * @tc.size   : MediumTest
176  * @tc.type   : Function
177  * @tc.level  : Level 1
178  */
HWTEST_F(AttrApiTest, RemovexattrExistAttrSuccess_0005, Function | MediumTest | Level1)179 HWTEST_F(AttrApiTest, RemovexattrExistAttrSuccess_0005, Function | MediumTest | Level1)
180 {
181     const char *name = "user.path_attr";
182     const char *value = "path_attr_value";
183     size_t size = strlen(value);
184 
185     // set path xattr, success
186     int ret = lsetxattr(TEST_VALID_PATH, name, value, size, 0);
187     EXPECT_EQ(ret, 0);
188 
189     // remove exist xattr success
190     ret = removexattr(TEST_VALID_PATH, name);
191     EXPECT_EQ(ret, 0);
192 }