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