xref: /aosp_15_r20/art/libdexfile/external/dex_file_supp_test.cc (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #include <sys/types.h>
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker #include <memory>
20*795d594fSAndroid Build Coastguard Worker #include <string>
21*795d594fSAndroid Build Coastguard Worker #include <string_view>
22*795d594fSAndroid Build Coastguard Worker 
23*795d594fSAndroid Build Coastguard Worker #include <android-base/file.h>
24*795d594fSAndroid Build Coastguard Worker #include <dex/dex_file.h>
25*795d594fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
26*795d594fSAndroid Build Coastguard Worker 
27*795d594fSAndroid Build Coastguard Worker #include "art_api/dex_file_support.h"
28*795d594fSAndroid Build Coastguard Worker #include "dex_file_test_data.h"
29*795d594fSAndroid Build Coastguard Worker 
30*795d594fSAndroid Build Coastguard Worker namespace art_api {
31*795d594fSAndroid Build Coastguard Worker namespace dex {
32*795d594fSAndroid Build Coastguard Worker 
TEST(DexFileTest,create)33*795d594fSAndroid Build Coastguard Worker TEST(DexFileTest, create) {
34*795d594fSAndroid Build Coastguard Worker   size_t size = sizeof(kDexData);
35*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<DexFile> dex_file;
36*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(DexFile::Create(kDexData, size, &size, "", &dex_file).Ok());
37*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(size, sizeof(kDexData));
38*795d594fSAndroid Build Coastguard Worker   EXPECT_NE(dex_file, nullptr);
39*795d594fSAndroid Build Coastguard Worker }
40*795d594fSAndroid Build Coastguard Worker 
TEST(DexFileTest,create_header_too_small)41*795d594fSAndroid Build Coastguard Worker TEST(DexFileTest, create_header_too_small) {
42*795d594fSAndroid Build Coastguard Worker   size_t size = sizeof(art::DexFile::Header) - 1;
43*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<DexFile> dex_file;
44*795d594fSAndroid Build Coastguard Worker   DexFile::Error error = DexFile::Create(kDexData, size, &size, "", &dex_file);
45*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(error.Ok());
46*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(error.Code(), ADEXFILE_ERROR_NOT_ENOUGH_DATA);
47*795d594fSAndroid Build Coastguard Worker   EXPECT_STREQ(error.ToString(), "Not enough data. Incomplete dex file.");
48*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(size, sizeof(art::DexFile::Header));
49*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(dex_file, nullptr);
50*795d594fSAndroid Build Coastguard Worker }
51*795d594fSAndroid Build Coastguard Worker 
TEST(DexFileTest,create_file_too_small)52*795d594fSAndroid Build Coastguard Worker TEST(DexFileTest, create_file_too_small) {
53*795d594fSAndroid Build Coastguard Worker   size_t size = sizeof(art::DexFile::Header);
54*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<DexFile> dex_file;
55*795d594fSAndroid Build Coastguard Worker   DexFile::Error error = DexFile::Create(kDexData, size, &size, "", &dex_file);
56*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(error.Ok());
57*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(error.Code(), ADEXFILE_ERROR_NOT_ENOUGH_DATA);
58*795d594fSAndroid Build Coastguard Worker   EXPECT_STREQ(error.ToString(), "Not enough data. Incomplete dex file.");
59*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(size, sizeof(kDexData));
60*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(dex_file, nullptr);
61*795d594fSAndroid Build Coastguard Worker }
62*795d594fSAndroid Build Coastguard Worker 
GetTestDexData()63*795d594fSAndroid Build Coastguard Worker static std::unique_ptr<DexFile> GetTestDexData() {
64*795d594fSAndroid Build Coastguard Worker   size_t size = sizeof(kDexData);
65*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<DexFile> dex_file;
66*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(DexFile::Create(kDexData, size, &size, "", &dex_file).Ok());
67*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(size, sizeof(kDexData));
68*795d594fSAndroid Build Coastguard Worker   EXPECT_NE(dex_file, nullptr);
69*795d594fSAndroid Build Coastguard Worker   return dex_file;
70*795d594fSAndroid Build Coastguard Worker }
71*795d594fSAndroid Build Coastguard Worker 
TEST(DexFileTest,findMethodAtOffset)72*795d594fSAndroid Build Coastguard Worker TEST(DexFileTest, findMethodAtOffset) {
73*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<DexFile> dex_file = GetTestDexData();
74*795d594fSAndroid Build Coastguard Worker   ASSERT_NE(dex_file, nullptr);
75*795d594fSAndroid Build Coastguard Worker 
76*795d594fSAndroid Build Coastguard Worker   bool found_init = false;
77*795d594fSAndroid Build Coastguard Worker   auto check_init = [&](const DexFile::Method& method) {
78*795d594fSAndroid Build Coastguard Worker     size_t size;
79*795d594fSAndroid Build Coastguard Worker     size_t offset = method.GetCodeOffset(&size);
80*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(offset, 0x100u);
81*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(size, 8u);
82*795d594fSAndroid Build Coastguard Worker     EXPECT_STREQ(method.GetName(), "<init>");
83*795d594fSAndroid Build Coastguard Worker     EXPECT_STREQ(method.GetQualifiedName(), "Main.<init>");
84*795d594fSAndroid Build Coastguard Worker     EXPECT_STREQ(method.GetQualifiedName(true), "void Main.<init>()");
85*795d594fSAndroid Build Coastguard Worker     EXPECT_STREQ(method.GetClassDescriptor(), "LMain;");
86*795d594fSAndroid Build Coastguard Worker     found_init = true;
87*795d594fSAndroid Build Coastguard Worker   };
88*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(dex_file->FindMethodAtOffset(0x102, check_init), 1u);
89*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(found_init);
90*795d594fSAndroid Build Coastguard Worker 
91*795d594fSAndroid Build Coastguard Worker   bool found_main = false;
92*795d594fSAndroid Build Coastguard Worker   auto check_main = [&](const DexFile::Method& method) {
93*795d594fSAndroid Build Coastguard Worker     size_t size;
94*795d594fSAndroid Build Coastguard Worker     size_t offset = method.GetCodeOffset(&size);
95*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(offset, 0x118u);
96*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(size, 2u);
97*795d594fSAndroid Build Coastguard Worker     EXPECT_STREQ(method.GetName(), "main");
98*795d594fSAndroid Build Coastguard Worker     EXPECT_STREQ(method.GetQualifiedName(), "Main.main");
99*795d594fSAndroid Build Coastguard Worker     EXPECT_STREQ(method.GetQualifiedName(true), "void Main.main(java.lang.String[])");
100*795d594fSAndroid Build Coastguard Worker     EXPECT_STREQ(method.GetClassDescriptor(), "LMain;");
101*795d594fSAndroid Build Coastguard Worker     found_main = true;
102*795d594fSAndroid Build Coastguard Worker   };
103*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(dex_file->FindMethodAtOffset(0x118, check_main), 1u);
104*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(found_main);
105*795d594fSAndroid Build Coastguard Worker }
106*795d594fSAndroid Build Coastguard Worker 
TEST(DexFileTest,get_method_info_for_offset_boundaries)107*795d594fSAndroid Build Coastguard Worker TEST(DexFileTest, get_method_info_for_offset_boundaries) {
108*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<DexFile> dex_file = GetTestDexData();
109*795d594fSAndroid Build Coastguard Worker   ASSERT_NE(dex_file, nullptr);
110*795d594fSAndroid Build Coastguard Worker 
111*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(dex_file->FindMethodAtOffset(0x99, [](auto){}), 0);
112*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(dex_file->FindMethodAtOffset(0x100, [](auto){}), 1);
113*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(dex_file->FindMethodAtOffset(0x107, [](auto){}), 1);
114*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(dex_file->FindMethodAtOffset(0x108, [](auto){}), 0);
115*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(dex_file->FindMethodAtOffset(0x100000, [](auto){}), 0);
116*795d594fSAndroid Build Coastguard Worker }
117*795d594fSAndroid Build Coastguard Worker 
TEST(DexFileTest,get_all_method_infos_without_signature)118*795d594fSAndroid Build Coastguard Worker TEST(DexFileTest, get_all_method_infos_without_signature) {
119*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<DexFile> dex_file = GetTestDexData();
120*795d594fSAndroid Build Coastguard Worker   ASSERT_NE(dex_file, nullptr);
121*795d594fSAndroid Build Coastguard Worker 
122*795d594fSAndroid Build Coastguard Worker   std::vector<std::string> names;
123*795d594fSAndroid Build Coastguard Worker   auto add = [&](const DexFile::Method& method) { names.push_back(method.GetQualifiedName()); };
124*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(dex_file->ForEachMethod(add), 2u);
125*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(names, std::vector<std::string>({"Main.<init>", "Main.main"}));
126*795d594fSAndroid Build Coastguard Worker }
127*795d594fSAndroid Build Coastguard Worker 
128*795d594fSAndroid Build Coastguard Worker }  // namespace dex
129*795d594fSAndroid Build Coastguard Worker }  // namespace art_api
130