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