1 /* 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #include <sys/statvfs.h> 17 #include "init_cmds.h" 18 #include "init_param.h" 19 #include "init_group_manager.h" 20 #include "param_stub.h" 21 #include "init_utils.h" 22 #include "trigger_manager.h" 23 24 using namespace testing::ext; 25 using namespace std; 26 27 namespace init_ut { 28 class CmdsUnitTest : public testing::Test { 29 public: SetUpTestCase(void)30 static void SetUpTestCase(void) 31 { 32 PrepareInitUnitTestEnv(); 33 }; TearDownTestCase(void)34 static void TearDownTestCase(void) {}; SetUp()35 void SetUp() {}; TearDown()36 void TearDown() {}; 37 }; 38 39 HWTEST_F(CmdsUnitTest, TestCmdExecByName, TestSize.Level1) 40 { 41 DoCmdByName("load_param ", " /system/etc/param onlyadd"); 42 DoCmdByName("symlink ", "/proc/self/fd/0 /dev/stdin"); 43 DoCmdByName("symlink ", "/notfile "); 44 DoCmdByName("insmod ", 45 "libdemo.z.so anony=1 mmz_allocator=hisi mmz=anonymous,0,0xA8000000,384M || report_error"); 46 DoCmdByName("insmod ", "/vendor/modules/hi_irq.ko"); 47 DoCmdByName("insmod ", "/data/init_ut/test_insmod"); 48 49 DoCmdByName("setparam ", "sys.usb.config ${persist.sys.usb.config}"); 50 51 DoCmdByName("load_persist_params ", ""); 52 DoCmdByName("trigger ", ""); 53 DoCmdByName("domainname ", "localdomain"); 54 DoCmdByName("hostname ", "localhost"); 55 DoCmdByName("sleep ", "1"); 56 DoCmdByName("setrlimit ", "RLIMIT_NICE 40 40"); 57 DoCmdByName("setrlimit ", "RLIMIT_NICE2 40 40"); 58 DoCmdByName("start ", "init_ut"); 59 DoCmdByName("stop ", "init_ut"); 60 DoCmdByName("reset ", "init_ut"); 61 DoCmdByName("reboot ", ""); 62 DoCmdByName("ifup ", "lo"); 63 DoCmdByName("mknode ", "/dev/null b 0666 1 3"); 64 DoCmdByName("mknode ", "/dev/null C 0666 1 3"); 65 DoCmdByName("mknode ", "/dev/null F 0666 1 3"); 66 DoCmdByName("mknode ", "/dev/null A 0666 1 3"); 67 DoCmdByName("makedev ", "999 999"); 68 DoCmdByName("mount_fstab ", ""); 69 DoCmdByName("umount_fstab ", ""); 70 DoCmdByName("mksandbox ", "system chipset"); 71 DoCmdByName("mksandbox ", "system"); 72 DoCmdByName("mksandbox ", "notsupport"); 73 DoCmdByName("mksandbox ", ""); 74 } 75 HWTEST_F(CmdsUnitTest, TestCmdExecByName1, TestSize.Level1) 76 { 77 DoCmdByName("timer_start ", "media_service|5000"); 78 DoCmdByName("timer_stop ", "media_service"); 79 DoCmdByName("exec ", "media_service"); 80 DoCmdByName("syncexec ", "/system/bin/toybox"); 81 DoCmdByName("load_access_token_id ", "media_service"); 82 DoCmdByName("stopAllServices ", "true"); 83 DoCmdByName("umount ", ""); 84 DoCmdByName("mount ", ""); 85 DoCmdByName("mount ", "ext4 /dev/block/platform/soc/10100000.himci.eMMC/by-name/vendor " 86 "/data wait filecrypt=555"); 87 DoCmdByName("init_global_key ", "/data"); 88 DoCmdByName("init_global_key ", "arg0 arg1"); 89 DoCmdByName("init_main_user ", "testUser"); 90 DoCmdByName("init_main_user ", nullptr); 91 DoCmdByName("mkswap ", ""); 92 DoCmdByName("swapon ", ""); 93 DoCmdByName("sync ", ""); 94 DoCmdByName("restorecon ", ""); 95 DoCmdByName("suspend ", ""); 96 DoCmdByName("wait ", "1"); 97 DoCmdByName("wait ", "aaa 1"); 98 } 99 100 HWTEST_F(CmdsUnitTest, TestCommonMkdir, TestSize.Level1) 101 { __anonbd950ff10102(const char *mkdirFile, const char *cmdLine) 102 auto checkMkdirCmd = [=](const char *mkdirFile, const char *cmdLine) { 103 DoCmdByName("mkdir ", cmdLine); 104 return access(mkdirFile, F_OK); 105 }; 106 EXPECT_EQ(checkMkdirCmd("/data/init_ut/test_dir0", "/data/init_ut/test_dir0"), 0); 107 EXPECT_EQ(checkMkdirCmd("/data/init_ut/test_dir1", "/data/init_ut/test_dir1 0755"), 0); 108 EXPECT_EQ(checkMkdirCmd("/data/init_ut/test_dir2", "/data/init_ut/test_dir2 0755 system system"), 0); 109 110 // abnormal 111 EXPECT_NE(checkMkdirCmd("/data/init_ut/test_dir3", ""), 0); 112 EXPECT_NE(checkMkdirCmd("/data/init_ut/test_dir4", "/data/init_ut/test_dir4 0755 system"), 0); 113 EXPECT_EQ(checkMkdirCmd("/data/init_ut/test_dir5", "/data/init_ut/test_dir5 0755 error error"), 0); 114 } 115 116 HWTEST_F(CmdsUnitTest, TestCommonChown, TestSize.Level1) 117 { 118 const char *testFile = "/data/init_ut/test_dir0"; 119 DoCmdByName("chown ", "system system /data/init_ut/test_dir0"); 120 struct stat info; 121 stat(testFile, &info); 122 const unsigned int systemUidGid = 1000; 123 EXPECT_EQ(info.st_uid, systemUidGid); 124 EXPECT_EQ(info.st_gid, systemUidGid); 125 126 // abnormal 127 DoCmdByName("chown ", "error error /data/init_ut/test_dir0"); 128 stat(testFile, &info); 129 EXPECT_EQ(info.st_uid, systemUidGid); 130 EXPECT_EQ(info.st_gid, systemUidGid); 131 } 132 133 HWTEST_F(CmdsUnitTest, TestCommonChmod, TestSize.Level1) 134 { 135 const char *testFile = "/data/init_ut/test_dir0/test_file0"; 136 const mode_t testMode = S_IRWXU | S_IRWXG | S_IRWXO; 137 int fd = open(testFile, O_CREAT | O_WRONLY, testMode); 138 ASSERT_GE(fd, 0); 139 DoCmdByName("chmod ", "777 /data/init_ut/test_dir0/test_file0"); 140 struct stat info; 141 stat(testFile, &info); 142 EXPECT_EQ(testMode, testMode & info.st_mode); 143 144 // abnormal 145 DoCmdByName("chmod ", "999 /data/init_ut/test_dir0/test_file0"); 146 stat(testFile, &info); 147 EXPECT_EQ(testMode, testMode & info.st_mode); 148 DoCmdByName("chmod ", "777 /data/init_ut/test_dir0/test_file001"); 149 150 close(fd); 151 fd = -1; 152 } 153 154 HWTEST_F(CmdsUnitTest, TestCommonCopy, TestSize.Level1) 155 { 156 const char *testFile1 = "/data/init_ut/test_dir0/test_file_copy1"; 157 DoCmdByName("copy ", "/data/init_ut/test_dir0/test_file0 /data/init_ut/test_dir0/test_file_copy1"); 158 int fd = open(testFile1, O_RDWR); 159 ASSERT_GE(fd, 0); 160 write(fd, "aaa", strlen("aaa")); 161 162 const char *testFile2 = "/data/init_ut/test_dir0/test_file_copy2"; 163 DoCmdByName("copy ", "/data/init_ut/test_dir0/test_file_copy1 /data/init_ut/test_dir0/test_file_copy2"); 164 int ret = access(testFile2, F_OK); 165 EXPECT_EQ(ret, 0); 166 close(fd); 167 fd = -1; 168 // abnormal 169 DoCmdByName("copy ", "/data/init_ut/test_dir0/test_file_copy1 /data/init_ut/test_dir0/test_file_copy1"); 170 DoCmdByName("copy ", "/data/init_ut/test_dir0/test_file_copy11 /data/init_ut/test_dir0/test_file_copy1"); 171 DoCmdByName("copy ", "a"); 172 } 173 174 HWTEST_F(CmdsUnitTest, TestCommonWrite, TestSize.Level1) 175 { 176 const char *testFile1 = "/data/init_ut/test_dir0/test_file_write1"; 177 int fd = open(testFile1, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); 178 ASSERT_GE(fd, 0); 179 180 DoCmdByName("write ", "/data/init_ut/test_dir0/test_file_write1 aaa"); 181 const int bufLen = 50; 182 char buffer[bufLen]; 183 int length = read(fd, buffer, bufLen - 1); 184 EXPECT_EQ(length, strlen("aaa")); 185 close(fd); 186 fd = -1; 187 // abnormal 188 DoCmdByName("write ", "/data/init_ut/test_dir0/test_file_write2 aaa 2"); 189 } 190 191 HWTEST_F(CmdsUnitTest, TestCommonRm, TestSize.Level1) 192 { 193 const char *testFile1 = "/data/init_ut/test_dir0/test_file_write1"; 194 DoCmdByName("rm ", testFile1); 195 int ret = access(testFile1, F_OK); 196 EXPECT_NE(ret, 0); 197 198 testFile1 = "/data/init_ut/test_dir1"; 199 DoCmdByName("rmdir ", testFile1); 200 ret = access(testFile1, F_OK); 201 EXPECT_NE(ret, 0); 202 203 // abnormal 204 DoCmdByName("rmdir ", testFile1); 205 } 206 207 HWTEST_F(CmdsUnitTest, TestCommonExport, TestSize.Level1) 208 { 209 DoCmdByName("export ", "TEST_INIT 1"); 210 EXPECT_STREQ("1", getenv("TEST_INIT")); 211 unsetenv("TEST_INIT"); 212 EXPECT_STRNE("1", getenv("TEST_INIT")); 213 } 214 215 HWTEST_F(CmdsUnitTest, TestCommonMount, TestSize.Level1) 216 { 217 DoCmdByName("mount ", "ext4 /dev/block/platform/soc/10100000.himci.eMMC/by-name/vendor " 218 "/vendor wait rdonly barrier=1"); 219 struct statvfs64 vfs {}; 220 int ret = statvfs64("/vendor", &vfs); 221 EXPECT_GE(ret, 0); 222 EXPECT_GT(vfs.f_bsize, 0); 223 } 224 225 HWTEST_F(CmdsUnitTest, TestGetCmdKey, TestSize.Level1) 226 { 227 const char *cmd1 = GetCmdKey(0); 228 EXPECT_STREQ(cmd1, "start "); 229 } 230 231 HWTEST_F(CmdsUnitTest, TestDoCmdByIndex, TestSize.Level1) 232 { 233 DoCmdByIndex(1, "/data/init_ut/test_cmd_dir0"); 234 int ret = access("/data/init_ut/test_cmd_dir0", F_OK); 235 EXPECT_EQ(ret, 0); 236 237 const int execPos = 17; 238 DoCmdByIndex(execPos, "sleep 1"); 239 DoCmdByIndex(23, "test"); // 23 is cmd index 240 } 241 242 HWTEST_F(CmdsUnitTest, TestGetCmdLinesFromJson, TestSize.Level1) 243 { 244 const char *jsonStr = "{\"jobs\":[{\"name\":\"init\",\"cmds\":[\"sleep 1\"]}]}"; 245 cJSON* jobItem = cJSON_Parse(jsonStr); 246 ASSERT_NE(nullptr, jobItem); 247 cJSON *cmdsItem = cJSON_GetObjectItem(jobItem, "jobs"); 248 ASSERT_NE(nullptr, cmdsItem); 249 ASSERT_TRUE(cJSON_IsArray(cmdsItem)); 250 251 cJSON *cmdsItem1 = cJSON_GetArrayItem(cmdsItem, 0); 252 ASSERT_NE(nullptr, cmdsItem1); 253 CmdLines **cmdLines = (CmdLines **)calloc(1, sizeof(CmdLines *)); 254 ASSERT_NE(nullptr, cmdLines); 255 int ret = GetCmdLinesFromJson(cmdsItem1, cmdLines); 256 EXPECT_EQ(ret, -1); 257 cJSON *cmdsItem2 = cJSON_GetObjectItem(cmdsItem1, "cmds"); 258 ASSERT_NE(nullptr, cmdsItem2); 259 ret = GetCmdLinesFromJson(cmdsItem2, cmdLines); 260 EXPECT_EQ(ret, 0); 261 262 cJSON_Delete(jobItem); 263 if (cmdLines[0] != nullptr) { 264 free(cmdLines[0]); 265 cmdLines[0] = nullptr; 266 } 267 free(cmdLines); 268 cmdLines = nullptr; 269 } 270 271 HWTEST_F(CmdsUnitTest, TestInitCmdFunc, TestSize.Level1) 272 { 273 int ret = GetBootModeFromMisc(); 274 EXPECT_EQ(ret, 0); 275 } 276 } // namespace init_ut 277