xref: /aosp_15_r20/external/bcc/tests/cc/test_zip.cc (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker /*
2*387f9dfdSAndroid Build Coastguard Worker  * Copyright (c) Meta Platforms, Inc. and affiliates.
3*387f9dfdSAndroid Build Coastguard Worker  *
4*387f9dfdSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*387f9dfdSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*387f9dfdSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*387f9dfdSAndroid Build Coastguard Worker  *
8*387f9dfdSAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
9*387f9dfdSAndroid Build Coastguard Worker  *
10*387f9dfdSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*387f9dfdSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*387f9dfdSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*387f9dfdSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*387f9dfdSAndroid Build Coastguard Worker  * limitations under the License.
15*387f9dfdSAndroid Build Coastguard Worker  */
16*387f9dfdSAndroid Build Coastguard Worker 
17*387f9dfdSAndroid Build Coastguard Worker #include <cstring>
18*387f9dfdSAndroid Build Coastguard Worker 
19*387f9dfdSAndroid Build Coastguard Worker #include "bcc_zip.h"
20*387f9dfdSAndroid Build Coastguard Worker #include "catch.hpp"
21*387f9dfdSAndroid Build Coastguard Worker 
22*387f9dfdSAndroid Build Coastguard Worker #define LIB_ENTRY_NAME "libdebuginfo_test_lib.so"
23*387f9dfdSAndroid Build Coastguard Worker #define ENTRY_IN_SUBDIR_NAME "zip_subdir/file.txt"
24*387f9dfdSAndroid Build Coastguard Worker #define NOT_AN_ARCHIVE_PATH CMAKE_CURRENT_BINARY_DIR "/dummy_proc_map.txt"
25*387f9dfdSAndroid Build Coastguard Worker #define TEST_ARCHIVE_PATH CMAKE_CURRENT_BINARY_DIR "/archive.zip"
26*387f9dfdSAndroid Build Coastguard Worker 
27*387f9dfdSAndroid Build Coastguard Worker namespace {
28*387f9dfdSAndroid Build Coastguard Worker 
require_entry_name_is(const bcc_zip_entry & entry,const char * name)29*387f9dfdSAndroid Build Coastguard Worker void require_entry_name_is(const bcc_zip_entry& entry, const char* name) {
30*387f9dfdSAndroid Build Coastguard Worker   REQUIRE(entry.name_length == strlen(name));
31*387f9dfdSAndroid Build Coastguard Worker   REQUIRE(memcmp(entry.name, name, strlen(name)) == 0);
32*387f9dfdSAndroid Build Coastguard Worker }
33*387f9dfdSAndroid Build Coastguard Worker 
get_required_entry(bcc_zip_archive * archive,const char * asset_name)34*387f9dfdSAndroid Build Coastguard Worker bcc_zip_entry get_required_entry(bcc_zip_archive* archive,
35*387f9dfdSAndroid Build Coastguard Worker                                  const char* asset_name) {
36*387f9dfdSAndroid Build Coastguard Worker   bcc_zip_entry out;
37*387f9dfdSAndroid Build Coastguard Worker   REQUIRE(bcc_zip_archive_find_entry(archive, asset_name, &out) == 0);
38*387f9dfdSAndroid Build Coastguard Worker   require_entry_name_is(out, asset_name);
39*387f9dfdSAndroid Build Coastguard Worker   return out;
40*387f9dfdSAndroid Build Coastguard Worker }
41*387f9dfdSAndroid Build Coastguard Worker 
get_uncompressed_data(const bcc_zip_entry & entry)42*387f9dfdSAndroid Build Coastguard Worker const void* get_uncompressed_data(const bcc_zip_entry& entry) {
43*387f9dfdSAndroid Build Coastguard Worker   REQUIRE(entry.compression == 0);
44*387f9dfdSAndroid Build Coastguard Worker   REQUIRE(entry.data_offset > 0);
45*387f9dfdSAndroid Build Coastguard Worker   REQUIRE(entry.data != nullptr);
46*387f9dfdSAndroid Build Coastguard Worker   return entry.data;
47*387f9dfdSAndroid Build Coastguard Worker }
48*387f9dfdSAndroid Build Coastguard Worker 
49*387f9dfdSAndroid Build Coastguard Worker }  // namespace
50*387f9dfdSAndroid Build Coastguard Worker 
51*387f9dfdSAndroid Build Coastguard Worker TEST_CASE("returns error for non-zip files", "[zip]") {
52*387f9dfdSAndroid Build Coastguard Worker   bcc_zip_archive* archive = bcc_zip_archive_open(NOT_AN_ARCHIVE_PATH);
53*387f9dfdSAndroid Build Coastguard Worker   REQUIRE(archive == nullptr);
54*387f9dfdSAndroid Build Coastguard Worker }
55*387f9dfdSAndroid Build Coastguard Worker 
56*387f9dfdSAndroid Build Coastguard Worker TEST_CASE("finds entries in a zip archive by name", "[zip]") {
57*387f9dfdSAndroid Build Coastguard Worker   bcc_zip_archive* archive = bcc_zip_archive_open(TEST_ARCHIVE_PATH);
58*387f9dfdSAndroid Build Coastguard Worker   REQUIRE(archive != nullptr);
59*387f9dfdSAndroid Build Coastguard Worker 
60*387f9dfdSAndroid Build Coastguard Worker   bcc_zip_entry entry = get_required_entry(archive, LIB_ENTRY_NAME);
61*387f9dfdSAndroid Build Coastguard Worker   REQUIRE(memcmp(get_uncompressed_data(entry),
62*387f9dfdSAndroid Build Coastguard Worker                  "\x7f"
63*387f9dfdSAndroid Build Coastguard Worker                  "ELF",
64*387f9dfdSAndroid Build Coastguard Worker                  4) == 0);
65*387f9dfdSAndroid Build Coastguard Worker 
66*387f9dfdSAndroid Build Coastguard Worker   entry = get_required_entry(archive, ENTRY_IN_SUBDIR_NAME);
67*387f9dfdSAndroid Build Coastguard Worker   REQUIRE(memcmp(get_uncompressed_data(entry), "This is a text file\n", 20) ==
68*387f9dfdSAndroid Build Coastguard Worker           0);
69*387f9dfdSAndroid Build Coastguard Worker 
70*387f9dfdSAndroid Build Coastguard Worker   REQUIRE(bcc_zip_archive_find_entry(archive, "missing", &entry) == -1);
71*387f9dfdSAndroid Build Coastguard Worker 
72*387f9dfdSAndroid Build Coastguard Worker   bcc_zip_archive_close(archive);
73*387f9dfdSAndroid Build Coastguard Worker }
74*387f9dfdSAndroid Build Coastguard Worker 
75*387f9dfdSAndroid Build Coastguard Worker TEST_CASE("finds entries in a zip archive by offset", "[zip]") {
76*387f9dfdSAndroid Build Coastguard Worker   bcc_zip_archive* archive = bcc_zip_archive_open(TEST_ARCHIVE_PATH);
77*387f9dfdSAndroid Build Coastguard Worker   REQUIRE(archive != nullptr);
78*387f9dfdSAndroid Build Coastguard Worker 
79*387f9dfdSAndroid Build Coastguard Worker   bcc_zip_entry entry;
80*387f9dfdSAndroid Build Coastguard Worker   REQUIRE(bcc_zip_archive_find_entry_at_offset(archive, 100, &entry) == 0);
81*387f9dfdSAndroid Build Coastguard Worker   require_entry_name_is(entry, LIB_ENTRY_NAME);
82*387f9dfdSAndroid Build Coastguard Worker   REQUIRE(memcmp(get_uncompressed_data(entry),
83*387f9dfdSAndroid Build Coastguard Worker                  "\x7f"
84*387f9dfdSAndroid Build Coastguard Worker                  "ELF",
85*387f9dfdSAndroid Build Coastguard Worker                  4) == 0);
86*387f9dfdSAndroid Build Coastguard Worker 
87*387f9dfdSAndroid Build Coastguard Worker   REQUIRE(bcc_zip_archive_find_entry_at_offset(archive, 100000, &entry) == -1);
88*387f9dfdSAndroid Build Coastguard Worker 
89*387f9dfdSAndroid Build Coastguard Worker   bcc_zip_archive_close(archive);
90*387f9dfdSAndroid Build Coastguard Worker }
91*387f9dfdSAndroid Build Coastguard Worker 
92*387f9dfdSAndroid Build Coastguard Worker TEST_CASE("open zip archive and finds an entry", "[zip]") {
93*387f9dfdSAndroid Build Coastguard Worker   bcc_zip_entry entry;
94*387f9dfdSAndroid Build Coastguard Worker   bcc_zip_archive* archive = bcc_zip_archive_open_and_find(
95*387f9dfdSAndroid Build Coastguard Worker       TEST_ARCHIVE_PATH "!/" LIB_ENTRY_NAME, &entry);
96*387f9dfdSAndroid Build Coastguard Worker   REQUIRE(archive != nullptr);
97*387f9dfdSAndroid Build Coastguard Worker   require_entry_name_is(entry, LIB_ENTRY_NAME);
98*387f9dfdSAndroid Build Coastguard Worker   REQUIRE(memcmp(get_uncompressed_data(entry),
99*387f9dfdSAndroid Build Coastguard Worker                  "\x7f"
100*387f9dfdSAndroid Build Coastguard Worker                  "ELF",
101*387f9dfdSAndroid Build Coastguard Worker                  4) == 0);
102*387f9dfdSAndroid Build Coastguard Worker   bcc_zip_archive_close(archive);
103*387f9dfdSAndroid Build Coastguard Worker 
104*387f9dfdSAndroid Build Coastguard Worker   archive = bcc_zip_archive_open_and_find(
105*387f9dfdSAndroid Build Coastguard Worker       TEST_ARCHIVE_PATH "!/" ENTRY_IN_SUBDIR_NAME, &entry);
106*387f9dfdSAndroid Build Coastguard Worker   REQUIRE(archive != nullptr);
107*387f9dfdSAndroid Build Coastguard Worker   require_entry_name_is(entry, ENTRY_IN_SUBDIR_NAME);
108*387f9dfdSAndroid Build Coastguard Worker   REQUIRE(memcmp(get_uncompressed_data(entry), "This is a text file\n", 20) ==
109*387f9dfdSAndroid Build Coastguard Worker           0);
110*387f9dfdSAndroid Build Coastguard Worker   bcc_zip_archive_close(archive);
111*387f9dfdSAndroid Build Coastguard Worker 
112*387f9dfdSAndroid Build Coastguard Worker   archive =
113*387f9dfdSAndroid Build Coastguard Worker       bcc_zip_archive_open_and_find(TEST_ARCHIVE_PATH "!/NOT_FOUND", &entry);
114*387f9dfdSAndroid Build Coastguard Worker   REQUIRE(archive == nullptr);
115*387f9dfdSAndroid Build Coastguard Worker }
116