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 "file-inl.h" 17b1994897Sopenharmony_ci#include "file_items.h" 18b1994897Sopenharmony_ci#include "file_item_container.h" 19b1994897Sopenharmony_ci#include "utils/string_helpers.h" 20b1994897Sopenharmony_ci#include "zip_archive.h" 21b1994897Sopenharmony_ci#include "file.h" 22b1994897Sopenharmony_ci 23b1994897Sopenharmony_ci#include "assembly-emitter.h" 24b1994897Sopenharmony_ci#include "assembly-parser.h" 25b1994897Sopenharmony_ci 26b1994897Sopenharmony_ci#include <cstdint> 27b1994897Sopenharmony_ci#ifdef PANDA_TARGET_MOBILE 28b1994897Sopenharmony_ci#include <unistd.h> 29b1994897Sopenharmony_ci#endif 30b1994897Sopenharmony_ci 31b1994897Sopenharmony_ci#include <vector> 32b1994897Sopenharmony_ci 33b1994897Sopenharmony_ci#include <gtest/gtest.h> 34b1994897Sopenharmony_ci 35b1994897Sopenharmony_cinamespace panda::panda_file::test { 36b1994897Sopenharmony_ci 37b1994897Sopenharmony_cistatic constexpr const char *ABC_FILE = "test_file.abc"; 38b1994897Sopenharmony_ci 39b1994897Sopenharmony_cistatic std::unique_ptr<const File> GetPandaFile(std::vector<uint8_t> *data) 40b1994897Sopenharmony_ci{ 41b1994897Sopenharmony_ci os::mem::ConstBytePtr ptr(reinterpret_cast<std::byte *>(data->data()), data->size(), 42b1994897Sopenharmony_ci [](std::byte *, size_t) noexcept {}); 43b1994897Sopenharmony_ci return File::OpenFromMemory(std::move(ptr)); 44b1994897Sopenharmony_ci} 45b1994897Sopenharmony_ci 46b1994897Sopenharmony_cistatic std::vector<uint8_t> GetEmptyPandaFileBytes() 47b1994897Sopenharmony_ci{ 48b1994897Sopenharmony_ci pandasm::Parser p; 49b1994897Sopenharmony_ci 50b1994897Sopenharmony_ci auto source = R"()"; 51b1994897Sopenharmony_ci 52b1994897Sopenharmony_ci std::string src_filename = "src.pa"; 53b1994897Sopenharmony_ci auto res = p.Parse(source, src_filename); 54b1994897Sopenharmony_ci ASSERT(p.ShowError().err == pandasm::Error::ErrorType::ERR_NONE); 55b1994897Sopenharmony_ci 56b1994897Sopenharmony_ci auto pf = pandasm::AsmEmitter::Emit(res.Value()); 57b1994897Sopenharmony_ci ASSERT(pf != nullptr); 58b1994897Sopenharmony_ci 59b1994897Sopenharmony_ci std::vector<uint8_t> data {}; 60b1994897Sopenharmony_ci const auto header_ptr = reinterpret_cast<const uint8_t *>(pf->GetHeader()); 61b1994897Sopenharmony_ci data.assign(header_ptr, header_ptr + sizeof(File::Header)); 62b1994897Sopenharmony_ci 63b1994897Sopenharmony_ci ASSERT(data.size() == sizeof(File::Header)); 64b1994897Sopenharmony_ci 65b1994897Sopenharmony_ci return data; 66b1994897Sopenharmony_ci} 67b1994897Sopenharmony_ci 68b1994897Sopenharmony_ciint CreateOrAddZipPandaFile(std::vector<uint8_t> *data, const char *zip_archive_name, const char *filename, int append, 69b1994897Sopenharmony_ci int level) 70b1994897Sopenharmony_ci{ 71b1994897Sopenharmony_ci return CreateOrAddFileIntoZip(zip_archive_name, filename, (*data).data(), (*data).size(), append, level); 72b1994897Sopenharmony_ci} 73b1994897Sopenharmony_ci 74b1994897Sopenharmony_cibool CheckAnonMemoryName([[maybe_unused]] const char *zip_archive_name) 75b1994897Sopenharmony_ci{ 76b1994897Sopenharmony_ci // check if [annon:panda-classes.abc extracted in memory from /xx/__OpenPandaFileFromZip__.zip] 77b1994897Sopenharmony_ci#ifdef PANDA_TARGET_MOBILE 78b1994897Sopenharmony_ci bool result = false; 79b1994897Sopenharmony_ci const char *prefix = "[anon:panda-"; 80b1994897Sopenharmony_ci int pid = getpid(); 81b1994897Sopenharmony_ci std::stringstream ss; 82b1994897Sopenharmony_ci ss << "/proc/" << pid << "/maps"; 83b1994897Sopenharmony_ci std::ifstream f; 84b1994897Sopenharmony_ci f.open(ss.str(), std::ios::in); 85b1994897Sopenharmony_ci EXPECT_TRUE(f.is_open()); 86b1994897Sopenharmony_ci for (std::string line; std::getline(f, line);) { 87b1994897Sopenharmony_ci if (line.find(prefix) != std::string::npos && line.find(zip_archive_name) != std::string::npos) { 88b1994897Sopenharmony_ci result = true; 89b1994897Sopenharmony_ci } 90b1994897Sopenharmony_ci } 91b1994897Sopenharmony_ci f.close(); 92b1994897Sopenharmony_ci return result; 93b1994897Sopenharmony_ci#else 94b1994897Sopenharmony_ci return true; 95b1994897Sopenharmony_ci#endif 96b1994897Sopenharmony_ci} 97b1994897Sopenharmony_ci 98b1994897Sopenharmony_ciHWTEST(File, GetClassByName, testing::ext::TestSize.Level0) 99b1994897Sopenharmony_ci{ 100b1994897Sopenharmony_ci ItemContainer container; 101b1994897Sopenharmony_ci 102b1994897Sopenharmony_ci std::vector<std::string> names = {"C", "B", "A"}; 103b1994897Sopenharmony_ci std::vector<ClassItem *> classes; 104b1994897Sopenharmony_ci 105b1994897Sopenharmony_ci for (auto &name : names) { 106b1994897Sopenharmony_ci classes.push_back(container.GetOrCreateClassItem(name)); 107b1994897Sopenharmony_ci } 108b1994897Sopenharmony_ci 109b1994897Sopenharmony_ci MemoryWriter mem_writer; 110b1994897Sopenharmony_ci 111b1994897Sopenharmony_ci ASSERT_TRUE(container.Write(&mem_writer)); 112b1994897Sopenharmony_ci 113b1994897Sopenharmony_ci // Read panda file from memory 114b1994897Sopenharmony_ci 115b1994897Sopenharmony_ci auto data = mem_writer.GetData(); 116b1994897Sopenharmony_ci auto panda_file = GetPandaFile(&data); 117b1994897Sopenharmony_ci ASSERT_NE(panda_file, nullptr); 118b1994897Sopenharmony_ci 119b1994897Sopenharmony_ci for (size_t i = 0; i < names.size(); i++) { 120b1994897Sopenharmony_ci EXPECT_EQ(panda_file->GetClassId(reinterpret_cast<const uint8_t *>(names[i].c_str())).GetOffset(), 121b1994897Sopenharmony_ci classes[i]->GetOffset()); 122b1994897Sopenharmony_ci } 123b1994897Sopenharmony_ci} 124b1994897Sopenharmony_ci 125b1994897Sopenharmony_ciHWTEST(File, OpenPandaFile, testing::ext::TestSize.Level0) 126b1994897Sopenharmony_ci{ 127b1994897Sopenharmony_ci // Create ZIP 128b1994897Sopenharmony_ci auto data = GetEmptyPandaFileBytes(); 129b1994897Sopenharmony_ci int ret; 130b1994897Sopenharmony_ci const char *zip_filename = "__OpenPandaFile__.zip"; 131b1994897Sopenharmony_ci const char *filename1 = ARCHIVE_FILENAME; 132b1994897Sopenharmony_ci const char *filename2 = "classses2.abc"; // just for testing. 133b1994897Sopenharmony_ci ret = CreateOrAddZipPandaFile(&data, zip_filename, filename1, APPEND_STATUS_CREATE, Z_BEST_COMPRESSION); 134b1994897Sopenharmony_ci ASSERT_EQ(ret, 0); 135b1994897Sopenharmony_ci ret = CreateOrAddZipPandaFile(&data, zip_filename, filename2, APPEND_STATUS_ADDINZIP, Z_BEST_COMPRESSION); 136b1994897Sopenharmony_ci ASSERT_EQ(ret, 0); 137b1994897Sopenharmony_ci 138b1994897Sopenharmony_ci // Open from ZIP 139b1994897Sopenharmony_ci auto pf = OpenPandaFile(zip_filename); 140b1994897Sopenharmony_ci EXPECT_NE(pf, nullptr); 141b1994897Sopenharmony_ci EXPECT_STREQ((pf->GetFilename()).c_str(), zip_filename); 142b1994897Sopenharmony_ci 143b1994897Sopenharmony_ci // Open from ZIP with archive_filename 144b1994897Sopenharmony_ci const char *filename3 = "classses3.abc"; // just for testing. 145b1994897Sopenharmony_ci pf = OpenPandaFile(zip_filename, filename3); 146b1994897Sopenharmony_ci EXPECT_NE(pf, nullptr); 147b1994897Sopenharmony_ci 148b1994897Sopenharmony_ci remove(zip_filename); 149b1994897Sopenharmony_ci 150b1994897Sopenharmony_ci ret = CreateOrAddZipPandaFile(&data, zip_filename, filename2, APPEND_STATUS_CREATE, Z_BEST_COMPRESSION); 151b1994897Sopenharmony_ci ASSERT_EQ(ret, 0); 152b1994897Sopenharmony_ci 153b1994897Sopenharmony_ci // Open from ZIP without default archive_filename 154b1994897Sopenharmony_ci pf = OpenPandaFile(zip_filename); 155b1994897Sopenharmony_ci EXPECT_EQ(pf, nullptr); 156b1994897Sopenharmony_ci 157b1994897Sopenharmony_ci remove(zip_filename); 158b1994897Sopenharmony_ci} 159b1994897Sopenharmony_ci 160b1994897Sopenharmony_ciHWTEST(File, OpenPandaFileFromMemory, testing::ext::TestSize.Level0) 161b1994897Sopenharmony_ci{ 162b1994897Sopenharmony_ci auto pf = OpenPandaFileFromMemory(nullptr, -1); 163b1994897Sopenharmony_ci EXPECT_EQ(pf, nullptr); 164b1994897Sopenharmony_ci 165b1994897Sopenharmony_ci pf = OpenPandaFileFromMemory(nullptr, 1U); 166b1994897Sopenharmony_ci EXPECT_EQ(pf, nullptr); 167b1994897Sopenharmony_ci 168b1994897Sopenharmony_ci std::string tag = "ArkTS Code"; 169b1994897Sopenharmony_ci pf = OpenPandaFileFromMemory(nullptr, -1, tag); 170b1994897Sopenharmony_ci EXPECT_EQ(pf, nullptr); 171b1994897Sopenharmony_ci 172b1994897Sopenharmony_ci tag = ""; 173b1994897Sopenharmony_ci pf = OpenPandaFileFromMemory(nullptr, 1U, tag); 174b1994897Sopenharmony_ci EXPECT_EQ(pf, nullptr); 175b1994897Sopenharmony_ci} 176b1994897Sopenharmony_ci 177b1994897Sopenharmony_ciHWTEST(File, OpenPandaFileFromSecureMemory, testing::ext::TestSize.Level0) 178b1994897Sopenharmony_ci{ 179b1994897Sopenharmony_ci auto pf = OpenPandaFileFromSecureMemory(nullptr, -1); 180b1994897Sopenharmony_ci EXPECT_EQ(pf, nullptr); 181b1994897Sopenharmony_ci 182b1994897Sopenharmony_ci pf = OpenPandaFileFromSecureMemory(nullptr, 1U); 183b1994897Sopenharmony_ci EXPECT_EQ(pf, nullptr); 184b1994897Sopenharmony_ci} 185b1994897Sopenharmony_ci 186b1994897Sopenharmony_ciHWTEST(File, OpenPandaFileFromZipNameAnonMem, testing::ext::TestSize.Level0) 187b1994897Sopenharmony_ci{ 188b1994897Sopenharmony_ci // Create ZIP 189b1994897Sopenharmony_ci auto data = GetEmptyPandaFileBytes(); 190b1994897Sopenharmony_ci int ret; 191b1994897Sopenharmony_ci const char *zip_filename = "__OpenPandaFileFromZipNameAnonMem__.zip"; 192b1994897Sopenharmony_ci const char *filename1 = ARCHIVE_FILENAME; 193b1994897Sopenharmony_ci ret = CreateOrAddZipPandaFile(&data, zip_filename, filename1, APPEND_STATUS_CREATE, Z_BEST_COMPRESSION); 194b1994897Sopenharmony_ci ASSERT_EQ(ret, 0); 195b1994897Sopenharmony_ci 196b1994897Sopenharmony_ci // Open from ZIP 197b1994897Sopenharmony_ci auto pf = OpenPandaFile(zip_filename); 198b1994897Sopenharmony_ci EXPECT_NE(pf, nullptr); 199b1994897Sopenharmony_ci EXPECT_STREQ((pf->GetFilename()).c_str(), zip_filename); 200b1994897Sopenharmony_ci ASSERT_TRUE(CheckAnonMemoryName(zip_filename)); 201b1994897Sopenharmony_ci 202b1994897Sopenharmony_ci remove(zip_filename); 203b1994897Sopenharmony_ci} 204b1994897Sopenharmony_ci 205b1994897Sopenharmony_ciHWTEST(File, OpenPandaFileOrZip, testing::ext::TestSize.Level0) 206b1994897Sopenharmony_ci{ 207b1994897Sopenharmony_ci // Create ZIP 208b1994897Sopenharmony_ci auto data = GetEmptyPandaFileBytes(); 209b1994897Sopenharmony_ci int ret; 210b1994897Sopenharmony_ci const char *zip_filename = "__OpenPandaFileOrZip__.zip"; 211b1994897Sopenharmony_ci const char *filename1 = ARCHIVE_FILENAME; 212b1994897Sopenharmony_ci const char *filename2 = "classes2.abc"; // just for testing. 213b1994897Sopenharmony_ci ret = CreateOrAddZipPandaFile(&data, zip_filename, filename1, APPEND_STATUS_CREATE, Z_BEST_COMPRESSION); 214b1994897Sopenharmony_ci ASSERT_EQ(ret, 0); 215b1994897Sopenharmony_ci ret = CreateOrAddZipPandaFile(&data, zip_filename, filename2, APPEND_STATUS_ADDINZIP, Z_BEST_COMPRESSION); 216b1994897Sopenharmony_ci ASSERT_EQ(ret, 0); 217b1994897Sopenharmony_ci 218b1994897Sopenharmony_ci // Open from ZIP 219b1994897Sopenharmony_ci auto pf = OpenPandaFileOrZip(zip_filename); 220b1994897Sopenharmony_ci EXPECT_NE(pf, nullptr); 221b1994897Sopenharmony_ci EXPECT_STREQ((pf->GetFilename()).c_str(), zip_filename); 222b1994897Sopenharmony_ci 223b1994897Sopenharmony_ci const char *zip_filename_with_entry = "__OpenPandaFileOrZip__.zip!/classes.abc"; 224b1994897Sopenharmony_ci auto pf_new = OpenPandaFileOrZip(zip_filename_with_entry); 225b1994897Sopenharmony_ci EXPECT_NE(pf_new, nullptr); 226b1994897Sopenharmony_ci 227b1994897Sopenharmony_ci remove(zip_filename); 228b1994897Sopenharmony_ci} 229b1994897Sopenharmony_ci 230b1994897Sopenharmony_ciHWTEST(File, OpenPandaFileFromZipErrorHandler, testing::ext::TestSize.Level0) 231b1994897Sopenharmony_ci{ 232b1994897Sopenharmony_ci const char *file_name = "test_file_empty.panda"; 233b1994897Sopenharmony_ci { 234b1994897Sopenharmony_ci auto writer = FileWriter(file_name); 235b1994897Sopenharmony_ci ASSERT_TRUE(writer); 236b1994897Sopenharmony_ci } 237b1994897Sopenharmony_ci auto pf = OpenPandaFile(file_name); 238b1994897Sopenharmony_ci EXPECT_EQ(pf, nullptr); 239b1994897Sopenharmony_ci 240b1994897Sopenharmony_ci const char *file_name_zip = "test_file_empty.zip"; 241b1994897Sopenharmony_ci { 242b1994897Sopenharmony_ci auto writer = FileWriter(file_name); 243b1994897Sopenharmony_ci ASSERT_TRUE(writer); 244b1994897Sopenharmony_ci const std::vector<uint8_t> magic = {'P', 'K'}; 245b1994897Sopenharmony_ci ASSERT_TRUE(writer.WriteBytes(magic)); 246b1994897Sopenharmony_ci } 247b1994897Sopenharmony_ci pf = OpenPandaFile(file_name_zip); 248b1994897Sopenharmony_ci EXPECT_EQ(pf, nullptr); 249b1994897Sopenharmony_ci 250b1994897Sopenharmony_ci // Create ZIP 251b1994897Sopenharmony_ci const char *file_name_zip_with_entry = "test_file_with_entry.zip"; 252b1994897Sopenharmony_ci std::vector<uint8_t> data = {}; 253b1994897Sopenharmony_ci int ret = CreateOrAddZipPandaFile(&data, file_name_zip_with_entry, ARCHIVE_FILENAME, 254b1994897Sopenharmony_ci APPEND_STATUS_CREATE, Z_BEST_COMPRESSION); 255b1994897Sopenharmony_ci ASSERT_EQ(ret, 0); 256b1994897Sopenharmony_ci pf = OpenPandaFile(file_name_zip_with_entry); 257b1994897Sopenharmony_ci EXPECT_EQ(pf, nullptr); 258b1994897Sopenharmony_ci 259b1994897Sopenharmony_ci auto fp = fopen(file_name_zip_with_entry, "a"); 260b1994897Sopenharmony_ci EXPECT_NE(fp, nullptr); 261b1994897Sopenharmony_ci const char append_str[] = "error"; 262b1994897Sopenharmony_ci EXPECT_EQ(fwrite(append_str, sizeof(append_str), 1U, fp), 1U); 263b1994897Sopenharmony_ci fclose(fp); 264b1994897Sopenharmony_ci pf = OpenPandaFile(file_name_zip_with_entry); 265b1994897Sopenharmony_ci EXPECT_EQ(pf, nullptr); 266b1994897Sopenharmony_ci 267b1994897Sopenharmony_ci remove(file_name); 268b1994897Sopenharmony_ci remove(file_name_zip); 269b1994897Sopenharmony_ci remove(file_name_zip_with_entry); 270b1994897Sopenharmony_ci} 271b1994897Sopenharmony_ci 272b1994897Sopenharmony_ciHWTEST(File, HandleArchive, testing::ext::TestSize.Level0) 273b1994897Sopenharmony_ci{ 274b1994897Sopenharmony_ci { 275b1994897Sopenharmony_ci ItemContainer container; 276b1994897Sopenharmony_ci auto writer = FileWriter(ARCHIVE_FILENAME); 277b1994897Sopenharmony_ci ASSERT_TRUE(container.Write(&writer)); 278b1994897Sopenharmony_ci ASSERT_TRUE(writer.Align(4U)); // to 4 bytes align 279b1994897Sopenharmony_ci } 280b1994897Sopenharmony_ci 281b1994897Sopenharmony_ci std::vector<uint8_t> data; 282b1994897Sopenharmony_ci { 283b1994897Sopenharmony_ci std::ifstream in(ARCHIVE_FILENAME, std::ios::binary); 284b1994897Sopenharmony_ci data.insert(data.end(), (std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>()); 285b1994897Sopenharmony_ci ASSERT_TRUE(data.size() > 0U && data.size() % 4U == 0U); 286b1994897Sopenharmony_ci } 287b1994897Sopenharmony_ci 288b1994897Sopenharmony_ci // Create ZIP 289b1994897Sopenharmony_ci const char *zip_filename = "__HandleArchive__.zip"; 290b1994897Sopenharmony_ci int ret = CreateOrAddZipPandaFile(&data, zip_filename, ARCHIVE_FILENAME, APPEND_STATUS_CREATE, Z_NO_COMPRESSION); 291b1994897Sopenharmony_ci ASSERT_EQ(ret, 0); 292b1994897Sopenharmony_ci auto pf = OpenPandaFile(zip_filename); 293b1994897Sopenharmony_ci EXPECT_NE(pf, nullptr); 294b1994897Sopenharmony_ci 295b1994897Sopenharmony_ci remove(ARCHIVE_FILENAME); 296b1994897Sopenharmony_ci remove(zip_filename); 297b1994897Sopenharmony_ci} 298b1994897Sopenharmony_ci 299b1994897Sopenharmony_ciHWTEST(File, CheckHeader, testing::ext::TestSize.Level0) 300b1994897Sopenharmony_ci{ 301b1994897Sopenharmony_ci // Write panda file to disk 302b1994897Sopenharmony_ci ItemContainer container; 303b1994897Sopenharmony_ci 304b1994897Sopenharmony_ci auto writer = FileWriter(ABC_FILE); 305b1994897Sopenharmony_ci ASSERT_TRUE(container.Write(&writer)); 306b1994897Sopenharmony_ci 307b1994897Sopenharmony_ci // Read panda file from disk 308b1994897Sopenharmony_ci auto fp = fopen(ABC_FILE, "rb"); 309b1994897Sopenharmony_ci EXPECT_NE(fp, nullptr); 310b1994897Sopenharmony_ci 311b1994897Sopenharmony_ci os::mem::ConstBytePtr ptr = os::mem::MapFile(os::file::File(fileno(fp)), os::mem::MMAP_PROT_READ, 312b1994897Sopenharmony_ci os::mem::MMAP_FLAG_PRIVATE, writer.GetOffset()).ToConst(); 313b1994897Sopenharmony_ci EXPECT_NE(ptr.Get(), nullptr); 314b1994897Sopenharmony_ci EXPECT_TRUE(CheckHeader(ptr, ABC_FILE)); 315b1994897Sopenharmony_ci fclose(fp); 316b1994897Sopenharmony_ci 317b1994897Sopenharmony_ci remove(ABC_FILE); 318b1994897Sopenharmony_ci} 319b1994897Sopenharmony_ci 320b1994897Sopenharmony_ciHWTEST(File, GetMode, testing::ext::TestSize.Level0) 321b1994897Sopenharmony_ci{ 322b1994897Sopenharmony_ci // Write panda file to disk 323b1994897Sopenharmony_ci ItemContainer container; 324b1994897Sopenharmony_ci 325b1994897Sopenharmony_ci auto writer = FileWriter(ABC_FILE); 326b1994897Sopenharmony_ci ASSERT_TRUE(container.Write(&writer)); 327b1994897Sopenharmony_ci 328b1994897Sopenharmony_ci // Read panda file from disk 329b1994897Sopenharmony_ci EXPECT_NE(File::Open(ABC_FILE), nullptr); 330b1994897Sopenharmony_ci EXPECT_EQ(File::Open(ABC_FILE, File::OpenMode::WRITE_ONLY), nullptr); 331b1994897Sopenharmony_ci 332b1994897Sopenharmony_ci remove(ABC_FILE); 333b1994897Sopenharmony_ci} 334b1994897Sopenharmony_ci 335b1994897Sopenharmony_ciHWTEST(File, Open, testing::ext::TestSize.Level0) 336b1994897Sopenharmony_ci{ 337b1994897Sopenharmony_ci EXPECT_EQ(File::Open(ABC_FILE), nullptr); 338b1994897Sopenharmony_ci 339b1994897Sopenharmony_ci auto fp = fopen(ABC_FILE, "w"); 340b1994897Sopenharmony_ci EXPECT_NE(fp, nullptr); 341b1994897Sopenharmony_ci const char write_str[] = "error"; 342b1994897Sopenharmony_ci EXPECT_EQ(fwrite(write_str, sizeof(write_str), 1U, fp), 1U); 343b1994897Sopenharmony_ci fclose(fp); 344b1994897Sopenharmony_ci EXPECT_EQ(File::Open(ABC_FILE), nullptr); 345b1994897Sopenharmony_ci EXPECT_EQ(File::Open(ABC_FILE, File::OpenMode::WRITE_ONLY), nullptr); 346b1994897Sopenharmony_ci 347b1994897Sopenharmony_ci remove(ABC_FILE); 348b1994897Sopenharmony_ci} 349b1994897Sopenharmony_ci 350b1994897Sopenharmony_ciHWTEST(File, OpenUncompressedArchive, testing::ext::TestSize.Level0) 351b1994897Sopenharmony_ci{ 352b1994897Sopenharmony_ci // Invalid FD 353b1994897Sopenharmony_ci EXPECT_EQ(File::OpenUncompressedArchive(-1, ABC_FILE, 0U, 0U), nullptr); 354b1994897Sopenharmony_ci 355b1994897Sopenharmony_ci // Invalid Size 356b1994897Sopenharmony_ci EXPECT_EQ(File::OpenUncompressedArchive(1, ABC_FILE, 0U, 0U), nullptr); 357b1994897Sopenharmony_ci 358b1994897Sopenharmony_ci // Invalid Max Size 359b1994897Sopenharmony_ci EXPECT_EQ(File::OpenUncompressedArchive(1, ABC_FILE, -1, 0U), nullptr); 360b1994897Sopenharmony_ci 361b1994897Sopenharmony_ci // Invalid ABC File 362b1994897Sopenharmony_ci auto data = GetEmptyPandaFileBytes(); 363b1994897Sopenharmony_ci auto fp = fopen(ARCHIVE_FILENAME, "w+"); 364b1994897Sopenharmony_ci EXPECT_NE(fp, nullptr); 365b1994897Sopenharmony_ci data[0] = 0U; 366b1994897Sopenharmony_ci EXPECT_EQ(fwrite(data.data(), sizeof(uint8_t), data.size(), fp), data.size()); 367b1994897Sopenharmony_ci (void)fseek(fp, 0, SEEK_SET); 368b1994897Sopenharmony_ci EXPECT_EQ(File::OpenUncompressedArchive(fileno(fp), ARCHIVE_FILENAME, sizeof(File::Header), 0U), nullptr); 369b1994897Sopenharmony_ci fclose(fp); 370b1994897Sopenharmony_ci 371b1994897Sopenharmony_ci remove(ABC_FILE); 372b1994897Sopenharmony_ci} 373b1994897Sopenharmony_ci 374b1994897Sopenharmony_ciHWTEST(File, CheckSecureMem, testing::ext::TestSize.Level0) 375b1994897Sopenharmony_ci{ 376b1994897Sopenharmony_ci uint8_t *data1 = nullptr; 377b1994897Sopenharmony_ci uintptr_t value1 = reinterpret_cast<uintptr_t>(data1); 378b1994897Sopenharmony_ci bool res1 = CheckSecureMem(value1, 0); // 0: size 379b1994897Sopenharmony_ci EXPECT_TRUE(res1); 380b1994897Sopenharmony_ci 381b1994897Sopenharmony_ci int data2 = 256; 382b1994897Sopenharmony_ci uintptr_t value2 = reinterpret_cast<uintptr_t>(&data2); 383b1994897Sopenharmony_ci bool res2 = CheckSecureMem(value2, 1000); 384b1994897Sopenharmony_ci EXPECT_TRUE(res2); 385b1994897Sopenharmony_ci 386b1994897Sopenharmony_ci int data3 = 41235235; 387b1994897Sopenharmony_ci uintptr_t value3 = reinterpret_cast<uintptr_t>(&data3); 388b1994897Sopenharmony_ci bool res3 = CheckSecureMem(value3, static_cast<size_t>(243423423523)); 389b1994897Sopenharmony_ci EXPECT_TRUE(res3); 390b1994897Sopenharmony_ci} 391b1994897Sopenharmony_ci 392b1994897Sopenharmony_ciHWTEST(File, CheckLiteralArray, testing::ext::TestSize.Level0) 393b1994897Sopenharmony_ci{ 394b1994897Sopenharmony_ci // Write panda file to disk 395b1994897Sopenharmony_ci ItemContainer container; 396b1994897Sopenharmony_ci 397b1994897Sopenharmony_ci auto writer = FileWriter(ABC_FILE); 398b1994897Sopenharmony_ci ASSERT_TRUE(container.Write(&writer)); 399b1994897Sopenharmony_ci 400b1994897Sopenharmony_ci // Read panda file from disk 401b1994897Sopenharmony_ci auto fp = fopen(ABC_FILE, "rb"); 402b1994897Sopenharmony_ci EXPECT_NE(fp, nullptr); 403b1994897Sopenharmony_ci 404b1994897Sopenharmony_ci os::mem::ConstBytePtr ptr = 405b1994897Sopenharmony_ci os::mem::MapFile(os::file::File(fileno(fp)), os::mem::MMAP_PROT_READ | os::mem::MMAP_PROT_WRITE, 406b1994897Sopenharmony_ci os::mem::MMAP_FLAG_PRIVATE, writer.GetOffset()) 407b1994897Sopenharmony_ci .ToConst(); 408b1994897Sopenharmony_ci EXPECT_NE(ptr.Get(), nullptr); 409b1994897Sopenharmony_ci EXPECT_TRUE(CheckHeader(ptr, ABC_FILE)); 410b1994897Sopenharmony_ci 411b1994897Sopenharmony_ci auto header = reinterpret_cast<File::Header *>(reinterpret_cast<uintptr_t>(ptr.Get())); 412b1994897Sopenharmony_ci auto num_literalarrays = header->num_literalarrays; 413b1994897Sopenharmony_ci uint32_t i = 10; 414b1994897Sopenharmony_ci header->num_literalarrays = i; 415b1994897Sopenharmony_ci EXPECT_FALSE(CheckHeader(ptr, ABC_FILE)); 416b1994897Sopenharmony_ci header->num_literalarrays = num_literalarrays; 417b1994897Sopenharmony_ci header->literalarray_idx_off = i; 418b1994897Sopenharmony_ci EXPECT_FALSE(CheckHeader(ptr, ABC_FILE)); 419b1994897Sopenharmony_ci fclose(fp); 420b1994897Sopenharmony_ci 421b1994897Sopenharmony_ci remove(ABC_FILE); 422b1994897Sopenharmony_ci} 423b1994897Sopenharmony_ci 424b1994897Sopenharmony_ci} // namespace panda::panda_file::test 425