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