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