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
32 using namespace testing;
33 using namespace testing::ext;
34
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38
39
40 #ifdef __cplusplus
41 }
42 #endif
43
44 namespace OHOS {
45 class HnpPackTest : public testing::Test {
46 public:
47 static void SetUpTestCase();
48 static void TearDownTestCase();
49 void SetUp();
50 void TearDown();
51 };
52
SetUpTestCase()53 void HnpPackTest::SetUpTestCase()
54 {
55 GTEST_LOG_(INFO) << "Hnp_Pack_TEST SetUpTestCase";
56 }
57
TearDownTestCase()58 void HnpPackTest::TearDownTestCase()
59 {
60 GTEST_LOG_(INFO) << "Hnp_Pack_TEST TearDownTestCase";
61 }
62
SetUp()63 void HnpPackTest::SetUp()
64 {
65 GTEST_LOG_(INFO) << "Hnp_Pack_TEST SetUp";
66 }
67
TearDown()68 void 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 */
81 HWTEST_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 */
139 HWTEST_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 */
179 HWTEST_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 */
229 HWTEST_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 */
289 HWTEST_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 */
346 HWTEST_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