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 }