1/* 2 * Copyright (c) 2024 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 <gtest/gtest.h> 17 18#include <cerrno> 19#include <climits> 20#include <cstdlib> 21#include <cstring> 22#include <memory> 23#include <string> 24#include <sys/stat.h> 25#include <sys/types.h> 26#include <unistd.h> 27 28#include "hnp_base.h" 29#include "hnp_pack.h" 30#include "securec.h" 31 32using namespace testing; 33using namespace testing::ext; 34 35#ifdef __cplusplus 36 extern "C" { 37#endif 38 39 40#ifdef __cplusplus 41 } 42#endif 43 44namespace OHOS { 45class HnpPackTest : public testing::Test { 46public: 47 static void SetUpTestCase(); 48 static void TearDownTestCase(); 49 void SetUp(); 50 void TearDown(); 51}; 52 53void HnpPackTest::SetUpTestCase() 54{ 55 GTEST_LOG_(INFO) << "Hnp_Pack_TEST SetUpTestCase"; 56} 57 58void HnpPackTest::TearDownTestCase() 59{ 60 GTEST_LOG_(INFO) << "Hnp_Pack_TEST TearDownTestCase"; 61} 62 63void HnpPackTest::SetUp() 64{ 65 GTEST_LOG_(INFO) << "Hnp_Pack_TEST SetUp"; 66} 67 68void HnpPackTest::TearDown() 69{ 70 GTEST_LOG_(INFO) << "Hnp_Pack_TEST TearDown"; 71} 72 73 74/** 75* @tc.name: Hnp_Pack_001 76* @tc.desc: Verify set Arg if HnpCmdPack succeed. 77* @tc.type: FUNC 78* @tc.require:issueI98PSE 79* @tc.author: 80*/ 81HWTEST_F(HnpPackTest, Hnp_Pack_001, TestSize.Level0) 82{ 83 GTEST_LOG_(INFO) << "Hnp_Pack_001 start"; 84 85 // clear resource before test 86 remove("./hnp_out/sample.hnp"); 87 rmdir("hnp_out"); 88 remove("hnp_sample/hnp.json"); 89 rmdir("hnp_sample"); 90 91 EXPECT_EQ(mkdir("hnp_sample", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH), 0); 92 EXPECT_EQ(mkdir("hnp_out", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH), 0); 93 94 char arg1[] = "hnp", arg2[] = "pack"; 95 96 { // param num not enough 97 char *argv[] = {arg1, arg2}; 98 int argc = sizeof(argv) / sizeof(argv[0]); 99 100 EXPECT_EQ(HnpCmdPack(argc, argv), HNP_ERRNO_OPERATOR_ARGV_MISS); 101 } 102 { // src dir path is invalid 103 char arg3[] = "-i", arg4[] = "./hnp_sample2", arg5[] = "-o", arg6[] = "./hnp_out"; 104 char *argv[] = {arg1, arg2, arg3, arg4, arg5, arg6}; 105 int argc = sizeof(argv) / sizeof(argv[0]); 106 107 EXPECT_EQ(HnpCmdPack(argc, argv), HNP_ERRNO_PACK_GET_REALPATH_FAILED); 108 } 109 { // no name and version 110 char arg3[] = "-i", arg4[] = "./hnp_sample", arg5[] = "-o", arg6[] = "./hnp_out"; 111 char *argv[] = {arg1, arg2, arg3, arg4, arg5, arg6}; 112 int argc = sizeof(argv) / sizeof(argv[0]); 113 114 EXPECT_EQ(HnpCmdPack(argc, argv), HNP_ERRNO_OPERATOR_ARGV_MISS); 115 } 116 { // ok 117 char arg3[] = "-i", arg4[] = "./hnp_sample", arg5[] = "-o", arg6[] = "./hnp_out"; 118 char arg7[] = "-n", arg8[] = "sample", arg9[] = "-v", arg10[] = "1.1"; 119 char *argv[] = {arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10}; 120 int argc = sizeof(argv) / sizeof(argv[0]); 121 122 EXPECT_EQ(HnpCmdPack(argc, argv), 0); 123 EXPECT_EQ(remove("./hnp_out/sample.hnp"), 0); 124 } 125 126 EXPECT_EQ(rmdir("hnp_sample"), 0); 127 EXPECT_EQ(rmdir("hnp_out"), 0); 128 129 GTEST_LOG_(INFO) << "Hnp_Pack_001 end"; 130} 131 132/** 133* @tc.name: Hnp_Pack_002 134* @tc.desc: Verify set Arg with cfg if HnpCmdPack succeed. 135* @tc.type: FUNC 136* @tc.require:issueI98PSE 137* @tc.author: 138*/ 139HWTEST_F(HnpPackTest, Hnp_Pack_002, TestSize.Level0) 140{ 141 GTEST_LOG_(INFO) << "Hnp_Pack_002 start"; 142 143 EXPECT_EQ(mkdir("hnp_sample", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH), 0); 144 EXPECT_EQ(mkdir("hnp_out", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH), 0); 145 FILE *fp = fopen("./hnp_sample/hnp.json", "w"); 146 EXPECT_NE(fp, nullptr); 147 fclose(fp); 148 149 char arg1[] = "hnp", arg2[] = "pack"; 150 char arg3[] = "-i", arg4[] = "./hnp_sample", arg5[] = "-o", arg6[] = "./hnp_out"; 151 char *argv[] = {arg1, arg2, arg3, arg4, arg5, arg6}; 152 int argc = sizeof(argv) / sizeof(argv[0]); 153 154 { // cfg file content is empty 155 EXPECT_EQ(HnpCmdPack(argc, argv), HNP_ERRNO_BASE_READ_FILE_STREAM_FAILED); 156 } 157 { // cfg file not json formaat 158 char cfg[] = "this is for test!"; 159 fp = fopen("./hnp_sample/hnp.json", "w"); 160 EXPECT_EQ(fwrite(cfg, sizeof(char), strlen(cfg) + 1, fp), strlen(cfg) + 1); 161 fclose(fp); 162 163 EXPECT_EQ(HnpCmdPack(argc, argv), HNP_ERRNO_BASE_PARSE_JSON_FAILED); 164 } 165 EXPECT_EQ(remove("./hnp_sample/hnp.json"), 0); 166 EXPECT_EQ(rmdir("hnp_sample"), 0); 167 EXPECT_EQ(rmdir("hnp_out"), 0); 168 169 GTEST_LOG_(INFO) << "Hnp_Pack_002 end"; 170} 171 172/** 173* @tc.name: Hnp_Pack_003 174* @tc.desc: Verify set cfg type item invalid if HnpCmdPack succeed. 175* @tc.type: FUNC 176* @tc.require:issueI98PSE 177* @tc.author: 178*/ 179HWTEST_F(HnpPackTest, Hnp_Pack_003, TestSize.Level0) 180{ 181 GTEST_LOG_(INFO) << "Hnp_Pack_003 start"; 182 183 EXPECT_EQ(mkdir("hnp_sample", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH), 0); 184 EXPECT_EQ(mkdir("hnp_out", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH), 0); 185 FILE *fp = fopen("./hnp_sample/hnp.json", "w"); 186 EXPECT_NE(fp, nullptr); 187 fclose(fp); 188 189 char arg1[] = "hnp", arg2[] = "pack"; 190 char arg3[] = "-i", arg4[] = "./hnp_sample", arg5[] = "-o", arg6[] = "./hnp_out"; 191 char *argv[] = {arg1, arg2, arg3, arg4, arg5, arg6}; 192 int argc = sizeof(argv) / sizeof(argv[0]); 193 194 { // cfg file content has not type item 195 char cfg[] = "{\"typ\":\"hnp-config\",\"name\":\"sample\",\"version\":\"1.1\",\"install\":" 196 "{\"links\":[{\"source\":\"bin/out\",\"target\":\"out\"},{\"source\":\"bin/out2\"," 197 "\"target\":\"out2\"}]}}"; 198 fp = fopen("./hnp_sample/hnp.json", "w"); 199 EXPECT_EQ(fwrite(cfg, sizeof(char), strlen(cfg) + 1, fp), strlen(cfg) + 1); 200 fclose(fp); 201 202 EXPECT_EQ(HnpCmdPack(argc, argv), HNP_ERRNO_BASE_PARSE_ITEM_NO_FOUND); 203 } 204 { // type item value is not expected 205 char cfg[] = "{\"type\":\"hnpconfig\",\"name\":\"sample\",\"version\":\"1.1\",\"install\":" 206 "{\"links\":[{\"source\":\"bin/out\",\"target\":\"out\"},{\"source\":\"bin/out2\"," 207 "\"target\":\"out2\"}]}}"; 208 fp = fopen("./hnp_sample/hnp.json", "w"); 209 EXPECT_EQ(fwrite(cfg, sizeof(char), strlen(cfg) + 1, fp), strlen(cfg) + 1); 210 fclose(fp); 211 212 EXPECT_EQ(HnpCmdPack(argc, argv), HNP_ERRNO_BASE_PARSE_ITEM_NO_FOUND); 213 } 214 215 EXPECT_EQ(remove("./hnp_sample/hnp.json"), 0); 216 EXPECT_EQ(rmdir("hnp_sample"), 0); 217 EXPECT_EQ(rmdir("hnp_out"), 0); 218 219 GTEST_LOG_(INFO) << "Hnp_Pack_003 end"; 220} 221 222/** 223* @tc.name: Hnp_Pack_004 224* @tc.desc: Verify set cfg invalid if HnpCmdPack succeed. 225* @tc.type: FUNC 226* @tc.require:issueI98PSE 227* @tc.author: 228*/ 229HWTEST_F(HnpPackTest, Hnp_Pack_004, TestSize.Level0) 230{ 231 GTEST_LOG_(INFO) << "Hnp_Pack_004 start"; 232 233 EXPECT_EQ(mkdir("hnp_sample", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH), 0); 234 EXPECT_EQ(mkdir("hnp_out", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH), 0); 235 FILE *fp = fopen("./hnp_sample/hnp.json", "w"); 236 EXPECT_NE(fp, nullptr); 237 fclose(fp); 238 239 char arg1[] = "hnp", arg2[] = "pack"; 240 char arg3[] = "-i", arg4[] = "./hnp_sample", arg5[] = "-o", arg6[] = "./hnp_out"; 241 char *argv[] = {arg1, arg2, arg3, arg4, arg5, arg6}; 242 int argc = sizeof(argv) / sizeof(argv[0]); 243 244 { // cfg file content has not name item 245 char cfg[] = "{\"type\":\"hnp-config\",\"version\":\"1.1\",\"install\":" 246 "{\"links\":[{\"source\":\"bin/out\",\"target\":\"out\"},{\"source\":\"bin/out2\"," 247 "\"target\":\"out2\"}]}}"; 248 fp = fopen("./hnp_sample/hnp.json", "w"); 249 EXPECT_EQ(fwrite(cfg, sizeof(char), strlen(cfg) + 1, fp), strlen(cfg) + 1); 250 fclose(fp); 251 252 EXPECT_EQ(HnpCmdPack(argc, argv), HNP_ERRNO_BASE_PARSE_ITEM_NO_FOUND); 253 } 254 { // cfg file content has not version item 255 char cfg[] = "{\"type\":\"hnp-config\",\"name\":\"sample\",\"install\":" 256 "{\"links\":[{\"source\":\"bin/out\",\"target\":\"out\"},{\"source\":\"bin/out2\"," 257 "\"target\":\"out2\"}]}}"; 258 fp = fopen("./hnp_sample/hnp.json", "w"); 259 EXPECT_EQ(fwrite(cfg, sizeof(char), strlen(cfg) + 1, fp), strlen(cfg) + 1); 260 fclose(fp); 261 262 EXPECT_EQ(HnpCmdPack(argc, argv), HNP_ERRNO_BASE_PARSE_ITEM_NO_FOUND); 263 } 264 { // cfg file content has not install item 265 char cfg[] = "{\"type\":\"hnp-config\",\"name\":\"sample\",\"version\":\"1.1\",\"uninstall\":" 266 "{\"links\":[{\"source\":\"bin/out\",\"target\":\"out\"},{\"source\":\"bin/out2\"," 267 "\"target\":\"out2\"}]}}"; 268 fp = fopen("./hnp_sample/hnp.json", "w"); 269 EXPECT_EQ(fwrite(cfg, sizeof(char), strlen(cfg) + 1, fp), strlen(cfg) + 1); 270 fclose(fp); 271 272 EXPECT_EQ(HnpCmdPack(argc, argv), HNP_ERRNO_BASE_PARSE_ITEM_NO_FOUND); 273 } 274 275 EXPECT_EQ(remove("./hnp_sample/hnp.json"), 0); 276 EXPECT_EQ(rmdir("hnp_sample"), 0); 277 EXPECT_EQ(rmdir("hnp_out"), 0); 278 279 GTEST_LOG_(INFO) << "Hnp_Pack_004 end"; 280} 281 282/** 283* @tc.name: Hnp_Pack_005 284* @tc.desc: Verify set cfg links item invalid if HnpCmdPack succeed. 285* @tc.type: FUNC 286* @tc.require:issueI98PSE 287* @tc.author: 288*/ 289HWTEST_F(HnpPackTest, Hnp_Pack_005, TestSize.Level0) 290{ 291 GTEST_LOG_(INFO) << "Hnp_Pack_005 start"; 292 293 EXPECT_EQ(mkdir("hnp_sample", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH), 0); 294 EXPECT_EQ(mkdir("hnp_out", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH), 0); 295 FILE *fp = fopen("./hnp_sample/hnp.json", "w"); 296 EXPECT_NE(fp, nullptr); 297 fclose(fp); 298 299 char arg1[] = "hnp", arg2[] = "pack"; 300 char arg3[] = "-i", arg4[] = "./hnp_sample", arg5[] = "-o", arg6[] = "./hnp_out"; 301 char *argv[] = {arg1, arg2, arg3, arg4, arg5, arg6}; 302 int argc = sizeof(argv) / sizeof(argv[0]); 303 304 { // link arry item has not source item 305 char cfg[] = "{\"type\":\"hnp-config\",\"name\":\"sample\",\"version\":\"1.1\",\"install\":" 306 "{\"links\":[{\"src\":\"bin/out\",\"target\":\"out\"},{\"source\":\"bin/out2\"," 307 "\"target\":\"out2\"}]}}"; 308 fp = fopen("./hnp_sample/hnp.json", "w"); 309 EXPECT_EQ(fwrite(cfg, sizeof(char), strlen(cfg) + 1, fp), strlen(cfg) + 1); 310 fclose(fp); 311 312 EXPECT_EQ(HnpCmdPack(argc, argv), HNP_ERRNO_BASE_PARSE_ITEM_NO_FOUND); 313 } 314 { // ok, link arry item has not target item 315 char cfg[] = "{\"type\":\"hnp-config\",\"name\":\"sample\",\"version\":\"1.1\",\"install\":" 316 "{\"links\":[{\"source\":\"a.out\",\"tar\":\"out\"},{\"source\":\"a.out\"," 317 "\"target\":\"out2\"}]}}"; 318 fp = fopen("./hnp_sample/hnp.json", "w"); 319 EXPECT_EQ(fwrite(cfg, sizeof(char), strlen(cfg) + 1, fp), strlen(cfg) + 1); 320 fclose(fp); 321 322 EXPECT_EQ(HnpCmdPack(argc, argv), HNP_ERRNO_PACK_GET_REALPATH_FAILED); 323 324 FILE *fp = fopen("./hnp_sample/a.out", "w"); 325 EXPECT_NE(fp, nullptr); 326 fclose(fp); 327 EXPECT_EQ(HnpCmdPack(argc, argv), 0); 328 EXPECT_EQ(remove("./hnp_sample/a.out"), 0); 329 EXPECT_EQ(remove("./hnp_out/sample.hnp"), 0); 330 } 331 332 EXPECT_EQ(remove("./hnp_sample/hnp.json"), 0); 333 EXPECT_EQ(rmdir("hnp_sample"), 0); 334 EXPECT_EQ(rmdir("hnp_out"), 0); 335 336 GTEST_LOG_(INFO) << "Hnp_Pack_005 end"; 337} 338 339/** 340* @tc.name: Hnp_Pack_006 341* @tc.desc: Verify set cfg valid if HnpCmdPack succeed. 342* @tc.type: FUNC 343* @tc.require:issueI98PSE 344* @tc.author: 345*/ 346HWTEST_F(HnpPackTest, Hnp_Pack_006, TestSize.Level0) 347{ 348 GTEST_LOG_(INFO) << "Hnp_Pack_006 start"; 349 350 EXPECT_EQ(mkdir("hnp_sample", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH), 0); 351 EXPECT_EQ(mkdir("hnp_out", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH), 0); 352 FILE *fp = fopen("./hnp_sample/hnp.json", "w"); 353 EXPECT_NE(fp, nullptr); 354 fclose(fp); 355 356 char arg1[] = "hnp", arg2[] = "pack"; 357 char arg3[] = "-i", arg4[] = "./hnp_sample", arg5[] = "-o", arg6[] = "./hnp_out"; 358 char *argv[] = {arg1, arg2, arg3, arg4, arg5, arg6}; 359 int argc = sizeof(argv) / sizeof(argv[0]); 360 361 { // ok. no links item in install item 362 char cfg[] = "{\"type\":\"hnp-config\",\"name\":\"sample\",\"version\":\"1.1\",\"install\":{}}"; 363 fp = fopen("./hnp_sample/hnp.json", "w"); 364 EXPECT_EQ(fwrite(cfg, sizeof(char), strlen(cfg) + 1, fp), strlen(cfg) + 1); 365 fclose(fp); 366 367 EXPECT_EQ(HnpCmdPack(argc, argv), 0); 368 EXPECT_EQ(remove("./hnp_out/sample.hnp"), 0); 369 } 370 { // ok. no array in links item 371 char cfg[] = "{\"type\":\"hnp-config\",\"name\":\"sample\",\"version\":\"1.1\",\"install\":" 372 "{\"links\":[]}}"; 373 fp = fopen("./hnp_sample/hnp.json", "w"); 374 EXPECT_EQ(fwrite(cfg, sizeof(char), strlen(cfg) + 1, fp), strlen(cfg) + 1); 375 fclose(fp); 376 377 EXPECT_EQ(HnpCmdPack(argc, argv), 0); 378 EXPECT_EQ(remove("./hnp_out/sample.hnp"), 0); 379 } 380 { // ok. 2 links 381 char cfg[] = "{\"type\":\"hnp-config\",\"name\":\"sample\",\"version\":\"1.1\",\"install\":" 382 "{\"links\":[{\"source\":\"a.out\",\"target\":\"out\"},{\"source\":\"a.out\"," 383 "\"target\":\"out2\"}]}}"; 384 fp = fopen("./hnp_sample/hnp.json", "w"); 385 EXPECT_EQ(fwrite(cfg, sizeof(char), strlen(cfg) + 1, fp), strlen(cfg) + 1); 386 fclose(fp); 387 388 EXPECT_EQ(HnpCmdPack(argc, argv), HNP_ERRNO_PACK_GET_REALPATH_FAILED); 389 390 FILE *fp = fopen("./hnp_sample/a.out", "w"); 391 EXPECT_NE(fp, nullptr); 392 fclose(fp); 393 EXPECT_EQ(HnpCmdPack(argc, argv), 0); 394 EXPECT_EQ(remove("./hnp_sample/a.out"), 0); 395 EXPECT_EQ(remove("./hnp_out/sample.hnp"), 0); 396 } 397 398 EXPECT_EQ(remove("./hnp_sample/hnp.json"), 0); 399 EXPECT_EQ(rmdir("hnp_sample"), 0); 400 EXPECT_EQ(rmdir("hnp_out"), 0); 401 402 GTEST_LOG_(INFO) << "Hnp_Pack_006 end"; 403} 404 405 406} // namespace OHOS 407