1b1994897Sopenharmony_ci/*
2b1994897Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3b1994897Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4b1994897Sopenharmony_ci * you may not use this file except in compliance with the License.
5b1994897Sopenharmony_ci * You may obtain a copy of the License at
6b1994897Sopenharmony_ci *
7b1994897Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8b1994897Sopenharmony_ci *
9b1994897Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10b1994897Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11b1994897Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12b1994897Sopenharmony_ci * See the License for the specific language governing permissions and
13b1994897Sopenharmony_ci * limitations under the License.
14b1994897Sopenharmony_ci */
15b1994897Sopenharmony_ci
16b1994897Sopenharmony_ci#include "zip_archive.h"
17b1994897Sopenharmony_ci#include "libpandafile/file.h"
18b1994897Sopenharmony_ci#include "os/file.h"
19b1994897Sopenharmony_ci#include "os/mem.h"
20b1994897Sopenharmony_ci
21b1994897Sopenharmony_ci#include "assembly-emitter.h"
22b1994897Sopenharmony_ci#include "assembly-parser.h"
23b1994897Sopenharmony_ci
24b1994897Sopenharmony_ci#include <cstddef>
25b1994897Sopenharmony_ci#include <cstdio>
26b1994897Sopenharmony_ci#include <cstdint>
27b1994897Sopenharmony_ci#include <vector>
28b1994897Sopenharmony_ci#include <gtest/gtest.h>
29b1994897Sopenharmony_ci#include <memory>
30b1994897Sopenharmony_ci#include <securec.h>
31b1994897Sopenharmony_ci
32b1994897Sopenharmony_ci#include <climits>
33b1994897Sopenharmony_ci#include <cstdlib>
34b1994897Sopenharmony_ci#include <sys/stat.h>
35b1994897Sopenharmony_ci#include <fcntl.h>
36b1994897Sopenharmony_ci#include <sys/stat.h>
37b1994897Sopenharmony_ci
38b1994897Sopenharmony_cinamespace panda::test {
39b1994897Sopenharmony_ci
40b1994897Sopenharmony_ci#define GTEST_COUT std::cerr << "[          ] [ INFO ]"
41b1994897Sopenharmony_ci
42b1994897Sopenharmony_ciconstexpr size_t MAX_BUFFER_SIZE = 2048;
43b1994897Sopenharmony_ciconstexpr size_t MAX_DIR_SIZE = 64;
44b1994897Sopenharmony_ci
45b1994897Sopenharmony_cistatic void GenerateZipfile(const char *data, const char *archivename, int N, char *buf, char *archive_filename, int &i,
46b1994897Sopenharmony_ci                            int &ret, std::vector<uint8_t> &pf_data, int level = Z_BEST_COMPRESSION)
47b1994897Sopenharmony_ci{
48b1994897Sopenharmony_ci    // Delete the test archive, so it doesn't keep growing as we run this test
49b1994897Sopenharmony_ci    remove(archivename);
50b1994897Sopenharmony_ci
51b1994897Sopenharmony_ci    // Create and append a directory entry for testing
52b1994897Sopenharmony_ci    ret = CreateOrAddFileIntoZip(archivename, "directory/", NULL, 0, APPEND_STATUS_CREATE, level);
53b1994897Sopenharmony_ci    if (ret != 0) {
54b1994897Sopenharmony_ci        ASSERT_EQ(1, 0) << "CreateOrAddFileIntoZip for directory failed!";
55b1994897Sopenharmony_ci        return;
56b1994897Sopenharmony_ci    }
57b1994897Sopenharmony_ci
58b1994897Sopenharmony_ci    // Append a bunch of text files to the test archive
59b1994897Sopenharmony_ci    for (i = (N - 1); i >= 0; --i) {
60b1994897Sopenharmony_ci        (void)sprintf_s(archive_filename, MAX_DIR_SIZE, "%d.txt", i);
61b1994897Sopenharmony_ci        (void)sprintf_s(buf, MAX_BUFFER_SIZE, "%d %s %d", (N - 1) - i, data, i);
62b1994897Sopenharmony_ci        ret =
63b1994897Sopenharmony_ci            CreateOrAddFileIntoZip(archivename, archive_filename, buf, strlen(buf) + 1, APPEND_STATUS_ADDINZIP, level);
64b1994897Sopenharmony_ci        if (ret != 0) {
65b1994897Sopenharmony_ci            ASSERT_EQ(1, 0) << "CreateOrAddFileIntoZip for " << i << ".txt failed!";
66b1994897Sopenharmony_ci            return;
67b1994897Sopenharmony_ci        }
68b1994897Sopenharmony_ci    }
69b1994897Sopenharmony_ci
70b1994897Sopenharmony_ci    // Append a file into directory entry for testing
71b1994897Sopenharmony_ci    (void)sprintf_s(buf, MAX_BUFFER_SIZE, "%d %s %d", N, data, N);
72b1994897Sopenharmony_ci    ret = CreateOrAddFileIntoZip(archivename, "directory/indirectory.txt", buf, strlen(buf) + 1, APPEND_STATUS_ADDINZIP,
73b1994897Sopenharmony_ci                                 level);
74b1994897Sopenharmony_ci    if (ret != 0) {
75b1994897Sopenharmony_ci        ASSERT_EQ(1, 0) << "CreateOrAddFileIntoZip for directory/indirectory.txt failed!";
76b1994897Sopenharmony_ci        return;
77b1994897Sopenharmony_ci    }
78b1994897Sopenharmony_ci
79b1994897Sopenharmony_ci    // Add a pandafile into zip for testing
80b1994897Sopenharmony_ci    ret = CreateOrAddFileIntoZip(archivename, "classes.abc", pf_data.data(), pf_data.size(), APPEND_STATUS_ADDINZIP,
81b1994897Sopenharmony_ci                                 level);
82b1994897Sopenharmony_ci    if (ret != 0) {
83b1994897Sopenharmony_ci        ASSERT_EQ(1, 0) << "CreateOrAddFileIntoZip for classes.abc failed!";
84b1994897Sopenharmony_ci        return;
85b1994897Sopenharmony_ci    }
86b1994897Sopenharmony_ci}
87b1994897Sopenharmony_ci
88b1994897Sopenharmony_cistatic void UnzipFileCheckDirectory(const char *archivename, char *filename, int level = Z_BEST_COMPRESSION)
89b1994897Sopenharmony_ci{
90b1994897Sopenharmony_ci    (void)sprintf_s(filename, MAX_DIR_SIZE, "directory/");
91b1994897Sopenharmony_ci
92b1994897Sopenharmony_ci    ZipArchiveHandle zipfile = nullptr;
93b1994897Sopenharmony_ci    FILE *myfile = fopen(archivename, "rbe");
94b1994897Sopenharmony_ci
95b1994897Sopenharmony_ci    if (OpenArchiveFile(zipfile, myfile) != 0) {
96b1994897Sopenharmony_ci        fclose(myfile);
97b1994897Sopenharmony_ci        ASSERT_EQ(1, 0) << "OpenArchiveFILE error.";
98b1994897Sopenharmony_ci        return;
99b1994897Sopenharmony_ci    }
100b1994897Sopenharmony_ci    if (LocateFile(zipfile, filename) != 0) {
101b1994897Sopenharmony_ci        CloseArchiveFile(zipfile);
102b1994897Sopenharmony_ci        fclose(myfile);
103b1994897Sopenharmony_ci        ASSERT_EQ(1, 0) << "LocateFile error.";
104b1994897Sopenharmony_ci        return;
105b1994897Sopenharmony_ci    }
106b1994897Sopenharmony_ci    EntryFileStat entry = EntryFileStat();
107b1994897Sopenharmony_ci    if (GetCurrentFileInfo(zipfile, &entry) != 0) {
108b1994897Sopenharmony_ci        CloseArchiveFile(zipfile);
109b1994897Sopenharmony_ci        fclose(myfile);
110b1994897Sopenharmony_ci        ASSERT_EQ(1, 0) << "GetCurrentFileInfo test error.";
111b1994897Sopenharmony_ci        return;
112b1994897Sopenharmony_ci    }
113b1994897Sopenharmony_ci    if (OpenCurrentFile(zipfile) != 0) {
114b1994897Sopenharmony_ci        CloseCurrentFile(zipfile);
115b1994897Sopenharmony_ci        CloseArchiveFile(zipfile);
116b1994897Sopenharmony_ci        fclose(myfile);
117b1994897Sopenharmony_ci        ASSERT_EQ(1, 0) << "OpenCurrentFile test error.";
118b1994897Sopenharmony_ci        return;
119b1994897Sopenharmony_ci    }
120b1994897Sopenharmony_ci
121b1994897Sopenharmony_ci    GetCurrentFileOffset(zipfile, &entry);
122b1994897Sopenharmony_ci
123b1994897Sopenharmony_ci    uint32_t uncompressed_length = entry.GetUncompressedSize();
124b1994897Sopenharmony_ci
125b1994897Sopenharmony_ci    ASSERT_GT(entry.GetOffset(), 0U);
126b1994897Sopenharmony_ci    if (level == Z_NO_COMPRESSION) {
127b1994897Sopenharmony_ci        ASSERT_FALSE(entry.IsCompressed());
128b1994897Sopenharmony_ci    } else {
129b1994897Sopenharmony_ci        ASSERT_TRUE(entry.IsCompressed());
130b1994897Sopenharmony_ci    }
131b1994897Sopenharmony_ci
132b1994897Sopenharmony_ci    GTEST_COUT << "Filename: " << filename << ", Uncompressed size: " << uncompressed_length
133b1994897Sopenharmony_ci               << "Compressed size: " << entry.GetCompressedSize() << "Compressed(): " << entry.IsCompressed()
134b1994897Sopenharmony_ci               << "entry offset: " << entry.GetOffset() << "\n";
135b1994897Sopenharmony_ci
136b1994897Sopenharmony_ci    CloseCurrentFile(zipfile);
137b1994897Sopenharmony_ci    CloseArchiveFile(zipfile);
138b1994897Sopenharmony_ci    fclose(myfile);
139b1994897Sopenharmony_ci}
140b1994897Sopenharmony_ci
141b1994897Sopenharmony_cistatic void UnzipFileCheckTxt(const char *archivename, char *filename, const char *data, int N, char *buf, int &ret,
142b1994897Sopenharmony_ci                              int level = Z_BEST_COMPRESSION)
143b1994897Sopenharmony_ci{
144b1994897Sopenharmony_ci    for (int i = 0; i < N; i++) {
145b1994897Sopenharmony_ci        (void)sprintf_s(filename, MAX_DIR_SIZE, "%d.txt", i);
146b1994897Sopenharmony_ci        (void)sprintf_s(buf, MAX_BUFFER_SIZE, "%d %s %d", (N - 1) - i, data, i);
147b1994897Sopenharmony_ci
148b1994897Sopenharmony_ci        ZipArchiveHandle zipfile = nullptr;
149b1994897Sopenharmony_ci        FILE *myfile = fopen(archivename, "rbe");
150b1994897Sopenharmony_ci
151b1994897Sopenharmony_ci        if (OpenArchiveFile(zipfile, myfile) != 0) {
152b1994897Sopenharmony_ci            fclose(myfile);
153b1994897Sopenharmony_ci            ASSERT_EQ(1, 0) << "OpenArchiveFILE error.";
154b1994897Sopenharmony_ci            return;
155b1994897Sopenharmony_ci        }
156b1994897Sopenharmony_ci        if (LocateFile(zipfile, filename) != 0) {
157b1994897Sopenharmony_ci            CloseArchiveFile(zipfile);
158b1994897Sopenharmony_ci            fclose(myfile);
159b1994897Sopenharmony_ci            ASSERT_EQ(1, 0) << "LocateFile error.";
160b1994897Sopenharmony_ci            return;
161b1994897Sopenharmony_ci        }
162b1994897Sopenharmony_ci        EntryFileStat entry = EntryFileStat();
163b1994897Sopenharmony_ci        if (GetCurrentFileInfo(zipfile, &entry) != 0) {
164b1994897Sopenharmony_ci            CloseArchiveFile(zipfile);
165b1994897Sopenharmony_ci            fclose(myfile);
166b1994897Sopenharmony_ci            ASSERT_EQ(1, 0) << "GetCurrentFileInfo test error.";
167b1994897Sopenharmony_ci            return;
168b1994897Sopenharmony_ci        }
169b1994897Sopenharmony_ci        if (OpenCurrentFile(zipfile) != 0) {
170b1994897Sopenharmony_ci            CloseCurrentFile(zipfile);
171b1994897Sopenharmony_ci            CloseArchiveFile(zipfile);
172b1994897Sopenharmony_ci            fclose(myfile);
173b1994897Sopenharmony_ci            ASSERT_EQ(1, 0) << "OpenCurrentFile test error.";
174b1994897Sopenharmony_ci            return;
175b1994897Sopenharmony_ci        }
176b1994897Sopenharmony_ci
177b1994897Sopenharmony_ci        GetCurrentFileOffset(zipfile, &entry);
178b1994897Sopenharmony_ci
179b1994897Sopenharmony_ci        uint32_t uncompressed_length = entry.GetUncompressedSize();
180b1994897Sopenharmony_ci        if (uncompressed_length == 0) {
181b1994897Sopenharmony_ci            CloseCurrentFile(zipfile);
182b1994897Sopenharmony_ci            CloseArchiveFile(zipfile);
183b1994897Sopenharmony_ci            fclose(myfile);
184b1994897Sopenharmony_ci            ASSERT_EQ(1, 0) << "Entry file has zero length! Readed bad data!";
185b1994897Sopenharmony_ci            return;
186b1994897Sopenharmony_ci        }
187b1994897Sopenharmony_ci        ASSERT_GT(entry.GetOffset(), 0U);
188b1994897Sopenharmony_ci        ASSERT_EQ(uncompressed_length, strlen(buf) + 1);
189b1994897Sopenharmony_ci        if (level == Z_NO_COMPRESSION) {
190b1994897Sopenharmony_ci            ASSERT_EQ(uncompressed_length, entry.GetCompressedSize());
191b1994897Sopenharmony_ci            ASSERT_FALSE(entry.IsCompressed());
192b1994897Sopenharmony_ci        } else {
193b1994897Sopenharmony_ci            ASSERT_GE(uncompressed_length, entry.GetCompressedSize());
194b1994897Sopenharmony_ci            ASSERT_TRUE(entry.IsCompressed());
195b1994897Sopenharmony_ci        }
196b1994897Sopenharmony_ci
197b1994897Sopenharmony_ci        GTEST_COUT << "Filename: " << filename << ", Uncompressed size: " << uncompressed_length
198b1994897Sopenharmony_ci                   << "Compressed size: " << entry.GetCompressedSize() << "Compressed(): " << entry.IsCompressed()
199b1994897Sopenharmony_ci                   << "entry offset: " << entry.GetOffset() << "\n";
200b1994897Sopenharmony_ci
201b1994897Sopenharmony_ci        {
202b1994897Sopenharmony_ci            // Extract to mem buffer accroding to entry info.
203b1994897Sopenharmony_ci            uint32_t page_size = os::mem::GetPageSize();
204b1994897Sopenharmony_ci            uint32_t min_pages = uncompressed_length / page_size;
205b1994897Sopenharmony_ci            uint32_t size_to_mmap =
206b1994897Sopenharmony_ci                uncompressed_length % page_size == 0 ? min_pages * page_size : (min_pages + 1) * page_size;
207b1994897Sopenharmony_ci            // we will use mem in memcmp, so donnot poision it!
208b1994897Sopenharmony_ci            void *mem = os::mem::MapRWAnonymousRaw(size_to_mmap, false);
209b1994897Sopenharmony_ci            if (mem == nullptr) {
210b1994897Sopenharmony_ci                CloseCurrentFile(zipfile);
211b1994897Sopenharmony_ci                CloseArchiveFile(zipfile);
212b1994897Sopenharmony_ci                fclose(myfile);
213b1994897Sopenharmony_ci                ASSERT_EQ(1, 0) << "Can't mmap anonymous!";
214b1994897Sopenharmony_ci                return;
215b1994897Sopenharmony_ci            }
216b1994897Sopenharmony_ci
217b1994897Sopenharmony_ci            ret = ExtractToMemory(zipfile, reinterpret_cast<uint8_t *>(mem), size_to_mmap);
218b1994897Sopenharmony_ci            if (ret != 0) {
219b1994897Sopenharmony_ci                os::mem::UnmapRaw(mem, size_to_mmap);
220b1994897Sopenharmony_ci                CloseCurrentFile(zipfile);
221b1994897Sopenharmony_ci                CloseArchiveFile(zipfile);
222b1994897Sopenharmony_ci                fclose(myfile);
223b1994897Sopenharmony_ci                ASSERT_EQ(1, 0) << "Can't extract!";
224b1994897Sopenharmony_ci                return;
225b1994897Sopenharmony_ci            }
226b1994897Sopenharmony_ci
227b1994897Sopenharmony_ci            // Make sure the extraction really succeeded.
228b1994897Sopenharmony_ci            size_t dlen = strlen(buf);
229b1994897Sopenharmony_ci            if (uncompressed_length != (dlen + 1)) {
230b1994897Sopenharmony_ci                os::mem::UnmapRaw(mem, size_to_mmap);
231b1994897Sopenharmony_ci                CloseCurrentFile(zipfile);
232b1994897Sopenharmony_ci                CloseArchive(zipfile);
233b1994897Sopenharmony_ci                fclose(myfile);
234b1994897Sopenharmony_ci                ASSERT_EQ(1, 0) << "ExtractToMemory() failed!, uncompressed_length is " << uncompressed_length - 1
235b1994897Sopenharmony_ci                                << ", original strlen is " << dlen;
236b1994897Sopenharmony_ci                return;
237b1994897Sopenharmony_ci            }
238b1994897Sopenharmony_ci
239b1994897Sopenharmony_ci            if (memcmp(mem, buf, dlen)) {
240b1994897Sopenharmony_ci                os::mem::UnmapRaw(mem, size_to_mmap);
241b1994897Sopenharmony_ci                CloseCurrentFile(zipfile);
242b1994897Sopenharmony_ci                CloseArchive(zipfile);
243b1994897Sopenharmony_ci                fclose(myfile);
244b1994897Sopenharmony_ci                ASSERT_EQ(1, 0) << "ExtractToMemory() memcmp failed!";
245b1994897Sopenharmony_ci                return;
246b1994897Sopenharmony_ci            }
247b1994897Sopenharmony_ci
248b1994897Sopenharmony_ci            GTEST_COUT << "Successfully extracted file " << filename << " from " << archivename << ", size is "
249b1994897Sopenharmony_ci                       << uncompressed_length << "\n";
250b1994897Sopenharmony_ci            os::mem::UnmapRaw(mem, size_to_mmap);
251b1994897Sopenharmony_ci        }
252b1994897Sopenharmony_ci
253b1994897Sopenharmony_ci        CloseCurrentFile(zipfile);
254b1994897Sopenharmony_ci        CloseArchiveFile(zipfile);
255b1994897Sopenharmony_ci        fclose(myfile);
256b1994897Sopenharmony_ci    }
257b1994897Sopenharmony_ci}
258b1994897Sopenharmony_ci
259b1994897Sopenharmony_cistatic void UnzipFileCheckPandaFile(const char *archivename, char *filename, std::vector<uint8_t> &pf_data, int &ret,
260b1994897Sopenharmony_ci                                    int level = Z_BEST_COMPRESSION)
261b1994897Sopenharmony_ci{
262b1994897Sopenharmony_ci    {
263b1994897Sopenharmony_ci        ZipArchiveHandle zipfile = nullptr;
264b1994897Sopenharmony_ci        FILE *myfile = fopen(archivename, "rbe");
265b1994897Sopenharmony_ci
266b1994897Sopenharmony_ci        if (OpenArchiveFile(zipfile, myfile) != 0) {
267b1994897Sopenharmony_ci            fclose(myfile);
268b1994897Sopenharmony_ci            ASSERT_EQ(1, 0) << "OpenArchiveFILE error.";
269b1994897Sopenharmony_ci            return;
270b1994897Sopenharmony_ci        }
271b1994897Sopenharmony_ci        if (LocateFile(zipfile, filename) != 0) {
272b1994897Sopenharmony_ci            CloseArchiveFile(zipfile);
273b1994897Sopenharmony_ci            fclose(myfile);
274b1994897Sopenharmony_ci            ASSERT_EQ(1, 0) << "LocateFile error.";
275b1994897Sopenharmony_ci            return;
276b1994897Sopenharmony_ci        }
277b1994897Sopenharmony_ci        EntryFileStat entry = EntryFileStat();
278b1994897Sopenharmony_ci        if (GetCurrentFileInfo(zipfile, &entry) != 0) {
279b1994897Sopenharmony_ci            CloseArchiveFile(zipfile);
280b1994897Sopenharmony_ci            fclose(myfile);
281b1994897Sopenharmony_ci            ASSERT_EQ(1, 0) << "GetCurrentFileInfo test error.";
282b1994897Sopenharmony_ci            return;
283b1994897Sopenharmony_ci        }
284b1994897Sopenharmony_ci        if (OpenCurrentFile(zipfile) != 0) {
285b1994897Sopenharmony_ci            CloseCurrentFile(zipfile);
286b1994897Sopenharmony_ci            CloseArchiveFile(zipfile);
287b1994897Sopenharmony_ci            fclose(myfile);
288b1994897Sopenharmony_ci            ASSERT_EQ(1, 0) << "OpenCurrentFile test error.";
289b1994897Sopenharmony_ci            return;
290b1994897Sopenharmony_ci        }
291b1994897Sopenharmony_ci
292b1994897Sopenharmony_ci        GetCurrentFileOffset(zipfile, &entry);
293b1994897Sopenharmony_ci
294b1994897Sopenharmony_ci        uint32_t uncompressed_length = entry.GetUncompressedSize();
295b1994897Sopenharmony_ci        if (uncompressed_length == 0) {
296b1994897Sopenharmony_ci            CloseCurrentFile(zipfile);
297b1994897Sopenharmony_ci            CloseArchiveFile(zipfile);
298b1994897Sopenharmony_ci            fclose(myfile);
299b1994897Sopenharmony_ci            ASSERT_EQ(1, 0) << "Entry file has zero length! Readed bad data!";
300b1994897Sopenharmony_ci            return;
301b1994897Sopenharmony_ci        }
302b1994897Sopenharmony_ci        ASSERT_GT(entry.GetOffset(), 0U);
303b1994897Sopenharmony_ci        ASSERT_EQ(uncompressed_length, pf_data.size());
304b1994897Sopenharmony_ci        if (level == Z_NO_COMPRESSION) {
305b1994897Sopenharmony_ci            ASSERT_EQ(uncompressed_length, entry.GetCompressedSize());
306b1994897Sopenharmony_ci            ASSERT_FALSE(entry.IsCompressed());
307b1994897Sopenharmony_ci        } else {
308b1994897Sopenharmony_ci            ASSERT_GE(uncompressed_length, entry.GetCompressedSize());
309b1994897Sopenharmony_ci            ASSERT_TRUE(entry.IsCompressed());
310b1994897Sopenharmony_ci        }
311b1994897Sopenharmony_ci
312b1994897Sopenharmony_ci        GTEST_COUT << "Filename: " << filename << ", Uncompressed size: " << uncompressed_length
313b1994897Sopenharmony_ci                   << "Compressed size: " << entry.GetCompressedSize() << "Compressed(): " << entry.IsCompressed()
314b1994897Sopenharmony_ci                   << "entry offset: " << entry.GetOffset() << "\n";
315b1994897Sopenharmony_ci
316b1994897Sopenharmony_ci        {
317b1994897Sopenharmony_ci            // Extract to mem buffer accroding to entry info.
318b1994897Sopenharmony_ci            uint32_t page_size = os::mem::GetPageSize();
319b1994897Sopenharmony_ci            uint32_t min_pages = uncompressed_length / page_size;
320b1994897Sopenharmony_ci            uint32_t size_to_mmap =
321b1994897Sopenharmony_ci                uncompressed_length % page_size == 0 ? min_pages * page_size : (min_pages + 1) * page_size;
322b1994897Sopenharmony_ci            // we will use mem in memcmp, so donnot poision it!
323b1994897Sopenharmony_ci            void *mem = os::mem::MapRWAnonymousRaw(size_to_mmap, false);
324b1994897Sopenharmony_ci            if (mem == nullptr) {
325b1994897Sopenharmony_ci                CloseCurrentFile(zipfile);
326b1994897Sopenharmony_ci                CloseArchiveFile(zipfile);
327b1994897Sopenharmony_ci                fclose(myfile);
328b1994897Sopenharmony_ci                ASSERT_EQ(1, 0) << "Can't mmap anonymous!";
329b1994897Sopenharmony_ci                return;
330b1994897Sopenharmony_ci            }
331b1994897Sopenharmony_ci
332b1994897Sopenharmony_ci            ret = ExtractToMemory(zipfile, reinterpret_cast<uint8_t *>(mem), size_to_mmap);
333b1994897Sopenharmony_ci            if (ret != 0) {
334b1994897Sopenharmony_ci                os::mem::UnmapRaw(mem, size_to_mmap);
335b1994897Sopenharmony_ci                CloseCurrentFile(zipfile);
336b1994897Sopenharmony_ci                CloseArchiveFile(zipfile);
337b1994897Sopenharmony_ci                fclose(myfile);
338b1994897Sopenharmony_ci                ASSERT_EQ(1, 0) << "Can't extract!";
339b1994897Sopenharmony_ci                return;
340b1994897Sopenharmony_ci            }
341b1994897Sopenharmony_ci
342b1994897Sopenharmony_ci            // Make sure the extraction really succeeded.
343b1994897Sopenharmony_ci            if (uncompressed_length != pf_data.size()) {
344b1994897Sopenharmony_ci                os::mem::UnmapRaw(mem, size_to_mmap);
345b1994897Sopenharmony_ci                CloseCurrentFile(zipfile);
346b1994897Sopenharmony_ci                CloseArchiveFile(zipfile);
347b1994897Sopenharmony_ci                fclose(myfile);
348b1994897Sopenharmony_ci                ASSERT_EQ(1, 0) << "ExtractToMemory() failed!, uncompressed_length is " << uncompressed_length
349b1994897Sopenharmony_ci                                << ", original pf_data size is " << pf_data.size() << "\n";
350b1994897Sopenharmony_ci                return;
351b1994897Sopenharmony_ci            }
352b1994897Sopenharmony_ci
353b1994897Sopenharmony_ci            if (memcmp(mem, pf_data.data(), pf_data.size())) {
354b1994897Sopenharmony_ci                os::mem::UnmapRaw(mem, size_to_mmap);
355b1994897Sopenharmony_ci                CloseCurrentFile(zipfile);
356b1994897Sopenharmony_ci                CloseArchiveFile(zipfile);
357b1994897Sopenharmony_ci                fclose(myfile);
358b1994897Sopenharmony_ci                ASSERT_EQ(1, 0) << "ExtractToMemory() memcmp failed!";
359b1994897Sopenharmony_ci                return;
360b1994897Sopenharmony_ci            }
361b1994897Sopenharmony_ci
362b1994897Sopenharmony_ci            GTEST_COUT << "Successfully extracted file " << filename << " from " << archivename << ", size is "
363b1994897Sopenharmony_ci                       << uncompressed_length << "\n";
364b1994897Sopenharmony_ci
365b1994897Sopenharmony_ci            os::mem::UnmapRaw(mem, size_to_mmap);
366b1994897Sopenharmony_ci        }
367b1994897Sopenharmony_ci        CloseCurrentFile(zipfile);
368b1994897Sopenharmony_ci        CloseArchiveFile(zipfile);
369b1994897Sopenharmony_ci        fclose(myfile);
370b1994897Sopenharmony_ci    }
371b1994897Sopenharmony_ci}
372b1994897Sopenharmony_ci
373b1994897Sopenharmony_cistatic void UnzipFileCheckInDirectory(const char *archivename, char *filename, const char *data, int N, char *buf,
374b1994897Sopenharmony_ci                                      int &ret, int level = Z_BEST_COMPRESSION)
375b1994897Sopenharmony_ci{
376b1994897Sopenharmony_ci    {
377b1994897Sopenharmony_ci        (void)sprintf_s(filename, MAX_DIR_SIZE, "directory/indirectory.txt");
378b1994897Sopenharmony_ci        (void)sprintf_s(buf, MAX_BUFFER_SIZE, "%d %s %d", N, data, N);
379b1994897Sopenharmony_ci
380b1994897Sopenharmony_ci        // Unzip Check
381b1994897Sopenharmony_ci        ZipArchiveHandle zipfile = nullptr;
382b1994897Sopenharmony_ci        FILE *myfile = fopen(archivename, "rbe");
383b1994897Sopenharmony_ci
384b1994897Sopenharmony_ci        if (OpenArchiveFile(zipfile, myfile) != 0) {
385b1994897Sopenharmony_ci            fclose(myfile);
386b1994897Sopenharmony_ci            ASSERT_EQ(1, 0) << "OpenArchiveFILE error.";
387b1994897Sopenharmony_ci            return;
388b1994897Sopenharmony_ci        }
389b1994897Sopenharmony_ci        if (LocateFile(zipfile, filename) != 0) {
390b1994897Sopenharmony_ci            CloseArchiveFile(zipfile);
391b1994897Sopenharmony_ci            fclose(myfile);
392b1994897Sopenharmony_ci            ASSERT_EQ(1, 0) << "LocateFile error.";
393b1994897Sopenharmony_ci            return;
394b1994897Sopenharmony_ci        }
395b1994897Sopenharmony_ci        EntryFileStat entry = EntryFileStat();
396b1994897Sopenharmony_ci        if (GetCurrentFileInfo(zipfile, &entry) != 0) {
397b1994897Sopenharmony_ci            CloseArchiveFile(zipfile);
398b1994897Sopenharmony_ci            fclose(myfile);
399b1994897Sopenharmony_ci            ASSERT_EQ(1, 0) << "GetCurrentFileInfo test error.";
400b1994897Sopenharmony_ci            return;
401b1994897Sopenharmony_ci        }
402b1994897Sopenharmony_ci        if (OpenCurrentFile(zipfile) != 0) {
403b1994897Sopenharmony_ci            CloseCurrentFile(zipfile);
404b1994897Sopenharmony_ci            CloseArchiveFile(zipfile);
405b1994897Sopenharmony_ci            fclose(myfile);
406b1994897Sopenharmony_ci            ASSERT_EQ(1, 0) << "OpenCurrentFile test error.";
407b1994897Sopenharmony_ci            return;
408b1994897Sopenharmony_ci        }
409b1994897Sopenharmony_ci
410b1994897Sopenharmony_ci        GetCurrentFileOffset(zipfile, &entry);
411b1994897Sopenharmony_ci
412b1994897Sopenharmony_ci        uint32_t uncompressed_length = entry.GetUncompressedSize();
413b1994897Sopenharmony_ci        if (uncompressed_length == 0) {
414b1994897Sopenharmony_ci            CloseCurrentFile(zipfile);
415b1994897Sopenharmony_ci            CloseArchiveFile(zipfile);
416b1994897Sopenharmony_ci            fclose(myfile);
417b1994897Sopenharmony_ci            ASSERT_EQ(1, 0) << "Entry file has zero length! Readed bad data!";
418b1994897Sopenharmony_ci            return;
419b1994897Sopenharmony_ci        }
420b1994897Sopenharmony_ci        ASSERT_GT(entry.GetOffset(), 0U);
421b1994897Sopenharmony_ci        ASSERT_EQ(uncompressed_length, strlen(buf) + 1);
422b1994897Sopenharmony_ci        if (level == Z_NO_COMPRESSION) {
423b1994897Sopenharmony_ci            ASSERT_EQ(uncompressed_length, entry.GetCompressedSize());
424b1994897Sopenharmony_ci            ASSERT_FALSE(entry.IsCompressed());
425b1994897Sopenharmony_ci        } else {
426b1994897Sopenharmony_ci            ASSERT_GE(uncompressed_length, entry.GetCompressedSize());
427b1994897Sopenharmony_ci            ASSERT_TRUE(entry.IsCompressed());
428b1994897Sopenharmony_ci        }
429b1994897Sopenharmony_ci        GTEST_COUT << "Filename: " << filename << ", Uncompressed size: " << uncompressed_length
430b1994897Sopenharmony_ci                   << "Compressed size: " << entry.GetCompressedSize() << "Compressed(): " << entry.IsCompressed()
431b1994897Sopenharmony_ci                   << "entry offset: " << entry.GetOffset() << "\n";
432b1994897Sopenharmony_ci
433b1994897Sopenharmony_ci        {
434b1994897Sopenharmony_ci            // Extract to mem buffer accroding to entry info.
435b1994897Sopenharmony_ci            uint32_t page_size = os::mem::GetPageSize();
436b1994897Sopenharmony_ci            uint32_t min_pages = uncompressed_length / page_size;
437b1994897Sopenharmony_ci            uint32_t size_to_mmap =
438b1994897Sopenharmony_ci                uncompressed_length % page_size == 0 ? min_pages * page_size : (min_pages + 1) * page_size;
439b1994897Sopenharmony_ci            // we will use mem in memcmp, so donnot poision it!
440b1994897Sopenharmony_ci            void *mem = os::mem::MapRWAnonymousRaw(size_to_mmap, false);
441b1994897Sopenharmony_ci            if (mem == nullptr) {
442b1994897Sopenharmony_ci                CloseCurrentFile(zipfile);
443b1994897Sopenharmony_ci                CloseArchiveFile(zipfile);
444b1994897Sopenharmony_ci                fclose(myfile);
445b1994897Sopenharmony_ci                ASSERT_EQ(1, 0) << "Can't mmap anonymous!";
446b1994897Sopenharmony_ci                return;
447b1994897Sopenharmony_ci            }
448b1994897Sopenharmony_ci
449b1994897Sopenharmony_ci            ret = ExtractToMemory(zipfile, reinterpret_cast<uint8_t *>(mem), size_to_mmap);
450b1994897Sopenharmony_ci            if (ret != 0) {
451b1994897Sopenharmony_ci                os::mem::UnmapRaw(mem, size_to_mmap);
452b1994897Sopenharmony_ci                CloseCurrentFile(zipfile);
453b1994897Sopenharmony_ci                CloseArchiveFile(zipfile);
454b1994897Sopenharmony_ci                fclose(myfile);
455b1994897Sopenharmony_ci                ASSERT_EQ(1, 0) << "Can't extract!";
456b1994897Sopenharmony_ci                return;
457b1994897Sopenharmony_ci            }
458b1994897Sopenharmony_ci
459b1994897Sopenharmony_ci            // Make sure the extraction really succeeded.
460b1994897Sopenharmony_ci            size_t dlen = strlen(buf);
461b1994897Sopenharmony_ci            if (uncompressed_length != (dlen + 1)) {
462b1994897Sopenharmony_ci                os::mem::UnmapRaw(mem, size_to_mmap);
463b1994897Sopenharmony_ci                CloseCurrentFile(zipfile);
464b1994897Sopenharmony_ci                CloseArchive(zipfile);
465b1994897Sopenharmony_ci                fclose(myfile);
466b1994897Sopenharmony_ci                ASSERT_EQ(1, 0) << "ExtractToMemory() failed!, uncompressed_length is " << uncompressed_length - 1
467b1994897Sopenharmony_ci                                << ", original strlen is " << dlen;
468b1994897Sopenharmony_ci                return;
469b1994897Sopenharmony_ci            }
470b1994897Sopenharmony_ci
471b1994897Sopenharmony_ci            if (memcmp(mem, buf, dlen)) {
472b1994897Sopenharmony_ci                os::mem::UnmapRaw(mem, size_to_mmap);
473b1994897Sopenharmony_ci                CloseCurrentFile(zipfile);
474b1994897Sopenharmony_ci                CloseArchive(zipfile);
475b1994897Sopenharmony_ci                fclose(myfile);
476b1994897Sopenharmony_ci                ASSERT_EQ(1, 0) << "ExtractToMemory() memcmp failed!";
477b1994897Sopenharmony_ci                return;
478b1994897Sopenharmony_ci            }
479b1994897Sopenharmony_ci
480b1994897Sopenharmony_ci            GTEST_COUT << "Successfully extracted file " << filename << " from " << archivename << ", size is "
481b1994897Sopenharmony_ci                       << uncompressed_length << "\n";
482b1994897Sopenharmony_ci
483b1994897Sopenharmony_ci            os::mem::UnmapRaw(mem, size_to_mmap);
484b1994897Sopenharmony_ci        }
485b1994897Sopenharmony_ci
486b1994897Sopenharmony_ci        CloseCurrentFile(zipfile);
487b1994897Sopenharmony_ci        CloseArchiveFile(zipfile);
488b1994897Sopenharmony_ci        fclose(myfile);
489b1994897Sopenharmony_ci    }
490b1994897Sopenharmony_ci}
491b1994897Sopenharmony_ci
492b1994897Sopenharmony_ciHWTEST(LIBZIPARCHIVE, ZipFile, testing::ext::TestSize.Level0)
493b1994897Sopenharmony_ci{
494b1994897Sopenharmony_ci    static const char *data =
495b1994897Sopenharmony_ci        "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras feugiat et odio ac sollicitudin. Maecenas "
496b1994897Sopenharmony_ci        "lobortis ultrices eros sed pharetra. Phasellus in tortor rhoncus, aliquam augue ac, gravida elit. Sed "
497b1994897Sopenharmony_ci        "molestie dolor a vulputate tincidunt. Proin a tellus quam. Suspendisse id feugiat elit, non ornare lacus. "
498b1994897Sopenharmony_ci        "Mauris arcu ex, pretium quis dolor ut, porta iaculis eros. Vestibulum sagittis placerat diam, vitae efficitur "
499b1994897Sopenharmony_ci        "turpis ultrices sit amet. Etiam elementum bibendum congue. In sit amet dolor ultricies, suscipit arcu ac, "
500b1994897Sopenharmony_ci        "molestie urna. Mauris ultrices volutpat massa quis ultrices. Suspendisse rutrum lectus sit amet metus "
501b1994897Sopenharmony_ci        "laoreet, non porta sapien venenatis. Fusce ut massa et purus elementum lacinia. Sed tempus bibendum pretium.";
502b1994897Sopenharmony_ci
503b1994897Sopenharmony_ci    /*
504b1994897Sopenharmony_ci     * creating an empty pandafile
505b1994897Sopenharmony_ci     */
506b1994897Sopenharmony_ci    std::vector<uint8_t> pf_data {};
507b1994897Sopenharmony_ci    {
508b1994897Sopenharmony_ci        pandasm::Parser p;
509b1994897Sopenharmony_ci
510b1994897Sopenharmony_ci        auto source = R"()";
511b1994897Sopenharmony_ci
512b1994897Sopenharmony_ci        std::string src_filename = "src.pa";
513b1994897Sopenharmony_ci        auto res = p.Parse(source, src_filename);
514b1994897Sopenharmony_ci        ASSERT_EQ(p.ShowError().err, pandasm::Error::ErrorType::ERR_NONE);
515b1994897Sopenharmony_ci
516b1994897Sopenharmony_ci        auto pf = pandasm::AsmEmitter::Emit(res.Value());
517b1994897Sopenharmony_ci        ASSERT_NE(pf, nullptr);
518b1994897Sopenharmony_ci
519b1994897Sopenharmony_ci        const auto header_ptr = reinterpret_cast<const uint8_t *>(pf->GetHeader());
520b1994897Sopenharmony_ci        pf_data.assign(header_ptr, header_ptr + sizeof(panda_file::File::Header));
521b1994897Sopenharmony_ci    }
522b1994897Sopenharmony_ci
523b1994897Sopenharmony_ci    static const char *archivename = "__LIBZIPARCHIVE__ZipFile__.zip";
524b1994897Sopenharmony_ci    const int N = 3;
525b1994897Sopenharmony_ci    char buf[MAX_BUFFER_SIZE];
526b1994897Sopenharmony_ci    char archive_filename[MAX_DIR_SIZE];
527b1994897Sopenharmony_ci    int i = 0;
528b1994897Sopenharmony_ci    int ret = 0;
529b1994897Sopenharmony_ci
530b1994897Sopenharmony_ci    GenerateZipfile(data, archivename, N, buf, archive_filename, i, ret, pf_data);
531b1994897Sopenharmony_ci
532b1994897Sopenharmony_ci    // Quick Check
533b1994897Sopenharmony_ci    ZipArchiveHandle zipfile = nullptr;
534b1994897Sopenharmony_ci    if (OpenArchive(zipfile, archivename) != 0) {
535b1994897Sopenharmony_ci        ASSERT_EQ(1, 0) << "OpenArchive error.";
536b1994897Sopenharmony_ci        return;
537b1994897Sopenharmony_ci    }
538b1994897Sopenharmony_ci
539b1994897Sopenharmony_ci    GlobalStat gi = GlobalStat();
540b1994897Sopenharmony_ci    if (GetGlobalFileInfo(zipfile, &gi) != 0) {
541b1994897Sopenharmony_ci        ASSERT_EQ(1, 0) << "GetGlobalFileInfo error.";
542b1994897Sopenharmony_ci        return;
543b1994897Sopenharmony_ci    }
544b1994897Sopenharmony_ci    for (i = 0; i < (int)gi.GetNumberOfEntry(); ++i) {
545b1994897Sopenharmony_ci        EntryFileStat file_stat;
546b1994897Sopenharmony_ci        if (GetCurrentFileInfo(zipfile, &file_stat) != 0) {
547b1994897Sopenharmony_ci            CloseArchive(zipfile);
548b1994897Sopenharmony_ci            ASSERT_EQ(1, 0) << "GetCurrentFileInfo error. Current index i = " << i;
549b1994897Sopenharmony_ci            return;
550b1994897Sopenharmony_ci        }
551b1994897Sopenharmony_ci        GTEST_COUT << "Index:  " << i << ", Uncompressed size: " << file_stat.GetUncompressedSize()
552b1994897Sopenharmony_ci                   << "Compressed size: " << file_stat.GetCompressedSize()
553b1994897Sopenharmony_ci                   << "Compressed(): " << file_stat.IsCompressed() << "entry offset: " << file_stat.GetOffset() << "\n";
554b1994897Sopenharmony_ci        if ((i + 1) < (int)gi.GetNumberOfEntry()) {
555b1994897Sopenharmony_ci            if (GoToNextFile(zipfile) != 0) {
556b1994897Sopenharmony_ci                CloseArchive(zipfile);
557b1994897Sopenharmony_ci                ASSERT_EQ(1, 0) << "GoToNextFile error. Current index i = " << i;
558b1994897Sopenharmony_ci                return;
559b1994897Sopenharmony_ci            }
560b1994897Sopenharmony_ci        }
561b1994897Sopenharmony_ci    }
562b1994897Sopenharmony_ci
563b1994897Sopenharmony_ci    CloseArchive(zipfile);
564b1994897Sopenharmony_ci    remove(archivename);
565b1994897Sopenharmony_ci    GTEST_COUT << "Success.\n";
566b1994897Sopenharmony_ci}
567b1994897Sopenharmony_ci
568b1994897Sopenharmony_ciHWTEST(LIBZIPARCHIVE, UnZipFile, testing::ext::TestSize.Level0)
569b1994897Sopenharmony_ci{
570b1994897Sopenharmony_ci    static const char *data =
571b1994897Sopenharmony_ci        "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras feugiat et odio ac sollicitudin. Maecenas "
572b1994897Sopenharmony_ci        "lobortis ultrices eros sed pharetra. Phasellus in tortor rhoncus, aliquam augue ac, gravida elit. Sed "
573b1994897Sopenharmony_ci        "molestie dolor a vulputate tincidunt. Proin a tellus quam. Suspendisse id feugiat elit, non ornare lacus. "
574b1994897Sopenharmony_ci        "Mauris arcu ex, pretium quis dolor ut, porta iaculis eros. Vestibulum sagittis placerat diam, vitae efficitur "
575b1994897Sopenharmony_ci        "turpis ultrices sit amet. Etiam elementum bibendum congue. In sit amet dolor ultricies, suscipit arcu ac, "
576b1994897Sopenharmony_ci        "molestie urna. Mauris ultrices volutpat massa quis ultrices. Suspendisse rutrum lectus sit amet metus "
577b1994897Sopenharmony_ci        "laoreet, non porta sapien venenatis. Fusce ut massa et purus elementum lacinia. Sed tempus bibendum pretium.";
578b1994897Sopenharmony_ci
579b1994897Sopenharmony_ci    /*
580b1994897Sopenharmony_ci     * creating an empty pandafile
581b1994897Sopenharmony_ci     */
582b1994897Sopenharmony_ci    std::vector<uint8_t> pf_data {};
583b1994897Sopenharmony_ci    {
584b1994897Sopenharmony_ci        pandasm::Parser p;
585b1994897Sopenharmony_ci
586b1994897Sopenharmony_ci        auto source = R"()";
587b1994897Sopenharmony_ci
588b1994897Sopenharmony_ci        std::string src_filename = "src.pa";
589b1994897Sopenharmony_ci        auto res = p.Parse(source, src_filename);
590b1994897Sopenharmony_ci        ASSERT_EQ(p.ShowError().err, pandasm::Error::ErrorType::ERR_NONE);
591b1994897Sopenharmony_ci
592b1994897Sopenharmony_ci        auto pf = pandasm::AsmEmitter::Emit(res.Value());
593b1994897Sopenharmony_ci        ASSERT_NE(pf, nullptr);
594b1994897Sopenharmony_ci
595b1994897Sopenharmony_ci        const auto header_ptr = reinterpret_cast<const uint8_t *>(pf->GetHeader());
596b1994897Sopenharmony_ci        pf_data.assign(header_ptr, header_ptr + sizeof(panda_file::File::Header));
597b1994897Sopenharmony_ci    }
598b1994897Sopenharmony_ci
599b1994897Sopenharmony_ci    // The zip filename
600b1994897Sopenharmony_ci    static const char *archivename = "__LIBZIPARCHIVE__UnZipFile__.zip";
601b1994897Sopenharmony_ci    const int N = 3;
602b1994897Sopenharmony_ci    char buf[MAX_BUFFER_SIZE];
603b1994897Sopenharmony_ci    char archive_filename[MAX_DIR_SIZE];
604b1994897Sopenharmony_ci    char filename[MAX_DIR_SIZE];
605b1994897Sopenharmony_ci    int i = 0;
606b1994897Sopenharmony_ci    int ret = 0;
607b1994897Sopenharmony_ci
608b1994897Sopenharmony_ci    GenerateZipfile(data, archivename, N, buf, archive_filename, i, ret, pf_data);
609b1994897Sopenharmony_ci
610b1994897Sopenharmony_ci    UnzipFileCheckDirectory(archivename, filename);
611b1994897Sopenharmony_ci
612b1994897Sopenharmony_ci    UnzipFileCheckTxt(archivename, filename, data, N, buf, ret);
613b1994897Sopenharmony_ci
614b1994897Sopenharmony_ci    UnzipFileCheckInDirectory(archivename, filename, data, N, buf, ret);
615b1994897Sopenharmony_ci
616b1994897Sopenharmony_ci    sprintf_s(filename, MAX_DIR_SIZE, "classes.abc");
617b1994897Sopenharmony_ci    UnzipFileCheckPandaFile(archivename, filename, pf_data, ret);
618b1994897Sopenharmony_ci
619b1994897Sopenharmony_ci    remove(archivename);
620b1994897Sopenharmony_ci    GTEST_COUT << "Success.\n";
621b1994897Sopenharmony_ci}
622b1994897Sopenharmony_ci
623b1994897Sopenharmony_ciHWTEST(LIBZIPARCHIVE, UnZipUncompressedFile, testing::ext::TestSize.Level0)
624b1994897Sopenharmony_ci{
625b1994897Sopenharmony_ci    static const char *data =
626b1994897Sopenharmony_ci        "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras feugiat et odio ac sollicitudin. Maecenas "
627b1994897Sopenharmony_ci        "lobortis ultrices eros sed pharetra. Phasellus in tortor rhoncus, aliquam augue ac, gravida elit. Sed "
628b1994897Sopenharmony_ci        "molestie dolor a vulputate tincidunt. Proin a tellus quam. Suspendisse id feugiat elit, non ornare lacus. "
629b1994897Sopenharmony_ci        "Mauris arcu ex, pretium quis dolor ut, porta iaculis eros. Vestibulum sagittis placerat diam, vitae efficitur "
630b1994897Sopenharmony_ci        "turpis ultrices sit amet. Etiam elementum bibendum congue. In sit amet dolor ultricies, suscipit arcu ac, "
631b1994897Sopenharmony_ci        "molestie urna. Mauris ultrices volutpat massa quis ultrices. Suspendisse rutrum lectus sit amet metus "
632b1994897Sopenharmony_ci        "laoreet, non porta sapien venenatis. Fusce ut massa et purus elementum lacinia. Sed tempus bibendum pretium.";
633b1994897Sopenharmony_ci
634b1994897Sopenharmony_ci    /*
635b1994897Sopenharmony_ci     * creating an empty pandafile
636b1994897Sopenharmony_ci     */
637b1994897Sopenharmony_ci    std::vector<uint8_t> pf_data {};
638b1994897Sopenharmony_ci    {
639b1994897Sopenharmony_ci        pandasm::Parser p;
640b1994897Sopenharmony_ci
641b1994897Sopenharmony_ci        auto source = R"()";
642b1994897Sopenharmony_ci
643b1994897Sopenharmony_ci        std::string src_filename = "src.pa";
644b1994897Sopenharmony_ci        auto res = p.Parse(source, src_filename);
645b1994897Sopenharmony_ci        ASSERT_EQ(p.ShowError().err, pandasm::Error::ErrorType::ERR_NONE);
646b1994897Sopenharmony_ci
647b1994897Sopenharmony_ci        auto pf = pandasm::AsmEmitter::Emit(res.Value());
648b1994897Sopenharmony_ci        ASSERT_NE(pf, nullptr);
649b1994897Sopenharmony_ci
650b1994897Sopenharmony_ci        const auto header_ptr = reinterpret_cast<const uint8_t *>(pf->GetHeader());
651b1994897Sopenharmony_ci        pf_data.assign(header_ptr, header_ptr + sizeof(panda_file::File::Header));
652b1994897Sopenharmony_ci    }
653b1994897Sopenharmony_ci
654b1994897Sopenharmony_ci    // The zip filename
655b1994897Sopenharmony_ci    static const char *archivename = "__LIBZIPARCHIVE__UnZipUncompressedFile__.zip";
656b1994897Sopenharmony_ci    const int N = 3;
657b1994897Sopenharmony_ci    char buf[MAX_BUFFER_SIZE];
658b1994897Sopenharmony_ci    char archive_filename[MAX_DIR_SIZE];
659b1994897Sopenharmony_ci    char filename[MAX_DIR_SIZE];
660b1994897Sopenharmony_ci    int i = 0;
661b1994897Sopenharmony_ci    int ret = 0;
662b1994897Sopenharmony_ci
663b1994897Sopenharmony_ci    GenerateZipfile(data, archivename, N, buf, archive_filename, i, ret, pf_data, Z_NO_COMPRESSION);
664b1994897Sopenharmony_ci
665b1994897Sopenharmony_ci    UnzipFileCheckDirectory(archivename, filename, Z_NO_COMPRESSION);
666b1994897Sopenharmony_ci
667b1994897Sopenharmony_ci    UnzipFileCheckTxt(archivename, filename, data, N, buf, ret, Z_NO_COMPRESSION);
668b1994897Sopenharmony_ci
669b1994897Sopenharmony_ci    UnzipFileCheckInDirectory(archivename, filename, data, N, buf, ret, Z_NO_COMPRESSION);
670b1994897Sopenharmony_ci
671b1994897Sopenharmony_ci    (void)sprintf_s(filename, MAX_DIR_SIZE, "classes.abc");
672b1994897Sopenharmony_ci    UnzipFileCheckPandaFile(archivename, filename, pf_data, ret, Z_NO_COMPRESSION);
673b1994897Sopenharmony_ci
674b1994897Sopenharmony_ci    remove(archivename);
675b1994897Sopenharmony_ci    GTEST_COUT << "Success.\n";
676b1994897Sopenharmony_ci}
677b1994897Sopenharmony_ci
678b1994897Sopenharmony_ciHWTEST(LIBZIPARCHIVE, UnZipUncompressedPandaFile, testing::ext::TestSize.Level0)
679b1994897Sopenharmony_ci{
680b1994897Sopenharmony_ci    /*
681b1994897Sopenharmony_ci     * creating an empty pandafile
682b1994897Sopenharmony_ci     */
683b1994897Sopenharmony_ci    std::vector<uint8_t> pf_data {};
684b1994897Sopenharmony_ci    {
685b1994897Sopenharmony_ci        pandasm::Parser p;
686b1994897Sopenharmony_ci
687b1994897Sopenharmony_ci        auto source = R"()";
688b1994897Sopenharmony_ci
689b1994897Sopenharmony_ci        std::string src_filename = "src.pa";
690b1994897Sopenharmony_ci        auto res = p.Parse(source, src_filename);
691b1994897Sopenharmony_ci        ASSERT_EQ(p.ShowError().err, pandasm::Error::ErrorType::ERR_NONE);
692b1994897Sopenharmony_ci
693b1994897Sopenharmony_ci        auto pf = pandasm::AsmEmitter::Emit(res.Value());
694b1994897Sopenharmony_ci        ASSERT_NE(pf, nullptr);
695b1994897Sopenharmony_ci
696b1994897Sopenharmony_ci        const auto header_ptr = reinterpret_cast<const uint8_t *>(pf->GetHeader());
697b1994897Sopenharmony_ci        pf_data.assign(header_ptr, header_ptr + sizeof(panda_file::File::Header));
698b1994897Sopenharmony_ci    }
699b1994897Sopenharmony_ci
700b1994897Sopenharmony_ci    // The zip filename
701b1994897Sopenharmony_ci    static const char *archivename = "__LIBZIPARCHIVE__UnZipUncompressedPandaFile__.zip";
702b1994897Sopenharmony_ci    char filename[MAX_DIR_SIZE];
703b1994897Sopenharmony_ci    int ret = 0;
704b1994897Sopenharmony_ci
705b1994897Sopenharmony_ci    // Delete the test archive, so it doesn't keep growing as we run this test
706b1994897Sopenharmony_ci    remove(archivename);
707b1994897Sopenharmony_ci
708b1994897Sopenharmony_ci    // Add pandafile into zip for testing
709b1994897Sopenharmony_ci    ret = CreateOrAddFileIntoZip(archivename, "class.abc", pf_data.data(), pf_data.size(), APPEND_STATUS_CREATE,
710b1994897Sopenharmony_ci                                 Z_NO_COMPRESSION);
711b1994897Sopenharmony_ci    if (ret != 0) {
712b1994897Sopenharmony_ci        ASSERT_EQ(1, 0) << "CreateOrAddFileIntoZip failed!";
713b1994897Sopenharmony_ci        return;
714b1994897Sopenharmony_ci    }
715b1994897Sopenharmony_ci    ret = CreateOrAddFileIntoZip(archivename, "classes.abc", pf_data.data(), pf_data.size(), APPEND_STATUS_ADDINZIP,
716b1994897Sopenharmony_ci                                 Z_NO_COMPRESSION);
717b1994897Sopenharmony_ci    if (ret != 0) {
718b1994897Sopenharmony_ci        ASSERT_EQ(1, 0) << "CreateOrAddFileIntoZip failed!";
719b1994897Sopenharmony_ci        return;
720b1994897Sopenharmony_ci    }
721b1994897Sopenharmony_ci
722b1994897Sopenharmony_ci    sprintf_s(filename, MAX_DIR_SIZE, "class.abc");
723b1994897Sopenharmony_ci    UnzipFileCheckPandaFile(archivename, filename, pf_data, ret, Z_NO_COMPRESSION);
724b1994897Sopenharmony_ci    sprintf_s(filename, MAX_DIR_SIZE, "classes.abc");
725b1994897Sopenharmony_ci    UnzipFileCheckPandaFile(archivename, filename, pf_data, ret, Z_NO_COMPRESSION);
726b1994897Sopenharmony_ci
727b1994897Sopenharmony_ci    remove(archivename);
728b1994897Sopenharmony_ci    GTEST_COUT << "Success.\n";
729b1994897Sopenharmony_ci}
730b1994897Sopenharmony_ci
731b1994897Sopenharmony_ciHWTEST(LIBZIPARCHIVE, IllegalPathTest, testing::ext::TestSize.Level0)
732b1994897Sopenharmony_ci{
733b1994897Sopenharmony_ci    static const char *archivename = "__LIBZIPARCHIVE__ILLEGALPATHTEST__.zip";
734b1994897Sopenharmony_ci    int ret = CreateOrAddFileIntoZip(archivename, "illegal_path.abc", nullptr, 0, APPEND_STATUS_ADDINZIP,
735b1994897Sopenharmony_ci                                     Z_NO_COMPRESSION);
736b1994897Sopenharmony_ci    ASSERT_EQ(ret, ZIPARCHIVE_ERR);
737b1994897Sopenharmony_ci    ZipArchiveHandle zipfile = nullptr;
738b1994897Sopenharmony_ci    ASSERT_EQ(OpenArchive(zipfile, archivename), ZIPARCHIVE_ERR);
739b1994897Sopenharmony_ci    GlobalStat gi = GlobalStat();
740b1994897Sopenharmony_ci    ASSERT_EQ(GetGlobalFileInfo(zipfile, &gi), ZIPARCHIVE_ERR);
741b1994897Sopenharmony_ci    ASSERT_EQ(GoToNextFile(zipfile), ZIPARCHIVE_ERR);
742b1994897Sopenharmony_ci    ASSERT_EQ(LocateFile(zipfile, "illegal_path.abc"), ZIPARCHIVE_ERR);
743b1994897Sopenharmony_ci    EntryFileStat entry = EntryFileStat();
744b1994897Sopenharmony_ci    ASSERT_EQ(GetCurrentFileInfo(zipfile, &entry), ZIPARCHIVE_ERR);
745b1994897Sopenharmony_ci    ASSERT_EQ(CloseArchive(zipfile), ZIPARCHIVE_ERR);
746b1994897Sopenharmony_ci
747b1994897Sopenharmony_ci    ASSERT_EQ(OpenArchiveFile(zipfile, nullptr), ZIPARCHIVE_ERR);
748b1994897Sopenharmony_ci    ASSERT_EQ(OpenCurrentFile(zipfile), ZIPARCHIVE_ERR);
749b1994897Sopenharmony_ci    ASSERT_EQ(CloseCurrentFile(zipfile), ZIPARCHIVE_ERR);
750b1994897Sopenharmony_ci    ASSERT_EQ(CloseArchiveFile(zipfile), ZIPARCHIVE_ERR);
751b1994897Sopenharmony_ci}
752b1994897Sopenharmony_ci}  // namespace panda::test
753