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 <cstdlib>
16d9f0492fSopenharmony_ci#include "init_cmds.h"
17d9f0492fSopenharmony_ci#include "init_group_manager.h"
18d9f0492fSopenharmony_ci#include "init_hashmap.h"
19d9f0492fSopenharmony_ci#include "init_param.h"
20d9f0492fSopenharmony_ci#include "init_service_manager.h"
21d9f0492fSopenharmony_ci#include "init_utils.h"
22d9f0492fSopenharmony_ci#include "init_unittest.h"
23d9f0492fSopenharmony_ci#include "le_timer.h"
24d9f0492fSopenharmony_ci#include "param_stub.h"
25d9f0492fSopenharmony_ci#include "securec.h"
26d9f0492fSopenharmony_ci#include "control_fd.h"
27d9f0492fSopenharmony_ci
28d9f0492fSopenharmony_ciusing namespace testing::ext;
29d9f0492fSopenharmony_ciusing namespace std;
30d9f0492fSopenharmony_ci
31d9f0492fSopenharmony_citypedef struct {
32d9f0492fSopenharmony_ci    HashNode node;
33d9f0492fSopenharmony_ci    char name[0];
34d9f0492fSopenharmony_ci} TestHashNode;
35d9f0492fSopenharmony_ci
36d9f0492fSopenharmony_cistatic int TestHashNodeCompare(const HashNode *node1, const HashNode *node2)
37d9f0492fSopenharmony_ci{
38d9f0492fSopenharmony_ci    TestHashNode *testNode1 = HASHMAP_ENTRY(node1, TestHashNode, node);
39d9f0492fSopenharmony_ci    TestHashNode *testNode2 = HASHMAP_ENTRY(node2, TestHashNode, node);
40d9f0492fSopenharmony_ci    return strcmp(testNode1->name, testNode2->name);
41d9f0492fSopenharmony_ci}
42d9f0492fSopenharmony_ci
43d9f0492fSopenharmony_cistatic int TestHashKeyCompare(const HashNode *node1, const void *key)
44d9f0492fSopenharmony_ci{
45d9f0492fSopenharmony_ci    TestHashNode *testNode1 = HASHMAP_ENTRY(node1, TestHashNode, node);
46d9f0492fSopenharmony_ci    return strcmp(testNode1->name, reinterpret_cast<char *>(const_cast<void *>(key)));
47d9f0492fSopenharmony_ci}
48d9f0492fSopenharmony_ci
49d9f0492fSopenharmony_cistatic int TestHashNodeFunction(const HashNode *node)
50d9f0492fSopenharmony_ci{
51d9f0492fSopenharmony_ci    TestHashNode *testNode = HASHMAP_ENTRY(node, TestHashNode, node);
52d9f0492fSopenharmony_ci    int code = 0;
53d9f0492fSopenharmony_ci    size_t nameLen = strlen(testNode->name);
54d9f0492fSopenharmony_ci    for (size_t i = 0; i < nameLen; i++) {
55d9f0492fSopenharmony_ci        code += testNode->name[i] - 'A';
56d9f0492fSopenharmony_ci    }
57d9f0492fSopenharmony_ci    return code;
58d9f0492fSopenharmony_ci}
59d9f0492fSopenharmony_ci
60d9f0492fSopenharmony_cistatic int TestHashKeyFunction(const void *key)
61d9f0492fSopenharmony_ci{
62d9f0492fSopenharmony_ci    int code = 0;
63d9f0492fSopenharmony_ci    const char *buff = static_cast<const char *>(key);
64d9f0492fSopenharmony_ci    size_t buffLen = strlen(buff);
65d9f0492fSopenharmony_ci    for (size_t i = 0; i < buffLen; i++) {
66d9f0492fSopenharmony_ci        code += buff[i] - 'A';
67d9f0492fSopenharmony_ci    }
68d9f0492fSopenharmony_ci    return code;
69d9f0492fSopenharmony_ci}
70d9f0492fSopenharmony_ci
71d9f0492fSopenharmony_cistatic void TestHashNodeFree(const HashNode *node, void *context)
72d9f0492fSopenharmony_ci{
73d9f0492fSopenharmony_ci    TestHashNode *testNode = HASHMAP_ENTRY(node, TestHashNode, node);
74d9f0492fSopenharmony_ci    printf("TestHashNodeFree %s\n", testNode->name);
75d9f0492fSopenharmony_ci    free(testNode);
76d9f0492fSopenharmony_ci}
77d9f0492fSopenharmony_ci
78d9f0492fSopenharmony_cistatic TestHashNode *TestCreateHashNode(const char *value)
79d9f0492fSopenharmony_ci{
80d9f0492fSopenharmony_ci    TestHashNode *node = reinterpret_cast<TestHashNode *>(malloc(sizeof(TestHashNode) + strlen(value) + 1));
81d9f0492fSopenharmony_ci    if (node == nullptr) {
82d9f0492fSopenharmony_ci        return nullptr;
83d9f0492fSopenharmony_ci    }
84d9f0492fSopenharmony_ci    int ret = strcpy_s(node->name, strlen(value) + 1, value);
85d9f0492fSopenharmony_ci    if (ret != 0) {
86d9f0492fSopenharmony_ci        free(node);
87d9f0492fSopenharmony_ci        return nullptr;
88d9f0492fSopenharmony_ci    }
89d9f0492fSopenharmony_ci    HASHMAPInitNode(&node->node);
90d9f0492fSopenharmony_ci    return node;
91d9f0492fSopenharmony_ci}
92d9f0492fSopenharmony_ci
93d9f0492fSopenharmony_cistatic void DoCmdByName(const char *name, const char *cmdContent)
94d9f0492fSopenharmony_ci{
95d9f0492fSopenharmony_ci    int cmdIndex = 0;
96d9f0492fSopenharmony_ci    (void)GetMatchCmd(name, &cmdIndex);
97d9f0492fSopenharmony_ci    DoCmdByIndex(cmdIndex, cmdContent, nullptr);
98d9f0492fSopenharmony_ci}
99d9f0492fSopenharmony_ci
100d9f0492fSopenharmony_cinamespace init_ut {
101d9f0492fSopenharmony_ciclass InitGroupManagerUnitTest : public testing::Test {
102d9f0492fSopenharmony_cipublic:
103d9f0492fSopenharmony_ci    static void SetUpTestCase(void) {};
104d9f0492fSopenharmony_ci    static void TearDownTestCase(void) {};
105d9f0492fSopenharmony_ci    void SetUp(void) {};
106d9f0492fSopenharmony_ci    void TearDown(void) {};
107d9f0492fSopenharmony_ci};
108d9f0492fSopenharmony_ci
109d9f0492fSopenharmony_ciHashInfo g_info = {
110d9f0492fSopenharmony_ci    TestHashNodeCompare,
111d9f0492fSopenharmony_ci    TestHashKeyCompare,
112d9f0492fSopenharmony_ci    TestHashNodeFunction,
113d9f0492fSopenharmony_ci    TestHashKeyFunction,
114d9f0492fSopenharmony_ci    TestHashNodeFree,
115d9f0492fSopenharmony_ci    2
116d9f0492fSopenharmony_ci};
117d9f0492fSopenharmony_ci
118d9f0492fSopenharmony_ciHWTEST_F(InitGroupManagerUnitTest, TestHashMap001, TestSize.Level1)
119d9f0492fSopenharmony_ci{
120d9f0492fSopenharmony_ci    HashMapHandle handle;
121d9f0492fSopenharmony_ci    OH_HashMapCreate(&handle, &g_info);
122d9f0492fSopenharmony_ci    const char *str1 = "Test hash map node 1";
123d9f0492fSopenharmony_ci    const char *str2 = "Test hash map node 2";
124d9f0492fSopenharmony_ci    const char *str3 = "Test hash map node 3";
125d9f0492fSopenharmony_ci    TestHashNode *node1 = TestCreateHashNode(str1);
126d9f0492fSopenharmony_ci    TestHashNode *node2 = TestCreateHashNode(str2);
127d9f0492fSopenharmony_ci    OH_HashMapAdd(handle, &node1->node);
128d9f0492fSopenharmony_ci    OH_HashMapAdd(handle, &node2->node);
129d9f0492fSopenharmony_ci    HashNode *node = OH_HashMapGet(handle, (const void *)str1);
130d9f0492fSopenharmony_ci    EXPECT_NE(node != nullptr, 0);
131d9f0492fSopenharmony_ci    if (node) {
132d9f0492fSopenharmony_ci        TestHashNode *tmp = HASHMAP_ENTRY(node, TestHashNode, node);
133d9f0492fSopenharmony_ci        EXPECT_EQ(strcmp(tmp->name, str1), 0);
134d9f0492fSopenharmony_ci    }
135d9f0492fSopenharmony_ci    node = OH_HashMapGet(handle, (const void *)str2);
136d9f0492fSopenharmony_ci    EXPECT_NE(node != nullptr, 0);
137d9f0492fSopenharmony_ci    if (node) {
138d9f0492fSopenharmony_ci        TestHashNode *tmp = HASHMAP_ENTRY(node, TestHashNode, node);
139d9f0492fSopenharmony_ci        EXPECT_EQ(strcmp(tmp->name, str2), 0);
140d9f0492fSopenharmony_ci    }
141d9f0492fSopenharmony_ci    TestHashNode *node3 = TestCreateHashNode(str3);
142d9f0492fSopenharmony_ci    OH_HashMapAdd(handle, &node3->node);
143d9f0492fSopenharmony_ci    node3 = TestCreateHashNode("Test hash map node 4");
144d9f0492fSopenharmony_ci    OH_HashMapAdd(handle, &node3->node);
145d9f0492fSopenharmony_ci    node3 = TestCreateHashNode("Test hash map node 5");
146d9f0492fSopenharmony_ci    OH_HashMapAdd(handle, &node3->node);
147d9f0492fSopenharmony_ci    node = OH_HashMapGet(handle, (const void *)str3);
148d9f0492fSopenharmony_ci    EXPECT_NE(node != nullptr, 0);
149d9f0492fSopenharmony_ci    if (node) {
150d9f0492fSopenharmony_ci        TestHashNode *tmp = HASHMAP_ENTRY(node, TestHashNode, node);
151d9f0492fSopenharmony_ci        EXPECT_EQ(strcmp(tmp->name, str3), 0);
152d9f0492fSopenharmony_ci    }
153d9f0492fSopenharmony_ci    OH_HashMapIsEmpty(handle);
154d9f0492fSopenharmony_ci    OH_HashMapTraverse(handle, [](const HashNode *node, const void *context) {return;}, nullptr);
155d9f0492fSopenharmony_ci    OH_HashMapDestory(handle, nullptr);
156d9f0492fSopenharmony_ci}
157d9f0492fSopenharmony_ci
158d9f0492fSopenharmony_ciHWTEST_F(InitGroupManagerUnitTest, TestHashMap002, TestSize.Level1)
159d9f0492fSopenharmony_ci{
160d9f0492fSopenharmony_ci    HashMapHandle handle;
161d9f0492fSopenharmony_ci    OH_HashMapCreate(&handle, &g_info);
162d9f0492fSopenharmony_ci    TestHashNode *node4 = TestCreateHashNode("pre-init");
163d9f0492fSopenharmony_ci    OH_HashMapAdd(handle, &node4->node);
164d9f0492fSopenharmony_ci    OH_HashMapRemove(handle, "pre-init");
165d9f0492fSopenharmony_ci    TestHashNodeFree(&node4->node, nullptr);
166d9f0492fSopenharmony_ci
167d9f0492fSopenharmony_ci    const char *act = "load_persist_props_action";
168d9f0492fSopenharmony_ci    TestHashNode *node5 = TestCreateHashNode(act);
169d9f0492fSopenharmony_ci    OH_HashMapAdd(handle, &node5->node);
170d9f0492fSopenharmony_ci    HashNode *node = OH_HashMapGet(handle, (const void *)act);
171d9f0492fSopenharmony_ci    EXPECT_NE(node != nullptr, 0);
172d9f0492fSopenharmony_ci    if (node) {
173d9f0492fSopenharmony_ci        TestHashNode *tmp = HASHMAP_ENTRY(node, TestHashNode, node);
174d9f0492fSopenharmony_ci        EXPECT_EQ(strcmp(tmp->name, act), 0);
175d9f0492fSopenharmony_ci    }
176d9f0492fSopenharmony_ci    OH_HashMapIsEmpty(handle);
177d9f0492fSopenharmony_ci    OH_HashMapTraverse(handle, [](const HashNode *node, const void *context) {return;}, nullptr);
178d9f0492fSopenharmony_ci    OH_HashMapDestory(handle, nullptr);
179d9f0492fSopenharmony_ci}
180d9f0492fSopenharmony_ci
181d9f0492fSopenharmony_ciHWTEST_F(InitGroupManagerUnitTest, TestInitGroupMgrInit, TestSize.Level1)
182d9f0492fSopenharmony_ci{
183d9f0492fSopenharmony_ci    InitServiceSpace();
184d9f0492fSopenharmony_ci    InitWorkspace *workspace = GetInitWorkspace();
185d9f0492fSopenharmony_ci    EXPECT_EQ(workspace->groupMode, GROUP_BOOT);
186d9f0492fSopenharmony_ci    workspace->groupMode = GROUP_BOOT;
187d9f0492fSopenharmony_ci    if (strcpy_s(workspace->groupModeStr, GROUP_NAME_MAX_LENGTH, "device.boot.group") != EOK) {
188d9f0492fSopenharmony_ci        EXPECT_EQ(1, 0);
189d9f0492fSopenharmony_ci    }
190d9f0492fSopenharmony_ci    // test read cfgfile
191d9f0492fSopenharmony_ci    int ret = InitParseGroupCfg();
192d9f0492fSopenharmony_ci    EXPECT_EQ(ret, 0);
193d9f0492fSopenharmony_ci}
194d9f0492fSopenharmony_ci
195d9f0492fSopenharmony_ciHWTEST_F(InitGroupManagerUnitTest, TestAddService, TestSize.Level1)
196d9f0492fSopenharmony_ci{
197d9f0492fSopenharmony_ci    const char *serviceStr = "{"
198d9f0492fSopenharmony_ci	    "\"services\": [{"
199d9f0492fSopenharmony_ci            "\"name\" : \"test-service\","
200d9f0492fSopenharmony_ci            "\"path\" : [\"/dev/test_service\"],"
201d9f0492fSopenharmony_ci            "\"start-mode\" : \"condition\","
202d9f0492fSopenharmony_ci            "\"end-mode\" : \"after-exec\","
203d9f0492fSopenharmony_ci            "\"console\":1,"
204d9f0492fSopenharmony_ci            "\"writepid\":[\"/dev/test_service\"],"
205d9f0492fSopenharmony_ci            "\"jobs\" : {"
206d9f0492fSopenharmony_ci                    "\"on-boot\" : \"boot:bootjob1\","
207d9f0492fSopenharmony_ci                    "\"on-start\" : \"service:startjob\","
208d9f0492fSopenharmony_ci                    "\"on-stop\" : \"service:stopjob\","
209d9f0492fSopenharmony_ci                    "\"on-restart\" : \"service:restartjob\""
210d9f0492fSopenharmony_ci                "}"
211d9f0492fSopenharmony_ci        "},{"
212d9f0492fSopenharmony_ci            "\"name\" : \"test-service2\","
213d9f0492fSopenharmony_ci            "\"path\" : [\"/dev/test_service\"],"
214d9f0492fSopenharmony_ci            "\"console\":1,"
215d9f0492fSopenharmony_ci            "\"start-mode\" : \"boot\","
216d9f0492fSopenharmony_ci            "\"writepid\":[\"/dev/test_service\"],"
217d9f0492fSopenharmony_ci            "\"jobs\" : {"
218d9f0492fSopenharmony_ci                    "\"on-boot\" : \"boot:bootjob1\","
219d9f0492fSopenharmony_ci                    "\"on-start\" : \"service:startjob\","
220d9f0492fSopenharmony_ci                    "\"on-stop\" : \"service:stopjob\","
221d9f0492fSopenharmony_ci                    "\"on-restart\" : \"service:restartjob\""
222d9f0492fSopenharmony_ci                "}"
223d9f0492fSopenharmony_ci        "}]"
224d9f0492fSopenharmony_ci    "}";
225d9f0492fSopenharmony_ci
226d9f0492fSopenharmony_ci    cJSON *fileRoot = cJSON_Parse(serviceStr);
227d9f0492fSopenharmony_ci    ASSERT_NE(nullptr, fileRoot);
228d9f0492fSopenharmony_ci    ConfigContext context = { INIT_CONTEXT_MAIN };
229d9f0492fSopenharmony_ci    ParseAllServices(fileRoot, &context);
230d9f0492fSopenharmony_ci    cJSON_Delete(fileRoot);
231d9f0492fSopenharmony_ci
232d9f0492fSopenharmony_ci    Service *service = GetServiceByName("test-service");
233d9f0492fSopenharmony_ci    ServiceStartTimer(service, 1);
234d9f0492fSopenharmony_ci    ServiceStopTimer(service);
235d9f0492fSopenharmony_ci    ASSERT_NE(service != nullptr, 0);
236d9f0492fSopenharmony_ci    EXPECT_EQ(service->startMode, START_MODE_CONDITION);
237d9f0492fSopenharmony_ci    ReleaseService(service);
238d9f0492fSopenharmony_ci    service = GetServiceByName("test-service2");
239d9f0492fSopenharmony_ci    ASSERT_NE(service != nullptr, 0);
240d9f0492fSopenharmony_ci    EXPECT_EQ(service->startMode, START_MODE_BOOT);
241d9f0492fSopenharmony_ci    ReleaseService(service);
242d9f0492fSopenharmony_ci}
243d9f0492fSopenharmony_ci
244d9f0492fSopenharmony_ci/**
245d9f0492fSopenharmony_ci * @brief
246d9f0492fSopenharmony_ci *
247d9f0492fSopenharmony_ci
248d9f0492fSopenharmony_ci    "socket" : [{
249d9f0492fSopenharmony_ci        "name" : "ueventd",
250d9f0492fSopenharmony_ci        "family" : "AF_INET", // AF_INET,AF_INET6,AF_UNIX(AF_LOCAL),AF_NETLINK
251d9f0492fSopenharmony_ci        "type" : : "SOCK_STREAM", // SOCK_STREAM,SOCK_DGRAM,SOCK_RAW,SOCK_PACKET,SOCK_SEQPACKET
252d9f0492fSopenharmony_ci        "protocol" : "IPPROTO_TCP", // IPPROTO_TCP,IPPTOTO_UDP,IPPROTO_SCTP,PPROTO_TIPC
253d9f0492fSopenharmony_ci        "permissions" : "0660",
254d9f0492fSopenharmony_ci        "uid" : "system",
255d9f0492fSopenharmony_ci        "gid" : "system",
256d9f0492fSopenharmony_ci        "option" : {
257d9f0492fSopenharmony_ci            "passcred" : "true",
258d9f0492fSopenharmony_ci            "rcvbufforce" : "",
259d9f0492fSopenharmony_ci            "cloexec" : "",
260d9f0492fSopenharmony_ci            "nonblock : ""
261d9f0492fSopenharmony_ci        }
262d9f0492fSopenharmony_ci    }],
263d9f0492fSopenharmony_ci */
264d9f0492fSopenharmony_ciHWTEST_F(InitGroupManagerUnitTest, TestAddServiceDeny, TestSize.Level1)
265d9f0492fSopenharmony_ci{
266d9f0492fSopenharmony_ci    const char *serviceStr = "{"
267d9f0492fSopenharmony_ci	    "\"services\": [{"
268d9f0492fSopenharmony_ci            "\"name\" : \"test-service5\","
269d9f0492fSopenharmony_ci            "\"path\" : [\"/dev/test_service\"],"
270d9f0492fSopenharmony_ci            "\"start-mode\" : \"by-condition\","
271d9f0492fSopenharmony_ci            "\"end-mode\" : \"ready\","
272d9f0492fSopenharmony_ci            "\"console\":1,"
273d9f0492fSopenharmony_ci            "\"writepid\":[\"/dev/test_service\"],"
274d9f0492fSopenharmony_ci            "\"jobs\" : {"
275d9f0492fSopenharmony_ci                    "\"on-boot\" : \"boot:bootjob1\","
276d9f0492fSopenharmony_ci                    "\"on-start\" : \"service:startjob\","
277d9f0492fSopenharmony_ci                    "\"on-stop\" : \"service:stopjob\","
278d9f0492fSopenharmony_ci                    "\"on-restart\" : \"service:restartjob\""
279d9f0492fSopenharmony_ci                "}"
280d9f0492fSopenharmony_ci        "}]"
281d9f0492fSopenharmony_ci    "}";
282d9f0492fSopenharmony_ci    InitWorkspace *workspace = GetInitWorkspace();
283d9f0492fSopenharmony_ci    workspace->groupMode = GROUP_CHARGE;
284d9f0492fSopenharmony_ci
285d9f0492fSopenharmony_ci    cJSON *fileRoot = cJSON_Parse(serviceStr);
286d9f0492fSopenharmony_ci    ASSERT_NE(nullptr, fileRoot);
287d9f0492fSopenharmony_ci    ConfigContext context = { INIT_CONTEXT_MAIN };
288d9f0492fSopenharmony_ci    ParseAllServices(fileRoot, &context);
289d9f0492fSopenharmony_ci    cJSON_Delete(fileRoot);
290d9f0492fSopenharmony_ci
291d9f0492fSopenharmony_ci    Service *service = GetServiceByName("test-service5");
292d9f0492fSopenharmony_ci    ASSERT_EQ(service, nullptr);
293d9f0492fSopenharmony_ci    workspace->groupMode = GROUP_BOOT;
294d9f0492fSopenharmony_ci}
295d9f0492fSopenharmony_ci
296d9f0492fSopenharmony_ciHWTEST_F(InitGroupManagerUnitTest, TestAddService2, TestSize.Level1)
297d9f0492fSopenharmony_ci{
298d9f0492fSopenharmony_ci    const char *serviceStr = "{"
299d9f0492fSopenharmony_ci	    "\"services\": [{"
300d9f0492fSopenharmony_ci            "\"name\" : \"test-service6\","
301d9f0492fSopenharmony_ci            "\"path\" : [\"/dev/test_service\"],"
302d9f0492fSopenharmony_ci            "\"console\":1,"
303d9f0492fSopenharmony_ci            "\"writepid\":[\"/dev/test_service\"],"
304d9f0492fSopenharmony_ci            "\"jobs\" : {"
305d9f0492fSopenharmony_ci                    "\"on-boot\" : \"boot:bootjob1\","
306d9f0492fSopenharmony_ci                    "\"on-start\" : \"service:startjob\","
307d9f0492fSopenharmony_ci                    "\"on-stop\" : \"service:stopjob\","
308d9f0492fSopenharmony_ci                    "\"on-restart\" : \"service:restartjob\""
309d9f0492fSopenharmony_ci                "}"
310d9f0492fSopenharmony_ci        "}]"
311d9f0492fSopenharmony_ci    "}";
312d9f0492fSopenharmony_ci
313d9f0492fSopenharmony_ci    InitWorkspace *workspace = GetInitWorkspace();
314d9f0492fSopenharmony_ci    workspace->groupMode = GROUP_CHARGE;
315d9f0492fSopenharmony_ci
316d9f0492fSopenharmony_ci    InitGroupNode *node = AddGroupNode(NODE_TYPE_SERVICES, "test-service6");
317d9f0492fSopenharmony_ci    ASSERT_NE(nullptr, node);
318d9f0492fSopenharmony_ci
319d9f0492fSopenharmony_ci    cJSON *fileRoot = cJSON_Parse(serviceStr);
320d9f0492fSopenharmony_ci    ASSERT_NE(nullptr, fileRoot);
321d9f0492fSopenharmony_ci    ConfigContext context = { INIT_CONTEXT_MAIN };
322d9f0492fSopenharmony_ci    ParseAllServices(fileRoot, &context);
323d9f0492fSopenharmony_ci    cJSON_Delete(fileRoot);
324d9f0492fSopenharmony_ci    char cmdStr[] = "all#bootevent";
325d9f0492fSopenharmony_ci    char cmdStr1[] = "parameter_service";
326d9f0492fSopenharmony_ci    ProcessControlFd(ACTION_DUMP, "all", nullptr);
327d9f0492fSopenharmony_ci    ProcessControlFd(ACTION_DUMP, cmdStr, nullptr);
328d9f0492fSopenharmony_ci    ProcessControlFd(ACTION_DUMP, cmdStr1, nullptr);
329d9f0492fSopenharmony_ci    ProcessControlFd(ACTION_SANDBOX, cmdStr, nullptr);
330d9f0492fSopenharmony_ci    ProcessControlFd(ACTION_MODULEMGR, cmdStr, nullptr);
331d9f0492fSopenharmony_ci    ProcessControlFd(ACTION_MAX, cmdStr, nullptr);
332d9f0492fSopenharmony_ci    Service *service = GetServiceByName("test-service6");
333d9f0492fSopenharmony_ci    ASSERT_NE(service, nullptr);
334d9f0492fSopenharmony_ci    workspace->groupMode = GROUP_BOOT;
335d9f0492fSopenharmony_ci}
336d9f0492fSopenharmony_ci
337d9f0492fSopenharmony_ciHWTEST_F(InitGroupManagerUnitTest, TestParseServiceCpucore, TestSize.Level1)
338d9f0492fSopenharmony_ci{
339d9f0492fSopenharmony_ci    const char *jsonStr = "{\"services\":{\"name\":\"test_service22\",\"path\":[\"/data/init_ut/test_service\"],"
340d9f0492fSopenharmony_ci        "\"importance\":-20,\"uid\":\"root\",\"writepid\":[\"/dev/test_service\"],\"console\":1,"
341d9f0492fSopenharmony_ci        "\"gid\":[\"root\"], \"cpucore\":[5, 2, 4, 1, 2, 0, 1], \"critical\":[1]}}";
342d9f0492fSopenharmony_ci    cJSON* jobItem = cJSON_Parse(jsonStr);
343d9f0492fSopenharmony_ci    ASSERT_NE(nullptr, jobItem);
344d9f0492fSopenharmony_ci    cJSON *serviceItem = cJSON_GetObjectItem(jobItem, "services");
345d9f0492fSopenharmony_ci    ASSERT_NE(nullptr, serviceItem);
346d9f0492fSopenharmony_ci    Service *service = AddService("test_service22");
347d9f0492fSopenharmony_ci    const int invalidImportantValue = 20;
348d9f0492fSopenharmony_ci    SetImportantValue(service, "", invalidImportantValue, 1);
349d9f0492fSopenharmony_ci    if (service != nullptr) {
350d9f0492fSopenharmony_ci        int ret = ParseOneService(serviceItem, service);
351d9f0492fSopenharmony_ci        GetAccessToken();
352d9f0492fSopenharmony_ci        DoCmdByName("timer_start ", "test_service22|5000");
353d9f0492fSopenharmony_ci        DoCmdByName("timer_start ", "test_service22|aa");
354d9f0492fSopenharmony_ci        DoCmdByName("timer_start ", "");
355d9f0492fSopenharmony_ci        EXPECT_EQ(ret, 0);
356d9f0492fSopenharmony_ci        StartServiceByName("test_service22|path");
357d9f0492fSopenharmony_ci        ReleaseService(service);
358d9f0492fSopenharmony_ci    }
359d9f0492fSopenharmony_ci    cJSON_Delete(jobItem);
360d9f0492fSopenharmony_ci}
361d9f0492fSopenharmony_ci
362d9f0492fSopenharmony_ciHWTEST_F(InitGroupManagerUnitTest, TestUpdaterServiceFds, TestSize.Level1)
363d9f0492fSopenharmony_ci{
364d9f0492fSopenharmony_ci    Service *service = AddService("test_service8");
365d9f0492fSopenharmony_ci    ASSERT_NE(nullptr, service);
366d9f0492fSopenharmony_ci    int fds[1] = { -1 }; // ServiceStop will release fds
367d9f0492fSopenharmony_ci    UpdaterServiceFds(nullptr, nullptr, 0);
368d9f0492fSopenharmony_ci    UpdaterServiceFds(service, fds, 1);
369d9f0492fSopenharmony_ci    UpdaterServiceFds(service, fds, 0);
370d9f0492fSopenharmony_ci    UpdaterServiceFds(service, fds, 1);
371d9f0492fSopenharmony_ci    UpdaterServiceFds(service, nullptr, 1);
372d9f0492fSopenharmony_ci    UpdaterServiceFds(service, fds, 1);
373d9f0492fSopenharmony_ci    int ret = UpdaterServiceFds(service, nullptr, 2); // 2 is fd num
374d9f0492fSopenharmony_ci    ASSERT_NE(ret, 0);
375d9f0492fSopenharmony_ci    service->attribute = SERVICE_ATTR_TIMERSTART;
376d9f0492fSopenharmony_ci    ServiceStartTimer(service, 0);
377d9f0492fSopenharmony_ci}
378d9f0492fSopenharmony_ciHWTEST_F(InitGroupManagerUnitTest, TestProcessWatchEvent, TestSize.Level1)
379d9f0492fSopenharmony_ci{
380d9f0492fSopenharmony_ci    Service *service = AddService("test_service9");
381d9f0492fSopenharmony_ci    ASSERT_NE(nullptr, service);
382d9f0492fSopenharmony_ci    ServiceSocket servercfg = {.next = nullptr, .sockFd = 0};
383d9f0492fSopenharmony_ci    service->socketCfg = &servercfg;
384d9f0492fSopenharmony_ci    ServiceWatcher watcher;
385d9f0492fSopenharmony_ci    int ret = AddSocketWatcher(&watcher, service, 0);
386d9f0492fSopenharmony_ci    ASSERT_EQ(ret, 0);
387d9f0492fSopenharmony_ci    uint32_t event;
388d9f0492fSopenharmony_ci    ((WatcherTask *)watcher)->processEvent((WatcherHandle)watcher, 0, &event, service);
389d9f0492fSopenharmony_ci    service->socketCfg = nullptr;
390d9f0492fSopenharmony_ci}
391d9f0492fSopenharmony_ci
392d9f0492fSopenharmony_ciHWTEST_F(InitGroupManagerUnitTest, TestCheckNodeValid, TestSize.Level1)
393d9f0492fSopenharmony_ci{
394d9f0492fSopenharmony_ci    int ret = CheckNodeValid(NODE_TYPE_MAX, "charger");
395d9f0492fSopenharmony_ci    EXPECT_EQ(ret, -1);
396d9f0492fSopenharmony_ci    ret = CheckNodeValid(NODE_TYPE_PLUGINS, "charger");
397d9f0492fSopenharmony_ci    EXPECT_EQ(ret, -1);
398d9f0492fSopenharmony_ci}
399d9f0492fSopenharmony_ci
400d9f0492fSopenharmony_ciHWTEST_F(InitGroupManagerUnitTest, TestGetGroupHashMap, TestSize.Level1)
401d9f0492fSopenharmony_ci{
402d9f0492fSopenharmony_ci    HashMapHandle handle = GetGroupHashMap(NODE_TYPE_GROUPS);
403d9f0492fSopenharmony_ci    EXPECT_TRUE(handle == nullptr);
404d9f0492fSopenharmony_ci}
405d9f0492fSopenharmony_ci}  // namespace init_ut
406