1d9f0492fSopenharmony_ci/*
2d9f0492fSopenharmony_ci * Copyright (c) 2022 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 <cinttypes>
17d9f0492fSopenharmony_ci#include <sys/mount.h>
18d9f0492fSopenharmony_ci#include "fs_manager/fs_manager.h"
19d9f0492fSopenharmony_ci#include "init_log.h"
20d9f0492fSopenharmony_ci#include "init_param.h"
21d9f0492fSopenharmony_ci#include "param_stub.h"
22d9f0492fSopenharmony_ci#include "securec.h"
23d9f0492fSopenharmony_ci#include "systemcapability.h"
24d9f0492fSopenharmony_ci#include "service_control.h"
25d9f0492fSopenharmony_ci#include "control_fd.h"
26d9f0492fSopenharmony_ci#include "loop_event.h"
27d9f0492fSopenharmony_ci#include "fd_holder.h"
28d9f0492fSopenharmony_ci#include "fd_holder_internal.h"
29d9f0492fSopenharmony_ci
30d9f0492fSopenharmony_ciusing namespace testing::ext;
31d9f0492fSopenharmony_ciusing namespace std;
32d9f0492fSopenharmony_ci
33d9f0492fSopenharmony_cinamespace init_ut {
34d9f0492fSopenharmony_ci
35d9f0492fSopenharmony_ciextern "C" {
36d9f0492fSopenharmony_civoid CmdDisConnectComplete(const TaskHandle client);
37d9f0492fSopenharmony_civoid CmdOnSendMessageComplete(const TaskHandle task, const BufferHandle handle);
38d9f0492fSopenharmony_civoid CmdOnClose(const TaskHandle task);
39d9f0492fSopenharmony_civoid CmdOnConnectComplete(const TaskHandle client);
40d9f0492fSopenharmony_civoid CmdOnRecvMessage(const TaskHandle task, const uint8_t *buffer, uint32_t buffLen);
41d9f0492fSopenharmony_civoid ProcessPtyRead(const WatcherHandle taskHandle, int fd, uint32_t *events, const void *context);
42d9f0492fSopenharmony_civoid ProcessPtyWrite(const WatcherHandle taskHandle, int fd, uint32_t *events, const void *context);
43d9f0492fSopenharmony_ciint CmdOnIncommingConnect(const LoopHandle loop, const TaskHandle server);
44d9f0492fSopenharmony_ciCmdAgent *CmdAgentCreate(const char *server);
45d9f0492fSopenharmony_civoid CmdClientOnRecvMessage(const TaskHandle task, const uint8_t *buffer, uint32_t buffLen);
46d9f0492fSopenharmony_ciint SendCmdMessage(const CmdAgent *agent, uint16_t type, const char *cmd, const char *ptyName);
47d9f0492fSopenharmony_ciint SendMessage(LoopHandle loop, TaskHandle task, const char *message);
48d9f0492fSopenharmony_ciint *GetFdsFromMsg(size_t *outFdCount, pid_t *requestPid, struct msghdr msghdr);
49d9f0492fSopenharmony_ciint BuildSendData(char *buffer, size_t size, const char *serviceName, bool hold, bool poll);
50d9f0492fSopenharmony_ciint CheckSocketPermission(const TaskHandle task);
51d9f0492fSopenharmony_ci}
52d9f0492fSopenharmony_ci
53d9f0492fSopenharmony_ciclass InnerkitsUnitTest : public testing::Test {
54d9f0492fSopenharmony_cipublic:
55d9f0492fSopenharmony_ci    static void SetUpTestCase(void) {};
56d9f0492fSopenharmony_ci    static void TearDownTestCase(void) {};
57d9f0492fSopenharmony_ci    void SetUp() {};
58d9f0492fSopenharmony_ci    void TearDown() {};
59d9f0492fSopenharmony_ci};
60d9f0492fSopenharmony_ci
61d9f0492fSopenharmony_cistatic int CallbackSendMsgProcessTest(const CmdAgent *agent, uint16_t type, const char *cmd, const char *ptyName)
62d9f0492fSopenharmony_ci{
63d9f0492fSopenharmony_ci    return 0;
64d9f0492fSopenharmony_ci}
65d9f0492fSopenharmony_ci
66d9f0492fSopenharmony_ci/**
67d9f0492fSopenharmony_ci* @tc.name: ReadFstabFromFile_unitest
68d9f0492fSopenharmony_ci* @tc.desc: read fstab from test file.
69d9f0492fSopenharmony_ci* @tc.type: FUNC
70d9f0492fSopenharmony_ci* @tc.require:
71d9f0492fSopenharmony_ci* @tc.author:
72d9f0492fSopenharmony_ci*/
73d9f0492fSopenharmony_ciHWTEST_F(InnerkitsUnitTest, Init_InnerkitsTest_ReadFstabFromFile001, TestSize.Level1)
74d9f0492fSopenharmony_ci{
75d9f0492fSopenharmony_ci    Fstab *fstab = nullptr;
76d9f0492fSopenharmony_ci    const std::string fstabFile1 = "/data/fstab.updater1";
77d9f0492fSopenharmony_ci    fstab = ReadFstabFromFile(fstabFile1.c_str(), false);
78d9f0492fSopenharmony_ci    EXPECT_EQ(fstab, nullptr);
79d9f0492fSopenharmony_ci    const std::string fstabFile2 = STARTUP_INIT_UT_PATH"/mount_unitest/ReadFstabFromFile1.fstable";
80d9f0492fSopenharmony_ci    fstab = ReadFstabFromFile(fstabFile2.c_str(), false);
81d9f0492fSopenharmony_ci    EXPECT_NE(fstab, nullptr);
82d9f0492fSopenharmony_ci    ParseFstabPerLine(const_cast<char *>("test"), fstab, true, nullptr);
83d9f0492fSopenharmony_ci    ReleaseFstab(fstab);
84d9f0492fSopenharmony_ci}
85d9f0492fSopenharmony_ci
86d9f0492fSopenharmony_ci/**
87d9f0492fSopenharmony_ci* @tc.name: FindFstabItemForPath_unitest
88d9f0492fSopenharmony_ci* @tc.desc: read fstab from test file, then find item according to path.
89d9f0492fSopenharmony_ci* @tc.type: FUNC
90d9f0492fSopenharmony_ci* @tc.require:
91d9f0492fSopenharmony_ci* @tc.author:
92d9f0492fSopenharmony_ci*/
93d9f0492fSopenharmony_ciHWTEST_F(InnerkitsUnitTest, Init_InnerkitsTest_FindFstabItemForPath001, TestSize.Level1)
94d9f0492fSopenharmony_ci{
95d9f0492fSopenharmony_ci    const std::string fstabFile1 = STARTUP_INIT_UT_PATH"/mount_unitest/ReadFstabFromFile1.fstable";
96d9f0492fSopenharmony_ci    Fstab *fstab = nullptr;
97d9f0492fSopenharmony_ci    fstab = ReadFstabFromFile(fstabFile1.c_str(), false);
98d9f0492fSopenharmony_ci    ASSERT_NE(fstab, nullptr);
99d9f0492fSopenharmony_ci    FstabItem* item = nullptr;
100d9f0492fSopenharmony_ci    const std::string path1 = "";
101d9f0492fSopenharmony_ci    item = FindFstabItemForPath(*fstab, path1.c_str());
102d9f0492fSopenharmony_ci    if (item == nullptr) {
103d9f0492fSopenharmony_ci        SUCCEED();
104d9f0492fSopenharmony_ci    }
105d9f0492fSopenharmony_ci    const std::string path2 = "/data";
106d9f0492fSopenharmony_ci    item = FindFstabItemForPath(*fstab, path2.c_str());
107d9f0492fSopenharmony_ci    if (item != nullptr) {
108d9f0492fSopenharmony_ci        SUCCEED();
109d9f0492fSopenharmony_ci    }
110d9f0492fSopenharmony_ci    const std::string path3 = "/data2";
111d9f0492fSopenharmony_ci    item = FindFstabItemForPath(*fstab, path3.c_str());
112d9f0492fSopenharmony_ci    if (item == nullptr) {
113d9f0492fSopenharmony_ci        SUCCEED();
114d9f0492fSopenharmony_ci    }
115d9f0492fSopenharmony_ci    const std::string path4 = "/data2/test";
116d9f0492fSopenharmony_ci    item = FindFstabItemForPath(*fstab, path4.c_str());
117d9f0492fSopenharmony_ci    if (item != nullptr) {
118d9f0492fSopenharmony_ci        SUCCEED();
119d9f0492fSopenharmony_ci    }
120d9f0492fSopenharmony_ci    ReleaseFstab(fstab);
121d9f0492fSopenharmony_ci    fstab = nullptr;
122d9f0492fSopenharmony_ci}
123d9f0492fSopenharmony_ci
124d9f0492fSopenharmony_ci/**
125d9f0492fSopenharmony_ci* @tc.name: FindFstabItemForMountPoint_unitest
126d9f0492fSopenharmony_ci* @tc.desc: read fstab from test file, then find item that matches with the mount point.
127d9f0492fSopenharmony_ci* @tc.type: FUNC
128d9f0492fSopenharmony_ci* @tc.require:
129d9f0492fSopenharmony_ci* @tc.author:
130d9f0492fSopenharmony_ci*/
131d9f0492fSopenharmony_ciHWTEST_F(InnerkitsUnitTest, Init_InnerkitsTest_FindFstabItemForMountPoint001, TestSize.Level1)
132d9f0492fSopenharmony_ci{
133d9f0492fSopenharmony_ci    const std::string fstabFile1 = STARTUP_INIT_UT_PATH"/mount_unitest/ReadFstabFromFile1.fstable";
134d9f0492fSopenharmony_ci    Fstab *fstab = nullptr;
135d9f0492fSopenharmony_ci    fstab = ReadFstabFromFile(fstabFile1.c_str(), false);
136d9f0492fSopenharmony_ci    ASSERT_NE(fstab, nullptr);
137d9f0492fSopenharmony_ci    FstabItem* item = nullptr;
138d9f0492fSopenharmony_ci    const std::string mp1 = "/data";
139d9f0492fSopenharmony_ci    const std::string mp2 = "/data2";
140d9f0492fSopenharmony_ci    item = FindFstabItemForMountPoint(*fstab, mp2.c_str());
141d9f0492fSopenharmony_ci    if (item == nullptr) {
142d9f0492fSopenharmony_ci        SUCCEED();
143d9f0492fSopenharmony_ci    }
144d9f0492fSopenharmony_ci    const std::string mp3 = "/data";
145d9f0492fSopenharmony_ci    item = FindFstabItemForMountPoint(*fstab, mp3.c_str());
146d9f0492fSopenharmony_ci    if (item != nullptr) {
147d9f0492fSopenharmony_ci        SUCCEED();
148d9f0492fSopenharmony_ci    }
149d9f0492fSopenharmony_ci    ReleaseFstab(fstab);
150d9f0492fSopenharmony_ci    fstab = nullptr;
151d9f0492fSopenharmony_ci}
152d9f0492fSopenharmony_ci
153d9f0492fSopenharmony_ci/**
154d9f0492fSopenharmony_ci* @tc.name: GetMountFlags_unitest
155d9f0492fSopenharmony_ci* @tc.desc: read fstab from test file, then find the item and get mount flags.
156d9f0492fSopenharmony_ci* @tc.type: FUNC
157d9f0492fSopenharmony_ci* @tc.require:
158d9f0492fSopenharmony_ci* @tc.author:
159d9f0492fSopenharmony_ci*/
160d9f0492fSopenharmony_ciHWTEST_F(InnerkitsUnitTest, Init_InnerkitsTest_GetMountFlags001, TestSize.Level1)
161d9f0492fSopenharmony_ci{
162d9f0492fSopenharmony_ci    const std::string fstabFile1 = STARTUP_INIT_UT_PATH"/mount_unitest/ReadFstabFromFile1.fstable";
163d9f0492fSopenharmony_ci    Fstab *fstab = nullptr;
164d9f0492fSopenharmony_ci    fstab = ReadFstabFromFile(fstabFile1.c_str(), true);
165d9f0492fSopenharmony_ci    ASSERT_NE(fstab, nullptr);
166d9f0492fSopenharmony_ci    struct FstabItem* item = nullptr;
167d9f0492fSopenharmony_ci    const std::string mp = "/hos";
168d9f0492fSopenharmony_ci    item = FindFstabItemForMountPoint(*fstab, mp.c_str());
169d9f0492fSopenharmony_ci    if (item == nullptr) {
170d9f0492fSopenharmony_ci        SUCCEED();
171d9f0492fSopenharmony_ci    }
172d9f0492fSopenharmony_ci    const int bufferSize = 512;
173d9f0492fSopenharmony_ci    char fsSpecificOptions[bufferSize] = {0};
174d9f0492fSopenharmony_ci    unsigned long flags = GetMountFlags(item->mountOptions, fsSpecificOptions, bufferSize, item->mountPoint);
175d9f0492fSopenharmony_ci    EXPECT_EQ(flags, static_cast<unsigned long>(MS_NOSUID | MS_NODEV | MS_NOATIME));
176d9f0492fSopenharmony_ci    ReleaseFstab(fstab);
177d9f0492fSopenharmony_ci    fstab = nullptr;
178d9f0492fSopenharmony_ci}
179d9f0492fSopenharmony_ci
180d9f0492fSopenharmony_ci/**
181d9f0492fSopenharmony_ci* @tc.name: GetSlotInfo_unittest
182d9f0492fSopenharmony_ci* @tc.desc: get the number of slots and get current slot.
183d9f0492fSopenharmony_ci* @tc.type: FUNC
184d9f0492fSopenharmony_ci* @tc.require:issueI5NTX2
185d9f0492fSopenharmony_ci* @tc.author:
186d9f0492fSopenharmony_ci*/
187d9f0492fSopenharmony_ciHWTEST_F(InnerkitsUnitTest, Init_InnerkitsTest_GetSlotInfo001, TestSize.Level1)
188d9f0492fSopenharmony_ci{
189d9f0492fSopenharmony_ci    EXPECT_NE(GetBootSlots(), -1);
190d9f0492fSopenharmony_ci    EXPECT_NE(GetCurrentSlot(), -1);
191d9f0492fSopenharmony_ci}
192d9f0492fSopenharmony_ci
193d9f0492fSopenharmony_ci/**
194d9f0492fSopenharmony_ci* @tc.name: LoadFstabFromCommandLine_unittest
195d9f0492fSopenharmony_ci* @tc.desc: get fstab from command line.
196d9f0492fSopenharmony_ci* @tc.type: FUNC
197d9f0492fSopenharmony_ci* @tc.require:issueI5NTX2
198d9f0492fSopenharmony_ci* @tc.author:
199d9f0492fSopenharmony_ci*/
200d9f0492fSopenharmony_ciHWTEST_F(InnerkitsUnitTest, Init_InnerkitsTest_LoadFstabFromCommandLine001, TestSize.Level1)
201d9f0492fSopenharmony_ci{
202d9f0492fSopenharmony_ci    EXPECT_NE(LoadFstabFromCommandLine(), (Fstab *)nullptr);
203d9f0492fSopenharmony_ci}
204d9f0492fSopenharmony_ci
205d9f0492fSopenharmony_ci/**
206d9f0492fSopenharmony_ci* @tc.name: GetBlockDevicePath_unittest
207d9f0492fSopenharmony_ci* @tc.desc: get block device path according to valid or invalid partition.
208d9f0492fSopenharmony_ci* @tc.type: FUNC
209d9f0492fSopenharmony_ci* @tc.require:issueI5NTX2
210d9f0492fSopenharmony_ci* @tc.author:
211d9f0492fSopenharmony_ci*/
212d9f0492fSopenharmony_ciHWTEST_F(InnerkitsUnitTest, Init_InnerkitsTest_GetBlockDevicePath001, TestSize.Level1)
213d9f0492fSopenharmony_ci{
214d9f0492fSopenharmony_ci    char devicePath[MAX_BUFFER_LEN] = {0};
215d9f0492fSopenharmony_ci    EXPECT_EQ(GetBlockDevicePath("/vendor", devicePath, MAX_BUFFER_LEN), 0);
216d9f0492fSopenharmony_ci    EXPECT_EQ(GetBlockDevicePath("/misc", devicePath, MAX_BUFFER_LEN), 0);
217d9f0492fSopenharmony_ci    EXPECT_EQ(GetBlockDevicePath("/invalid", devicePath, MAX_BUFFER_LEN), -1);
218d9f0492fSopenharmony_ci    unlink(BOOT_CMD_LINE);
219d9f0492fSopenharmony_ci    EXPECT_EQ(GetBlockDevicePath("/invalid", devicePath, MAX_BUFFER_LEN), -1);
220d9f0492fSopenharmony_ci    GetCurrentSlot();
221d9f0492fSopenharmony_ci    // restore cmdline
222d9f0492fSopenharmony_ci    PrepareCmdLineData();
223d9f0492fSopenharmony_ci}
224d9f0492fSopenharmony_ci
225d9f0492fSopenharmony_ci/**
226d9f0492fSopenharmony_ci* @tc.name: DoFormat_unittest
227d9f0492fSopenharmony_ci* @tc.desc: format file system, includes ext4 and f2fs type.
228d9f0492fSopenharmony_ci* @tc.type: FUNC
229d9f0492fSopenharmony_ci* @tc.require:
230d9f0492fSopenharmony_ci* @tc.author:
231d9f0492fSopenharmony_ci*/
232d9f0492fSopenharmony_ciHWTEST_F(InnerkitsUnitTest, Init_InnerkitsTest_DoFormat001, TestSize.Level1)
233d9f0492fSopenharmony_ci{
234d9f0492fSopenharmony_ci    EXPECT_NE(DoFormat("/testpath", "ext4"), -1);
235d9f0492fSopenharmony_ci    EXPECT_NE(DoFormat("/testpath", "f2fs"), -1);
236d9f0492fSopenharmony_ci    EXPECT_EQ(DoFormat("/testpath", "notFs"), -1);
237d9f0492fSopenharmony_ci    EXPECT_EQ(DoFormat(nullptr, nullptr), -1);
238d9f0492fSopenharmony_ci}
239d9f0492fSopenharmony_ci
240d9f0492fSopenharmony_ci/**
241d9f0492fSopenharmony_ci* @tc.name: MountAllWithFstabFile_unittest
242d9f0492fSopenharmony_ci* @tc.desc: mount partitions according to fstab that read from file.
243d9f0492fSopenharmony_ci* @tc.type: FUNC
244d9f0492fSopenharmony_ci* @tc.require:issueI5NTX2
245d9f0492fSopenharmony_ci* @tc.author:
246d9f0492fSopenharmony_ci*/
247d9f0492fSopenharmony_ciHWTEST_F(InnerkitsUnitTest, Init_InnerkitsTest_MountAllWithFstabFile001, TestSize.Level1)
248d9f0492fSopenharmony_ci{
249d9f0492fSopenharmony_ci    EXPECT_NE(MountAllWithFstabFile(STARTUP_INIT_UT_PATH"/etc/fstab.required", 0), 1);
250d9f0492fSopenharmony_ci    EXPECT_NE(UmountAllWithFstabFile(STARTUP_INIT_UT_PATH"/etc/fstab.required"), 1);
251d9f0492fSopenharmony_ci    EXPECT_EQ(MountAllWithFstabFile("/testErrorFile", 0), -1);
252d9f0492fSopenharmony_ci    EXPECT_EQ(MountAllWithFstabFile(nullptr, 0), -1);
253d9f0492fSopenharmony_ci    EXPECT_EQ(GetMountStatusForMountPoint(nullptr), -1);
254d9f0492fSopenharmony_ci    FstabItem fstabItem = {};
255d9f0492fSopenharmony_ci    fstabItem.fsType = strdup("notSupport");
256d9f0492fSopenharmony_ci    fstabItem.mountPoint = strdup("");
257d9f0492fSopenharmony_ci    EXPECT_EQ(MountOneItem(nullptr), -1);
258d9f0492fSopenharmony_ci    EXPECT_EQ(MountOneItem(&fstabItem), 0);
259d9f0492fSopenharmony_ci    if (fstabItem.fsType != nullptr) {
260d9f0492fSopenharmony_ci        free(fstabItem.fsType);
261d9f0492fSopenharmony_ci        fstabItem.fsType = nullptr;
262d9f0492fSopenharmony_ci    }
263d9f0492fSopenharmony_ci    if (fstabItem.mountPoint != nullptr) {
264d9f0492fSopenharmony_ci        free(fstabItem.mountPoint);
265d9f0492fSopenharmony_ci        fstabItem.mountPoint = nullptr;
266d9f0492fSopenharmony_ci    }
267d9f0492fSopenharmony_ci}
268d9f0492fSopenharmony_ci
269d9f0492fSopenharmony_ci#define SYSCAP_MAX_SIZE 100
270d9f0492fSopenharmony_ci
271d9f0492fSopenharmony_ci// TestSysCap
272d9f0492fSopenharmony_ciHWTEST_F(InnerkitsUnitTest, Init_InnerkitsTest_TestSysCap001, TestSize.Level1)
273d9f0492fSopenharmony_ci{
274d9f0492fSopenharmony_ci    bool ret = HasSystemCapability("test.cap");
275d9f0492fSopenharmony_ci    EXPECT_EQ(ret, false);
276d9f0492fSopenharmony_ci    ret = HasSystemCapability(nullptr);
277d9f0492fSopenharmony_ci    EXPECT_EQ(ret, false);
278d9f0492fSopenharmony_ci    ret = HasSystemCapability("ArkUI.ArkUI.Napi");
279d9f0492fSopenharmony_ci    EXPECT_EQ(ret, true);
280d9f0492fSopenharmony_ci    ret = HasSystemCapability("SystemCapability.ArkUI.ArkUI.Napi");
281d9f0492fSopenharmony_ci    EXPECT_EQ(ret, true);
282d9f0492fSopenharmony_ci    char *wrongName = reinterpret_cast<char *>(malloc(SYSCAP_MAX_SIZE));
283d9f0492fSopenharmony_ci    ASSERT_NE(wrongName, nullptr);
284d9f0492fSopenharmony_ci    EXPECT_EQ(memset_s(wrongName, SYSCAP_MAX_SIZE, 1, SYSCAP_MAX_SIZE), 0);
285d9f0492fSopenharmony_ci    HasSystemCapability(wrongName);
286d9f0492fSopenharmony_ci    free(wrongName);
287d9f0492fSopenharmony_ci}
288d9f0492fSopenharmony_ci
289d9f0492fSopenharmony_ci// TestControlService
290d9f0492fSopenharmony_ciHWTEST_F(InnerkitsUnitTest, Init_InnerkitsTest_ControlService001, TestSize.Level1)
291d9f0492fSopenharmony_ci{
292d9f0492fSopenharmony_ci    TestSetParamCheckResult("startup.service.ctl.", 0777, 0);
293d9f0492fSopenharmony_ci    ServiceControl("deviceinfoservice", START);
294d9f0492fSopenharmony_ci    SystemWriteParam("startup.service.ctl.deviceinfoservice", "2");
295d9f0492fSopenharmony_ci    ServiceControl("deviceinfoservice", RESTART);
296d9f0492fSopenharmony_ci    ServiceControl("deviceinfoservice", STOP);
297d9f0492fSopenharmony_ci    SystemWriteParam("startup.service.ctl.deviceinfoservice", "0");
298d9f0492fSopenharmony_ci    ServiceControl("param_watcher", RESTART);
299d9f0492fSopenharmony_ci    EXPECT_EQ(ServiceControl(nullptr, RESTART), -1);
300d9f0492fSopenharmony_ci    const char *argv[] = {"testArg"};
301d9f0492fSopenharmony_ci    ServiceControlWithExtra("deviceinfoservice", RESTART, argv, 1);
302d9f0492fSopenharmony_ci    ServiceControlWithExtra(nullptr, RESTART, argv, 1);
303d9f0492fSopenharmony_ci    ServiceControlWithExtra(nullptr, 3, argv, 1); // 3 is action
304d9f0492fSopenharmony_ci    ServiceControlWithExtra("notservie", RESTART, argv, 1);
305d9f0492fSopenharmony_ci    ServiceControlWithExtra("deviceinfoservice", 3, argv, 1); // 3 is action
306d9f0492fSopenharmony_ci    ServiceSetReady("deviceinfoservice");
307d9f0492fSopenharmony_ci    ServiceSetReady(nullptr);
308d9f0492fSopenharmony_ci    ServiceWaitForStatus("deviceinfoservice", SERVICE_READY, 1);
309d9f0492fSopenharmony_ci    ServiceWaitForStatus("deviceinfoservice", SERVICE_READY, -1);
310d9f0492fSopenharmony_ci    ServiceWaitForStatus(nullptr, SERVICE_READY, 1);
311d9f0492fSopenharmony_ci    StartServiceByTimer("deviceinfoservice", 1);
312d9f0492fSopenharmony_ci    StartServiceByTimer("deviceinfoservice", 0);
313d9f0492fSopenharmony_ci    StartServiceByTimer(nullptr, 0);
314d9f0492fSopenharmony_ci    StopServiceTimer("deviceinfoservice");
315d9f0492fSopenharmony_ci}
316d9f0492fSopenharmony_ci
317d9f0492fSopenharmony_cistatic int TestIncommingConnect(const LoopHandle loop, const TaskHandle server)
318d9f0492fSopenharmony_ci{
319d9f0492fSopenharmony_ci    UNUSED(loop);
320d9f0492fSopenharmony_ci    UNUSED(server);
321d9f0492fSopenharmony_ci    return 0;
322d9f0492fSopenharmony_ci}
323d9f0492fSopenharmony_ci
324d9f0492fSopenharmony_ci// TestControlFd
325d9f0492fSopenharmony_ciHWTEST_F(InnerkitsUnitTest, Init_InnerkitsTest_ControlFd001, TestSize.Level1)
326d9f0492fSopenharmony_ci{
327d9f0492fSopenharmony_ci    CmdClientInit("/data/testSock1", ACTION_DUMP, "cmd", nullptr);
328d9f0492fSopenharmony_ci    CmdClientInit("/data/testSock1", ACTION_DUMP, "cmd", CallbackSendMsgProcessTest);
329d9f0492fSopenharmony_ci    CmdClientInit(INIT_CONTROL_FD_SOCKET_PATH, ACTION_DUMP, nullptr, nullptr);
330d9f0492fSopenharmony_ci    CmdClientInit(nullptr, ACTION_DUMP, "cmd", nullptr);
331d9f0492fSopenharmony_ci
332d9f0492fSopenharmony_ci    CmdDisConnectComplete(nullptr);
333d9f0492fSopenharmony_ci    CmdOnSendMessageComplete(nullptr, nullptr);
334d9f0492fSopenharmony_ci    CmdOnConnectComplete(nullptr);
335d9f0492fSopenharmony_ci    CmdClientOnRecvMessage(nullptr, nullptr, 0);
336d9f0492fSopenharmony_ci    CmdAgentCreate(nullptr);
337d9f0492fSopenharmony_ci    CmdAgent *agent = CmdAgentCreate(INIT_CONTROL_FD_SOCKET_PATH);
338d9f0492fSopenharmony_ci    EXPECT_NE(agent, nullptr);
339d9f0492fSopenharmony_ci    SendCmdMessage(agent, ACTION_DUMP, "cmd", "test");
340d9f0492fSopenharmony_ci    SendCmdMessage(agent, ACTION_DUMP, "cmd", nullptr);
341d9f0492fSopenharmony_ci    SendMessage(nullptr, nullptr, nullptr);
342d9f0492fSopenharmony_ci    uint32_t events = 0;
343d9f0492fSopenharmony_ci    InitPtyInterface(agent, 0, "cmd", nullptr);
344d9f0492fSopenharmony_ci    InitPtyInterface(agent, 0, "cmd", CallbackSendMsgProcessTest);
345d9f0492fSopenharmony_ci    InitPtyInterface(agent, 0, nullptr, nullptr);
346d9f0492fSopenharmony_ci    InitPtyInterface(nullptr, 0, nullptr, nullptr);
347d9f0492fSopenharmony_ci    mode_t mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
348d9f0492fSopenharmony_ci    CheckAndCreatFile("/data/init_ut/testInput", mode);
349d9f0492fSopenharmony_ci    int fd = open("/data/init_ut/testInput", O_RDWR);
350d9f0492fSopenharmony_ci    perror("write failed");
351d9f0492fSopenharmony_ci    EXPECT_GT(fd, 0);
352d9f0492fSopenharmony_ci    EXPECT_GT(write(fd, "test", strlen("test")), 0);
353d9f0492fSopenharmony_ci    perror("write failed");
354d9f0492fSopenharmony_ci    lseek(fd, 0, SEEK_SET);
355d9f0492fSopenharmony_ci    ProcessPtyRead(nullptr, fd, &events, (void *)agent);
356d9f0492fSopenharmony_ci    ProcessPtyRead(nullptr, fd, &events, (void *)agent);
357d9f0492fSopenharmony_ci    ProcessPtyRead(nullptr, STDERR_FILENO, &events, nullptr);
358d9f0492fSopenharmony_ci    lseek(fd, 0, SEEK_SET);
359d9f0492fSopenharmony_ci    ProcessPtyWrite(nullptr, fd, &events, (void *)agent);
360d9f0492fSopenharmony_ci    ProcessPtyWrite(nullptr, fd, &events, (void *)agent);
361d9f0492fSopenharmony_ci    ProcessPtyWrite(nullptr, STDERR_FILENO, &events, nullptr);
362d9f0492fSopenharmony_ci    close(fd);
363d9f0492fSopenharmony_ci
364d9f0492fSopenharmony_ci    if (agent) {
365d9f0492fSopenharmony_ci        CmdOnClose(agent->task);
366d9f0492fSopenharmony_ci    }
367d9f0492fSopenharmony_ci}
368d9f0492fSopenharmony_ci
369d9f0492fSopenharmony_ciHWTEST_F(InnerkitsUnitTest, Init_InnerkitsTest_ControlFdServer001, TestSize.Level1)
370d9f0492fSopenharmony_ci{
371d9f0492fSopenharmony_ci    CmdServiceInit(nullptr, nullptr, nullptr);
372d9f0492fSopenharmony_ci    CmdServiceInit("/data/testSock1", [](uint16_t type, const char *serviceCmd, const void *context) {
373d9f0492fSopenharmony_ci        UNUSED(type);
374d9f0492fSopenharmony_ci        UNUSED(serviceCmd);
375d9f0492fSopenharmony_ci        UNUSED(context);
376d9f0492fSopenharmony_ci        }, LE_GetDefaultLoop());
377d9f0492fSopenharmony_ci
378d9f0492fSopenharmony_ci    TaskHandle testServer = nullptr;
379d9f0492fSopenharmony_ci    LE_StreamServerInfo info = {};
380d9f0492fSopenharmony_ci    info.baseInfo.flags = TASK_STREAM | TASK_SERVER | TASK_PIPE | TASK_TEST;
381d9f0492fSopenharmony_ci    info.server = (char *)"/data/testSock1";
382d9f0492fSopenharmony_ci    info.socketId = -1;
383d9f0492fSopenharmony_ci    info.baseInfo.close = nullptr;
384d9f0492fSopenharmony_ci    info.disConnectComplete = nullptr;
385d9f0492fSopenharmony_ci    info.incommingConnect = TestIncommingConnect;
386d9f0492fSopenharmony_ci    info.sendMessageComplete = nullptr;
387d9f0492fSopenharmony_ci    info.recvMessage = nullptr;
388d9f0492fSopenharmony_ci    (void)LE_CreateStreamServer(LE_GetDefaultLoop(), &testServer, &info);
389d9f0492fSopenharmony_ci    CmdOnIncommingConnect(LE_GetDefaultLoop(), testServer);
390d9f0492fSopenharmony_ci
391d9f0492fSopenharmony_ci    CmdOnRecvMessage(testServer, nullptr, 0);
392d9f0492fSopenharmony_ci    CmdMessage *cmdMsg = (CmdMessage *)malloc(sizeof(CmdMessage) + strlen("test"));
393d9f0492fSopenharmony_ci    cmdMsg->type = ACTION_DUMP;
394d9f0492fSopenharmony_ci    cmdMsg->ptyName[0] = '\0';;
395d9f0492fSopenharmony_ci    CmdOnRecvMessage(testServer, (uint8_t *)(&cmdMsg), 0);
396d9f0492fSopenharmony_ci    cmdMsg->type = ACTION_DUMP;
397d9f0492fSopenharmony_ci    cmdMsg->cmd[0] = 'a';
398d9f0492fSopenharmony_ci    cmdMsg->ptyName[0] = 'a';
399d9f0492fSopenharmony_ci    CmdOnRecvMessage(testServer, (uint8_t *)(&cmdMsg), 0);
400d9f0492fSopenharmony_ci    CmdServiceProcessDelClient(0);
401d9f0492fSopenharmony_ci    CmdServiceProcessDelClient(0);
402d9f0492fSopenharmony_ci    free(cmdMsg);
403d9f0492fSopenharmony_ci}
404d9f0492fSopenharmony_ci
405d9f0492fSopenharmony_ciHWTEST_F(InnerkitsUnitTest, Init_InnerkitsTest_HoldFd001, TestSize.Level1)
406d9f0492fSopenharmony_ci{
407d9f0492fSopenharmony_ci    CheckSocketPermission(nullptr);
408d9f0492fSopenharmony_ci    CmdServiceProcessDestroyClient();
409d9f0492fSopenharmony_ci}
410d9f0492fSopenharmony_ci
411d9f0492fSopenharmony_ciHWTEST_F(InnerkitsUnitTest, Init_InnerkitsTest_HoldFd002, TestSize.Level1)
412d9f0492fSopenharmony_ci{
413d9f0492fSopenharmony_ci    int fds1[] = {1, 0};
414d9f0492fSopenharmony_ci    ServiceSaveFd("testServiceName", fds1, ARRAY_LENGTH(fds1));
415d9f0492fSopenharmony_ci    ServiceSaveFd(nullptr, fds1, ARRAY_LENGTH(fds1));
416d9f0492fSopenharmony_ci    ServiceSaveFdWithPoll("testServiceName", fds1, 0);
417d9f0492fSopenharmony_ci    ServiceSaveFdWithPoll(nullptr, fds1, 0);
418d9f0492fSopenharmony_ci    ServiceSaveFdWithPoll("testServiceName", fds1, ARRAY_LENGTH(fds1));
419d9f0492fSopenharmony_ci    EXPECT_EQ(setenv("OHOS_FD_HOLD_testServiceName", "1 0", 0), 0);
420d9f0492fSopenharmony_ci
421d9f0492fSopenharmony_ci    size_t fdCount = 0;
422d9f0492fSopenharmony_ci    int *fds = nullptr;
423d9f0492fSopenharmony_ci    ServiceGetFd("testService", nullptr);
424d9f0492fSopenharmony_ci    ServiceGetFd("testService", &fdCount);
425d9f0492fSopenharmony_ci    char *wrongName = (char *)malloc(MAX_FD_HOLDER_BUFFER + 1);
426d9f0492fSopenharmony_ci    ASSERT_NE(wrongName, nullptr);
427d9f0492fSopenharmony_ci    EXPECT_EQ(memset_s(wrongName, MAX_FD_HOLDER_BUFFER + 1, 1, MAX_FD_HOLDER_BUFFER + 1), 0);
428d9f0492fSopenharmony_ci    ServiceGetFd(wrongName, &fdCount);
429d9f0492fSopenharmony_ci    BuildSendData(wrongName, 1, "testService", 0, 1);
430d9f0492fSopenharmony_ci    BuildSendData(wrongName, 1, "testService", 0, 0);
431d9f0492fSopenharmony_ci    BuildSendData(nullptr, 1, "testService", 0, 0);
432d9f0492fSopenharmony_ci    free(wrongName);
433d9f0492fSopenharmony_ci
434d9f0492fSopenharmony_ci    fds = ServiceGetFd("testServiceName", &fdCount);
435d9f0492fSopenharmony_ci    EXPECT_NE(fds, nullptr);
436d9f0492fSopenharmony_ci    struct msghdr msghdr = {};
437d9f0492fSopenharmony_ci    BuildControlMessage(nullptr, nullptr, 1, 0);
438d9f0492fSopenharmony_ci    BuildControlMessage(&msghdr, nullptr, 1, 0);
439d9f0492fSopenharmony_ci    if (msghdr.msg_control != nullptr) {
440d9f0492fSopenharmony_ci        free(msghdr.msg_control);
441d9f0492fSopenharmony_ci        msghdr.msg_control = nullptr;
442d9f0492fSopenharmony_ci    }
443d9f0492fSopenharmony_ci    BuildControlMessage(&msghdr, fds, -1, 0);
444d9f0492fSopenharmony_ci    if (msghdr.msg_control != nullptr) {
445d9f0492fSopenharmony_ci        free(msghdr.msg_control);
446d9f0492fSopenharmony_ci        msghdr.msg_control = nullptr;
447d9f0492fSopenharmony_ci    }
448d9f0492fSopenharmony_ci    BuildControlMessage(&msghdr, fds, -1, 1);
449d9f0492fSopenharmony_ci    if (msghdr.msg_control != nullptr) {
450d9f0492fSopenharmony_ci        free(msghdr.msg_control);
451d9f0492fSopenharmony_ci        msghdr.msg_control = nullptr;
452d9f0492fSopenharmony_ci    }
453d9f0492fSopenharmony_ci    if (fds != nullptr)
454d9f0492fSopenharmony_ci    {
455d9f0492fSopenharmony_ci        free(fds);
456d9f0492fSopenharmony_ci        fds = nullptr;
457d9f0492fSopenharmony_ci    }
458d9f0492fSopenharmony_ci}
459d9f0492fSopenharmony_ci
460d9f0492fSopenharmony_ciHWTEST_F(InnerkitsUnitTest, Init_InnerkitsTest_HoldFd003, TestSize.Level1)
461d9f0492fSopenharmony_ci{
462d9f0492fSopenharmony_ci    size_t fdCount = 0;
463d9f0492fSopenharmony_ci    int *fds = nullptr;
464d9f0492fSopenharmony_ci    char buffer[MAX_FD_HOLDER_BUFFER + 1] = {};
465d9f0492fSopenharmony_ci    pid_t requestPid = -1;
466d9f0492fSopenharmony_ci    struct msghdr msghdr = {};
467d9f0492fSopenharmony_ci    GetFdsFromMsg(&fdCount, &requestPid, msghdr);
468d9f0492fSopenharmony_ci    msghdr.msg_flags = MSG_TRUNC;
469d9f0492fSopenharmony_ci    GetFdsFromMsg(&fdCount, &requestPid, msghdr);
470d9f0492fSopenharmony_ci    struct iovec iovec = {
471d9f0492fSopenharmony_ci        .iov_base = buffer,
472d9f0492fSopenharmony_ci        .iov_len = MAX_FD_HOLDER_BUFFER,
473d9f0492fSopenharmony_ci    };
474d9f0492fSopenharmony_ci    ReceiveFds(0, iovec, &fdCount, false, &requestPid);
475d9f0492fSopenharmony_ci    fds = ReceiveFds(0, iovec, &fdCount, true, &requestPid);
476d9f0492fSopenharmony_ci    if (fds != nullptr)
477d9f0492fSopenharmony_ci    {
478d9f0492fSopenharmony_ci        free(fds);
479d9f0492fSopenharmony_ci        fds = nullptr;
480d9f0492fSopenharmony_ci    }
481d9f0492fSopenharmony_ci    if (msghdr.msg_control != nullptr) {
482d9f0492fSopenharmony_ci        free(msghdr.msg_control);
483d9f0492fSopenharmony_ci    }
484d9f0492fSopenharmony_ci}
485d9f0492fSopenharmony_ci
486d9f0492fSopenharmony_ci} // namespace init_ut
487