1d9f0492fSopenharmony_ci/*
2d9f0492fSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
3d9f0492fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4d9f0492fSopenharmony_ci * you may not use this file except in compliance with the License.
5d9f0492fSopenharmony_ci * You may obtain a copy of the License at
6d9f0492fSopenharmony_ci *
7d9f0492fSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8d9f0492fSopenharmony_ci *
9d9f0492fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10d9f0492fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11d9f0492fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d9f0492fSopenharmony_ci * See the License for the specific language governing permissions and
13d9f0492fSopenharmony_ci * limitations under the License.
14d9f0492fSopenharmony_ci */
15d9f0492fSopenharmony_ci
16d9f0492fSopenharmony_ci#include "param_stub.h"
17d9f0492fSopenharmony_ci#include <dirent.h>
18d9f0492fSopenharmony_ci#include <sys/prctl.h>
19d9f0492fSopenharmony_ci#include <unistd.h>
20d9f0492fSopenharmony_ci
21d9f0492fSopenharmony_ci#include "begetctl.h"
22d9f0492fSopenharmony_ci#include "bootstage.h"
23d9f0492fSopenharmony_ci#include "init.h"
24d9f0492fSopenharmony_ci#include "init_log.h"
25d9f0492fSopenharmony_ci#include "init_param.h"
26d9f0492fSopenharmony_ci#ifndef OHOS_LITE
27d9f0492fSopenharmony_ci#include "init_mount.h"
28d9f0492fSopenharmony_ci#endif
29d9f0492fSopenharmony_ci#include "hookmgr.h"
30d9f0492fSopenharmony_ci#include "parameter.h"
31d9f0492fSopenharmony_ci#include "param_manager.h"
32d9f0492fSopenharmony_ci#include "param_security.h"
33d9f0492fSopenharmony_ci#include "param_utils.h"
34d9f0492fSopenharmony_ci#include "init_group_manager.h"
35d9f0492fSopenharmony_ci#include "init_module_engine.h"
36d9f0492fSopenharmony_ci#ifdef PARAM_LOAD_CFG_FROM_CODE
37d9f0492fSopenharmony_ci#include "param_cfg.h"
38d9f0492fSopenharmony_ci#endif
39d9f0492fSopenharmony_ci#include "ueventd.h"
40d9f0492fSopenharmony_ci
41d9f0492fSopenharmony_ci#ifdef __cplusplus
42d9f0492fSopenharmony_ci#if __cplusplus
43d9f0492fSopenharmony_ciextern "C" {
44d9f0492fSopenharmony_ci#endif
45d9f0492fSopenharmony_ci#endif
46d9f0492fSopenharmony_ci
47d9f0492fSopenharmony_cistatic int g_stubResult[STUB_MAX] = { 0 };
48d9f0492fSopenharmony_cistatic int g_testRandom = 2; // 2 is test random
49d9f0492fSopenharmony_ci
50d9f0492fSopenharmony_cistatic int g_testPermissionResult = DAC_RESULT_PERMISSION;
51d9f0492fSopenharmony_civoid SetTestPermissionResult(int result)
52d9f0492fSopenharmony_ci{
53d9f0492fSopenharmony_ci    g_testPermissionResult = result;
54d9f0492fSopenharmony_ci}
55d9f0492fSopenharmony_ci
56d9f0492fSopenharmony_cistatic const char *selinuxLabels[][2] = {
57d9f0492fSopenharmony_ci    {"test.permission.read", "u:object_r:test_read:s0"},
58d9f0492fSopenharmony_ci    {"test.permission.write", "u:object_r:test_write:s0"},
59d9f0492fSopenharmony_ci    {"test.permission.watch", "u:object_r:test_watch:s0"},
60d9f0492fSopenharmony_ci};
61d9f0492fSopenharmony_ci
62d9f0492fSopenharmony_cistatic int TestGenHashCode(const char *buff)
63d9f0492fSopenharmony_ci{
64d9f0492fSopenharmony_ci    int code = 0;
65d9f0492fSopenharmony_ci    size_t buffLen = strlen(buff);
66d9f0492fSopenharmony_ci    for (size_t i = 0; i < buffLen; i++) {
67d9f0492fSopenharmony_ci        code += buff[i] - 'A';
68d9f0492fSopenharmony_ci    }
69d9f0492fSopenharmony_ci    return code;
70d9f0492fSopenharmony_ci}
71d9f0492fSopenharmony_ci
72d9f0492fSopenharmony_cistatic void TestSetSelinuxLogCallback(void) {}
73d9f0492fSopenharmony_ci
74d9f0492fSopenharmony_cistatic int TestSetParamCheck(const char *paraName, const char *context, const SrcInfo *info)
75d9f0492fSopenharmony_ci{
76d9f0492fSopenharmony_ci    BEGET_LOGI("TestSetParamCheck %s result %d", paraName, g_testPermissionResult);
77d9f0492fSopenharmony_ci    return g_testPermissionResult;
78d9f0492fSopenharmony_ci}
79d9f0492fSopenharmony_ci
80d9f0492fSopenharmony_cistatic const char *TestGetParamLabel(const char *paraName)
81d9f0492fSopenharmony_ci{
82d9f0492fSopenharmony_ci    BEGET_LOGI("TestGetParamLabel %s", paraName);
83d9f0492fSopenharmony_ci    if (paraName == nullptr) {
84d9f0492fSopenharmony_ci        return nullptr;
85d9f0492fSopenharmony_ci    }
86d9f0492fSopenharmony_ci    for (size_t i = 0; i < ARRAY_LENGTH(selinuxLabels); i++) {
87d9f0492fSopenharmony_ci        if (strncmp(selinuxLabels[i][0], paraName, strlen(selinuxLabels[i][0])) == 0) {
88d9f0492fSopenharmony_ci            return selinuxLabels[i][1];
89d9f0492fSopenharmony_ci        }
90d9f0492fSopenharmony_ci    }
91d9f0492fSopenharmony_ci    int code = TestGenHashCode(paraName);
92d9f0492fSopenharmony_ci    code = code % (ARRAY_LENGTH(selinuxLabels));
93d9f0492fSopenharmony_ci    return selinuxLabels[code][1];
94d9f0492fSopenharmony_ci}
95d9f0492fSopenharmony_ci
96d9f0492fSopenharmony_cistatic int32_t TestGetSelinuxLabelIndex(const char *paraName)
97d9f0492fSopenharmony_ci{
98d9f0492fSopenharmony_ci    for (size_t i = 0; i < ARRAY_LENGTH(selinuxLabels); i++) {
99d9f0492fSopenharmony_ci        if (strncmp(selinuxLabels[i][0], paraName, strlen(selinuxLabels[i][0])) == 0) {
100d9f0492fSopenharmony_ci            return i;
101d9f0492fSopenharmony_ci        }
102d9f0492fSopenharmony_ci    }
103d9f0492fSopenharmony_ci    int code = TestGenHashCode(paraName);
104d9f0492fSopenharmony_ci    code = code % (ARRAY_LENGTH(selinuxLabels));
105d9f0492fSopenharmony_ci    return code;
106d9f0492fSopenharmony_ci}
107d9f0492fSopenharmony_ci
108d9f0492fSopenharmony_cistatic const char *g_forbidReadParamName[] = {
109d9f0492fSopenharmony_ci    "ohos.servicectrl.",
110d9f0492fSopenharmony_ci    // "test.permission.write",
111d9f0492fSopenharmony_ci};
112d9f0492fSopenharmony_cistatic int TestReadParamCheck(const char *paraName)
113d9f0492fSopenharmony_ci{
114d9f0492fSopenharmony_ci    // forbid to read ohos.servicectrl.
115d9f0492fSopenharmony_ci    for (size_t i = 0; i < ARRAY_LENGTH(g_forbidReadParamName); i++) {
116d9f0492fSopenharmony_ci        if (strncmp(paraName, g_forbidReadParamName[i], strlen(g_forbidReadParamName[i])) == 0) {
117d9f0492fSopenharmony_ci            return 1;
118d9f0492fSopenharmony_ci        }
119d9f0492fSopenharmony_ci    }
120d9f0492fSopenharmony_ci    return g_testPermissionResult;
121d9f0492fSopenharmony_ci}
122d9f0492fSopenharmony_cistatic void TestDestroyParamList(ParamContextsList **list)
123d9f0492fSopenharmony_ci{
124d9f0492fSopenharmony_ci#ifdef PARAM_SUPPORT_SELINUX
125d9f0492fSopenharmony_ci    ParamContextsList *head = *list;
126d9f0492fSopenharmony_ci    while (head != nullptr) {
127d9f0492fSopenharmony_ci        ParamContextsList *next = head->next;
128d9f0492fSopenharmony_ci        free((void *)head->info.paraName);
129d9f0492fSopenharmony_ci        free((void *)head->info.paraContext);
130d9f0492fSopenharmony_ci        free(head);
131d9f0492fSopenharmony_ci        head = next;
132d9f0492fSopenharmony_ci    }
133d9f0492fSopenharmony_ci#endif
134d9f0492fSopenharmony_ci}
135d9f0492fSopenharmony_cistatic ParamContextsList *TestGetParamList(void)
136d9f0492fSopenharmony_ci{
137d9f0492fSopenharmony_ci#ifdef PARAM_SUPPORT_SELINUX
138d9f0492fSopenharmony_ci    ParamContextsList *head = (ParamContextsList *)malloc(sizeof(ParamContextsList));
139d9f0492fSopenharmony_ci    BEGET_ERROR_CHECK(head != nullptr, return nullptr, "Failed to alloc ParamContextsList");
140d9f0492fSopenharmony_ci    head->info.paraName = strdup(selinuxLabels[0][0]);
141d9f0492fSopenharmony_ci    head->info.paraContext = strdup(selinuxLabels[0][1]);
142d9f0492fSopenharmony_ci    head->info.index = 0;
143d9f0492fSopenharmony_ci    head->next = nullptr;
144d9f0492fSopenharmony_ci    for (size_t i = 1; i < ARRAY_LENGTH(selinuxLabels); i++) {
145d9f0492fSopenharmony_ci        ParamContextsList *node = (ParamContextsList *)malloc(sizeof(ParamContextsList));
146d9f0492fSopenharmony_ci        BEGET_ERROR_CHECK(node != nullptr, TestDestroyParamList(&head);
147d9f0492fSopenharmony_ci            return nullptr, "Failed to alloc ParamContextsList");
148d9f0492fSopenharmony_ci        node->info.paraName = strdup(selinuxLabels[i][0]);
149d9f0492fSopenharmony_ci        node->info.paraContext = strdup(selinuxLabels[i][1]);
150d9f0492fSopenharmony_ci        node->info.index = i;
151d9f0492fSopenharmony_ci        node->next = head->next;
152d9f0492fSopenharmony_ci        head->next = node;
153d9f0492fSopenharmony_ci    }
154d9f0492fSopenharmony_ci    // test error, no node paraName
155d9f0492fSopenharmony_ci    ParamContextsList *node = (ParamContextsList *)malloc(sizeof(ParamContextsList));
156d9f0492fSopenharmony_ci    BEGET_ERROR_CHECK(node != nullptr, TestDestroyParamList(&head);
157d9f0492fSopenharmony_ci        return nullptr, "Failed to alloc ParamContextsList");
158d9f0492fSopenharmony_ci    node->info.paraName = nullptr;
159d9f0492fSopenharmony_ci    node->info.paraContext = strdup(selinuxLabels[0][1]);
160d9f0492fSopenharmony_ci    node->next = head->next;
161d9f0492fSopenharmony_ci    head->next = node;
162d9f0492fSopenharmony_ci
163d9f0492fSopenharmony_ci    // test error, no node paraContext
164d9f0492fSopenharmony_ci    node = (ParamContextsList *)malloc(sizeof(ParamContextsList));
165d9f0492fSopenharmony_ci    BEGET_ERROR_CHECK(node != nullptr, TestDestroyParamList(&head);
166d9f0492fSopenharmony_ci        return nullptr, "Failed to alloc ParamContextsList");
167d9f0492fSopenharmony_ci    node->info.paraName = strdup(selinuxLabels[0][0]);
168d9f0492fSopenharmony_ci    node->info.paraContext = nullptr;
169d9f0492fSopenharmony_ci    node->next = head->next;
170d9f0492fSopenharmony_ci    head->next = node;
171d9f0492fSopenharmony_ci
172d9f0492fSopenharmony_ci    // test error, repeat
173d9f0492fSopenharmony_ci    node = (ParamContextsList *)malloc(sizeof(ParamContextsList));
174d9f0492fSopenharmony_ci    BEGET_ERROR_CHECK(node != nullptr, TestDestroyParamList(&head);
175d9f0492fSopenharmony_ci        return nullptr, "Failed to alloc ParamContextsList");
176d9f0492fSopenharmony_ci    node->info.paraName = strdup(selinuxLabels[0][0]);
177d9f0492fSopenharmony_ci    node->info.paraContext = strdup(selinuxLabels[0][1]);
178d9f0492fSopenharmony_ci    node->info.index = 0;
179d9f0492fSopenharmony_ci    node->next = head->next;
180d9f0492fSopenharmony_ci    head->next = node;
181d9f0492fSopenharmony_ci    return head;
182d9f0492fSopenharmony_ci#else
183d9f0492fSopenharmony_ci    return nullptr;
184d9f0492fSopenharmony_ci#endif
185d9f0492fSopenharmony_ci}
186d9f0492fSopenharmony_ci
187d9f0492fSopenharmony_civoid TestSetSelinuxOps(void)
188d9f0492fSopenharmony_ci{
189d9f0492fSopenharmony_ci#ifdef PARAM_SUPPORT_SELINUX
190d9f0492fSopenharmony_ci    SelinuxSpace *selinuxSpace = &GetParamWorkSpace()->selinuxSpace;
191d9f0492fSopenharmony_ci    selinuxSpace->setSelinuxLogCallback = TestSetSelinuxLogCallback;
192d9f0492fSopenharmony_ci    selinuxSpace->setParamCheck = TestSetParamCheck;
193d9f0492fSopenharmony_ci    selinuxSpace->getParamLabel = TestGetParamLabel;
194d9f0492fSopenharmony_ci    selinuxSpace->readParamCheck = TestReadParamCheck;
195d9f0492fSopenharmony_ci    selinuxSpace->getParamList = TestGetParamList;
196d9f0492fSopenharmony_ci    selinuxSpace->destroyParamList = TestDestroyParamList;
197d9f0492fSopenharmony_ci    selinuxSpace->getParamLabelIndex = TestGetSelinuxLabelIndex;
198d9f0492fSopenharmony_ci#endif
199d9f0492fSopenharmony_ci}
200d9f0492fSopenharmony_ci
201d9f0492fSopenharmony_civoid TestSetParamCheckResult(const char *prefix, uint16_t mode, int result)
202d9f0492fSopenharmony_ci{
203d9f0492fSopenharmony_ci    ParamAuditData auditData = {};
204d9f0492fSopenharmony_ci    auditData.name = prefix;
205d9f0492fSopenharmony_ci    auditData.dacData.gid = 202;  // 202 test dac gid
206d9f0492fSopenharmony_ci    auditData.dacData.uid = 202;  // 202 test dac uid
207d9f0492fSopenharmony_ci    auditData.dacData.mode = mode;
208d9f0492fSopenharmony_ci    AddSecurityLabel(&auditData);
209d9f0492fSopenharmony_ci    SetTestPermissionResult(result);
210d9f0492fSopenharmony_ci}
211d9f0492fSopenharmony_ci
212d9f0492fSopenharmony_civoid CreateTestFile(const char *fileName, const char *data)
213d9f0492fSopenharmony_ci{
214d9f0492fSopenharmony_ci    CheckAndCreateDir(fileName);
215d9f0492fSopenharmony_ci    PARAM_LOGV("PrepareParamTestData for %s", fileName);
216d9f0492fSopenharmony_ci    FILE *tmpFile = fopen(fileName, "wr");
217d9f0492fSopenharmony_ci    if (tmpFile != nullptr) {
218d9f0492fSopenharmony_ci        fprintf(tmpFile, "%s", data);
219d9f0492fSopenharmony_ci        (void)fflush(tmpFile);
220d9f0492fSopenharmony_ci        fclose(tmpFile);
221d9f0492fSopenharmony_ci    }
222d9f0492fSopenharmony_ci}
223d9f0492fSopenharmony_cistatic void PrepareUeventdcfg(void)
224d9f0492fSopenharmony_ci{
225d9f0492fSopenharmony_ci    const char *ueventdcfg = "[device]\n"
226d9f0492fSopenharmony_ci        "/dev/test 0666 1000 1000\n"
227d9f0492fSopenharmony_ci        "[device]\n"
228d9f0492fSopenharmony_ci        "/dev/test1 0666 1000\n"
229d9f0492fSopenharmony_ci        "[device]\n"
230d9f0492fSopenharmony_ci        "/dev/test2 0666 1000 1000 1000 1000\n"
231d9f0492fSopenharmony_ci        "[sysfs]\n"
232d9f0492fSopenharmony_ci        "/dir/to/nothing attr_nowhere 0666 1000 1000\n"
233d9f0492fSopenharmony_ci        "[sysfs]\n"
234d9f0492fSopenharmony_ci        "  #/dir/to/nothing attr_nowhere 0666\n"
235d9f0492fSopenharmony_ci        "[sysfs\n"
236d9f0492fSopenharmony_ci        "/dir/to/nothing attr_nowhere 0666\n"
237d9f0492fSopenharmony_ci        "[firmware]\n"
238d9f0492fSopenharmony_ci        "/etc\n"
239d9f0492fSopenharmony_ci        "[device]\n"
240d9f0492fSopenharmony_ci        "/dev/testbinder 0666 1000 1000 const.dev.binder\n"
241d9f0492fSopenharmony_ci        "[device]\n"
242d9f0492fSopenharmony_ci        "/dev/testbinder1 0666 1000 1000 const.dev.binder\n"
243d9f0492fSopenharmony_ci        "[device]\n"
244d9f0492fSopenharmony_ci        "/dev/testbinder2 0666 1000 1000 const.dev.binder\n"
245d9f0492fSopenharmony_ci        "[device]\n"
246d9f0492fSopenharmony_ci        "/dev/testbinder3 0666 1000 1000 const.dev.binder\n";
247d9f0492fSopenharmony_ci    mkdir("/data/ueventd_ut", S_IRWXU | S_IRWXG | S_IRWXO);
248d9f0492fSopenharmony_ci    CreateTestFile(STARTUP_INIT_UT_PATH"/ueventd_ut/valid.config", ueventdcfg);
249d9f0492fSopenharmony_ci}
250d9f0492fSopenharmony_cistatic void PrepareModCfg(void)
251d9f0492fSopenharmony_ci{
252d9f0492fSopenharmony_ci    const char *modCfg = "testinsmod";
253d9f0492fSopenharmony_ci    CreateTestFile(STARTUP_INIT_UT_PATH"/test_insmod", modCfg);
254d9f0492fSopenharmony_ci}
255d9f0492fSopenharmony_cistatic void PrepareInnerKitsCfg()
256d9f0492fSopenharmony_ci{
257d9f0492fSopenharmony_ci    const char *innerKitsCfg = "/dev/block/platform/soc/10100000.himci.eMMC/by-name/system /system "
258d9f0492fSopenharmony_ci        "ext4 ro,barrier=1 wait\n"
259d9f0492fSopenharmony_ci        "/dev/block/platform/soc/10100000.himci.eMMC/by-name/vendor /vendor "
260d9f0492fSopenharmony_ci        "ext4 ro,barrier=1 wait\n"
261d9f0492fSopenharmony_ci        "/dev/block/platform/soc/10100000.himci.eMMC/by-name/hos "
262d9f0492fSopenharmony_ci        "/hos ntfs nosuid,nodev,noatime,barrier=1,data=ordered wait\n"
263d9f0492fSopenharmony_ci        "/dev/block/platform/soc/10100000.himci.eMMC/by-name/userdata /data ext4 "
264d9f0492fSopenharmony_ci        "nosuid,nodev,noatime,barrier=1,data=ordered,noauto_da_alloc "
265d9f0492fSopenharmony_ci        "wait,reservedsize=104857600\n"
266d9f0492fSopenharmony_ci        "  aaaa\n"
267d9f0492fSopenharmony_ci        "aa aa\n"
268d9f0492fSopenharmony_ci        "aa aa aa\n"
269d9f0492fSopenharmony_ci        "aa aa aa aa\n";
270d9f0492fSopenharmony_ci    const char *fstabRequired = "# fstab file.\n"
271d9f0492fSopenharmony_ci        "#<src> <mnt_point> <type> <mnt_flags and options> <fs_mgr_flags>\n"
272d9f0492fSopenharmony_ci        "/dev/block/platform/fe310000.sdhci/by-name/testsystem /usr ext4 ro,barrier=1 wait,required,nofail\n"
273d9f0492fSopenharmony_ci        "/dev/block/platform/fe310000.sdhci/by-name/testvendor /vendor ext4 ro,barrier=1 wait,required\n"
274d9f0492fSopenharmony_ci        "/dev/block/platform/fe310000.sdhci/by-name/testuserdata1 /data f2fs noatime,nosuid,nodev wait,check,quota\n"
275d9f0492fSopenharmony_ci        "/dev/block/platform/fe310000.sdhci/by-name/testuserdata2 /data ext4 noatime,fscrypt=xxx wait,check,quota\n"
276d9f0492fSopenharmony_ci        "/dev/block/platform/fe310000.sdhci/by-name/testmisc /misc none none wait,required";
277d9f0492fSopenharmony_ci    mkdir("/data/init_ut/mount_unitest/", S_IRWXU | S_IRWXG | S_IRWXO);
278d9f0492fSopenharmony_ci    CreateTestFile(STARTUP_INIT_UT_PATH"/mount_unitest/ReadFstabFromFile1.fstable", innerKitsCfg);
279d9f0492fSopenharmony_ci    CreateTestFile(STARTUP_INIT_UT_PATH"/etc/fstab.required", fstabRequired);
280d9f0492fSopenharmony_ci    CreateTestFile(STARTUP_INIT_UT_PATH"/system/etc/fstab.required", fstabRequired);
281d9f0492fSopenharmony_ci}
282d9f0492fSopenharmony_cistatic void PrepareGroupTestCfg()
283d9f0492fSopenharmony_ci{
284d9f0492fSopenharmony_ci    const char *data = "{"
285d9f0492fSopenharmony_ci	    "\"jobs\": [\"param:job1\", \"param:job2\", \"param:job4\"],"
286d9f0492fSopenharmony_ci	    "\"services\": [\"service:service1\", \"service:service3\", \"service:service2\"],"
287d9f0492fSopenharmony_ci	    "\"groups\": [\"subsystem.xxx1.group\", \"subsystem.xxx2.group\", \"subsystem.xxx4.group\"]"
288d9f0492fSopenharmony_ci    "}";
289d9f0492fSopenharmony_ci    const char *xxx1 = "{"
290d9f0492fSopenharmony_ci	    "\"groups\": [\"subsystem.xxx11.group\""
291d9f0492fSopenharmony_ci    "}";
292d9f0492fSopenharmony_ci    const char *xxx11 = "{"
293d9f0492fSopenharmony_ci	    "\"groups\": [\"subsystem.xxx12.group\""
294d9f0492fSopenharmony_ci    "}";
295d9f0492fSopenharmony_ci    const char *xxx12 = "{"
296d9f0492fSopenharmony_ci	    "\"groups\": [\"subsystem.xxx13.group\""
297d9f0492fSopenharmony_ci    "}";
298d9f0492fSopenharmony_ci    const char *xxx13 = "{"
299d9f0492fSopenharmony_ci	    "\"groups\": [\"subsystem.xxx14.group\""
300d9f0492fSopenharmony_ci    "}";
301d9f0492fSopenharmony_ci    const char *xxx14 = "{"
302d9f0492fSopenharmony_ci	    "\"groups\": [\"subsystem.xxx11.group\""
303d9f0492fSopenharmony_ci    "}";
304d9f0492fSopenharmony_ci    CreateTestFile(GROUP_DEFAULT_PATH "/device.boot.group.cfg", data);
305d9f0492fSopenharmony_ci    CreateTestFile(GROUP_DEFAULT_PATH "/subsystem.xxx1.group.cfg", xxx1);
306d9f0492fSopenharmony_ci    CreateTestFile(GROUP_DEFAULT_PATH "/subsystem.xxx11.group.cfg", xxx11);
307d9f0492fSopenharmony_ci    CreateTestFile(GROUP_DEFAULT_PATH "/subsystem.xxx12.group.cfg", xxx12);
308d9f0492fSopenharmony_ci    CreateTestFile(GROUP_DEFAULT_PATH "/subsystem.xxx13.group.cfg", xxx13);
309d9f0492fSopenharmony_ci    CreateTestFile(GROUP_DEFAULT_PATH "/subsystem.xxx14.group.cfg", xxx14);
310d9f0492fSopenharmony_ci}
311d9f0492fSopenharmony_cistatic bool IsDir(const std::string &path)
312d9f0492fSopenharmony_ci{
313d9f0492fSopenharmony_ci    struct stat st {};
314d9f0492fSopenharmony_ci    if (stat(path.c_str(), &st) < 0) {
315d9f0492fSopenharmony_ci        return false;
316d9f0492fSopenharmony_ci    }
317d9f0492fSopenharmony_ci    return S_ISDIR(st.st_mode);
318d9f0492fSopenharmony_ci}
319d9f0492fSopenharmony_cistatic bool DeleteDir(const std::string &path)
320d9f0492fSopenharmony_ci{
321d9f0492fSopenharmony_ci    auto pDir = std::unique_ptr<DIR, decltype(&closedir)>(opendir(path.c_str()), closedir);
322d9f0492fSopenharmony_ci    if (pDir == nullptr) {
323d9f0492fSopenharmony_ci        return false;
324d9f0492fSopenharmony_ci    }
325d9f0492fSopenharmony_ci
326d9f0492fSopenharmony_ci    struct dirent *dp = nullptr;
327d9f0492fSopenharmony_ci    while ((dp = readdir(pDir.get())) != nullptr) {
328d9f0492fSopenharmony_ci        std::string currentName(dp->d_name);
329d9f0492fSopenharmony_ci        if (currentName[0] != '.') {
330d9f0492fSopenharmony_ci            std::string tmpName(path);
331d9f0492fSopenharmony_ci            tmpName.append("/" + currentName);
332d9f0492fSopenharmony_ci            if (IsDir(tmpName)) {
333d9f0492fSopenharmony_ci                DeleteDir(tmpName);
334d9f0492fSopenharmony_ci            }
335d9f0492fSopenharmony_ci            remove(tmpName.c_str());
336d9f0492fSopenharmony_ci        }
337d9f0492fSopenharmony_ci    }
338d9f0492fSopenharmony_ci    if (remove(path.c_str()) != 0) {
339d9f0492fSopenharmony_ci        return false;
340d9f0492fSopenharmony_ci    }
341d9f0492fSopenharmony_ci    return true;
342d9f0492fSopenharmony_ci}
343d9f0492fSopenharmony_cistatic void LoadParamFromCfg(void)
344d9f0492fSopenharmony_ci{
345d9f0492fSopenharmony_ci#ifdef PARAM_LOAD_CFG_FROM_CODE
346d9f0492fSopenharmony_ci    for (size_t i = 0; i < ARRAY_LENGTH(g_paramDefCfgNodes); i++) {
347d9f0492fSopenharmony_ci        PARAM_LOGI("InitParamClient name %s = %s", g_paramDefCfgNodes[i].name, g_paramDefCfgNodes[i].value);
348d9f0492fSopenharmony_ci        uint32_t dataIndex = 0;
349d9f0492fSopenharmony_ci        int ret = WriteParam(g_paramDefCfgNodes[i].name, g_paramDefCfgNodes[i].value, &dataIndex, 0);
350d9f0492fSopenharmony_ci        PARAM_CHECK(ret == 0, continue, "Failed to set param %d name %s %s",
351d9f0492fSopenharmony_ci            ret, g_paramDefCfgNodes[i].name, g_paramDefCfgNodes[i].value);
352d9f0492fSopenharmony_ci    }
353d9f0492fSopenharmony_ci#endif
354d9f0492fSopenharmony_ci}
355d9f0492fSopenharmony_ci
356d9f0492fSopenharmony_cistatic const char *g_triggerData = "{"
357d9f0492fSopenharmony_ci        "\"jobs\" : [{"
358d9f0492fSopenharmony_ci        "        \"name\" : \"early-init\","
359d9f0492fSopenharmony_ci        "        \"cmds\" : ["
360d9f0492fSopenharmony_ci        "            \"    write        '/proc/sys/kernel/sysrq 0'\","
361d9f0492fSopenharmony_ci        "            \"    load_persist_params \","
362d9f0492fSopenharmony_ci        "            \"    load_persist_params        \","
363d9f0492fSopenharmony_ci        "            \" #   load_persist_params \","
364d9f0492fSopenharmony_ci        "            \"   restorecon /postinstall\","
365d9f0492fSopenharmony_ci        "            \"mkdir /acct/uid\","
366d9f0492fSopenharmony_ci        "            \"chown root system /dev/memcg/memory.pressure_level\","
367d9f0492fSopenharmony_ci        "            \"chmod 0040 /dev/memcg/memory.pressure_level\","
368d9f0492fSopenharmony_ci        "            \"mkdir /dev/memcg/apps/ 0755 system system\","
369d9f0492fSopenharmony_ci        "           \"mkdir /dev/memcg/system 0550 system system\","
370d9f0492fSopenharmony_ci        "            \"start ueventd\","
371d9f0492fSopenharmony_ci        "            \"exec_start apexd-bootstrap\","
372d9f0492fSopenharmony_ci        "            \"setparam sys.usb.config ${persist.sys.usb.config}\""
373d9f0492fSopenharmony_ci        "        ]"
374d9f0492fSopenharmony_ci        "    },"
375d9f0492fSopenharmony_ci        "    {"
376d9f0492fSopenharmony_ci        "        \"name\" : \"param:trigger_test_1\","
377d9f0492fSopenharmony_ci        "        \"condition\" : \"test.sys.boot_from_charger_mode=5\","
378d9f0492fSopenharmony_ci        "        \"cmds\" : ["
379d9f0492fSopenharmony_ci        "            \"class_stop charger\","
380d9f0492fSopenharmony_ci        "            \"trigger late-init\""
381d9f0492fSopenharmony_ci        "        ]"
382d9f0492fSopenharmony_ci        "    },"
383d9f0492fSopenharmony_ci        "    {"
384d9f0492fSopenharmony_ci        "        \"name\" : \"param:trigger_test_2\","
385d9f0492fSopenharmony_ci        "        \"condition\" : \"test.sys.boot_from_charger_mode=1  "
386d9f0492fSopenharmony_ci        " || test.sys.boot_from_charger_mode=2   ||  test.sys.boot_from_charger_mode=3\","
387d9f0492fSopenharmony_ci        "        \"cmds\" : ["
388d9f0492fSopenharmony_ci        "            \"class_stop charger\","
389d9f0492fSopenharmony_ci        "            \"trigger late-init\""
390d9f0492fSopenharmony_ci        "        ]"
391d9f0492fSopenharmony_ci        "    },"
392d9f0492fSopenharmony_ci        "    {"
393d9f0492fSopenharmony_ci        "        \"name\" : \"load_persist_params_action\","
394d9f0492fSopenharmony_ci        "        \"cmds\" : ["
395d9f0492fSopenharmony_ci        "           \"load_persist_params\","
396d9f0492fSopenharmony_ci        "            \"start logd\","
397d9f0492fSopenharmony_ci        "            \"start logd-reinit\""
398d9f0492fSopenharmony_ci        "        ]"
399d9f0492fSopenharmony_ci        "    },"
400d9f0492fSopenharmony_ci        "    {"
401d9f0492fSopenharmony_ci        "        \"name\" : \"firmware_mounts_complete\","
402d9f0492fSopenharmony_ci        "        \"cmds\" : ["
403d9f0492fSopenharmony_ci        "            \"rm /dev/.booting\""
404d9f0492fSopenharmony_ci        "        ]"
405d9f0492fSopenharmony_ci        "    }"
406d9f0492fSopenharmony_ci        "]"
407d9f0492fSopenharmony_ci    "}";
408d9f0492fSopenharmony_ci
409d9f0492fSopenharmony_civoid PrepareCmdLineData()
410d9f0492fSopenharmony_ci{
411d9f0492fSopenharmony_ci    const char *cmdLine = "bootgroup=device.boot.group earlycon=uart8250,mmio32,0xfe660000 "
412d9f0492fSopenharmony_ci        "root=PARTUUID=614e0000-0000 rw rootwait rootfstype=ext4 console=ttyFIQ0 hardware=rk3568 "
413d9f0492fSopenharmony_ci        "BOOT_IMAGE=/kernel init=/init default_boot_device=fe310000.sdhci bootslots=2 currentslot=1 initloglevel=2 "
414d9f0492fSopenharmony_ci        "ohos.required_mount.system="
415d9f0492fSopenharmony_ci        "/dev/block/platform/fe310000.sdhci/by-name/system@/usr@ext4@ro,barrier=1@wait,required "
416d9f0492fSopenharmony_ci        "ohos.required_mount.vendor="
417d9f0492fSopenharmony_ci        "/dev/block/platform/fe310000.sdhci/by-name/vendor@/vendor@ext4@ro,barrier=1@wait,required "
418d9f0492fSopenharmony_ci        "ohos.required_mount.misc="
419d9f0492fSopenharmony_ci        "/dev/block/platform/fe310000.sdhci/by-name/misc@none@none@none@wait,required ohos.boot.eng_mode=on ";
420d9f0492fSopenharmony_ci    CreateTestFile(BOOT_CMD_LINE, cmdLine);
421d9f0492fSopenharmony_ci}
422d9f0492fSopenharmony_ci
423d9f0492fSopenharmony_cistatic void PrepareAreaSizeFile(void)
424d9f0492fSopenharmony_ci{
425d9f0492fSopenharmony_ci    const char *ohosParamSize = "default_param=1024\n"
426d9f0492fSopenharmony_ci            "hilog_param=2048\n"
427d9f0492fSopenharmony_ci            "const_product_param=2048\n"
428d9f0492fSopenharmony_ci            "startup_param=20480\n"
429d9f0492fSopenharmony_ci            "persist_param=2048\n"
430d9f0492fSopenharmony_ci            "const_param=20480\n"
431d9f0492fSopenharmony_ci            "test_watch=102400\n"
432d9f0492fSopenharmony_ci            "test_write=102400\n"
433d9f0492fSopenharmony_ci            "const_param***=20480\n"
434d9f0492fSopenharmony_ci            "persist_sys_param=2048\n"
435d9f0492fSopenharmony_ci            "test_write=102400\n";
436d9f0492fSopenharmony_ci    CreateTestFile(PARAM_AREA_SIZE_CFG, ohosParamSize);
437d9f0492fSopenharmony_ci}
438d9f0492fSopenharmony_ci
439d9f0492fSopenharmony_cistatic void PrepareTestGroupFile(void)
440d9f0492fSopenharmony_ci{
441d9f0492fSopenharmony_ci    std::string groupData = "root:x:0:\n"
442d9f0492fSopenharmony_ci        "bin:x:2:\n"
443d9f0492fSopenharmony_ci        "system:x:1000:\n"
444d9f0492fSopenharmony_ci        "log:x:1007:\n"
445d9f0492fSopenharmony_ci        "deviceinfo:x:1102:\n"
446d9f0492fSopenharmony_ci        "samgr:x:5555:\n"
447d9f0492fSopenharmony_ci        "hdf_devmgr:x:3044:\n\n"
448d9f0492fSopenharmony_ci        "power_host:x:3025:\n"
449d9f0492fSopenharmony_ci        "servicectrl:x:1050:root,  shell,system,   samgr,   hdf_devmgr      \n"
450d9f0492fSopenharmony_ci        "powerctrl:x:1051:root, shell,system,  update,power_host\r\n"
451d9f0492fSopenharmony_ci        "bootctrl:x:1052:root,shell,system\n"
452d9f0492fSopenharmony_ci        "deviceprivate:x:1053:root,shell,system,samgr,hdf_devmgr,deviceinfo,"
453d9f0492fSopenharmony_ci        "dsoftbus,dms,account,useriam,access_token,device_manager,foundation,dbms,deviceauth,huks_server\n"
454d9f0492fSopenharmony_ci        "hiview:x:1201:\n"
455d9f0492fSopenharmony_ci        "hidumper_service:x:1212:\n"
456d9f0492fSopenharmony_ci        "shell:x:2000:\n"
457d9f0492fSopenharmony_ci        "cache:x:2001:\n"
458d9f0492fSopenharmony_ci        "net_bw_stats:x:3006:\n";
459d9f0492fSopenharmony_ci
460d9f0492fSopenharmony_ci    CreateTestFile(STARTUP_INIT_UT_PATH "/etc/group", groupData.c_str());
461d9f0492fSopenharmony_ci}
462d9f0492fSopenharmony_ci
463d9f0492fSopenharmony_cistatic void PrepareDacData()
464d9f0492fSopenharmony_ci{
465d9f0492fSopenharmony_ci    // for dac
466d9f0492fSopenharmony_ci    std::string dacData = "ohos.servicectrl.   = system:servicectrl:0775 \n";
467d9f0492fSopenharmony_ci    dacData += "startup.service.ctl.        = system:servicectrl:0775:int\n";
468d9f0492fSopenharmony_ci    dacData += "test.permission.       = root:root:0770\n";
469d9f0492fSopenharmony_ci    dacData += "test.permission.read. =  root:root:0774\n";
470d9f0492fSopenharmony_ci    dacData += "test.permission.write.=  root:root:0772\n";
471d9f0492fSopenharmony_ci    dacData += "test.permission.watcher. = root:root:0771\n";
472d9f0492fSopenharmony_ci    dacData += "test.test1. = system:test1:0771\n";
473d9f0492fSopenharmony_ci    dacData += "test.test2.watcher. = test2:root:0771\n";
474d9f0492fSopenharmony_ci    dacData += "test.type.int. = root:root:0777:int\n";
475d9f0492fSopenharmony_ci    dacData += "test.type.bool. = root:root:0777:bool\n";
476d9f0492fSopenharmony_ci    dacData += "test.type.string. = root:root:0777\n";
477d9f0492fSopenharmony_ci    dacData += "test.invalid.int. = root:root:\n";
478d9f0492fSopenharmony_ci    dacData += "test.invalid.int. = root::\n";
479d9f0492fSopenharmony_ci    dacData += "test.invalid.int. = ::\n";
480d9f0492fSopenharmony_ci    dacData += "test.invalid.int. = \n";
481d9f0492fSopenharmony_ci    dacData += "test.invalid.int. \n";
482d9f0492fSopenharmony_ci    CreateTestFile(STARTUP_INIT_UT_PATH "/system/etc/param/ohos.para.dac", dacData.c_str());
483d9f0492fSopenharmony_ci    CreateTestFile(STARTUP_INIT_UT_PATH "/system/etc/param/ohos.para.dac_1", dacData.c_str());
484d9f0492fSopenharmony_ci}
485d9f0492fSopenharmony_ci
486d9f0492fSopenharmony_cistatic int TestHook(const HOOK_INFO *hookInfo, void *cookie)
487d9f0492fSopenharmony_ci{
488d9f0492fSopenharmony_ci    return 0;
489d9f0492fSopenharmony_ci}
490d9f0492fSopenharmony_ci
491d9f0492fSopenharmony_civoid PrepareInitUnitTestEnv(void)
492d9f0492fSopenharmony_ci{
493d9f0492fSopenharmony_ci    static int evnOk = 0;
494d9f0492fSopenharmony_ci    if (evnOk) {
495d9f0492fSopenharmony_ci        return;
496d9f0492fSopenharmony_ci    }
497d9f0492fSopenharmony_ci    printf("PrepareInitUnitTestEnv \n");
498d9f0492fSopenharmony_ci#ifdef PARAM_SUPPORT_SELINUX
499d9f0492fSopenharmony_ci    RegisterSecuritySelinuxOps(nullptr, 0);
500d9f0492fSopenharmony_ci#endif
501d9f0492fSopenharmony_ci
502d9f0492fSopenharmony_ci#ifndef OHOS_LITE
503d9f0492fSopenharmony_ci    InitAddGlobalInitHook(0, TestHook);
504d9f0492fSopenharmony_ci    InitAddPreParamServiceHook(0, TestHook);
505d9f0492fSopenharmony_ci    InitAddPreParamLoadHook(0, TestHook);
506d9f0492fSopenharmony_ci    InitAddPreCfgLoadHook(0, TestHook);
507d9f0492fSopenharmony_ci    InitAddPostCfgLoadHook(0, TestHook);
508d9f0492fSopenharmony_ci    InitAddPostPersistParamLoadHook(0, TestHook);
509d9f0492fSopenharmony_ci#endif
510d9f0492fSopenharmony_ci    // read default parameter from system
511d9f0492fSopenharmony_ci    LoadDefaultParams("/system/etc/param/ohos_const", LOAD_PARAM_NORMAL);
512d9f0492fSopenharmony_ci    LoadDefaultParams("/vendor/etc/param", LOAD_PARAM_NORMAL);
513d9f0492fSopenharmony_ci    LoadDefaultParams("/system/etc/param", LOAD_PARAM_ONLY_ADD);
514d9f0492fSopenharmony_ci
515d9f0492fSopenharmony_ci    // read ut parameters
516d9f0492fSopenharmony_ci    LoadDefaultParams(STARTUP_INIT_UT_PATH "/system/etc/param/ohos_const", LOAD_PARAM_NORMAL);
517d9f0492fSopenharmony_ci    LoadDefaultParams(STARTUP_INIT_UT_PATH "/vendor/etc/param", LOAD_PARAM_NORMAL);
518d9f0492fSopenharmony_ci    LoadDefaultParams(STARTUP_INIT_UT_PATH "/system/etc/param", LOAD_PARAM_ONLY_ADD);
519d9f0492fSopenharmony_ci    LoadParamsFile(STARTUP_INIT_UT_PATH "/system/etc/param", LOAD_PARAM_ONLY_ADD);
520d9f0492fSopenharmony_ci    LoadParamFromCfg();
521d9f0492fSopenharmony_ci
522d9f0492fSopenharmony_ci    int32_t loglevel = GetIntParameter("persist.init.debug.loglevel", INIT_ERROR);
523d9f0492fSopenharmony_ci    SetInitLogLevel((InitLogLevel)loglevel);
524d9f0492fSopenharmony_ci
525d9f0492fSopenharmony_ci    // for test int get
526d9f0492fSopenharmony_ci    SystemWriteParam("test.int.get", "-101");
527d9f0492fSopenharmony_ci    SystemWriteParam("test.uint.get", "101");
528d9f0492fSopenharmony_ci    SystemWriteParam("test.string.get", "101");
529d9f0492fSopenharmony_ci    SystemWriteParam("test.bool.get.true", "true");
530d9f0492fSopenharmony_ci    SystemWriteParam("test.bool.get.false", "false");
531d9f0492fSopenharmony_ci
532d9f0492fSopenharmony_ci    evnOk = 1;
533d9f0492fSopenharmony_ci}
534d9f0492fSopenharmony_ci
535d9f0492fSopenharmony_ciint TestCheckParamPermission(const ParamLabelIndex *labelIndex,
536d9f0492fSopenharmony_ci    const ParamSecurityLabel *srcLabel, const char *name, uint32_t mode)
537d9f0492fSopenharmony_ci{
538d9f0492fSopenharmony_ci    // DAC_RESULT_FORBIDED
539d9f0492fSopenharmony_ci    return g_testPermissionResult;
540d9f0492fSopenharmony_ci}
541d9f0492fSopenharmony_ci
542d9f0492fSopenharmony_ciint TestFreeLocalSecurityLabel(ParamSecurityLabel *srcLabel)
543d9f0492fSopenharmony_ci{
544d9f0492fSopenharmony_ci    return 0;
545d9f0492fSopenharmony_ci}
546d9f0492fSopenharmony_ci
547d9f0492fSopenharmony_civoid SetStubResult(STUB_TYPE type, int result)
548d9f0492fSopenharmony_ci{
549d9f0492fSopenharmony_ci    g_stubResult[type] = result;
550d9f0492fSopenharmony_ci}
551d9f0492fSopenharmony_ci
552d9f0492fSopenharmony_ci#ifndef OHOS_LITE
553d9f0492fSopenharmony_cistatic void TestBeforeInit(void)
554d9f0492fSopenharmony_ci{
555d9f0492fSopenharmony_ci    ParamWorkSpace *paramSpace = GetParamWorkSpace();
556d9f0492fSopenharmony_ci    EXPECT_NE(paramSpace, nullptr);
557d9f0492fSopenharmony_ci    InitParamService();
558d9f0492fSopenharmony_ci    CloseParamWorkSpace();
559d9f0492fSopenharmony_ci    paramSpace = GetParamWorkSpace();
560d9f0492fSopenharmony_ci    EXPECT_NE(paramSpace, nullptr);
561d9f0492fSopenharmony_ci
562d9f0492fSopenharmony_ci    // test read cmdline
563d9f0492fSopenharmony_ci    Fstab *stab = LoadRequiredFstab();
564d9f0492fSopenharmony_ci    ReleaseFstab(stab);
565d9f0492fSopenharmony_ci}
566d9f0492fSopenharmony_ci#endif
567d9f0492fSopenharmony_ci
568d9f0492fSopenharmony_cistatic pid_t g_currPid = 0;
569d9f0492fSopenharmony_cistatic __attribute__((constructor(101))) void ParamTestStubInit(void)
570d9f0492fSopenharmony_ci{
571d9f0492fSopenharmony_ci    g_currPid = getpid();
572d9f0492fSopenharmony_ci    printf("Init unit test start %u \n", g_currPid);
573d9f0492fSopenharmony_ci    EnableInitLog(INIT_INFO);
574d9f0492fSopenharmony_ci    InitParseGroupCfg();
575d9f0492fSopenharmony_ci    // prepare data
576d9f0492fSopenharmony_ci    mkdir(STARTUP_INIT_UT_PATH, S_IRWXU | S_IRWXG | S_IRWXO);
577d9f0492fSopenharmony_ci    CheckAndCreateDir(STARTUP_INIT_UT_PATH MODULE_LIB_NAME "/autorun/");
578d9f0492fSopenharmony_ci    int cmdIndex = 0;
579d9f0492fSopenharmony_ci    (void)GetMatchCmd("copy ", &cmdIndex);
580d9f0492fSopenharmony_ci    DoCmdByIndex(cmdIndex, MODULE_LIB_NAME"/libbootchart.z.so "
581d9f0492fSopenharmony_ci        STARTUP_INIT_UT_PATH MODULE_LIB_NAME "/libbootchart.z.so", nullptr);
582d9f0492fSopenharmony_ci    DoCmdByIndex(cmdIndex, MODULE_LIB_NAME"/libbootchart.z.so "
583d9f0492fSopenharmony_ci        STARTUP_INIT_UT_PATH MODULE_LIB_NAME "/autorun/libbootchart.z.so", nullptr);
584d9f0492fSopenharmony_ci    PrepareUeventdcfg();
585d9f0492fSopenharmony_ci    PrepareInnerKitsCfg();
586d9f0492fSopenharmony_ci    PrepareModCfg();
587d9f0492fSopenharmony_ci    PrepareGroupTestCfg();
588d9f0492fSopenharmony_ci    PrepareDacData();
589d9f0492fSopenharmony_ci    CreateTestFile(STARTUP_INIT_UT_PATH"/trigger_test.cfg", g_triggerData);
590d9f0492fSopenharmony_ci    PrepareAreaSizeFile();
591d9f0492fSopenharmony_ci    PrepareTestGroupFile();
592d9f0492fSopenharmony_ci    PrepareCmdLineData();
593d9f0492fSopenharmony_ci    TestSetSelinuxOps();
594d9f0492fSopenharmony_ci
595d9f0492fSopenharmony_ci    PARAM_LOGI("TestSetSelinuxOps \n");
596d9f0492fSopenharmony_ci#ifndef OHOS_LITE
597d9f0492fSopenharmony_ci    TestBeforeInit();
598d9f0492fSopenharmony_ci#endif
599d9f0492fSopenharmony_ci#ifndef __LITEOS_A__
600d9f0492fSopenharmony_ci    SystemInit();
601d9f0492fSopenharmony_ci#endif
602d9f0492fSopenharmony_ci    PARAM_LOGI("SystemConfig \n");
603d9f0492fSopenharmony_ci    SystemConfig(NULL);
604d9f0492fSopenharmony_ci    PrepareInitUnitTestEnv();
605d9f0492fSopenharmony_ci}
606d9f0492fSopenharmony_ci
607d9f0492fSopenharmony_ci__attribute__((destructor)) static void ParamTestStubExit(void)
608d9f0492fSopenharmony_ci{
609d9f0492fSopenharmony_ci    PARAM_LOGI("ParamTestStubExit %u %u \n", g_currPid, getpid());
610d9f0492fSopenharmony_ci    if (g_currPid != getpid()) {
611d9f0492fSopenharmony_ci        return;
612d9f0492fSopenharmony_ci    }
613d9f0492fSopenharmony_ci#ifndef OHOS_LITE
614d9f0492fSopenharmony_ci    StopParamService();
615d9f0492fSopenharmony_ci
616d9f0492fSopenharmony_ci    HookMgrExecute(GetBootStageHookMgr(), INIT_BOOT_COMPLETE, nullptr, nullptr);
617d9f0492fSopenharmony_ci    CloseUeventConfig();
618d9f0492fSopenharmony_ci    CloseServiceSpace();
619d9f0492fSopenharmony_ci    demoExit();
620d9f0492fSopenharmony_ci    LE_CloseLoop(LE_GetDefaultLoop());
621d9f0492fSopenharmony_ci    HookMgrDestroy(GetBootStageHookMgr());
622d9f0492fSopenharmony_ci#endif
623d9f0492fSopenharmony_ci}
624d9f0492fSopenharmony_ci
625d9f0492fSopenharmony_ci#ifdef OHOS_LITE
626d9f0492fSopenharmony_civoid __attribute__((weak))LE_DoAsyncEvent(const LoopHandle loopHandle, const TaskHandle taskHandle)
627d9f0492fSopenharmony_ci{
628d9f0492fSopenharmony_ci}
629d9f0492fSopenharmony_ci
630d9f0492fSopenharmony_ciconst char* HalGetSerial(void)
631d9f0492fSopenharmony_ci{
632d9f0492fSopenharmony_ci    static const char *serial = "1234567890";
633d9f0492fSopenharmony_ci    return serial;
634d9f0492fSopenharmony_ci}
635d9f0492fSopenharmony_ci#endif
636d9f0492fSopenharmony_ci
637d9f0492fSopenharmony_ciint __attribute__((weak))SprintfStub(char *buffer, size_t size, const char *fmt, ...)
638d9f0492fSopenharmony_ci{
639d9f0492fSopenharmony_ci    int len = -1;
640d9f0492fSopenharmony_ci    va_list vargs;
641d9f0492fSopenharmony_ci    va_start(vargs, fmt);
642d9f0492fSopenharmony_ci    len = vsnprintf_s(buffer, size, size - 1, fmt, vargs);
643d9f0492fSopenharmony_ci    va_end(vargs);
644d9f0492fSopenharmony_ci    return len;
645d9f0492fSopenharmony_ci}
646d9f0492fSopenharmony_ci
647d9f0492fSopenharmony_ciint __attribute__((weak))MountStub(const char* source, const char* target,
648d9f0492fSopenharmony_ci    const char* filesystemtype, unsigned long mountflags, const void * data)
649d9f0492fSopenharmony_ci{
650d9f0492fSopenharmony_ci    return g_stubResult[STUB_MOUNT];
651d9f0492fSopenharmony_ci}
652d9f0492fSopenharmony_ci
653d9f0492fSopenharmony_ciint __attribute__((weak))UmountStub(const char *target)
654d9f0492fSopenharmony_ci{
655d9f0492fSopenharmony_ci    return 0;
656d9f0492fSopenharmony_ci}
657d9f0492fSopenharmony_ci
658d9f0492fSopenharmony_ciint __attribute__((weak))Umount2Stub(const char *target, int flags)
659d9f0492fSopenharmony_ci{
660d9f0492fSopenharmony_ci    return 0;
661d9f0492fSopenharmony_ci}
662d9f0492fSopenharmony_ci
663d9f0492fSopenharmony_ciint __attribute__((weak))SymlinkStub(const char * oldpath, const char * newpath)
664d9f0492fSopenharmony_ci{
665d9f0492fSopenharmony_ci    return 0;
666d9f0492fSopenharmony_ci}
667d9f0492fSopenharmony_ci
668d9f0492fSopenharmony_ciint PrctlStub(int option, ...)
669d9f0492fSopenharmony_ci{
670d9f0492fSopenharmony_ci    if (option == PR_SET_SECUREBITS) {
671d9f0492fSopenharmony_ci        static int count = 0;
672d9f0492fSopenharmony_ci        count++;
673d9f0492fSopenharmony_ci        return (count % g_testRandom == 1) ? 0 : -1;
674d9f0492fSopenharmony_ci    }
675d9f0492fSopenharmony_ci    if (option == PR_CAP_AMBIENT) {
676d9f0492fSopenharmony_ci        static int count1 = 0;
677d9f0492fSopenharmony_ci        count1++;
678d9f0492fSopenharmony_ci        return (count1 % g_testRandom == 1) ? 0 : -1;
679d9f0492fSopenharmony_ci    }
680d9f0492fSopenharmony_ci    return 0;
681d9f0492fSopenharmony_ci}
682d9f0492fSopenharmony_ci
683d9f0492fSopenharmony_ciint ExecvStub(const char *pathname, char *const argv[])
684d9f0492fSopenharmony_ci{
685d9f0492fSopenharmony_ci    printf("ExecvStub %s \n", pathname);
686d9f0492fSopenharmony_ci    return 0;
687d9f0492fSopenharmony_ci}
688d9f0492fSopenharmony_ci
689d9f0492fSopenharmony_ciint LchownStub(const char *pathname, uid_t owner, gid_t group)
690d9f0492fSopenharmony_ci{
691d9f0492fSopenharmony_ci    return 0;
692d9f0492fSopenharmony_ci}
693d9f0492fSopenharmony_ci
694d9f0492fSopenharmony_ciint KillStub(pid_t pid, int signal)
695d9f0492fSopenharmony_ci{
696d9f0492fSopenharmony_ci    return 0;
697d9f0492fSopenharmony_ci}
698d9f0492fSopenharmony_ci
699d9f0492fSopenharmony_ciint ExecveStub(const char *pathname, char *const argv[], char *const envp[])
700d9f0492fSopenharmony_ci{
701d9f0492fSopenharmony_ci    printf("ExecveStub %s \n", pathname);
702d9f0492fSopenharmony_ci    return 0;
703d9f0492fSopenharmony_ci}
704d9f0492fSopenharmony_ci
705d9f0492fSopenharmony_ciint LoadPolicy()
706d9f0492fSopenharmony_ci{
707d9f0492fSopenharmony_ci    return 0;
708d9f0492fSopenharmony_ci}
709d9f0492fSopenharmony_ci
710d9f0492fSopenharmony_cistatic int g_selinuxOptResult = 0;
711d9f0492fSopenharmony_ciint setcon(const char *name)
712d9f0492fSopenharmony_ci{
713d9f0492fSopenharmony_ci    g_selinuxOptResult++;
714d9f0492fSopenharmony_ci    return g_selinuxOptResult % g_testRandom;
715d9f0492fSopenharmony_ci}
716d9f0492fSopenharmony_ci
717d9f0492fSopenharmony_ciint RestoreconRecurse(const char *name)
718d9f0492fSopenharmony_ci{
719d9f0492fSopenharmony_ci    g_selinuxOptResult++;
720d9f0492fSopenharmony_ci    return g_selinuxOptResult % g_testRandom;
721d9f0492fSopenharmony_ci}
722d9f0492fSopenharmony_ci
723d9f0492fSopenharmony_ciint setexeccon(const char *name)
724d9f0492fSopenharmony_ci{
725d9f0492fSopenharmony_ci    g_selinuxOptResult++;
726d9f0492fSopenharmony_ci    return g_selinuxOptResult % g_testRandom;
727d9f0492fSopenharmony_ci}
728d9f0492fSopenharmony_ci
729d9f0492fSopenharmony_ciint setsockcreatecon(const char *name)
730d9f0492fSopenharmony_ci{
731d9f0492fSopenharmony_ci    g_selinuxOptResult++;
732d9f0492fSopenharmony_ci    return g_selinuxOptResult % g_testRandom;
733d9f0492fSopenharmony_ci}
734d9f0492fSopenharmony_ci
735d9f0492fSopenharmony_ciint setfilecon(const char *name, const char *content)
736d9f0492fSopenharmony_ci{
737d9f0492fSopenharmony_ci    g_selinuxOptResult++;
738d9f0492fSopenharmony_ci    return g_selinuxOptResult % g_testRandom;
739d9f0492fSopenharmony_ci}
740d9f0492fSopenharmony_ci
741d9f0492fSopenharmony_ciParamLabelIndex *TestGetParamLabelIndex(const char *name)
742d9f0492fSopenharmony_ci{
743d9f0492fSopenharmony_ci    static ParamLabelIndex labelIndex = {0};
744d9f0492fSopenharmony_ci    uint32_t index = 0;
745d9f0492fSopenharmony_ci    ParamWorkSpace *paramWorkspace = GetParamWorkSpace();
746d9f0492fSopenharmony_ci    if (paramWorkspace == nullptr) {
747d9f0492fSopenharmony_ci        return &labelIndex;
748d9f0492fSopenharmony_ci    }
749d9f0492fSopenharmony_ci#ifdef PARAM_SUPPORT_SELINUX
750d9f0492fSopenharmony_ci    if (paramWorkspace->selinuxSpace.getParamLabelIndex == nullptr) {
751d9f0492fSopenharmony_ci        return &labelIndex;
752d9f0492fSopenharmony_ci    }
753d9f0492fSopenharmony_ci    index = (uint32_t)paramWorkspace->selinuxSpace.getParamLabelIndex(name) + WORKSPACE_INDEX_BASE;
754d9f0492fSopenharmony_ci    if (index >= paramWorkspace->maxLabelIndex) {
755d9f0492fSopenharmony_ci        return &labelIndex;
756d9f0492fSopenharmony_ci    }
757d9f0492fSopenharmony_ci#endif
758d9f0492fSopenharmony_ci    labelIndex.workspace = paramWorkspace->workSpace[index];
759d9f0492fSopenharmony_ci    PARAM_CHECK(labelIndex.workspace != nullptr, return nullptr, "Invalid workSpace");
760d9f0492fSopenharmony_ci    labelIndex.selinuxLabelIndex = labelIndex.workspace->spaceIndex;
761d9f0492fSopenharmony_ci    (void)FindTrieNode(paramWorkspace->workSpace[0], name, strlen(name), &labelIndex.dacLabelIndex);
762d9f0492fSopenharmony_ci    return &labelIndex;
763d9f0492fSopenharmony_ci}
764d9f0492fSopenharmony_ci#ifdef __cplusplus
765d9f0492fSopenharmony_ci#if __cplusplus
766d9f0492fSopenharmony_ci}
767d9f0492fSopenharmony_ci#endif
768d9f0492fSopenharmony_ci#endif
769