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 "unit_test.h"
17 #include <thread>
18 #include <selinux/selinux.h>
19 #include "selinux_error.h"
20 #include "test_common.h"
21
22 using namespace testing::ext;
23 using namespace OHOS::Security::SelinuxUnitTest;
24 using namespace Selinux;
25 const static int SLEEP_SECOND = 2;
26 const static std::string BASE_PATH = "/data/app/el1/0/base/";
27 const static std::string TEST_PATH = BASE_PATH + "com.ohos.selftest/";
28
29 const static std::string TEST_SUB_PATH_1 = TEST_PATH + "subpath1/";
30 const static std::string TEST_SUB_PATH_2 = TEST_PATH + "subpath2/";
31 const static std::string TEST_SUB_PATH_3 = TEST_PATH + "subpath3/";
32 const static std::string TEST_SUB_PATH_4 = TEST_PATH + "subpath4/";
33
34 const static std::string TEST_SUB_PATH_1_FILE_1 = TEST_SUB_PATH_1 + "file1.txt";
35 const static std::string TEST_SUB_PATH_1_FILE_2 = TEST_SUB_PATH_1 + "file2.txt";
36 const static std::string TEST_SUB_PATH_2_FILE_1 = TEST_SUB_PATH_2 + "file1.txt";
37 const static std::string TEST_SUB_PATH_2_FILE_2 = TEST_SUB_PATH_2 + "file2.txt";
38 const static std::string TEST_SUB_PATH_3_FILE_1 = TEST_SUB_PATH_3 + "file1.txt";
39 const static std::string TEST_SUB_PATH_3_FILE_2 = TEST_SUB_PATH_3 + "file2.txt";
40 const static std::string TEST_SUB_PATH_4_FILE_1 = TEST_SUB_PATH_4 + "file1.txt";
41 const static std::string TEST_SUB_PATH_4_FILE_2 = TEST_SUB_PATH_4 + "file2.txt";
42
43 const static std::string TEST_UNSIMPLIFY_PATH = TEST_SUB_PATH_3 + "//../subpath4/";
44 const static std::string TEST_UNSIMPLIFY_FILE = TEST_SUB_PATH_4 + "//../subpath3/file1.txt";
45
46 const static std::string INVALID_PATH = "/data/data/path";
47 const static std::string NOT_EXIST_PATH = BASE_PATH + "not_exsit_path";
48 const static std::string TEST_APL = "system_core";
49 const static std::string TEST_NAME = "com.hap.selftest";
50 const static std::string DEST_LABEL = "u:object_r:selftest_hap_data_file:s0";
51 const static std::string DEST_DOMAIN = "u:r:selftest:s0";
52
53 const static std::string SEHAP_CONTEXTS_FILE = "/system/etc/selinux/targeted/contexts/sehap_contexts";
54
GenerateTestFile()55 static void GenerateTestFile()
56 {
57 ASSERT_EQ(true, CopyFile(SEHAP_CONTEXTS_FILE, SEHAP_CONTEXTS_FILE + "_bk"));
58 std::vector<std::string> sehapInfo = {
59 "apl=system_core name=com.ohos.test domain= type=",
60 "apl=system_core name=com.hap.selftest domain=selftest type=selftest_hap_data_file"};
61 ASSERT_EQ(true, WriteFile(SEHAP_CONTEXTS_FILE, sehapInfo));
62 }
63
RemoveTestFile()64 static void RemoveTestFile()
65 {
66 ASSERT_EQ(0, RenameFile(SEHAP_CONTEXTS_FILE + "_bk", SEHAP_CONTEXTS_FILE));
67 }
68
SetUpTestCase()69 void SelinuxUnitTest::SetUpTestCase()
70 {
71 // make test case clean
72 GenerateTestFile();
73 }
74
TearDownTestCase()75 void SelinuxUnitTest::TearDownTestCase()
76 {
77 RemoveTestFile();
78 }
79
SetUp()80 void SelinuxUnitTest::SetUp() {}
81
TearDown()82 void SelinuxUnitTest::TearDown() {}
83
CreateDataFile() const84 void SelinuxUnitTest::CreateDataFile() const {}
85
86 /**
87 * @tc.name: HapFileRestorecon001
88 * @tc.desc: HapFileRestorecon input path invalid.
89 * @tc.type: FUNC
90 * @tc.require:AR000GJSDQ
91 */
92 HWTEST_F(SelinuxUnitTest, HapFileRestorecon001, TestSize.Level1)
93 {
94 ASSERT_EQ(true, CreateDirectory(INVALID_PATH));
95
96 int ret = test.HapFileRestorecon(INVALID_PATH, TEST_APL, TEST_NAME, 0);
97 ASSERT_EQ(-SELINUX_PATH_INVAILD, ret);
98 ASSERT_EQ(true, RemoveDirectory(INVALID_PATH));
99
100 if (access(NOT_EXIST_PATH.c_str(), F_OK) == 0) {
101 ASSERT_EQ(true, RemoveDirectory(NOT_EXIST_PATH));
102 }
103
104 ret = test.HapFileRestorecon(NOT_EXIST_PATH, TEST_APL, TEST_NAME, 0);
105 ASSERT_EQ(-SELINUX_PATH_INVAILD, ret);
106 }
107
108 /**
109 * @tc.name: HapFileRestorecon002
110 * @tc.desc: HapFileRestorecon input para empty.
111 * @tc.type: FUNC
112 * @tc.require:AR000GJSDQ
113 */
114 HWTEST_F(SelinuxUnitTest, HapFileRestorecon002, TestSize.Level1)
115 {
116 ASSERT_EQ(true, CreateDirectory(TEST_SUB_PATH_1));
117
118 int ret = test.HapFileRestorecon("", TEST_APL, TEST_NAME, 0);
119 ASSERT_EQ(-SELINUX_ARG_INVALID, ret);
120
121 ret = test.HapFileRestorecon(TEST_SUB_PATH_1, "", TEST_NAME, 0);
122 ASSERT_EQ(-SELINUX_ARG_INVALID, ret);
123
124 ret = test.HapFileRestorecon(TEST_SUB_PATH_1, TEST_APL, "", 0);
125 ASSERT_EQ(SELINUX_SUCC, ret);
126
127 ASSERT_EQ(true, RemoveDirectory(TEST_PATH));
128 }
129
130 /**
131 * @tc.name: HapFileRestorecon003
132 * @tc.desc: HapFileRestorecon type empty.
133 * @tc.type: FUNC
134 * @tc.require:AR000GJSDQ
135 */
136 HWTEST_F(SelinuxUnitTest, HapFileRestorecon003, TestSize.Level1)
137 {
138 ASSERT_EQ(true, CreateDirectory(TEST_SUB_PATH_1));
139 // apl=system_core name=com.ohos.test domain= type=
140 int ret = test.HapFileRestorecon(TEST_SUB_PATH_1, TEST_APL, "com.ohos.test", 0);
141 ASSERT_EQ(-SELINUX_ARG_INVALID, ret);
142
143 ASSERT_EQ(true, RemoveDirectory(TEST_PATH));
144 }
145
146 /**
147 * @tc.name: HapFileRestorecon004
148 * @tc.desc: HapFileRestorecon input single path no recurse.
149 * @tc.type: FUNC
150 * @tc.require:AR000GJSDQ
151 */
152 HWTEST_F(SelinuxUnitTest, HapFileRestorecon004, TestSize.Level1)
153 {
154 ASSERT_EQ(true, CreateFile(TEST_SUB_PATH_1_FILE_1)); // this file should not be restorecon
155
156 char *secontextOld = nullptr;
157 getfilecon(TEST_SUB_PATH_1_FILE_1.c_str(), &secontextOld);
158
159 int ret = test.HapFileRestorecon(TEST_SUB_PATH_1, TEST_APL, TEST_NAME, 0);
160 ASSERT_EQ(SELINUX_SUCC, ret);
161
162 char *secontext = nullptr;
163 getfilecon(TEST_SUB_PATH_1.c_str(), &secontext);
164 ret = strcmp(DEST_LABEL.c_str(), secontext);
165 ASSERT_EQ(SELINUX_SUCC, ret);
166 freecon(secontext);
167 secontext = nullptr;
168
169 getfilecon(TEST_SUB_PATH_1_FILE_1.c_str(), &secontext);
170 ret = strcmp(secontextOld, secontext);
171 ASSERT_EQ(SELINUX_SUCC, ret);
172 freecon(secontext);
173 secontext = nullptr;
174
175 ASSERT_EQ(true, RemoveDirectory(TEST_PATH));
176 }
177
178 /**
179 * @tc.name: HapFileRestorecon005
180 * @tc.desc: HapFileRestorecon input single path recurse.
181 * @tc.type: FUNC
182 * @tc.require:AR000GJSDQ
183 */
184 HWTEST_F(SelinuxUnitTest, HapFileRestorecon005, TestSize.Level1)
185 {
186 ASSERT_EQ(true, CreateFile(TEST_SUB_PATH_1_FILE_1));
187 ASSERT_EQ(true, CreateFile(TEST_SUB_PATH_1_FILE_2));
188 ASSERT_EQ(true, CreateFile(TEST_SUB_PATH_2_FILE_1));
189 ASSERT_EQ(true, CreateFile(TEST_SUB_PATH_2_FILE_2));
190
191 int ret = test.HapFileRestorecon(TEST_PATH, TEST_APL, TEST_NAME, 1);
192 ASSERT_EQ(SELINUX_SUCC, ret);
193
194 char *secontext = nullptr;
195 getfilecon(TEST_SUB_PATH_1.c_str(), &secontext);
196 ret = strcmp(DEST_LABEL.c_str(), secontext);
197 ASSERT_EQ(SELINUX_SUCC, ret);
198 freecon(secontext);
199 secontext = nullptr;
200
201 getfilecon(TEST_SUB_PATH_2.c_str(), &secontext);
202 ret = strcmp(DEST_LABEL.c_str(), secontext);
203 ASSERT_EQ(SELINUX_SUCC, ret);
204 freecon(secontext);
205 secontext = nullptr;
206
207 getfilecon(TEST_SUB_PATH_1_FILE_1.c_str(), &secontext);
208 ret = strcmp(DEST_LABEL.c_str(), secontext);
209 ASSERT_EQ(SELINUX_SUCC, ret);
210 freecon(secontext);
211 secontext = nullptr;
212
213 getfilecon(TEST_SUB_PATH_1_FILE_2.c_str(), &secontext);
214 ret = strcmp(DEST_LABEL.c_str(), secontext);
215 ASSERT_EQ(SELINUX_SUCC, ret);
216 freecon(secontext);
217 secontext = nullptr;
218
219 getfilecon(TEST_SUB_PATH_2_FILE_1.c_str(), &secontext);
220 ret = strcmp(DEST_LABEL.c_str(), secontext);
221 ASSERT_EQ(SELINUX_SUCC, ret);
222 freecon(secontext);
223 secontext = nullptr;
224
225 getfilecon(TEST_SUB_PATH_2_FILE_2.c_str(), &secontext);
226 ret = strcmp(DEST_LABEL.c_str(), secontext);
227 ASSERT_EQ(SELINUX_SUCC, ret);
228 freecon(secontext);
229 secontext = nullptr;
230
231 ASSERT_EQ(true, RemoveDirectory(TEST_PATH));
232 }
233
234 /**
235 * @tc.name: HapFileRestorecon006
236 * @tc.desc: HapFileRestorecon input single unsimplify path/file.
237 * @tc.type: FUNC
238 * @tc.require:AR000GJSDQ
239 */
240 HWTEST_F(SelinuxUnitTest, HapFileRestorecon006, TestSize.Level1)
241 {
242 ASSERT_EQ(true, CreateDirectory(TEST_SUB_PATH_4));
243 ASSERT_EQ(true, CreateFile(TEST_SUB_PATH_3_FILE_1));
244
245 int ret = test.HapFileRestorecon(TEST_UNSIMPLIFY_PATH, TEST_APL, TEST_NAME, 0);
246 ASSERT_EQ(SELINUX_SUCC, ret);
247
248 char *secontext = nullptr;
249 getfilecon(TEST_SUB_PATH_4.c_str(), &secontext);
250 ret = strcmp(DEST_LABEL.c_str(), secontext);
251 ASSERT_EQ(SELINUX_SUCC, ret);
252 freecon(secontext);
253 secontext = nullptr;
254
255 ret = test.HapFileRestorecon(TEST_UNSIMPLIFY_FILE, TEST_APL, TEST_NAME, 0);
256 ASSERT_EQ(SELINUX_SUCC, ret);
257
258 secontext = nullptr;
259 getfilecon(TEST_SUB_PATH_3_FILE_1.c_str(), &secontext);
260 ret = strcmp(DEST_LABEL.c_str(), secontext);
261 ASSERT_EQ(SELINUX_SUCC, ret);
262 freecon(secontext);
263 secontext = nullptr;
264
265 ASSERT_EQ(true, RemoveDirectory(TEST_PATH));
266 }
267
268 /**
269 * @tc.name: HapFileRestorecon007
270 * @tc.desc: HapFileRestorecon input multi path/file no recurse.
271 * @tc.type: FUNC
272 * @tc.require:AR000GJSDQ
273 */
274 HWTEST_F(SelinuxUnitTest, HapFileRestorecon007, TestSize.Level1)
275 {
276 ASSERT_EQ(true, CreateDirectory(TEST_SUB_PATH_4));
277 ASSERT_EQ(true, CreateFile(TEST_SUB_PATH_1_FILE_1));
278 ASSERT_EQ(true, CreateFile(TEST_SUB_PATH_1_FILE_2));
279 ASSERT_EQ(true, CreateFile(TEST_SUB_PATH_2_FILE_1)); // should not be restorecon
280 ASSERT_EQ(true, CreateFile(TEST_SUB_PATH_3_FILE_1));
281
282 char *secontextOld = nullptr;
283 getfilecon(TEST_SUB_PATH_2_FILE_1.c_str(), &secontextOld);
284
285 std::vector<std::string> tmp;
286 tmp.emplace_back(TEST_SUB_PATH_1);
287 tmp.emplace_back(TEST_SUB_PATH_2);
288 tmp.emplace_back(TEST_SUB_PATH_1_FILE_1);
289 tmp.emplace_back(TEST_SUB_PATH_1_FILE_2);
290 tmp.emplace_back(TEST_UNSIMPLIFY_FILE);
291 tmp.emplace_back(TEST_UNSIMPLIFY_PATH);
292
293 int ret = test.HapFileRestorecon(tmp, TEST_APL, TEST_NAME, 0);
294 ASSERT_EQ(SELINUX_SUCC, ret);
295
296 char *secontext = nullptr;
297 getfilecon(TEST_SUB_PATH_1.c_str(), &secontext);
298 ret = strcmp(DEST_LABEL.c_str(), secontext);
299 ASSERT_EQ(SELINUX_SUCC, ret);
300 freecon(secontext);
301 secontext = nullptr;
302
303 getfilecon(TEST_SUB_PATH_2.c_str(), &secontext);
304 ret = strcmp(DEST_LABEL.c_str(), secontext);
305 ASSERT_EQ(SELINUX_SUCC, ret);
306 freecon(secontext);
307 secontext = nullptr;
308
309 getfilecon(TEST_SUB_PATH_1_FILE_1.c_str(), &secontext);
310 ret = strcmp(DEST_LABEL.c_str(), secontext);
311 ASSERT_EQ(SELINUX_SUCC, ret);
312 freecon(secontext);
313 secontext = nullptr;
314
315 getfilecon(TEST_SUB_PATH_1_FILE_2.c_str(), &secontext);
316 ret = strcmp(DEST_LABEL.c_str(), secontext);
317 ASSERT_EQ(SELINUX_SUCC, ret);
318 freecon(secontext);
319 secontext = nullptr;
320
321 getfilecon(TEST_SUB_PATH_2_FILE_1.c_str(), &secontext); // this file should not be restorecon
322 ret = strcmp(secontextOld, secontext);
323 ASSERT_EQ(SELINUX_SUCC, ret);
324 freecon(secontext);
325 freecon(secontextOld);
326 secontext = nullptr;
327 secontextOld = nullptr;
328
329 getfilecon(TEST_SUB_PATH_3_FILE_1.c_str(), &secontext);
330 ret = strcmp(DEST_LABEL.c_str(), secontext);
331 ASSERT_EQ(SELINUX_SUCC, ret);
332 freecon(secontext);
333 secontext = nullptr;
334
335 getfilecon(TEST_SUB_PATH_4.c_str(), &secontext);
336 ret = strcmp(DEST_LABEL.c_str(), secontext);
337 ASSERT_EQ(SELINUX_SUCC, ret);
338 freecon(secontext);
339 secontext = nullptr;
340
341 ASSERT_EQ(true, RemoveDirectory(TEST_PATH));
342 }
343
344 /**
345 * @tc.name: HapFileRestorecon008
346 * @tc.desc: HapFileRestorecon input multi path/file recurse.
347 * @tc.type: FUNC
348 * @tc.require:AR000GJSDQ
349 */
350 HWTEST_F(SelinuxUnitTest, HapFileRestorecon008, TestSize.Level1)
351 {
352 ASSERT_EQ(true, CreateFile(TEST_SUB_PATH_1_FILE_1));
353 ASSERT_EQ(true, CreateFile(TEST_SUB_PATH_1_FILE_2));
354 ASSERT_EQ(true, CreateFile(TEST_SUB_PATH_2_FILE_1));
355 ASSERT_EQ(true, CreateFile(TEST_SUB_PATH_2_FILE_2));
356 ASSERT_EQ(true, CreateFile(TEST_SUB_PATH_3_FILE_1));
357 ASSERT_EQ(true, CreateFile(TEST_SUB_PATH_3_FILE_2)); // this file should not be restorecon
358 ASSERT_EQ(true, CreateFile(TEST_SUB_PATH_4_FILE_1));
359 ASSERT_EQ(true, CreateFile(TEST_SUB_PATH_4_FILE_2));
360
361 std::vector<std::string> tmp;
362 tmp.emplace_back(TEST_SUB_PATH_1);
363 tmp.emplace_back(TEST_SUB_PATH_2);
364 tmp.emplace_back(TEST_UNSIMPLIFY_FILE); // TEST_SUB_PATH_3_FILE_1
365 tmp.emplace_back(TEST_UNSIMPLIFY_PATH); // TEST_SUB_PATH_4
366
367 char *secontextOld = nullptr;
368 getfilecon(TEST_SUB_PATH_3_FILE_2.c_str(), &secontextOld);
369
370 int ret = test.HapFileRestorecon(tmp, TEST_APL, TEST_NAME, 1);
371 ASSERT_EQ(SELINUX_SUCC, ret);
372
373 char *secontext = nullptr;
374 getfilecon(TEST_SUB_PATH_1.c_str(), &secontext);
375 ret = strcmp(DEST_LABEL.c_str(), secontext);
376 ASSERT_EQ(SELINUX_SUCC, ret);
377 freecon(secontext);
378 secontext = nullptr;
379
380 getfilecon(TEST_SUB_PATH_2.c_str(), &secontext);
381 ret = strcmp(DEST_LABEL.c_str(), secontext);
382 ASSERT_EQ(SELINUX_SUCC, ret);
383 freecon(secontext);
384 secontext = nullptr;
385
386 getfilecon(TEST_SUB_PATH_4.c_str(), &secontext);
387 ret = strcmp(DEST_LABEL.c_str(), secontext);
388 ASSERT_EQ(SELINUX_SUCC, ret);
389 freecon(secontext);
390 secontext = nullptr;
391
392 getfilecon(TEST_SUB_PATH_1_FILE_1.c_str(), &secontext);
393 ret = strcmp(DEST_LABEL.c_str(), secontext);
394 ASSERT_EQ(SELINUX_SUCC, ret);
395 freecon(secontext);
396 secontext = nullptr;
397
398 getfilecon(TEST_SUB_PATH_1_FILE_2.c_str(), &secontext);
399 ret = strcmp(DEST_LABEL.c_str(), secontext);
400 ASSERT_EQ(SELINUX_SUCC, ret);
401 freecon(secontext);
402 secontext = nullptr;
403
404 getfilecon(TEST_SUB_PATH_2_FILE_1.c_str(), &secontext);
405 ret = strcmp(DEST_LABEL.c_str(), secontext);
406 ASSERT_EQ(SELINUX_SUCC, ret);
407 freecon(secontext);
408 secontext = nullptr;
409
410 getfilecon(TEST_SUB_PATH_2_FILE_2.c_str(), &secontext);
411 ret = strcmp(DEST_LABEL.c_str(), secontext);
412 ASSERT_EQ(SELINUX_SUCC, ret);
413 freecon(secontext);
414 secontext = nullptr;
415
416 getfilecon(TEST_SUB_PATH_4_FILE_1.c_str(), &secontext);
417 ret = strcmp(DEST_LABEL.c_str(), secontext);
418 ASSERT_EQ(SELINUX_SUCC, ret);
419 freecon(secontext);
420 secontext = nullptr;
421
422 getfilecon(TEST_SUB_PATH_4_FILE_2.c_str(), &secontext);
423 ret = strcmp(DEST_LABEL.c_str(), secontext);
424 ASSERT_EQ(SELINUX_SUCC, ret);
425 freecon(secontext);
426 secontext = nullptr;
427
428 getfilecon(TEST_SUB_PATH_3_FILE_1.c_str(), &secontext);
429 ret = strcmp(DEST_LABEL.c_str(), secontext);
430 ASSERT_EQ(SELINUX_SUCC, ret);
431 freecon(secontext);
432 secontext = nullptr;
433
434 getfilecon(TEST_SUB_PATH_3_FILE_2.c_str(), &secontext);
435 ret = strcmp(secontextOld, secontext);
436 ASSERT_EQ(SELINUX_SUCC, ret);
437 freecon(secontext);
438 freecon(secontextOld);
439 secontext = nullptr;
440 secontextOld = nullptr;
441
442 ASSERT_EQ(true, RemoveDirectory(TEST_PATH));
443 }
444
445 /**
446 * @tc.name: HapFileRestorecon009
447 * @tc.desc: HapFileRestorecon repeat label.
448 * @tc.type: FUNC
449 * @tc.require:AR000GJSDQ
450 */
451 HWTEST_F(SelinuxUnitTest, HapFileRestorecon009, TestSize.Level1)
452 {
453 ASSERT_EQ(true, CreateDirectory(TEST_SUB_PATH_1));
454
455 int ret = test.HapFileRestorecon(TEST_SUB_PATH_1, TEST_APL, TEST_NAME, 0);
456 ASSERT_EQ(SELINUX_SUCC, ret);
457
458 char *secontext = nullptr;
459 getfilecon(TEST_SUB_PATH_1.c_str(), &secontext);
460 ret = strcmp(DEST_LABEL.c_str(), secontext);
461 ASSERT_EQ(SELINUX_SUCC, ret);
462 freecon(secontext);
463 secontext = nullptr;
464
465 char *secontextOld = nullptr;
466 getfilecon(TEST_SUB_PATH_1.c_str(), &secontextOld);
467
468 ret = test.HapFileRestorecon(TEST_SUB_PATH_1, TEST_APL, TEST_NAME, 0); // double restorcon
469 ASSERT_EQ(SELINUX_SUCC, ret);
470
471 getfilecon(TEST_SUB_PATH_1.c_str(), &secontext);
472 ret = strcmp(secontextOld, secontext);
473 ASSERT_EQ(SELINUX_SUCC, ret);
474 freecon(secontext);
475 freecon(secontextOld);
476 secontext = nullptr;
477 secontextOld = nullptr;
478
479 ASSERT_EQ(true, RemoveDirectory(TEST_PATH));
480 }
481
482 /**
483 * @tc.name: HapDomainSetcontext001
484 * @tc.desc: HapDomainSetcontext input para empty.
485 * @tc.type: FUNC
486 * @tc.require:AR000GJSDQ
487 */
488 HWTEST_F(SelinuxUnitTest, HapDomainSetcontext001, TestSize.Level1)
489 {
490 int ret = test.HapDomainSetcontext("", TEST_NAME);
491 ASSERT_EQ(-SELINUX_ARG_INVALID, ret);
492
493 ret = test.HapDomainSetcontext(TEST_APL, "");
494 ASSERT_EQ(SELINUX_SUCC, ret);
495 }
496
497 /**
498 * @tc.name: HapDomainSetcontext002
499 * @tc.desc: HapDomainSetcontext domain empty.
500 * @tc.type: FUNC
501 * @tc.require:AR000GJSDQ
502 */
503 HWTEST_F(SelinuxUnitTest, HapDomainSetcontext002, TestSize.Level1)
504 {
505 // apl=system_core name=com.ohos.test domain= type=
506 int ret = test.HapDomainSetcontext(TEST_APL, "com.ohos.test");
507 ASSERT_EQ(-SELINUX_ARG_INVALID, ret);
508 }
509
510 /**
511 * @tc.name: HapDomainSetcontext003
512 * @tc.desc: HapDomainSetcontext domain function test.
513 * @tc.type: FUNC
514 * @tc.require:AR000GJSDQ
515 */
516 HWTEST_F(SelinuxUnitTest, HapDomainSetcontext003, TestSize.Level1)
517 {
518 pid_t pid = fork();
519 ASSERT_TRUE(pid >= 0);
520 if (pid < 0) {
521 return;
522 } else if (pid == 0) {
523 int ret = test.HapDomainSetcontext(TEST_APL, TEST_NAME);
524 ASSERT_EQ(SELINUX_SUCC, ret);
525 sleep(SLEEP_SECOND);
526 exit(0);
527 } else {
528 std::string cmdRes = RunCommand("ps -efZ | grep hap_restorecon_unittest | grep -v grep");
529 ASSERT_TRUE(cmdRes.find(DEST_DOMAIN) != std::string::npos);
530 }
531 }
532