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#include <gtest/gtest.h>
16d9f0492fSopenharmony_ci
17d9f0492fSopenharmony_ci#include "init_param.h"
18d9f0492fSopenharmony_ci#include "param_message.h"
19d9f0492fSopenharmony_ci#include "param_stub.h"
20d9f0492fSopenharmony_ci#include "param_init.h"
21d9f0492fSopenharmony_ci#include "trigger_manager.h"
22d9f0492fSopenharmony_ci#include "le_timer.h"
23d9f0492fSopenharmony_ci
24d9f0492fSopenharmony_ciusing namespace testing::ext;
25d9f0492fSopenharmony_ciusing namespace std;
26d9f0492fSopenharmony_ci
27d9f0492fSopenharmony_cistatic int TestTriggerExecute(TriggerNode *trigger, const char *content, uint32_t size)
28d9f0492fSopenharmony_ci{
29d9f0492fSopenharmony_ci    return 0;
30d9f0492fSopenharmony_ci}
31d9f0492fSopenharmony_ci
32d9f0492fSopenharmony_cistatic int CheckServerParamValue(const char *name, const char *expectValue)
33d9f0492fSopenharmony_ci{
34d9f0492fSopenharmony_ci    char tmp[PARAM_BUFFER_SIZE] = {0};
35d9f0492fSopenharmony_ci    u_int32_t len = sizeof(tmp);
36d9f0492fSopenharmony_ci    SystemReadParam(name, tmp, &len);
37d9f0492fSopenharmony_ci    printf("CheckParamValue name %s value: \'%s\' expectValue:\'%s\' \n", name, tmp, expectValue);
38d9f0492fSopenharmony_ci    EXPECT_NE((int)strlen(tmp), 0);
39d9f0492fSopenharmony_ci    if (expectValue != nullptr) {
40d9f0492fSopenharmony_ci        EXPECT_EQ(strcmp(tmp, expectValue), 0);
41d9f0492fSopenharmony_ci    }
42d9f0492fSopenharmony_ci    return 0;
43d9f0492fSopenharmony_ci}
44d9f0492fSopenharmony_ci
45d9f0492fSopenharmony_cinamespace init_ut {
46d9f0492fSopenharmony_cistatic ParamTaskPtr g_worker = nullptr;
47d9f0492fSopenharmony_ciclass ParamServiceUnitTest : public ::testing::Test {
48d9f0492fSopenharmony_cipublic:
49d9f0492fSopenharmony_ci    ParamServiceUnitTest() {}
50d9f0492fSopenharmony_ci    virtual ~ParamServiceUnitTest() {}
51d9f0492fSopenharmony_ci
52d9f0492fSopenharmony_ci    static void SetUpTestCase(void) {}
53d9f0492fSopenharmony_ci
54d9f0492fSopenharmony_ci    void SetUp()
55d9f0492fSopenharmony_ci    {
56d9f0492fSopenharmony_ci        if (GetParamSecurityLabel() != nullptr) {
57d9f0492fSopenharmony_ci            GetParamSecurityLabel()->cred.uid = 1000;  // 1000 test uid
58d9f0492fSopenharmony_ci            GetParamSecurityLabel()->cred.gid = 1000;  // 1000 test gid
59d9f0492fSopenharmony_ci        }
60d9f0492fSopenharmony_ci    }
61d9f0492fSopenharmony_ci    void TearDown() {}
62d9f0492fSopenharmony_ci    void TestBody() {}
63d9f0492fSopenharmony_ci
64d9f0492fSopenharmony_ci    int TestSetParams(const char *params[][1 + 1], int num)
65d9f0492fSopenharmony_ci    {
66d9f0492fSopenharmony_ci        for (int i = 0; i < num; i++) {
67d9f0492fSopenharmony_ci            SystemWriteParam(params[i][0], params[i][1]);
68d9f0492fSopenharmony_ci        }
69d9f0492fSopenharmony_ci
70d9f0492fSopenharmony_ci        // check
71d9f0492fSopenharmony_ci        for (int i = 0; i < num; i++) {
72d9f0492fSopenharmony_ci            CheckServerParamValue(params[i][0], params[i][1]);
73d9f0492fSopenharmony_ci        }
74d9f0492fSopenharmony_ci
75d9f0492fSopenharmony_ci        for (int i = num - 1; i >= 0; i--) {
76d9f0492fSopenharmony_ci            CheckServerParamValue(params[i][0], params[i][1]);
77d9f0492fSopenharmony_ci        }
78d9f0492fSopenharmony_ci        return 0;
79d9f0492fSopenharmony_ci    }
80d9f0492fSopenharmony_ci
81d9f0492fSopenharmony_ci    int TestAddSecurityLabel1()
82d9f0492fSopenharmony_ci    {
83d9f0492fSopenharmony_ci        GetParamSecurityLabel()->cred.gid = 9999;  // 9999 test gid
84d9f0492fSopenharmony_ci        const char *name = "label1.test.aaa.bbb.ccc.dddd.eee";
85d9f0492fSopenharmony_ci        const char *value = "2001";
86d9f0492fSopenharmony_ci        uint32_t labelIndex = 0;
87d9f0492fSopenharmony_ci        SystemWriteParam(name, value);
88d9f0492fSopenharmony_ci        // 获取到跟属性
89d9f0492fSopenharmony_ci        WorkSpace *workspace = GetWorkSpace(WORKSPACE_INDEX_DAC);
90d9f0492fSopenharmony_ci        (void)FindTrieNode(workspace, name, strlen(name), &labelIndex);
91d9f0492fSopenharmony_ci        ParamSecurityNode *node = (ParamSecurityNode *)GetTrieNode(workspace, labelIndex);
92d9f0492fSopenharmony_ci        if (node == nullptr) {
93d9f0492fSopenharmony_ci            EXPECT_EQ(1, 0);
94d9f0492fSopenharmony_ci            return 0;
95d9f0492fSopenharmony_ci        }
96d9f0492fSopenharmony_ci        EXPECT_EQ(node->gid, 0);
97d9f0492fSopenharmony_ci        return 0;
98d9f0492fSopenharmony_ci    }
99d9f0492fSopenharmony_ci
100d9f0492fSopenharmony_ci    // 添加一个label,最长匹配到这个节点
101d9f0492fSopenharmony_ci    int TestAddSecurityLabel2()
102d9f0492fSopenharmony_ci    {
103d9f0492fSopenharmony_ci        GetParamSecurityLabel()->cred.gid = 9999;  // 9999 test gid
104d9f0492fSopenharmony_ci        const char *name = "label2.test.aaa.bbb.ccc.dddd.eee";
105d9f0492fSopenharmony_ci        const char *value = "2001";
106d9f0492fSopenharmony_ci        ParamAuditData auditData = {};
107d9f0492fSopenharmony_ci        auditData.name = "label2.test.aaa";
108d9f0492fSopenharmony_ci        auditData.dacData.gid = 202;  // 202 test dac gid
109d9f0492fSopenharmony_ci        auditData.dacData.uid = geteuid();
110d9f0492fSopenharmony_ci        auditData.dacData.mode = 0666;  // 0666 test mode
111d9f0492fSopenharmony_ci        SystemWriteParam(name, value);
112d9f0492fSopenharmony_ci        uint32_t labelIndex = 0;
113d9f0492fSopenharmony_ci        AddSecurityLabel(&auditData);
114d9f0492fSopenharmony_ci        WorkSpace *workspace = GetWorkSpace(WORKSPACE_INDEX_DAC);
115d9f0492fSopenharmony_ci        (void)FindTrieNode(workspace, name, strlen(name), &labelIndex);
116d9f0492fSopenharmony_ci        ParamSecurityNode *node = (ParamSecurityNode *)GetTrieNode(workspace, labelIndex);
117d9f0492fSopenharmony_ci        if (node == nullptr) {
118d9f0492fSopenharmony_ci            EXPECT_EQ(1, 0);
119d9f0492fSopenharmony_ci            return 0;
120d9f0492fSopenharmony_ci        }
121d9f0492fSopenharmony_ci        EXPECT_EQ(node->gid, auditData.dacData.gid);
122d9f0492fSopenharmony_ci        return 0;
123d9f0492fSopenharmony_ci    }
124d9f0492fSopenharmony_ci
125d9f0492fSopenharmony_ci    // 添加一个label,最长匹配到最后一个相同节点
126d9f0492fSopenharmony_ci    int TestAddSecurityLabel3()
127d9f0492fSopenharmony_ci    {
128d9f0492fSopenharmony_ci        GetParamSecurityLabel()->cred.gid = 9999;  // 9999 test gid
129d9f0492fSopenharmony_ci        const char *name = "label3.test.aaa.bbb.ccc.dddd.eee";
130d9f0492fSopenharmony_ci        const char *value = "2001";
131d9f0492fSopenharmony_ci        ParamAuditData auditData = {};
132d9f0492fSopenharmony_ci        auditData.name = "label3.test.aaa";
133d9f0492fSopenharmony_ci        auditData.dacData.gid = 203;  // 203 test gid
134d9f0492fSopenharmony_ci        auditData.dacData.uid = geteuid();
135d9f0492fSopenharmony_ci        auditData.dacData.mode = 0666;  // 0666 test mode
136d9f0492fSopenharmony_ci        SystemWriteParam(name, value);
137d9f0492fSopenharmony_ci        AddSecurityLabel(&auditData);
138d9f0492fSopenharmony_ci
139d9f0492fSopenharmony_ci        auditData.name = "label3.test.aaa.bbb.ccc.dddd.eee.dddd";
140d9f0492fSopenharmony_ci        auditData.dacData.gid = 202;  // 202 test dac gid
141d9f0492fSopenharmony_ci        auditData.dacData.uid = geteuid();
142d9f0492fSopenharmony_ci        auditData.dacData.mode = 0666;  // 0666 test mode
143d9f0492fSopenharmony_ci        SystemWriteParam(name, value);
144d9f0492fSopenharmony_ci        AddSecurityLabel(&auditData);
145d9f0492fSopenharmony_ci
146d9f0492fSopenharmony_ci        uint32_t labelIndex = 0;
147d9f0492fSopenharmony_ci        WorkSpace *workspace = GetWorkSpace(WORKSPACE_INDEX_DAC);
148d9f0492fSopenharmony_ci        ParamTrieNode *paramNode = FindTrieNode(workspace, name, strlen(name), &labelIndex);
149d9f0492fSopenharmony_ci        ParamSecurityNode *node = (ParamSecurityNode *)GetTrieNode(workspace, labelIndex);
150d9f0492fSopenharmony_ci        if (paramNode == nullptr || node == nullptr) {
151d9f0492fSopenharmony_ci            EXPECT_EQ(1, 0);
152d9f0492fSopenharmony_ci            return 0;
153d9f0492fSopenharmony_ci        }
154d9f0492fSopenharmony_ci        EXPECT_EQ((int)node->gid, 203);  // 203 test gid
155d9f0492fSopenharmony_ci        return 0;
156d9f0492fSopenharmony_ci    }
157d9f0492fSopenharmony_ci
158d9f0492fSopenharmony_ci    // 添加一个label,完全匹配
159d9f0492fSopenharmony_ci    int TestAddSecurityLabel4()
160d9f0492fSopenharmony_ci    {
161d9f0492fSopenharmony_ci        GetParamSecurityLabel()->cred.gid = 9999;  // 9999 test gid
162d9f0492fSopenharmony_ci        const char *name = "label4.test.aaa.bbb.ccc.dddd.eee";
163d9f0492fSopenharmony_ci        const char *value = "2001";
164d9f0492fSopenharmony_ci        ParamAuditData auditData = {};
165d9f0492fSopenharmony_ci        auditData.name = "label4.test.aaa.bbb.ccc.dddd.eee";
166d9f0492fSopenharmony_ci        auditData.dacData.gid = 203;  // 203 test gid
167d9f0492fSopenharmony_ci        auditData.dacData.uid = geteuid();
168d9f0492fSopenharmony_ci        auditData.dacData.mode = 0666;  // 0666 test mode
169d9f0492fSopenharmony_ci        SystemWriteParam(name, value);
170d9f0492fSopenharmony_ci        uint32_t labelIndex = 0;
171d9f0492fSopenharmony_ci        AddSecurityLabel(&auditData);
172d9f0492fSopenharmony_ci        WorkSpace *workspace = GetWorkSpace(WORKSPACE_INDEX_DAC);
173d9f0492fSopenharmony_ci        ParamTrieNode *paramNode = FindTrieNode(workspace, name, strlen(name), &labelIndex);
174d9f0492fSopenharmony_ci        ParamSecurityNode *node = (ParamSecurityNode *)GetTrieNode(workspace, labelIndex);
175d9f0492fSopenharmony_ci        if (paramNode == nullptr || node == nullptr) {
176d9f0492fSopenharmony_ci            EXPECT_EQ(1, 0);
177d9f0492fSopenharmony_ci            return 0;
178d9f0492fSopenharmony_ci        }
179d9f0492fSopenharmony_ci        EXPECT_EQ(node->gid, auditData.dacData.gid);
180d9f0492fSopenharmony_ci        return 0;
181d9f0492fSopenharmony_ci    }
182d9f0492fSopenharmony_ci
183d9f0492fSopenharmony_ci    void TestBufferValue(char *buffer, uint32_t len)
184d9f0492fSopenharmony_ci    {
185d9f0492fSopenharmony_ci        const int printBase = 10;
186d9f0492fSopenharmony_ci        for (uint32_t index = 0; index <= len; index++) {
187d9f0492fSopenharmony_ci            buffer[index] = '0' + index % printBase;
188d9f0492fSopenharmony_ci            if (index != 0 && index % printBase == 0) {
189d9f0492fSopenharmony_ci                buffer[index] = '.';
190d9f0492fSopenharmony_ci            }
191d9f0492fSopenharmony_ci        }
192d9f0492fSopenharmony_ci        buffer[len] = '\0';
193d9f0492fSopenharmony_ci    }
194d9f0492fSopenharmony_ci
195d9f0492fSopenharmony_ci    int TestNameIsValid()
196d9f0492fSopenharmony_ci    {
197d9f0492fSopenharmony_ci        char buffer[PARAM_BUFFER_SIZE];
198d9f0492fSopenharmony_ci        // set name length = 127
199d9f0492fSopenharmony_ci        TestBufferValue(buffer, PARAM_NAME_LEN_MAX - 1);
200d9f0492fSopenharmony_ci        int ret = SystemWriteParam(buffer, "1111");
201d9f0492fSopenharmony_ci        EXPECT_EQ(ret, 0);
202d9f0492fSopenharmony_ci        TestBufferValue(buffer, PARAM_NAME_LEN_MAX);
203d9f0492fSopenharmony_ci        ret = SystemWriteParam(buffer, "1111");
204d9f0492fSopenharmony_ci        EXPECT_NE(ret, 0);
205d9f0492fSopenharmony_ci        TestBufferValue(buffer, PARAM_NAME_LEN_MAX + 1);
206d9f0492fSopenharmony_ci        ret = SystemWriteParam(buffer, "1111");
207d9f0492fSopenharmony_ci        EXPECT_NE(ret, 0);
208d9f0492fSopenharmony_ci
209d9f0492fSopenharmony_ci        ret = SystemWriteParam(" ", "1111");
210d9f0492fSopenharmony_ci        EXPECT_NE(ret, 0);
211d9f0492fSopenharmony_ci        ret = SystemWriteParam("__.__..", "1111");
212d9f0492fSopenharmony_ci        EXPECT_NE(ret, 0);
213d9f0492fSopenharmony_ci        ret = SystemWriteParam(".__..", "1111");
214d9f0492fSopenharmony_ci        EXPECT_NE(ret, 0);
215d9f0492fSopenharmony_ci        ret = SystemWriteParam("test.-@:_", "1111");
216d9f0492fSopenharmony_ci        EXPECT_EQ(ret, 0);
217d9f0492fSopenharmony_ci
218d9f0492fSopenharmony_ci        // 保存一个只读的属性,大于最大值
219d9f0492fSopenharmony_ci        TestBufferValue(buffer, PARAM_VALUE_LEN_MAX - 1);
220d9f0492fSopenharmony_ci        ret = SystemWriteParam("const.test_readonly.dddddddddddddddddd.fffffffffffffffffff", buffer);
221d9f0492fSopenharmony_ci        EXPECT_EQ(ret, 0);
222d9f0492fSopenharmony_ci
223d9f0492fSopenharmony_ci        TestBufferValue(buffer, PARAM_VALUE_LEN_MAX + 1);
224d9f0492fSopenharmony_ci        ret = SystemWriteParam("const.test_readonly.aaaaaaaaaaaaaaaaaa.fffffffffffffffffff", buffer);
225d9f0492fSopenharmony_ci        EXPECT_EQ(ret, 0);
226d9f0492fSopenharmony_ci
227d9f0492fSopenharmony_ci        // 更新只读项目
228d9f0492fSopenharmony_ci        TestBufferValue(buffer, PARAM_VALUE_LEN_MAX - 1);
229d9f0492fSopenharmony_ci        ret = SystemWriteParam("const.test_readonly.dddddddddddddddddd.fffffffffffffffffff", buffer);
230d9f0492fSopenharmony_ci        EXPECT_NE(ret, 0);
231d9f0492fSopenharmony_ci
232d9f0492fSopenharmony_ci        // 写普通属性
233d9f0492fSopenharmony_ci        TestBufferValue(buffer, PARAM_VALUE_LEN_MAX - 1);
234d9f0492fSopenharmony_ci        ret = SystemWriteParam("test.bigvalue.dddddddddddddddddd.fffffffffffffffffff", buffer);
235d9f0492fSopenharmony_ci        EXPECT_EQ(ret, 0);
236d9f0492fSopenharmony_ci        TestBufferValue(buffer, PARAM_VALUE_LEN_MAX + 1);
237d9f0492fSopenharmony_ci        ret = SystemWriteParam("test.bigvalue.dddddddddddddddddd.fffffffffffffffffff", buffer);
238d9f0492fSopenharmony_ci        EXPECT_NE(ret, 0);
239d9f0492fSopenharmony_ci
240d9f0492fSopenharmony_ci        // invalid name
241d9f0492fSopenharmony_ci        TestBufferValue(buffer, PARAM_VALUE_LEN_MAX - 1);
242d9f0492fSopenharmony_ci        ret = SystemWriteParam("test.invalidname..fffffffffffffffffff", buffer);
243d9f0492fSopenharmony_ci        EXPECT_NE(ret, 0);
244d9f0492fSopenharmony_ci        ret = SystemWriteParam("test.invalidname.%fffffffffffffffffff", buffer);
245d9f0492fSopenharmony_ci        EXPECT_NE(ret, 0);
246d9f0492fSopenharmony_ci        ret = SystemWriteParam("test.invalidname.$fffffffffffffffffff", buffer);
247d9f0492fSopenharmony_ci        EXPECT_NE(ret, 0);
248d9f0492fSopenharmony_ci        return 0;
249d9f0492fSopenharmony_ci    }
250d9f0492fSopenharmony_ci
251d9f0492fSopenharmony_ci    int TestParamTraversal()
252d9f0492fSopenharmony_ci    {
253d9f0492fSopenharmony_ci        char value[PARAM_BUFFER_SIZE + PARAM_BUFFER_SIZE] = {0};
254d9f0492fSopenharmony_ci        SystemTraversalParameter(
255d9f0492fSopenharmony_ci            "",
256d9f0492fSopenharmony_ci            [](ParamHandle handle, void *cookie) {
257d9f0492fSopenharmony_ci                SystemGetParameterName(handle, (char *)cookie, PARAM_BUFFER_SIZE);
258d9f0492fSopenharmony_ci                u_int32_t len = PARAM_BUFFER_SIZE;
259d9f0492fSopenharmony_ci                SystemGetParameterValue(handle, ((char *)cookie) + PARAM_BUFFER_SIZE, &len);
260d9f0492fSopenharmony_ci                printf("$$$$$$$$Param %s=%s \n", (char *)cookie, ((char *)cookie) + PARAM_BUFFER_SIZE);
261d9f0492fSopenharmony_ci            },
262d9f0492fSopenharmony_ci            (void *)value);
263d9f0492fSopenharmony_ci        return 0;
264d9f0492fSopenharmony_ci    }
265d9f0492fSopenharmony_ci
266d9f0492fSopenharmony_ci    int TestUpdateParam(const char *name, const char *value)
267d9f0492fSopenharmony_ci    {
268d9f0492fSopenharmony_ci        SystemWriteParam(name, value);
269d9f0492fSopenharmony_ci        SystemWriteParam(name, value);
270d9f0492fSopenharmony_ci        SystemWriteParam(name, value);
271d9f0492fSopenharmony_ci        SystemWriteParam(name, value);
272d9f0492fSopenharmony_ci        CheckServerParamValue(name, value);
273d9f0492fSopenharmony_ci        return 0;
274d9f0492fSopenharmony_ci    }
275d9f0492fSopenharmony_ci
276d9f0492fSopenharmony_ci    int TestPersistParam()
277d9f0492fSopenharmony_ci    {
278d9f0492fSopenharmony_ci        RegisterPersistParamOps(nullptr);
279d9f0492fSopenharmony_ci        LoadPersistParams();
280d9f0492fSopenharmony_ci        SystemWriteParam("persist.111.ffff.bbbb.cccc.dddd.eeee", "1101");
281d9f0492fSopenharmony_ci        SystemWriteParam("persist.111.aaaa.bbbb.cccc.dddd.eeee", "1102");
282d9f0492fSopenharmony_ci        SystemWriteParam("persist.111.bbbb.cccc.dddd.eeee", "1103");
283d9f0492fSopenharmony_ci        CheckServerParamValue("persist.111.bbbb.cccc.dddd.eeee", "1103");
284d9f0492fSopenharmony_ci        SystemWriteParam("persist.111.cccc.bbbb.cccc.dddd.eeee", "1104");
285d9f0492fSopenharmony_ci        SystemWriteParam("persist.111.eeee.bbbb.cccc.dddd.eeee", "1105");
286d9f0492fSopenharmony_ci        CheckServerParamValue("persist.111.ffff.bbbb.cccc.dddd.eeee", "1101");
287d9f0492fSopenharmony_ci        SystemWriteParam("persist.111.ffff.bbbb.cccc.dddd.eeee", "1106");
288d9f0492fSopenharmony_ci        CheckServerParamValue("persist.111.ffff.bbbb.cccc.dddd.eeee", "1106");
289d9f0492fSopenharmony_ci
290d9f0492fSopenharmony_ci        SystemWriteParam("persist.111.bbbb.cccc.dddd.1107", "1107");
291d9f0492fSopenharmony_ci        SystemWriteParam("persist.111.bbbb.cccc.dddd.1108", "1108");
292d9f0492fSopenharmony_ci        SystemWriteParam("persist.111.bbbb.cccc.dddd.1109", "1108");
293d9f0492fSopenharmony_ci
294d9f0492fSopenharmony_ci        SystemWriteParam("persist.111.bbbb.cccc.dddd.1110", "1108");
295d9f0492fSopenharmony_ci        SystemWriteParam("persist.111.bbbb.cccc.dddd.1111", "1108");
296d9f0492fSopenharmony_ci        TimerCallbackForSave(nullptr, nullptr);
297d9f0492fSopenharmony_ci        LoadPersistParams();
298d9f0492fSopenharmony_ci        return 0;
299d9f0492fSopenharmony_ci    }
300d9f0492fSopenharmony_ci
301d9f0492fSopenharmony_ci    ParamTaskPtr CreateAndGetStreamTask()
302d9f0492fSopenharmony_ci    {
303d9f0492fSopenharmony_ci        OnIncomingConnect(LE_GetDefaultLoop(), GetParamService()->serverTask);
304d9f0492fSopenharmony_ci        EXPECT_NE(GetParamService()->watcherTask, nullptr);
305d9f0492fSopenharmony_ci        return GetParamService()->watcherTask;
306d9f0492fSopenharmony_ci    }
307d9f0492fSopenharmony_ci
308d9f0492fSopenharmony_ci    int TestServiceProcessMessage(const char *name, const char *value, int userLabel)
309d9f0492fSopenharmony_ci    {
310d9f0492fSopenharmony_ci        if (g_worker == nullptr) {
311d9f0492fSopenharmony_ci            g_worker = CreateAndGetStreamTask();
312d9f0492fSopenharmony_ci        }
313d9f0492fSopenharmony_ci        if (g_worker == nullptr) {
314d9f0492fSopenharmony_ci            return 0;
315d9f0492fSopenharmony_ci        }
316d9f0492fSopenharmony_ci        ParamSecurityOps *paramSecurityOps = GetParamSecurityOps(0);
317d9f0492fSopenharmony_ci        if (userLabel && paramSecurityOps != nullptr) {
318d9f0492fSopenharmony_ci            paramSecurityOps->securityFreeLabel = TestFreeLocalSecurityLabel;
319d9f0492fSopenharmony_ci            paramSecurityOps->securityCheckParamPermission = TestCheckParamPermission;
320d9f0492fSopenharmony_ci        }
321d9f0492fSopenharmony_ci        uint32_t msgSize = sizeof(ParamMessage) + sizeof(ParamMsgContent) + PARAM_ALIGN(strlen(value) + 1);
322d9f0492fSopenharmony_ci        ParamMessage *request = (ParamMessage *)CreateParamMessage(MSG_SET_PARAM, name, msgSize);
323d9f0492fSopenharmony_ci        PARAM_CHECK(request != nullptr, return -1, "Failed to malloc for connect");
324d9f0492fSopenharmony_ci        do {
325d9f0492fSopenharmony_ci            request->type = MSG_SET_PARAM;
326d9f0492fSopenharmony_ci            uint32_t offset = 0;
327d9f0492fSopenharmony_ci            int ret = FillParamMsgContent(request, &offset, PARAM_VALUE, value, strlen(value));
328d9f0492fSopenharmony_ci            PARAM_CHECK(ret == 0, break, "Failed to fill value");
329d9f0492fSopenharmony_ci            ProcessMessage((const ParamTaskPtr)g_worker, (const ParamMessage *)request);
330d9f0492fSopenharmony_ci        } while (0);
331d9f0492fSopenharmony_ci        free(request);
332d9f0492fSopenharmony_ci        RegisterSecurityOps(1);
333d9f0492fSopenharmony_ci        return 0;
334d9f0492fSopenharmony_ci    }
335d9f0492fSopenharmony_ci
336d9f0492fSopenharmony_ci    int AddWatch(int type, const char *name, const char *value)
337d9f0492fSopenharmony_ci    {
338d9f0492fSopenharmony_ci        if (g_worker == nullptr) {
339d9f0492fSopenharmony_ci            g_worker = CreateAndGetStreamTask();
340d9f0492fSopenharmony_ci        }
341d9f0492fSopenharmony_ci        if (g_worker == nullptr) {
342d9f0492fSopenharmony_ci            return 0;
343d9f0492fSopenharmony_ci        }
344d9f0492fSopenharmony_ci        uint32_t msgSize = sizeof(ParamMessage) + sizeof(ParamMsgContent) + sizeof(ParamMsgContent)
345d9f0492fSopenharmony_ci            + PARAM_ALIGN(strlen(value) + 1) + sizeof(uint32_t);
346d9f0492fSopenharmony_ci        ParamMessage *request = (ParamMessage *)(ParamMessage *)CreateParamMessage(type, name, msgSize);
347d9f0492fSopenharmony_ci        PARAM_CHECK(request != nullptr, return -1, "Failed to malloc for connect");
348d9f0492fSopenharmony_ci        do {
349d9f0492fSopenharmony_ci            uint32_t offset = 0;
350d9f0492fSopenharmony_ci            int ret = FillParamMsgContent(request, &offset, PARAM_VALUE, value, strlen(value));
351d9f0492fSopenharmony_ci            PARAM_CHECK(ret == 0, break, "Failed to fill value");
352d9f0492fSopenharmony_ci
353d9f0492fSopenharmony_ci            ParamMsgContent *content = (ParamMsgContent *)(request->data + offset);
354d9f0492fSopenharmony_ci            content->type = PARAM_WAIT_TIMEOUT;
355d9f0492fSopenharmony_ci            content->contentSize = sizeof(uint32_t);
356d9f0492fSopenharmony_ci            *((uint32_t *)(content->content)) = 100; // 100 is test value
357d9f0492fSopenharmony_ci            offset += sizeof(ParamMsgContent) + sizeof(uint32_t);
358d9f0492fSopenharmony_ci            request->msgSize = offset + sizeof(ParamMessage);
359d9f0492fSopenharmony_ci
360d9f0492fSopenharmony_ci            ProcessMessage((const ParamTaskPtr)g_worker, (const ParamMessage *)request);
361d9f0492fSopenharmony_ci        } while (0);
362d9f0492fSopenharmony_ci        free(request);
363d9f0492fSopenharmony_ci        return 0;
364d9f0492fSopenharmony_ci    }
365d9f0492fSopenharmony_ci
366d9f0492fSopenharmony_ci    // 无匹配
367d9f0492fSopenharmony_ci    int TestAddParamWait1()
368d9f0492fSopenharmony_ci    {
369d9f0492fSopenharmony_ci        const char *name = "wait.aaa.bbb.ccc.111";
370d9f0492fSopenharmony_ci        const char *value = "wait1";
371d9f0492fSopenharmony_ci        AddWatch(MSG_WAIT_PARAM, name, value);
372d9f0492fSopenharmony_ci        SystemWriteParam(name, value);
373d9f0492fSopenharmony_ci        // execute trigger
374d9f0492fSopenharmony_ci        LE_DoAsyncEvent(LE_GetDefaultLoop(), GetTriggerWorkSpace()->eventHandle);
375d9f0492fSopenharmony_ci        return 0;
376d9f0492fSopenharmony_ci    }
377d9f0492fSopenharmony_ci
378d9f0492fSopenharmony_ci    // 模糊匹配
379d9f0492fSopenharmony_ci    int TestAddParamWait2()
380d9f0492fSopenharmony_ci    {
381d9f0492fSopenharmony_ci        const char *name = "wait.aaa.bbb.ccc.222";
382d9f0492fSopenharmony_ci        const char *value = "wait2";
383d9f0492fSopenharmony_ci        AddWatch(MSG_WAIT_PARAM, name, "*");
384d9f0492fSopenharmony_ci        SystemWriteParam(name, value);
385d9f0492fSopenharmony_ci        // execute trigger
386d9f0492fSopenharmony_ci        LE_DoAsyncEvent(LE_GetDefaultLoop(), GetTriggerWorkSpace()->eventHandle);
387d9f0492fSopenharmony_ci        return 0;
388d9f0492fSopenharmony_ci    }
389d9f0492fSopenharmony_ci
390d9f0492fSopenharmony_ci    // 属性存在
391d9f0492fSopenharmony_ci    int TestAddParamWait3()
392d9f0492fSopenharmony_ci    {
393d9f0492fSopenharmony_ci        const char *name = "wait.aaa.bbb.ccc.333";
394d9f0492fSopenharmony_ci        const char *value = "wait3";
395d9f0492fSopenharmony_ci        SystemWriteParam(name, value);
396d9f0492fSopenharmony_ci        AddWatch(MSG_WAIT_PARAM, name, value);
397d9f0492fSopenharmony_ci        // execute trigger
398d9f0492fSopenharmony_ci        LE_DoAsyncEvent(LE_GetDefaultLoop(), GetTriggerWorkSpace()->eventHandle);
399d9f0492fSopenharmony_ci        return 0;
400d9f0492fSopenharmony_ci    }
401d9f0492fSopenharmony_ci
402d9f0492fSopenharmony_ci    int TestAddParamWatch1()
403d9f0492fSopenharmony_ci    {
404d9f0492fSopenharmony_ci        const char *name = "watch.aaa.bbb.ccc.111";
405d9f0492fSopenharmony_ci        const char *value = "watch1";
406d9f0492fSopenharmony_ci        AddWatch(MSG_ADD_WATCHER, name, value);
407d9f0492fSopenharmony_ci        std::string newName = name;
408d9f0492fSopenharmony_ci        newName += ".test.test.test";
409d9f0492fSopenharmony_ci        SystemWriteParam(newName.c_str(), value);
410d9f0492fSopenharmony_ci        // execute trigger
411d9f0492fSopenharmony_ci        LE_DoAsyncEvent(LE_GetDefaultLoop(), GetTriggerWorkSpace()->eventHandle);
412d9f0492fSopenharmony_ci        return 0;
413d9f0492fSopenharmony_ci    }
414d9f0492fSopenharmony_ci
415d9f0492fSopenharmony_ci    int TestAddParamWatch2()
416d9f0492fSopenharmony_ci    {
417d9f0492fSopenharmony_ci        const char *name = "watch.aaa.bbb.ccc.222";
418d9f0492fSopenharmony_ci        const char *value = "watch2";
419d9f0492fSopenharmony_ci        AddWatch(MSG_ADD_WATCHER, name, "*");
420d9f0492fSopenharmony_ci        SystemWriteParam(name, value);
421d9f0492fSopenharmony_ci        // execute trigger
422d9f0492fSopenharmony_ci        LE_DoAsyncEvent(LE_GetDefaultLoop(), GetTriggerWorkSpace()->eventHandle);
423d9f0492fSopenharmony_ci        return 0;
424d9f0492fSopenharmony_ci    }
425d9f0492fSopenharmony_ci
426d9f0492fSopenharmony_ci    int TestAddParamWatch3()
427d9f0492fSopenharmony_ci    {
428d9f0492fSopenharmony_ci        const char *name = "watch.aaa.bbb.ccc.333";
429d9f0492fSopenharmony_ci        const char *value = "watch3";
430d9f0492fSopenharmony_ci        std::string newName = name;
431d9f0492fSopenharmony_ci        newName += ".test.test.test";
432d9f0492fSopenharmony_ci        SystemWriteParam(newName.c_str(), value);
433d9f0492fSopenharmony_ci        AddWatch(MSG_ADD_WATCHER, name, value);
434d9f0492fSopenharmony_ci        char buffer[] = "testbuff";
435d9f0492fSopenharmony_ci        CheckTrigger(GetTriggerWorkSpace(), TRIGGER_PARAM_WATCH, buffer, strlen(buffer), TestTriggerExecute);
436d9f0492fSopenharmony_ci        AddWatch(MSG_DEL_WATCHER, name, value);
437d9f0492fSopenharmony_ci        return 0;
438d9f0492fSopenharmony_ci    }
439d9f0492fSopenharmony_ci
440d9f0492fSopenharmony_ci    int TestCloseTriggerWatch()
441d9f0492fSopenharmony_ci    {
442d9f0492fSopenharmony_ci#ifdef PARAM_SUPPORT_TRIGGER
443d9f0492fSopenharmony_ci        SystemDumpTriggers(1, nullptr);
444d9f0492fSopenharmony_ci#endif
445d9f0492fSopenharmony_ci        ParamWatcher *watcher = (ParamWatcher *)ParamGetTaskUserData(g_worker);
446d9f0492fSopenharmony_ci        ClearWatchTrigger(watcher, TRIGGER_PARAM_WAIT);
447d9f0492fSopenharmony_ci        ParamTaskClose(g_worker);
448d9f0492fSopenharmony_ci        g_worker = nullptr;
449d9f0492fSopenharmony_ci        ParamTaskClose(g_worker);
450d9f0492fSopenharmony_ci        SystemWriteParam("init.svc.param_watcher", "stopped");
451d9f0492fSopenharmony_ci        return 0;
452d9f0492fSopenharmony_ci    }
453d9f0492fSopenharmony_ci
454d9f0492fSopenharmony_ci    int TestServiceCtrl(const char *serviceName, uint16_t mode)
455d9f0492fSopenharmony_ci    {
456d9f0492fSopenharmony_ci        // service forbid
457d9f0492fSopenharmony_ci        TestSetParamCheckResult("ohos.servicectrl.", mode, 1);
458d9f0492fSopenharmony_ci        return SystemWriteParam("ohos.ctl.start", serviceName);
459d9f0492fSopenharmony_ci    }
460d9f0492fSopenharmony_ci
461d9f0492fSopenharmony_ci    int TestPowerCtrl(const char *reboot, uint16_t mode)
462d9f0492fSopenharmony_ci    {
463d9f0492fSopenharmony_ci        // service forbid
464d9f0492fSopenharmony_ci        TestSetParamCheckResult("ohos.servicectrl.reboot", mode, 1);
465d9f0492fSopenharmony_ci        return SystemWriteParam("ohos.startup.powerctrl", reboot);
466d9f0492fSopenharmony_ci    }
467d9f0492fSopenharmony_ci};
468d9f0492fSopenharmony_ci
469d9f0492fSopenharmony_ciHWTEST_F(ParamServiceUnitTest, Init_TestPersistParam_001, TestSize.Level0)
470d9f0492fSopenharmony_ci{
471d9f0492fSopenharmony_ci    ParamServiceUnitTest test;
472d9f0492fSopenharmony_ci    test.TestPersistParam();
473d9f0492fSopenharmony_ci}
474d9f0492fSopenharmony_ci
475d9f0492fSopenharmony_ciHWTEST_F(ParamServiceUnitTest, Init_TestReadCmdline_001, TestSize.Level0)
476d9f0492fSopenharmony_ci{
477d9f0492fSopenharmony_ci    const char *snData = "222222222222222222222";
478d9f0492fSopenharmony_ci    CreateTestFile(STARTUP_INIT_UT_PATH "/system/etc/sn", snData);
479d9f0492fSopenharmony_ci    // for cmdline
480d9f0492fSopenharmony_ci    std::string cmdLineForSn = "bootgroup=device.charge.group earlycon=uart8250,mmio32,0xfe660000 "
481d9f0492fSopenharmony_ci        "root=PARTUUID=614e0000-0000 rw rootwait rootfstype=ext4 console=ttyFIQ0 hardware=rk3568"
482d9f0492fSopenharmony_ci        " BOOT_IMAGE=/kernel  init=/init";
483d9f0492fSopenharmony_ci    std::string snWithPath = cmdLineForSn + "ohos.boot.sn=" + STARTUP_INIT_UT_PATH "/system/etc/sn";
484d9f0492fSopenharmony_ci    CreateTestFile(BOOT_CMD_LINE, snWithPath.c_str());
485d9f0492fSopenharmony_ci    LoadParamFromCmdLine();
486d9f0492fSopenharmony_ci    std::string snWithSN = cmdLineForSn + "ohos.boot.sn=" + snData;
487d9f0492fSopenharmony_ci    CreateTestFile(BOOT_CMD_LINE, snWithSN.c_str());
488d9f0492fSopenharmony_ci    LoadParamFromCmdLine();
489d9f0492fSopenharmony_ci    CreateTestFile(BOOT_CMD_LINE, cmdLineForSn.c_str());
490d9f0492fSopenharmony_ci    LoadParamFromCmdLine();
491d9f0492fSopenharmony_ci}
492d9f0492fSopenharmony_ci
493d9f0492fSopenharmony_ciHWTEST_F(ParamServiceUnitTest, Init_TestServiceProcessMessage_001, TestSize.Level0)
494d9f0492fSopenharmony_ci{
495d9f0492fSopenharmony_ci    ParamServiceUnitTest test;
496d9f0492fSopenharmony_ci    test.TestServiceProcessMessage("wertt.qqqq.wwww.rrrr", "wwww.eeeee", 1);
497d9f0492fSopenharmony_ci    test.TestServiceProcessMessage("wertt.2222.wwww.3333", "wwww.eeeee", 0);
498d9f0492fSopenharmony_ci}
499d9f0492fSopenharmony_ci
500d9f0492fSopenharmony_ciHWTEST_F(ParamServiceUnitTest, Init_TestAddParamWait_001, TestSize.Level0)
501d9f0492fSopenharmony_ci{
502d9f0492fSopenharmony_ci    ParamServiceUnitTest test;
503d9f0492fSopenharmony_ci    test.TestAddParamWait1();
504d9f0492fSopenharmony_ci}
505d9f0492fSopenharmony_ci
506d9f0492fSopenharmony_ciHWTEST_F(ParamServiceUnitTest, Init_TestAddParamWait_002, TestSize.Level0)
507d9f0492fSopenharmony_ci{
508d9f0492fSopenharmony_ci    ParamServiceUnitTest test;
509d9f0492fSopenharmony_ci    test.TestAddParamWait2();
510d9f0492fSopenharmony_ci}
511d9f0492fSopenharmony_ci
512d9f0492fSopenharmony_ciHWTEST_F(ParamServiceUnitTest, Init_TestAddParamWait_003, TestSize.Level0)
513d9f0492fSopenharmony_ci{
514d9f0492fSopenharmony_ci    ParamServiceUnitTest test;
515d9f0492fSopenharmony_ci    test.TestAddParamWait3();
516d9f0492fSopenharmony_ci}
517d9f0492fSopenharmony_ci
518d9f0492fSopenharmony_ciHWTEST_F(ParamServiceUnitTest, Init_TestAddParamWatch_001, TestSize.Level0)
519d9f0492fSopenharmony_ci{
520d9f0492fSopenharmony_ci    ParamServiceUnitTest test;
521d9f0492fSopenharmony_ci    test.TestAddParamWatch1();
522d9f0492fSopenharmony_ci}
523d9f0492fSopenharmony_ci
524d9f0492fSopenharmony_ciHWTEST_F(ParamServiceUnitTest, Init_TestAddParamWatch_002, TestSize.Level0)
525d9f0492fSopenharmony_ci{
526d9f0492fSopenharmony_ci    ParamServiceUnitTest test;
527d9f0492fSopenharmony_ci    test.TestAddParamWatch2();
528d9f0492fSopenharmony_ci}
529d9f0492fSopenharmony_ci
530d9f0492fSopenharmony_ci#ifndef OHOS_LITE
531d9f0492fSopenharmony_ciHWTEST_F(ParamServiceUnitTest, Init_TestAddParamWatch_003, TestSize.Level0)
532d9f0492fSopenharmony_ci{
533d9f0492fSopenharmony_ci    ParamServiceUnitTest test;
534d9f0492fSopenharmony_ci    test.TestAddParamWatch3();
535d9f0492fSopenharmony_ci    int hashCode = CheckWatchTriggerTimeout();
536d9f0492fSopenharmony_ci    EXPECT_EQ(hashCode, 0);
537d9f0492fSopenharmony_ci}
538d9f0492fSopenharmony_ci
539d9f0492fSopenharmony_ciHWTEST_F(ParamServiceUnitTest, Init_TestCloseTriggerWatch_001, TestSize.Level0)
540d9f0492fSopenharmony_ci{
541d9f0492fSopenharmony_ci    ParamServiceUnitTest test;
542d9f0492fSopenharmony_ci    test.TestCloseTriggerWatch();
543d9f0492fSopenharmony_ci}
544d9f0492fSopenharmony_ci
545d9f0492fSopenharmony_ciHWTEST_F(ParamServiceUnitTest, Init_TestServiceCtrl_001, TestSize.Level0)
546d9f0492fSopenharmony_ci{
547d9f0492fSopenharmony_ci    ParamServiceUnitTest test;
548d9f0492fSopenharmony_ci    int ret = test.TestServiceCtrl("server1", 0770);
549d9f0492fSopenharmony_ci    EXPECT_NE(ret, 0);
550d9f0492fSopenharmony_ci#ifdef PARAM_SUPPORT_SELINUX
551d9f0492fSopenharmony_ci    // selinux forbid
552d9f0492fSopenharmony_ci    ret = test.TestServiceCtrl("server2", 0772);
553d9f0492fSopenharmony_ci    EXPECT_NE(ret, 0);
554d9f0492fSopenharmony_ci#endif
555d9f0492fSopenharmony_ci    ret = 0;
556d9f0492fSopenharmony_ci}
557d9f0492fSopenharmony_ci
558d9f0492fSopenharmony_ciHWTEST_F(ParamServiceUnitTest, Init_TestPowerCtrl_001, TestSize.Level0)
559d9f0492fSopenharmony_ci{
560d9f0492fSopenharmony_ci    ParamServiceUnitTest test;
561d9f0492fSopenharmony_ci    int ret = test.TestPowerCtrl("reboot,shutdown", 0770);
562d9f0492fSopenharmony_ci    EXPECT_NE(ret, 0);
563d9f0492fSopenharmony_ci    ret = test.TestPowerCtrl("reboot,shutdown", 0772);
564d9f0492fSopenharmony_ci#ifdef PARAM_SUPPORT_SELINUX
565d9f0492fSopenharmony_ci    // selinux forbid
566d9f0492fSopenharmony_ci    EXPECT_NE(ret, 0);
567d9f0492fSopenharmony_ci#endif
568d9f0492fSopenharmony_ci    ret = test.TestPowerCtrl("reboot,updater", 0770);
569d9f0492fSopenharmony_ci    EXPECT_NE(ret, 0);
570d9f0492fSopenharmony_ci    ret = test.TestPowerCtrl("reboot,updater", 0772);
571d9f0492fSopenharmony_ci#ifdef PARAM_SUPPORT_SELINUX
572d9f0492fSopenharmony_ci    // selinux forbid
573d9f0492fSopenharmony_ci    EXPECT_NE(ret, 0);
574d9f0492fSopenharmony_ci#endif
575d9f0492fSopenharmony_ci    ret = test.TestPowerCtrl("reboot,flashd", 0770);
576d9f0492fSopenharmony_ci    EXPECT_NE(ret, 0);
577d9f0492fSopenharmony_ci    ret = test.TestPowerCtrl("reboot,flashd", 0772);
578d9f0492fSopenharmony_ci#ifdef PARAM_SUPPORT_SELINUX
579d9f0492fSopenharmony_ci    // selinux forbid
580d9f0492fSopenharmony_ci    EXPECT_NE(ret, 0);
581d9f0492fSopenharmony_ci#endif
582d9f0492fSopenharmony_ci
583d9f0492fSopenharmony_ci    ret = test.TestPowerCtrl("reboot", 0770);
584d9f0492fSopenharmony_ci    EXPECT_NE(ret, 0);
585d9f0492fSopenharmony_ci    ret = test.TestPowerCtrl("reboot", 0772);
586d9f0492fSopenharmony_ci#ifdef PARAM_SUPPORT_SELINUX
587d9f0492fSopenharmony_ci    // selinux forbid
588d9f0492fSopenharmony_ci    EXPECT_NE(ret, 0);
589d9f0492fSopenharmony_ci#endif
590d9f0492fSopenharmony_ci
591d9f0492fSopenharmony_ci    ParamServiceStop();
592d9f0492fSopenharmony_ci}
593d9f0492fSopenharmony_ci#endif
594d9f0492fSopenharmony_ci}  // namespace init_ut
595