• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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