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