xref: /aosp_15_r20/art/libdexfile/dex/dex_file_loader_test.cc (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2011 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 "dex_file.h"
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker #include <memory>
20*795d594fSAndroid Build Coastguard Worker 
21*795d594fSAndroid Build Coastguard Worker #include "base64_test_util.h"
22*795d594fSAndroid Build Coastguard Worker #include "code_item_accessors-inl.h"
23*795d594fSAndroid Build Coastguard Worker #include "descriptors_names.h"
24*795d594fSAndroid Build Coastguard Worker #include "dex_file-inl.h"
25*795d594fSAndroid Build Coastguard Worker #include "dex_file_loader.h"
26*795d594fSAndroid Build Coastguard Worker #include "gtest/gtest.h"
27*795d594fSAndroid Build Coastguard Worker 
28*795d594fSAndroid Build Coastguard Worker namespace art {
29*795d594fSAndroid Build Coastguard Worker 
30*795d594fSAndroid Build Coastguard Worker class DexFileLoaderTest : public testing::Test {};
31*795d594fSAndroid Build Coastguard Worker 
32*795d594fSAndroid Build Coastguard Worker static constexpr char kLocationString[] = "/a/dex/file/location";
33*795d594fSAndroid Build Coastguard Worker 
DecodeBase64Vec(const char * src)34*795d594fSAndroid Build Coastguard Worker static inline std::vector<uint8_t> DecodeBase64Vec(const char* src) {
35*795d594fSAndroid Build Coastguard Worker   std::vector<uint8_t> res;
36*795d594fSAndroid Build Coastguard Worker   size_t size;
37*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<uint8_t[]> data(DecodeBase64(src, &size));
38*795d594fSAndroid Build Coastguard Worker   res.resize(size);
39*795d594fSAndroid Build Coastguard Worker   memcpy(res.data(), data.get(), size);
40*795d594fSAndroid Build Coastguard Worker   return res;
41*795d594fSAndroid Build Coastguard Worker }
42*795d594fSAndroid Build Coastguard Worker 
43*795d594fSAndroid Build Coastguard Worker // Although this is the same content logically as the Nested test dex,
44*795d594fSAndroid Build Coastguard Worker // the DexFileHeader test is sensitive to subtle changes in the
45*795d594fSAndroid Build Coastguard Worker // contents due to the checksum etc, so we embed the exact input here.
46*795d594fSAndroid Build Coastguard Worker //
47*795d594fSAndroid Build Coastguard Worker // class Nested {
48*795d594fSAndroid Build Coastguard Worker //     class Inner {
49*795d594fSAndroid Build Coastguard Worker //     }
50*795d594fSAndroid Build Coastguard Worker // }
51*795d594fSAndroid Build Coastguard Worker static const char kRawDex[] =
52*795d594fSAndroid Build Coastguard Worker   "ZGV4CjAzNQAQedgAe7gM1B/WHsWJ6L7lGAISGC7yjD2IAwAAcAAAAHhWNBIAAAAAAAAAAMQCAAAP"
53*795d594fSAndroid Build Coastguard Worker   "AAAAcAAAAAcAAACsAAAAAgAAAMgAAAABAAAA4AAAAAMAAADoAAAAAgAAAAABAABIAgAAQAEAAK4B"
54*795d594fSAndroid Build Coastguard Worker   "AAC2AQAAvQEAAM0BAADXAQAA+wEAABsCAAA+AgAAUgIAAF8CAABiAgAAZgIAAHMCAAB5AgAAgQIA"
55*795d594fSAndroid Build Coastguard Worker   "AAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAkAAAAJAAAABgAAAAAAAAAKAAAABgAAAKgBAAAAAAEA"
56*795d594fSAndroid Build Coastguard Worker   "DQAAAAAAAQAAAAAAAQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAIAAAAiAEAAKsCAAAA"
57*795d594fSAndroid Build Coastguard Worker   "AAAAAQAAAAAAAAAFAAAAAAAAAAgAAACYAQAAuAIAAAAAAAACAAAAlAIAAJoCAAABAAAAowIAAAIA"
58*795d594fSAndroid Build Coastguard Worker   "AgABAAAAiAIAAAYAAABbAQAAcBACAAAADgABAAEAAQAAAI4CAAAEAAAAcBACAAAADgBAAQAAAAAA"
59*795d594fSAndroid Build Coastguard Worker   "AAAAAAAAAAAATAEAAAAAAAAAAAAAAAAAAAEAAAABAAY8aW5pdD4ABUlubmVyAA5MTmVzdGVkJElu"
60*795d594fSAndroid Build Coastguard Worker   "bmVyOwAITE5lc3RlZDsAIkxkYWx2aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdDbGFzczsAHkxkYWx2"
61*795d594fSAndroid Build Coastguard Worker   "aWsvYW5ub3RhdGlvbi9Jbm5lckNsYXNzOwAhTGRhbHZpay9hbm5vdGF0aW9uL01lbWJlckNsYXNz"
62*795d594fSAndroid Build Coastguard Worker   "ZXM7ABJMamF2YS9sYW5nL09iamVjdDsAC05lc3RlZC5qYXZhAAFWAAJWTAALYWNjZXNzRmxhZ3MA"
63*795d594fSAndroid Build Coastguard Worker   "BG5hbWUABnRoaXMkMAAFdmFsdWUAAgEABw4AAQAHDjwAAgIBDhgBAgMCCwQADBcBAgQBDhwBGAAA"
64*795d594fSAndroid Build Coastguard Worker   "AQEAAJAgAICABNQCAAABAAGAgATwAgAAEAAAAAAAAAABAAAAAAAAAAEAAAAPAAAAcAAAAAIAAAAH"
65*795d594fSAndroid Build Coastguard Worker   "AAAArAAAAAMAAAACAAAAyAAAAAQAAAABAAAA4AAAAAUAAAADAAAA6AAAAAYAAAACAAAAAAEAAAMQ"
66*795d594fSAndroid Build Coastguard Worker   "AAACAAAAQAEAAAEgAAACAAAAVAEAAAYgAAACAAAAiAEAAAEQAAABAAAAqAEAAAIgAAAPAAAArgEA"
67*795d594fSAndroid Build Coastguard Worker   "AAMgAAACAAAAiAIAAAQgAAADAAAAlAIAAAAgAAACAAAAqwIAAAAQAAABAAAAxAIAAA==";
68*795d594fSAndroid Build Coastguard Worker 
69*795d594fSAndroid Build Coastguard Worker // kRawDex{38,39,40,41} are dex'ed versions of the following Java source :
70*795d594fSAndroid Build Coastguard Worker //
71*795d594fSAndroid Build Coastguard Worker // public class Main {
72*795d594fSAndroid Build Coastguard Worker //     public static void main(String[] foo) {
73*795d594fSAndroid Build Coastguard Worker //     }
74*795d594fSAndroid Build Coastguard Worker // }
75*795d594fSAndroid Build Coastguard Worker //
76*795d594fSAndroid Build Coastguard Worker // The dex file was manually edited to change its dex version code to 38
77*795d594fSAndroid Build Coastguard Worker // or 39, respectively.
78*795d594fSAndroid Build Coastguard Worker static const char kRawDex38[] =
79*795d594fSAndroid Build Coastguard Worker   "ZGV4CjAzOAC4OovJlJ1089ikzK6asMf/f8qp3Kve5VsgAgAAcAAAAHhWNBIAAAAAAAAAAIwBAAAI"
80*795d594fSAndroid Build Coastguard Worker   "AAAAcAAAAAQAAACQAAAAAgAAAKAAAAAAAAAAAAAAAAMAAAC4AAAAAQAAANAAAAAwAQAA8AAAACIB"
81*795d594fSAndroid Build Coastguard Worker   "AAAqAQAAMgEAAEYBAABRAQAAVAEAAFgBAABtAQAAAQAAAAIAAAAEAAAABgAAAAQAAAACAAAAAAAA"
82*795d594fSAndroid Build Coastguard Worker   "AAUAAAACAAAAHAEAAAAAAAAAAAAAAAABAAcAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAAAADAAAA"
83*795d594fSAndroid Build Coastguard Worker   "AAAAAH4BAAAAAAAAAQABAAEAAABzAQAABAAAAHAQAgAAAA4AAQABAAAAAAB4AQAAAQAAAA4AAAAB"
84*795d594fSAndroid Build Coastguard Worker   "AAAAAwAGPGluaXQ+AAZMTWFpbjsAEkxqYXZhL2xhbmcvT2JqZWN0OwAJTWFpbi5qYXZhAAFWAAJW"
85*795d594fSAndroid Build Coastguard Worker   "TAATW0xqYXZhL2xhbmcvU3RyaW5nOwAEbWFpbgABAAcOAAMBAAcOAAAAAgAAgYAE8AEBCYgCDAAA"
86*795d594fSAndroid Build Coastguard Worker   "AAAAAAABAAAAAAAAAAEAAAAIAAAAcAAAAAIAAAAEAAAAkAAAAAMAAAACAAAAoAAAAAUAAAADAAAA"
87*795d594fSAndroid Build Coastguard Worker   "uAAAAAYAAAABAAAA0AAAAAEgAAACAAAA8AAAAAEQAAABAAAAHAEAAAIgAAAIAAAAIgEAAAMgAAAC"
88*795d594fSAndroid Build Coastguard Worker   "AAAAcwEAAAAgAAABAAAAfgEAAAAQAAABAAAAjAEAAA==";
89*795d594fSAndroid Build Coastguard Worker 
90*795d594fSAndroid Build Coastguard Worker static const char kRawDex39[] =
91*795d594fSAndroid Build Coastguard Worker   "ZGV4CjAzOQC4OovJlJ1089ikzK6asMf/f8qp3Kve5VsgAgAAcAAAAHhWNBIAAAAAAAAAAIwBAAAI"
92*795d594fSAndroid Build Coastguard Worker   "AAAAcAAAAAQAAACQAAAAAgAAAKAAAAAAAAAAAAAAAAMAAAC4AAAAAQAAANAAAAAwAQAA8AAAACIB"
93*795d594fSAndroid Build Coastguard Worker   "AAAqAQAAMgEAAEYBAABRAQAAVAEAAFgBAABtAQAAAQAAAAIAAAAEAAAABgAAAAQAAAACAAAAAAAA"
94*795d594fSAndroid Build Coastguard Worker   "AAUAAAACAAAAHAEAAAAAAAAAAAAAAAABAAcAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAAAADAAAA"
95*795d594fSAndroid Build Coastguard Worker   "AAAAAH4BAAAAAAAAAQABAAEAAABzAQAABAAAAHAQAgAAAA4AAQABAAAAAAB4AQAAAQAAAA4AAAAB"
96*795d594fSAndroid Build Coastguard Worker   "AAAAAwAGPGluaXQ+AAZMTWFpbjsAEkxqYXZhL2xhbmcvT2JqZWN0OwAJTWFpbi5qYXZhAAFWAAJW"
97*795d594fSAndroid Build Coastguard Worker   "TAATW0xqYXZhL2xhbmcvU3RyaW5nOwAEbWFpbgABAAcOAAMBAAcOAAAAAgAAgYAE8AEBCYgCDAAA"
98*795d594fSAndroid Build Coastguard Worker   "AAAAAAABAAAAAAAAAAEAAAAIAAAAcAAAAAIAAAAEAAAAkAAAAAMAAAACAAAAoAAAAAUAAAADAAAA"
99*795d594fSAndroid Build Coastguard Worker   "uAAAAAYAAAABAAAA0AAAAAEgAAACAAAA8AAAAAEQAAABAAAAHAEAAAIgAAAIAAAAIgEAAAMgAAAC"
100*795d594fSAndroid Build Coastguard Worker   "AAAAcwEAAAAgAAABAAAAfgEAAAAQAAABAAAAjAEAAA==";
101*795d594fSAndroid Build Coastguard Worker 
102*795d594fSAndroid Build Coastguard Worker static const char kRawDex40[] =
103*795d594fSAndroid Build Coastguard Worker   "ZGV4CjA0MAC4OovJlJ1089ikzK6asMf/f8qp3Kve5VsgAgAAcAAAAHhWNBIAAAAAAAAAAIwBAAAI"
104*795d594fSAndroid Build Coastguard Worker   "AAAAcAAAAAQAAACQAAAAAgAAAKAAAAAAAAAAAAAAAAMAAAC4AAAAAQAAANAAAAAwAQAA8AAAACIB"
105*795d594fSAndroid Build Coastguard Worker   "AAAqAQAAMgEAAEYBAABRAQAAVAEAAFgBAABtAQAAAQAAAAIAAAAEAAAABgAAAAQAAAACAAAAAAAA"
106*795d594fSAndroid Build Coastguard Worker   "AAUAAAACAAAAHAEAAAAAAAAAAAAAAAABAAcAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAAAADAAAA"
107*795d594fSAndroid Build Coastguard Worker   "AAAAAH4BAAAAAAAAAQABAAEAAABzAQAABAAAAHAQAgAAAA4AAQABAAAAAAB4AQAAAQAAAA4AAAAB"
108*795d594fSAndroid Build Coastguard Worker   "AAAAAwAGPGluaXQ+AAZMTWFpbjsAEkxqYXZhL2xhbmcvT2JqZWN0OwAJTWFpbi5qYXZhAAFWAAJW"
109*795d594fSAndroid Build Coastguard Worker   "TAATW0xqYXZhL2xhbmcvU3RyaW5nOwAEbWFpbgABAAcOAAMBAAcOAAAAAgAAgYAE8AEBCYgCDAAA"
110*795d594fSAndroid Build Coastguard Worker   "AAAAAAABAAAAAAAAAAEAAAAIAAAAcAAAAAIAAAAEAAAAkAAAAAMAAAACAAAAoAAAAAUAAAADAAAA"
111*795d594fSAndroid Build Coastguard Worker   "uAAAAAYAAAABAAAA0AAAAAEgAAACAAAA8AAAAAEQAAABAAAAHAEAAAIgAAAIAAAAIgEAAAMgAAAC"
112*795d594fSAndroid Build Coastguard Worker   "AAAAcwEAAAAgAAABAAAAfgEAAAAQAAABAAAAjAEAAA==";
113*795d594fSAndroid Build Coastguard Worker 
114*795d594fSAndroid Build Coastguard Worker // Taken from 001-Main.
115*795d594fSAndroid Build Coastguard Worker static const char kRawDex41[] =
116*795d594fSAndroid Build Coastguard Worker   "ZGV4CjA0MQBBaEGw/8clTiOn3IafJ++m20gViy5Peh7UAgAAeAAAAHhWNBIAAAAAAAAAAEACAAAK"
117*795d594fSAndroid Build Coastguard Worker   "AAAAeAAAAAQAAACgAAAAAgAAALAAAAAAAAAAAAAAAAMAAADIAAAAAQAAAOAAAAAAAAAAAAAAANQC"
118*795d594fSAndroid Build Coastguard Worker   "AAAAAAAAOgEAAEIBAABKAQAAXgEAAGkBAABsAQAAcAEAAIUBAACLAQAAkQEAAAEAAAACAAAABAAA"
119*795d594fSAndroid Build Coastguard Worker   "AAYAAAAEAAAAAgAAAAAAAAAFAAAAAgAAADQBAAAAAAAAAAAAAAAAAQAIAAAAAQAAAAAAAAAAAAAA"
120*795d594fSAndroid Build Coastguard Worker   "AQAAAAEAAAAAAAAAAwAAAAAAAAAxAgAAAAAAAAEAAQABAAAAKgEAAAQAAABwEAIAAAAOAAEAAQAA"
121*795d594fSAndroid Build Coastguard Worker   "AAAALgEAAAEAAAAOABEADgATAQgOAAABAAAAAwAGPGluaXQ+AAZMTWFpbjsAEkxqYXZhL2xhbmcv"
122*795d594fSAndroid Build Coastguard Worker   "T2JqZWN0OwAJTWFpbi5qYXZhAAFWAAJWTAATW0xqYXZhL2xhbmcvU3RyaW5nOwAEYXJncwAEbWFp"
123*795d594fSAndroid Build Coastguard Worker   "bgCdAX5+RDh7ImJhY2tlbmQiOiJkZXgiLCJjb21waWxhdGlvbi1tb2RlIjoiZGVidWciLCJoYXMt"
124*795d594fSAndroid Build Coastguard Worker   "Y2hlY2tzdW1zIjpmYWxzZSwibWluLWFwaSI6MjYsInNoYS0xIjoiNTRjYmIzMTZlNGI3OWFhMDM1"
125*795d594fSAndroid Build Coastguard Worker   "ZDUwMTM4ZTI3NjY4OGJiOTM5ZGIwNCIsInZlcnNpb24iOiI4LjMuMTQtZGV2In0AAAACAACBgASA"
126*795d594fSAndroid Build Coastguard Worker   "AgEJmAIADAAAAAAAAAABAAAAAAAAAAEAAAAKAAAAeAAAAAIAAAAEAAAAoAAAAAMAAAACAAAAsAAA"
127*795d594fSAndroid Build Coastguard Worker   "AAUAAAADAAAAyAAAAAYAAAABAAAA4AAAAAEgAAACAAAAAAEAAAMgAAACAAAAKgEAAAEQAAABAAAA"
128*795d594fSAndroid Build Coastguard Worker   "NAEAAAIgAAAKAAAAOgEAAAAgAAABAAAAMQIAAAAQAAABAAAAQAIAAA==";
129*795d594fSAndroid Build Coastguard Worker 
130*795d594fSAndroid Build Coastguard Worker // Taken from 001-Main and modified.
131*795d594fSAndroid Build Coastguard Worker static const char kRawDex42[] =
132*795d594fSAndroid Build Coastguard Worker   "ZGV4CjA0MgBBaEGw/8clTiOn3IafJ++m20gViy5Peh7UAgAAeAAAAHhWNBIAAAAAAAAAAEACAAAK"
133*795d594fSAndroid Build Coastguard Worker   "AAAAeAAAAAQAAACgAAAAAgAAALAAAAAAAAAAAAAAAAMAAADIAAAAAQAAAOAAAAAAAAAAAAAAANQC"
134*795d594fSAndroid Build Coastguard Worker   "AAAAAAAAOgEAAEIBAABKAQAAXgEAAGkBAABsAQAAcAEAAIUBAACLAQAAkQEAAAEAAAACAAAABAAA"
135*795d594fSAndroid Build Coastguard Worker   "AAYAAAAEAAAAAgAAAAAAAAAFAAAAAgAAADQBAAAAAAAAAAAAAAAAAQAIAAAAAQAAAAAAAAAAAAAA"
136*795d594fSAndroid Build Coastguard Worker   "AQAAAAEAAAAAAAAAAwAAAAAAAAAxAgAAAAAAAAEAAQABAAAAKgEAAAQAAABwEAIAAAAOAAEAAQAA"
137*795d594fSAndroid Build Coastguard Worker   "AAAALgEAAAEAAAAOABEADgATAQgOAAABAAAAAwAGPGluaXQ+AAZMTWFpbjsAEkxqYXZhL2xhbmcv"
138*795d594fSAndroid Build Coastguard Worker   "T2JqZWN0OwAJTWFpbi5qYXZhAAFWAAJWTAATW0xqYXZhL2xhbmcvU3RyaW5nOwAEYXJncwAEbWFp"
139*795d594fSAndroid Build Coastguard Worker   "bgCdAX5+RDh7ImJhY2tlbmQiOiJkZXgiLCJjb21waWxhdGlvbi1tb2RlIjoiZGVidWciLCJoYXMt"
140*795d594fSAndroid Build Coastguard Worker   "Y2hlY2tzdW1zIjpmYWxzZSwibWluLWFwaSI6MjYsInNoYS0xIjoiNTRjYmIzMTZlNGI3OWFhMDM1"
141*795d594fSAndroid Build Coastguard Worker   "ZDUwMTM4ZTI3NjY4OGJiOTM5ZGIwNCIsInZlcnNpb24iOiI4LjMuMTQtZGV2In0AAAACAACBgASA"
142*795d594fSAndroid Build Coastguard Worker   "AgEJmAIADAAAAAAAAAABAAAAAAAAAAEAAAAKAAAAeAAAAAIAAAAEAAAAoAAAAAMAAAACAAAAsAAA"
143*795d594fSAndroid Build Coastguard Worker   "AAUAAAADAAAAyAAAAAYAAAABAAAA4AAAAAEgAAACAAAAAAEAAAMgAAACAAAAKgEAAAEQAAABAAAA"
144*795d594fSAndroid Build Coastguard Worker   "NAEAAAIgAAAKAAAAOgEAAAAgAAABAAAAMQIAAAAQAAABAAAAQAIAAA==";
145*795d594fSAndroid Build Coastguard Worker 
146*795d594fSAndroid Build Coastguard Worker // Taken from art-gtest-jars-MultiDex.jar
147*795d594fSAndroid Build Coastguard Worker static const char kRawContainerDex[] =
148*795d594fSAndroid Build Coastguard Worker   "ZGV4CjA0MQAAIUzJT/jrhaH3BHocZOpqBIO1QRkfBPE0AgAAeAAAAHhWNBIAAAAAAAAAAJQBAAAV"
149*795d594fSAndroid Build Coastguard Worker   "AAAArAIAAAgAAAB4AAAABAAAAJgAAAABAAAAyAAAAAYAAADQAAAAAQAAAAABAAAAAAAAAAAAALwF"
150*795d594fSAndroid Build Coastguard Worker   "AAAAAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAHAAAACwAAAA0AAAABAAAABAAAAAAAAAALAAAABgAA"
151*795d594fSAndroid Build Coastguard Worker   "AAAAAAAMAAAABgAAAHgBAAAMAAAABgAAAIABAAAFAAIAEQAAAAAAAQAAAAAAAAADABAAAAABAAEA"
152*795d594fSAndroid Build Coastguard Worker   "AAAAAAEAAAAPAAAAAgACABIAAAADAAEAAAAAAAAAAAAAAAAAAwAAAAAAAAAIAAAAAAAAAIYBAAAA"
153*795d594fSAndroid Build Coastguard Worker   "AAAAAQABAAEAAABmAQAABAAAAHAQBQAAAA4ABAABAAIAAABqAQAADwAAACIAAQBwEAIAAABiAQAA"
154*795d594fSAndroid Build Coastguard Worker   "bhADAAAADAJuIAQAIQAOABEADgATAQ8OWgMAFAKWAAAAAAEAAAAEAAAAAQAAAAcAAAACAACAgASg"
155*795d594fSAndroid Build Coastguard Worker   "AgEJuAINAAAAAAAAAAEAAAAAAAAAAgAAAAgAAAB4AAAAAwAAAAQAAACYAAAABAAAAAEAAADIAAAA"
156*795d594fSAndroid Build Coastguard Worker   "BQAAAAYAAADQAAAABgAAAAEAAAAAAQAAASAAAAIAAAAgAQAAAyAAAAIAAABmAQAAARAAAAIAAAB4"
157*795d594fSAndroid Build Coastguard Worker   "AQAAACAAAAEAAACGAQAAABAAAAEAAACUAQAAAQAAABUAAACsAgAAAiAAABUAAACYAwAAZGV4CjA0"
158*795d594fSAndroid Build Coastguard Worker   "MQAxmn5fJHSijXMoNjKkUwU/LqsrYEld5QiIAwAAeAAAAHhWNBIAAAAAAAAAADQFAAAVAAAArAIA"
159*795d594fSAndroid Build Coastguard Worker   "AAQAAAAAAwAAAgAAABADAAAAAAAAAAAAAAMAAAAoAwAAAQAAAEADAAAAAAAAAAAAALwFAAA0AgAA"
160*795d594fSAndroid Build Coastguard Worker   "mAMAAKADAACjAwAAqwMAALUDAADMAwAA4AMAAPQDAAAIBAAAEwQAAB0EAAAqBAAALQQAADEEAABG"
161*795d594fSAndroid Build Coastguard Worker   "BAAATAQAAFcEAABdBAAAYgQAAGsEAABzBAAAAwAAAAUAAAAGAAAACwAAAAEAAAACAAAAAAAAAAsA"
162*795d594fSAndroid Build Coastguard Worker   "AAADAAAAAAAAAAAAAQAAAAAAAAAAAA8AAAABAAEAAAAAAAAAAAAAAAAAAQAAAAAAAAAKAAAAAAAA"
163*795d594fSAndroid Build Coastguard Worker   "ACMFAAAAAAAAAgABAAAAAACQAwAAAwAAABoACQARAAAAAQABAAEAAACUAwAABAAAAHAQAgAAAA4A"
164*795d594fSAndroid Build Coastguard Worker   "EwAOABEADgAGPGluaXQ+AAFMAAZMTWFpbjsACExTZWNvbmQ7ABVMamF2YS9pby9QcmludFN0cmVh"
165*795d594fSAndroid Build Coastguard Worker   "bTsAEkxqYXZhL2xhbmcvT2JqZWN0OwASTGphdmEvbGFuZy9TdHJpbmc7ABJMamF2YS9sYW5nL1N5"
166*795d594fSAndroid Build Coastguard Worker   "c3RlbTsACU1haW4uamF2YQAIT3JpZ2luYWwAC1NlY29uZC5qYXZhAAFWAAJWTAATW0xqYXZhL2xh"
167*795d594fSAndroid Build Coastguard Worker   "bmcvU3RyaW5nOwAEYXJncwAJZ2V0U2Vjb25kAARtYWluAANvdXQAB3ByaW50bG4ABnNlY29uZACt"
168*795d594fSAndroid Build Coastguard Worker   "AX5+RDh7ImJhY2tlbmQiOiJkZXgiLCJjb21waWxhdGlvbi1tb2RlIjoiZGVidWciLCJoYXMtY2hl"
169*795d594fSAndroid Build Coastguard Worker   "Y2tzdW1zIjpmYWxzZSwibWluLWFwaSI6MTksInBsYXRmb3JtIjp0cnVlLCJzaGEtMSI6IjA0ZmZl"
170*795d594fSAndroid Build Coastguard Worker   "ODMwMGM0MjlmMWFkMTZmM2E1Y2I0ZWQ2OTkyMTNlNGYyY2QiLCJ2ZXJzaW9uIjoiOC4yLjIxLWRl"
171*795d594fSAndroid Build Coastguard Worker   "diJ9AAAAAQEAgIAE+AYBAeAGAAAACwAAAAAAAAABAAAANAIAAAEAAAAVAAAArAIAAAIAAAAEAAAA"
172*795d594fSAndroid Build Coastguard Worker   "AAMAAAMAAAACAAAAEAMAAAUAAAADAAAAKAMAAAYAAAABAAAAQAMAAAEgAAACAAAAYAMAAAMgAAAC"
173*795d594fSAndroid Build Coastguard Worker   "AAAAkAMAAAIgAAAVAAAAmAMAAAAgAAABAAAAIwUAAAAQAAABAAAANAUAAA==";
174*795d594fSAndroid Build Coastguard Worker 
175*795d594fSAndroid Build Coastguard Worker static const char kRawDexZeroLength[] =
176*795d594fSAndroid Build Coastguard Worker   "UEsDBAoAAAAAAOhxAkkAAAAAAAAAAAAAAAALABwAY2xhc3Nlcy5kZXhVVAkAA2QNoVdnDaFXdXgL"
177*795d594fSAndroid Build Coastguard Worker   "AAEE5AMBAASIEwAAUEsBAh4DCgAAAAAA6HECSQAAAAAAAAAAAAAAAAsAGAAAAAAAAAAAAKCBAAAA"
178*795d594fSAndroid Build Coastguard Worker   "AGNsYXNzZXMuZGV4VVQFAANkDaFXdXgLAAEE5AMBAASIEwAAUEsFBgAAAAABAAEAUQAAAEUAAAAA"
179*795d594fSAndroid Build Coastguard Worker   "AA==";
180*795d594fSAndroid Build Coastguard Worker 
181*795d594fSAndroid Build Coastguard Worker static const char kRawZipClassesDexPresent[] =
182*795d594fSAndroid Build Coastguard Worker   "UEsDBBQAAAAIANVRN0ms99lIMQEAACACAAALABwAY2xhc3Nlcy5kZXhVVAkAAwFj5VcUY+VXdXgL"
183*795d594fSAndroid Build Coastguard Worker   "AAEE5AMBAASIEwAAS0mt4DIwtmDYYdV9csrcks83lpxZN2vD8f/1p1beWX3vabQCEwNDAQMDQ0WY"
184*795d594fSAndroid Build Coastguard Worker   "iRADFPQwMjBwMEDEWYB4AhADlTEsYEAAZiDeAcRApQwXgNgAyPgApJWAtBYQGwGxGxAHAnEIEEcA"
185*795d594fSAndroid Build Coastguard Worker   "cS4jRD0T1Fw2KM0ENZMVypZhRLIIqIMdag9CBMFnhtJ1jDA5RrBcMSPE7AIBkIl8UFGgP6Fu4IOa"
186*795d594fSAndroid Build Coastguard Worker   "wczAZpOZl1lix8Dm45uYmWfNIOSTlViWqJ+TmJeu75+UlZpcYs3ACZLSA4kzMIYxMIX5MAhHIykL"
187*795d594fSAndroid Build Coastguard Worker   "LinKzEu3ZmDJBSoDOZiPgRlMgv3T2MDygZGRs4OJB8n9MBoWzrAwmQD1Eyy8WZHCmg0pvBkVIGpA"
188*795d594fSAndroid Build Coastguard Worker   "Yc4oABEHhRuTAsRMUDwwQ9WAwoJBAaIGHE5Q9aB4BgBQSwECHgMUAAAACADVUTdJrPfZSDEBAAAg"
189*795d594fSAndroid Build Coastguard Worker   "AgAACwAYAAAAAAAAAAAAoIEAAAAAY2xhc3Nlcy5kZXhVVAUAAwFj5Vd1eAsAAQTkAwEABIgTAABQ"
190*795d594fSAndroid Build Coastguard Worker   "SwUGAAAAAAEAAQBRAAAAdgEAAAAA";
191*795d594fSAndroid Build Coastguard Worker 
192*795d594fSAndroid Build Coastguard Worker static const char kRawZipClassesDexAbsent[] =
193*795d594fSAndroid Build Coastguard Worker   "UEsDBBQAAAAIANVRN0ms99lIMQEAACACAAAOABwAbm90Y2xhc3Nlcy5kZXhVVAkAAwFj5VcUY+VX"
194*795d594fSAndroid Build Coastguard Worker   "dXgLAAEE5AMBAASIEwAAS0mt4DIwtmDYYdV9csrcks83lpxZN2vD8f/1p1beWX3vabQCEwNDAQMD"
195*795d594fSAndroid Build Coastguard Worker   "Q0WYiRADFPQwMjBwMEDEWYB4AhADlTEsYEAAZiDeAcRApQwXgNgAyPgApJWAtBYQGwGxGxAHAnEI"
196*795d594fSAndroid Build Coastguard Worker   "EEcAcS4jRD0T1Fw2KM0ENZMVypZhRLIIqIMdag9CBMFnhtJ1jDA5RrBcMSPE7AIBkIl8UFGgP6Fu"
197*795d594fSAndroid Build Coastguard Worker   "4IOawczAZpOZl1lix8Dm45uYmWfNIOSTlViWqJ+TmJeu75+UlZpcYs3ACZLSA4kzMIYxMIX5MAhH"
198*795d594fSAndroid Build Coastguard Worker   "IykLLinKzEu3ZmDJBSoDOZiPgRlMgv3T2MDygZGRs4OJB8n9MBoWzrAwmQD1Eyy8WZHCmg0pvBkV"
199*795d594fSAndroid Build Coastguard Worker   "IGpAYc4oABEHhRuTAsRMUDwwQ9WAwoJBAaIGHE5Q9aB4BgBQSwECHgMUAAAACADVUTdJrPfZSDEB"
200*795d594fSAndroid Build Coastguard Worker   "AAAgAgAADgAYAAAAAAAAAAAAoIEAAAAAbm90Y2xhc3Nlcy5kZXhVVAUAAwFj5Vd1eAsAAQTkAwEA"
201*795d594fSAndroid Build Coastguard Worker   "BIgTAABQSwUGAAAAAAEAAQBUAAAAeQEAAAAA";
202*795d594fSAndroid Build Coastguard Worker 
203*795d594fSAndroid Build Coastguard Worker static const char kRawZipThreeDexFiles[] =
204*795d594fSAndroid Build Coastguard Worker   "UEsDBBQAAAAIAP1WN0ms99lIMQEAACACAAAMABwAY2xhc3NlczIuZGV4VVQJAAOtbOVXrWzlV3V4"
205*795d594fSAndroid Build Coastguard Worker   "CwABBOQDAQAEiBMAAEtJreAyMLZg2GHVfXLK3JLPN5acWTdrw/H/9adW3ll972m0AhMDQwEDA0NF"
206*795d594fSAndroid Build Coastguard Worker   "mIkQAxT0MDIwcDBAxFmAeAIQA5UxLGBAAGYg3gHEQKUMF4DYAMj4AKSVgLQWEBsBsRsQBwJxCBBH"
207*795d594fSAndroid Build Coastguard Worker   "AHEuI0Q9E9RcNijNBDWTFcqWYUSyCKiDHWoPQgTBZ4bSdYwwOUawXDEjxOwCAZCJfFBRoD+hbuCD"
208*795d594fSAndroid Build Coastguard Worker   "msHMwGaTmZdZYsfA5uObmJlnzSDkk5VYlqifk5iXru+flJWaXGLNwAmS0gOJMzCGMTCF+TAIRyMp"
209*795d594fSAndroid Build Coastguard Worker   "Cy4pysxLt2ZgyQUqAzmYj4EZTIL909jA8oGRkbODiQfJ/TAaFs6wMJkA9RMsvFmRwpoNKbwZFSBq"
210*795d594fSAndroid Build Coastguard Worker   "QGHOKAARB4UbkwLETFA8MEPVgMKCQQGiBhxOUPWgeAYAUEsDBBQAAAAIAABXN0ms99lIMQEAACAC"
211*795d594fSAndroid Build Coastguard Worker   "AAAMABwAY2xhc3NlczMuZGV4VVQJAAOvbOVXr2zlV3V4CwABBOQDAQAEiBMAAEtJreAyMLZg2GHV"
212*795d594fSAndroid Build Coastguard Worker   "fXLK3JLPN5acWTdrw/H/9adW3ll972m0AhMDQwEDA0NFmIkQAxT0MDIwcDBAxFmAeAIQA5UxLGBA"
213*795d594fSAndroid Build Coastguard Worker   "AGYg3gHEQKUMF4DYAMj4AKSVgLQWEBsBsRsQBwJxCBBHAHEuI0Q9E9RcNijNBDWTFcqWYUSyCKiD"
214*795d594fSAndroid Build Coastguard Worker   "HWoPQgTBZ4bSdYwwOUawXDEjxOwCAZCJfFBRoD+hbuCDmsHMwGaTmZdZYsfA5uObmJlnzSDkk5VY"
215*795d594fSAndroid Build Coastguard Worker   "lqifk5iXru+flJWaXGLNwAmS0gOJMzCGMTCF+TAIRyMpCy4pysxLt2ZgyQUqAzmYj4EZTIL909jA"
216*795d594fSAndroid Build Coastguard Worker   "8oGRkbODiQfJ/TAaFs6wMJkA9RMsvFmRwpoNKbwZFSBqQGHOKAARB4UbkwLETFA8MEPVgMKCQQGi"
217*795d594fSAndroid Build Coastguard Worker   "BhxOUPWgeAYAUEsDBBQAAAAIANVRN0ms99lIMQEAACACAAALABwAY2xhc3Nlcy5kZXhVVAkAAwFj"
218*795d594fSAndroid Build Coastguard Worker   "5VetbOVXdXgLAAEE5AMBAASIEwAAS0mt4DIwtmDYYdV9csrcks83lpxZN2vD8f/1p1beWX3vabQC"
219*795d594fSAndroid Build Coastguard Worker   "EwNDAQMDQ0WYiRADFPQwMjBwMEDEWYB4AhADlTEsYEAAZiDeAcRApQwXgNgAyPgApJWAtBYQGwGx"
220*795d594fSAndroid Build Coastguard Worker   "GxAHAnEIEEcAcS4jRD0T1Fw2KM0ENZMVypZhRLIIqIMdag9CBMFnhtJ1jDA5RrBcMSPE7AIBkIl8"
221*795d594fSAndroid Build Coastguard Worker   "UFGgP6Fu4IOawczAZpOZl1lix8Dm45uYmWfNIOSTlViWqJ+TmJeu75+UlZpcYs3ACZLSA4kzMIYx"
222*795d594fSAndroid Build Coastguard Worker   "MIX5MAhHIykLLinKzEu3ZmDJBSoDOZiPgRlMgv3T2MDygZGRs4OJB8n9MBoWzrAwmQD1Eyy8WZHC"
223*795d594fSAndroid Build Coastguard Worker   "mg0pvBkVIGpAYc4oABEHhRuTAsRMUDwwQ9WAwoJBAaIGHE5Q9aB4BgBQSwECHgMUAAAACAD9VjdJ"
224*795d594fSAndroid Build Coastguard Worker   "rPfZSDEBAAAgAgAADAAYAAAAAAAAAAAAoIEAAAAAY2xhc3NlczIuZGV4VVQFAAOtbOVXdXgLAAEE"
225*795d594fSAndroid Build Coastguard Worker   "5AMBAASIEwAAUEsBAh4DFAAAAAgAAFc3Saz32UgxAQAAIAIAAAwAGAAAAAAAAAAAAKCBdwEAAGNs"
226*795d594fSAndroid Build Coastguard Worker   "YXNzZXMzLmRleFVUBQADr2zlV3V4CwABBOQDAQAEiBMAAFBLAQIeAxQAAAAIANVRN0ms99lIMQEA"
227*795d594fSAndroid Build Coastguard Worker   "ACACAAALABgAAAAAAAAAAACgge4CAABjbGFzc2VzLmRleFVUBQADAWPlV3V4CwABBOQDAQAEiBMA"
228*795d594fSAndroid Build Coastguard Worker   "AFBLBQYAAAAAAwADAPUAAABkBAAAAAA=";
229*795d594fSAndroid Build Coastguard Worker 
230*795d594fSAndroid Build Coastguard Worker static const char kRawDexBadMapOffset[] =
231*795d594fSAndroid Build Coastguard Worker   "ZGV4CjAzNQAZKGSz85r+tXJ1I24FYi+FpQtWbXtelAmoAQAAcAAAAHhWNBIAAAAAAAAAAEAwIBAF"
232*795d594fSAndroid Build Coastguard Worker   "AAAAcAAAAAMAAACEAAAAAQAAAJAAAAAAAAAAAAAAAAIAAACcAAAAAQAAAKwAAADcAAAAzAAAAOQA"
233*795d594fSAndroid Build Coastguard Worker   "AADsAAAA9AAAAPkAAAANAQAAAgAAAAMAAAAEAAAABAAAAAIAAAAAAAAAAAAAAAAAAAABAAAAAAAA"
234*795d594fSAndroid Build Coastguard Worker   "AAAAAAABAAAAAQAAAAAAAAABAAAAAAAAABUBAAAAAAAAAQABAAEAAAAQAQAABAAAAHAQAQAAAA4A"
235*795d594fSAndroid Build Coastguard Worker   "Bjxpbml0PgAGQS5qYXZhAANMQTsAEkxqYXZhL2xhbmcvT2JqZWN0OwABVgABAAcOAAAAAQAAgYAE"
236*795d594fSAndroid Build Coastguard Worker   "zAEACwAAAAAAAAABAAAAAAAAAAEAAAAFAAAAcAAAAAIAAAADAAAAhAAAAAMAAAABAAAAkAAAAAUA"
237*795d594fSAndroid Build Coastguard Worker   "AAACAAAAnAAAAAYAAAABAAAArAAAAAEgAAABAAAAzAAAAAIgAAAFAAAA5AAAAAMgAAABAAAAEAEA"
238*795d594fSAndroid Build Coastguard Worker   "AAAgAAABAAAAFQEAAAAQAAABAAAAIAEAAA==";
239*795d594fSAndroid Build Coastguard Worker 
240*795d594fSAndroid Build Coastguard Worker static const char kRawDexDebugInfoLocalNullType[] =
241*795d594fSAndroid Build Coastguard Worker     "ZGV4CjAzNQA+Kwj2g6OZMH88OvK9Ey6ycdIsFCt18ED8AQAAcAAAAHhWNBIAAAAAAAAAAHQBAAAI"
242*795d594fSAndroid Build Coastguard Worker     "AAAAcAAAAAQAAACQAAAAAgAAAKAAAAAAAAAAAAAAAAMAAAC4AAAAAQAAANAAAAAMAQAA8AAAABwB"
243*795d594fSAndroid Build Coastguard Worker     "AAAkAQAALAEAAC8BAAA0AQAASAEAAEsBAABOAQAAAgAAAAMAAAAEAAAABQAAAAIAAAAAAAAAAAAA"
244*795d594fSAndroid Build Coastguard Worker     "AAUAAAADAAAAAAAAAAEAAQAAAAAAAQAAAAYAAAACAAEAAAAAAAEAAAABAAAAAgAAAAAAAAABAAAA"
245*795d594fSAndroid Build Coastguard Worker     "AAAAAGMBAAAAAAAAAQABAAEAAABUAQAABAAAAHAQAgAAAA4AAgABAAAAAABZAQAAAgAAABIQDwAG"
246*795d594fSAndroid Build Coastguard Worker     "PGluaXQ+AAZBLmphdmEAAUkAA0xBOwASTGphdmEvbGFuZy9PYmplY3Q7AAFWAAFhAAR0aGlzAAEA"
247*795d594fSAndroid Build Coastguard Worker     "Bw4AAwAHDh4DAAcAAAAAAQEAgYAE8AEBAIgCAAAACwAAAAAAAAABAAAAAAAAAAEAAAAIAAAAcAAA"
248*795d594fSAndroid Build Coastguard Worker     "AAIAAAAEAAAAkAAAAAMAAAACAAAAoAAAAAUAAAADAAAAuAAAAAYAAAABAAAA0AAAAAEgAAACAAAA"
249*795d594fSAndroid Build Coastguard Worker     "8AAAAAIgAAAIAAAAHAEAAAMgAAACAAAAVAEAAAAgAAABAAAAYwEAAAAQAAABAAAAdAEAAA==";
250*795d594fSAndroid Build Coastguard Worker 
251*795d594fSAndroid Build Coastguard Worker // Created from kRawDex38 by changing version to 35 and appending three entries
252*795d594fSAndroid Build Coastguard Worker // to the map list, namely `kDexTypeMethodHandleItem`, `kDexTypeCallSiteIdItem`
253*795d594fSAndroid Build Coastguard Worker // and `kDexTypeHiddenapiClassData`, each with size one and invalid offset 0xffff.
254*795d594fSAndroid Build Coastguard Worker static const char kRawDexBadMapOffsets[] =
255*795d594fSAndroid Build Coastguard Worker     "ZGV4CjAzNQC4OovJlJ1089ikzK6asMf/f8qp3Kve5VsgAgAAcAAAAHhWNBIAAAAAAAAAAIwBAAAI"
256*795d594fSAndroid Build Coastguard Worker     "AAAAcAAAAAQAAACQAAAAAgAAAKAAAAAAAAAAAAAAAAMAAAC4AAAAAQAAANAAAAAwAQAA8AAAACIB"
257*795d594fSAndroid Build Coastguard Worker     "AAAqAQAAMgEAAEYBAABRAQAAVAEAAFgBAABtAQAAAQAAAAIAAAAEAAAABgAAAAQAAAACAAAAAAAA"
258*795d594fSAndroid Build Coastguard Worker     "AAUAAAACAAAAHAEAAAAAAAAAAAAAAAABAAcAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAAAADAAAA"
259*795d594fSAndroid Build Coastguard Worker     "AAAAAH4BAAAAAAAAAQABAAEAAABzAQAABAAAAHAQAgAAAA4AAQABAAAAAAB4AQAAAQAAAA4AAAAB"
260*795d594fSAndroid Build Coastguard Worker     "AAAAAwAGPGluaXQ+AAZMTWFpbjsAEkxqYXZhL2xhbmcvT2JqZWN0OwAJTWFpbi5qYXZhAAFWAAJW"
261*795d594fSAndroid Build Coastguard Worker     "TAATW0xqYXZhL2xhbmcvU3RyaW5nOwAEbWFpbgABAAcOAAMBAAcOAAAAAgAAgYAE8AEBCYgCDwAA"
262*795d594fSAndroid Build Coastguard Worker     "AAAAAAABAAAAAAAAAAEAAAAIAAAAcAAAAAIAAAAEAAAAkAAAAAMAAAACAAAAoAAAAAUAAAADAAAA"
263*795d594fSAndroid Build Coastguard Worker     "uAAAAAYAAAABAAAA0AAAAAEgAAACAAAA8AAAAAEQAAABAAAAHAEAAAIgAAAIAAAAIgEAAAMgAAAC"
264*795d594fSAndroid Build Coastguard Worker     "AAAAcwEAAAAgAAABAAAAfgEAAAAQAAABAAAAjAEAAAgAAAABAAAA//8AAAcAAAABAAAA//8AAADw"
265*795d594fSAndroid Build Coastguard Worker     "AAABAAAA//8AAA==";
266*795d594fSAndroid Build Coastguard Worker 
267*795d594fSAndroid Build Coastguard Worker static const char kRawDexStringDataOOB[] =
268*795d594fSAndroid Build Coastguard Worker     "ZGV4CjAzNQCeYAY06q0ySzKz8hklA3wUmxR8x10yt8X0AgAAcAAAAHhWNBIAAAAAAAAAAFQCAAAQAAAAcAAAAAcAAACw"
269*795d594fSAndroid Build Coastguard Worker     "AAAAAwAAAMwAAAABAAAA8AAAAAQAAAD4AAAAAQAAABgBAAC8AQAAOAEAAH4BAACGAQABAAEAlQAAnQC0AQAAyAEAANwB"
270*795d594fSAndroid Build Coastguard Worker     "AADwAQAA+"
271*795d594fSAndroid Build Coastguard Worker     "wEAAP4BAAACAgAAFwIAAB0CAAAjAgAAKAIAADECAAACAAAAAwAAAAQAAAAFAAAABgAAAAgAAAAKAAAACAAAAAUAAAAAA"
272*795d594fSAndroid Build Coastguard Worker     "AAACQAAAAUAAABwAQAACQAAAAUAAAB4AQAABAABAA0AAAAAAAAAAAAAAAAAAgAMAAAAAQABAA4AAAACAAAAAAAAAAAAA"
273*795d594fSAndroid Build Coastguard Worker     "AABAAAAAgAAAAAAAAAHAAAAAAAAAEMCAAAAAAAAAQABAAEAAAA3AgAABAAAAHAQAwAAAA4AAwABAAIAAAA8AgAACAAAA"
274*795d594fSAndroid Build Coastguard Worker     "GIAAAAaAQEAbiACABAADgABAAAAAwAAAAEAAAAGAAY8aW5pdD4ADUhlbGxvLCB3b3JsZCEABkxNYWluOwAVTGphdmEva"
275*795d594fSAndroid Build Coastguard Worker     "W8vUHJpbnRTdHJlYW07ABJMamF2YS9sYW5nL09iamVjdDsAEkxqYXZhL2xhbmcvU3RyaW5nOwASTGphdmEvbGFuZy9Te"
276*795d594fSAndroid Build Coastguard Worker     "XN0ZW07AAlNYWluLmphdmEAAVYAAlZMABNbTGphK2EvbGFuZy9TdHJpbmc7AARhcmdzAARtYWluAANvdXQAB3ByaW50b"
277*795d594fSAndroid Build Coastguard Worker     "G4ABHRoaXMAEQAHDgATAQwHDngAAAACAACBgAS4AgEJ0AIAAAANAAAAAAAAAAEAAAAAAAAAAQAAABAAAABwAAAAAgAAA"
278*795d594fSAndroid Build Coastguard Worker     "AcAAACwAAAAAwAAAAMAAADMAAAABAAAAAEAAADwAAAABQAAAAQAAAD4AAAABgAAAAEAAAAYAQAAASAAAAIAAAA4AQAAA"
279*795d594fSAndroid Build Coastguard Worker     "RAAAAIAAABwAQAAAiAAABAAAAB+AQAAAyAAAAIAAAA3AgAAACAAAAEAAABDAgAAABAAAAEAAABUAgAA";
280*795d594fSAndroid Build Coastguard Worker 
281*795d594fSAndroid Build Coastguard Worker static const char kRawDexCodeItemOOB[] =
282*795d594fSAndroid Build Coastguard Worker     "ZGV4CjAzNQBNRhvKLnmGPLR973zkwLwGomvp/qfZL080AgAAcAAAAHhWNBIAAAAA"
283*795d594fSAndroid Build Coastguard Worker     "AAAAAKABAAAKAAAAcAAAAAQAAACYAAAAAgAAAKgAAAAAAAAAAAAAAAMAAADAAAAA"
284*795d594fSAndroid Build Coastguard Worker     "AQAAANgAAAA8AQAACAAAACoBAAAxAQAA2gEAAE4BAABZAQAAXAEAAGABAAB1AQAA"
285*795d594fSAndroid Build Coastguard Worker     "ewEAAIEBAAABAAAAAgAAAAQAAAAGAAAABAAAAAIAAAAAAAAABQAAAAIAAAAkAQAA"
286*795d594fSAndroid Build Coastguard Worker     "AAAAAAAAAAAAAAEACAAAAAEAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAMAAAAAAAAA"
287*795d594fSAndroid Build Coastguard Worker     "kgEAAAAAAAABAAEAAQAAAIcBAAKSAAAAcBACAAAADgABAAEAAAAAAIwBAAABAAAA"
288*795d594fSAndroid Build Coastguard Worker     "DgAAAAEAAAADAAY8aW5pdD4ABkxNYWluOwASTGphdmEvbGFuZy9PYmplY3Q7AAlN"
289*795d594fSAndroid Build Coastguard Worker     "YWluLmphdmEAAVYAAlZMABNbTGphdmEvbGFuZy9TdHJpbmc7AARhcmdzAARtYWlu"
290*795d594fSAndroid Build Coastguard Worker     "AAR0aGlzABEABw4A6QH4+PH////9+gAlgAT4AQEJkAIMAAAAAAAAAAEAAAAAAAAA"
291*795d594fSAndroid Build Coastguard Worker     "AQAAAAoAAABwAAAAAgAAAAQAAACYAAAAAwAAAAIAAACoAAAABQAAAAMAAADAAAAA"
292*795d594fSAndroid Build Coastguard Worker     "BgAAAAEAAADYAAAAASAAAAIAAAD4AAAAARAAAAEAAAAkAQAAAiAAAAoAAAAqAQAA"
293*795d594fSAndroid Build Coastguard Worker     "AyAAAAIAAACHAQAAACAAAAEAAACSAQAAABAAAAEAAACgAQAA";
294*795d594fSAndroid Build Coastguard Worker 
295*795d594fSAndroid Build Coastguard Worker static const char kHiddenAPIClassDataBadOffset[] =
296*795d594fSAndroid Build Coastguard Worker     "ZGV4CjAzNQA+Lt8iLnmGPLR973zkwLwGomvp/qfZL080AgAAcAAAAHhWNBIAAAAA"
297*795d594fSAndroid Build Coastguard Worker     "AAAAAKABAAAKAAAAcAAAAAQAAACYAAAAAgAAAKgAAAAAAAAAAAAAAAMAAADAAAAA"
298*795d594fSAndroid Build Coastguard Worker     "AQAAANgAAAA8AfoA+AAAACoBAAAyAQAAOgEAAE4BAABZAQAAXAEAAGABAAB1AQAA"
299*795d594fSAndroid Build Coastguard Worker     "ewEAAIEBAAABAAAAAgAAAAQAAAAGAAAABAAAAAIAAAAAAAAABQAAAAIAAABHAQBP"
300*795d594fSAndroid Build Coastguard Worker     "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/"
301*795d594fSAndroid Build Coastguard Worker     "//////8DRwAAAAAAAAAAAAAAAAAIAAAAAAAAAPIAAAAIAAAAAAAAAAAAAAAAAAAA"
302*795d594fSAndroid Build Coastguard Worker     "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
303*795d594fSAndroid Build Coastguard Worker     "ACAAAAACAAAABAAAAJgAAAADAAAAAgAAAKgAAAAFAAAAAwAAAMAAAAAGAAAAAQAA"
304*795d594fSAndroid Build Coastguard Worker     "AAR0aGlzABEAAA4AEwEIBw4AAAACAAAlgPsH/gEJkAIMAAAAAAAAAAEAAAAAAAAA"
305*795d594fSAndroid Build Coastguard Worker     "AQAAAAoAAABwAAAAAgAAAAQAAACYAAAAAwAAAAIAAACoAAAABQAAAAMAAADAAAAA"
306*795d594fSAndroid Build Coastguard Worker     "BgAAAAEAAADYAAAABwAAAAIAAAD4AAAAAPAAAAAAAQAEAQAAAiAAAAoAAAAqAQAA"
307*795d594fSAndroid Build Coastguard Worker     "AyAAAC0AAACHAQAAACAAAAEAAACSAQAAABAAAAEAAACgAQAA";
308*795d594fSAndroid Build Coastguard Worker 
309*795d594fSAndroid Build Coastguard Worker static const char kRawBadDebugInfoItem[] =
310*795d594fSAndroid Build Coastguard Worker     "ZGV4CjAzOAAaShJb6q0xSzOzJXwUA/IZmxR8x10yt8X0AgAAcAAAAHhWNBIwQB8z"
311*795d594fSAndroid Build Coastguard Worker     "AAAAAFQCAAAQAAAIcAAAAAcAAACwAAAAAwAAAMwAAAABAAAA8AAAAPz/9wD4AAAA"
312*795d594fSAndroid Build Coastguard Worker     "AQAAOhgBAAC8AQA5AQAAAH4BAACAgAAAAAAAAAAAAAAEAAABAAn///kACAAAAAAA"
313*795d594fSAndroid Build Coastguard Worker     "BgAAAAgACgIAABcCAAClAAIAIwIAACgCAAAxAgDeAgAAAEAAAAAEAAAABQBQAAYA"
314*795d594fSAndroid Build Coastguard Worker     "AAAIAAAAAAAAAAAAAAcAAAEACf8Y+QAIAAAAAAAGAAAACAAAAAwAAICAgIAAAAIA"
315*795d594fSAndroid Build Coastguard Worker     "IwL5ACgCAAAwAgACAQAAAAMAAAAEAAAABQBQAAYAAAAIAAAAAAAAAAADAAEACf//"
316*795d594fSAndroid Build Coastguard Worker     "+QAIAAAAAAAGAAAACAAKAgAAFwMAAKUAAAMAAAAEAAAABQAAAAYAAAAEAAAAAgAA"
317*795d594fSAndroid Build Coastguard Worker     "AAAAgIAACQAFEAAAAIAABACAgIAAAAAsCH4AAAAAAAYAAAAIAAAADAAAAAUAAAAC"
318*795d594fSAndroid Build Coastguard Worker     "AAAAAICABICAgAAAAICAAAUAAAAGAAAACAAAAwAAAAAABAAAAAIAAAAM+f8ABQAA"
319*795d594fSAndroid Build Coastguard Worker     "AAIAAACAgIAAAAQAgACAAIAALAB+AACAAAAGAAAACAAAAAwAAAAFAACAAgAAAACA"
320*795d594fSAndroid Build Coastguard Worker     "gIAAAAAAAIAAAAAAAAAAAAAAAAQAAAACAAAAAACAAATmgICAAAAAABMAAAAAAACA"
321*795d594fSAndroid Build Coastguard Worker     "AAAAAAgAAAAMAAAABQAAAAIAAAAAgIAEgICAAAAAgIAABQAAAAYAAAAIAAADAAAA"
322*795d594fSAndroid Build Coastguard Worker     "AAAEAAAAAgAAAAwAAAAFAAAAAgANAAAAAAAjAAEAAAAAAAAABwAAABAAAABwAAAA"
323*795d594fSAndroid Build Coastguard Worker     "AgAAAAcAAACwAAAAAyAAAEEAAADMAAAABAAAAAEnAADwAAAABQAAAAQAA/j4AAAA"
324*795d594fSAndroid Build Coastguard Worker     "BgAAAFv///8bAQAAAQAAAAAAAG81AQAAARAAAAIAAABwAQAAAiAAABAAAAB+AQAA"
325*795d594fSAndroid Build Coastguard Worker     "AwAAKQIAAAA3AgAAACAAAAEAAABDAgAAABAAAAEAAABUAgAA";
326*795d594fSAndroid Build Coastguard Worker 
327*795d594fSAndroid Build Coastguard Worker static const char kIncorrectSectionSizeInHeader[] =
328*795d594fSAndroid Build Coastguard Worker     "ZGV4CjAzOACmfCim6q0xSzKzJXwUA/IZmxR8x10yt8X0AgAAcAAAAHhWNBIwQB8z"
329*795d594fSAndroid Build Coastguard Worker     "AAAAAFQCAAABAT//cAAAAAcAAACwAAAAAwAAAMwAAAABAACA8AAAAPz/9wD4AAAA"
330*795d594fSAndroid Build Coastguard Worker     "AQAAOhgBAAC8AzI0AQAAAH4BgAAAAQAAANgAAAApAQAAYQAAACoJWwAxAQAAOgAA"
331*795d594fSAndroid Build Coastguard Worker     "zAAAAP////8QCQAABAAAADEBAAA6AADMAAAA/////xAJAAAEAAAAAAAAAIAAAAAA"
332*795d594fSAndroid Build Coastguard Worker     "gAAAAAAAAAEAAADmAAAABAAAAAoAAACAAAAAAIAAAAAAgAAAAICAgAAAAAAAAAAA"
333*795d594fSAndroid Build Coastguard Worker     "gIAAAAAAgAAAAICAgAAAAAAAAAAAgIAAAAAAAAAAAACAAAAAAHoAAACGgu//Nzk3"
334*795d594fSAndroid Build Coastguard Worker     "QPUhAEEAAP//dgACAAAADQAAAOYAAAAAAAAAAAAATWFpbm7qYXZhEAD8//cA+AAA"
335*795d594fSAndroid Build Coastguard Worker     "AAEAADoYAQAAvAMyNAEAAAB+AQAAgIAAAAAAAAAAAICAAAAAAIAAAACAgIAAAAAA"
336*795d594fSAndroid Build Coastguard Worker     "AAAAAICAAAAAAAAAAAAAgAAAAAB6AAAAhoLv/zc5N0D1IQBBAAD//3YAAgAAAA0A"
337*795d594fSAndroid Build Coastguard Worker     "AADmAAAAAAAAAAAAAE1haW5u6mF2YRAA/P/3APgAAADYAAAAKQEAAGEAAAAqCVsA"
338*795d594fSAndroid Build Coastguard Worker     "MQEAADoAAMwAAAD/////EAkAAAQAAAAxAQAAOgAAzAAAAP////8QCQAATWFpbm7q"
339*795d594fSAndroid Build Coastguard Worker     "YQB2YQFWAAJWGAATizUBAQmQBgwAAAAAAAAAAACHAQAAACAAAAEA+P9t+gAAABAA"
340*795d594fSAndroid Build Coastguard Worker     "AAEABAAAAICAgACAAAAAAIAABQANAAAAAAAjAAEAAAAAAAAABwAABxAAAABwAAAA"
341*795d594fSAndroid Build Coastguard Worker     "AgAAAAcAAACwAAAAACAABEEAAADMAAAABAAAAAEnAADwAAAABQAAAwAAAPj4AAAA"
342*795d594fSAndroid Build Coastguard Worker     "BgAwqDYA//8YAQAAAQAAAAAAAG8zAQAAARAAAAIAAABwAQAAAiAAABAAAAB+AQAA"
343*795d594fSAndroid Build Coastguard Worker     "AwAAKQIAAAAzAgAABiAAAAEAAABDAgAAABAAAAEAAABUAgAA";
344*795d594fSAndroid Build Coastguard Worker 
345*795d594fSAndroid Build Coastguard Worker static const char kFileSizeTooSmallInHeader[] =
346*795d594fSAndroid Build Coastguard Worker     "ZGV4CjAzOADm+mgA5vpofOqtMUsBCAAAJAEAAAJ3AAABAAAAcQAA/////////0ES"
347*795d594fSAndroid Build Coastguard Worker     "+//4mrr////u/wAAAAAAADv//0X/ZAEAAFwBAABgY2Q6JAEAAHsBAACBAQAAAQAA"
348*795d594fSAndroid Build Coastguard Worker     "AAIAAAAFAAAEAAAAAAAAAA==";
349*795d594fSAndroid Build Coastguard Worker 
DecodeDexFile(const char * base64,std::vector<uint8_t> * dex_bytes)350*795d594fSAndroid Build Coastguard Worker static void DecodeDexFile(const char* base64, std::vector<uint8_t>* dex_bytes) {
351*795d594fSAndroid Build Coastguard Worker   // decode base64
352*795d594fSAndroid Build Coastguard Worker   CHECK(base64 != nullptr);
353*795d594fSAndroid Build Coastguard Worker   *dex_bytes = DecodeBase64Vec(base64);
354*795d594fSAndroid Build Coastguard Worker   CHECK_NE(dex_bytes->size(), 0u);
355*795d594fSAndroid Build Coastguard Worker }
356*795d594fSAndroid Build Coastguard Worker 
OpenDexFilesBase64(const char * base64,const char * location,std::vector<uint8_t> * dex_bytes,std::vector<std::unique_ptr<const DexFile>> * dex_files,DexFileLoaderErrorCode * error_code,std::string * error_msg)357*795d594fSAndroid Build Coastguard Worker static bool OpenDexFilesBase64(const char* base64,
358*795d594fSAndroid Build Coastguard Worker                                const char* location,
359*795d594fSAndroid Build Coastguard Worker                                std::vector<uint8_t>* dex_bytes,
360*795d594fSAndroid Build Coastguard Worker                                std::vector<std::unique_ptr<const DexFile>>* dex_files,
361*795d594fSAndroid Build Coastguard Worker                                DexFileLoaderErrorCode* error_code,
362*795d594fSAndroid Build Coastguard Worker                                std::string* error_msg) {
363*795d594fSAndroid Build Coastguard Worker   DecodeDexFile(base64, dex_bytes);
364*795d594fSAndroid Build Coastguard Worker 
365*795d594fSAndroid Build Coastguard Worker   // read dex file(s)
366*795d594fSAndroid Build Coastguard Worker   static constexpr bool kVerifyChecksum = true;
367*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> tmp;
368*795d594fSAndroid Build Coastguard Worker   DexFileLoader dex_file_loader(dex_bytes->data(), dex_bytes->size(), location);
369*795d594fSAndroid Build Coastguard Worker   bool success =
370*795d594fSAndroid Build Coastguard Worker       dex_file_loader.Open(/* verify= */ true, kVerifyChecksum, error_code, error_msg, dex_files);
371*795d594fSAndroid Build Coastguard Worker   return success;
372*795d594fSAndroid Build Coastguard Worker }
373*795d594fSAndroid Build Coastguard Worker 
OpenDexFileBase64(const char * base64,const char * location,std::vector<uint8_t> * dex_bytes,size_t expected_dex_files=1)374*795d594fSAndroid Build Coastguard Worker static std::unique_ptr<const DexFile> OpenDexFileBase64(const char* base64,
375*795d594fSAndroid Build Coastguard Worker                                                         const char* location,
376*795d594fSAndroid Build Coastguard Worker                                                         std::vector<uint8_t>* dex_bytes,
377*795d594fSAndroid Build Coastguard Worker                                                         size_t expected_dex_files = 1) {
378*795d594fSAndroid Build Coastguard Worker   // read dex files.
379*795d594fSAndroid Build Coastguard Worker   DexFileLoaderErrorCode error_code;
380*795d594fSAndroid Build Coastguard Worker   std::string error_msg;
381*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> dex_files;
382*795d594fSAndroid Build Coastguard Worker   bool success = OpenDexFilesBase64(base64, location, dex_bytes, &dex_files, &error_code,
383*795d594fSAndroid Build Coastguard Worker                                     &error_msg);
384*795d594fSAndroid Build Coastguard Worker   CHECK(success) << error_msg;
385*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(expected_dex_files, dex_files.size());
386*795d594fSAndroid Build Coastguard Worker   return std::move(dex_files[0]);
387*795d594fSAndroid Build Coastguard Worker }
388*795d594fSAndroid Build Coastguard Worker 
OpenDexFileInMemoryBase64(const char * base64,const char * location,uint32_t location_checksum,bool expect_success,std::vector<uint8_t> * dex_bytes)389*795d594fSAndroid Build Coastguard Worker static std::unique_ptr<const DexFile> OpenDexFileInMemoryBase64(const char* base64,
390*795d594fSAndroid Build Coastguard Worker                                                                 const char* location,
391*795d594fSAndroid Build Coastguard Worker                                                                 uint32_t location_checksum,
392*795d594fSAndroid Build Coastguard Worker                                                                 bool expect_success,
393*795d594fSAndroid Build Coastguard Worker                                                                 std::vector<uint8_t>* dex_bytes) {
394*795d594fSAndroid Build Coastguard Worker   DecodeDexFile(base64, dex_bytes);
395*795d594fSAndroid Build Coastguard Worker 
396*795d594fSAndroid Build Coastguard Worker   std::string error_message;
397*795d594fSAndroid Build Coastguard Worker   DexFileLoader dex_file_loader(dex_bytes->data(), dex_bytes->size(), location);
398*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<const DexFile> dex_file(dex_file_loader.Open(location_checksum,
399*795d594fSAndroid Build Coastguard Worker                                                                /* oat_dex_file= */ nullptr,
400*795d594fSAndroid Build Coastguard Worker                                                                /* verify= */ true,
401*795d594fSAndroid Build Coastguard Worker                                                                /* verify_checksum= */ true,
402*795d594fSAndroid Build Coastguard Worker                                                                &error_message));
403*795d594fSAndroid Build Coastguard Worker   if (expect_success) {
404*795d594fSAndroid Build Coastguard Worker     CHECK(dex_file != nullptr) << error_message;
405*795d594fSAndroid Build Coastguard Worker   } else {
406*795d594fSAndroid Build Coastguard Worker     CHECK(dex_file == nullptr) << "Expected dex file open to fail.";
407*795d594fSAndroid Build Coastguard Worker   }
408*795d594fSAndroid Build Coastguard Worker   return dex_file;
409*795d594fSAndroid Build Coastguard Worker }
410*795d594fSAndroid Build Coastguard Worker 
ValidateDexFileHeader(std::unique_ptr<const DexFile> dex_file)411*795d594fSAndroid Build Coastguard Worker static void ValidateDexFileHeader(std::unique_ptr<const DexFile> dex_file) {
412*795d594fSAndroid Build Coastguard Worker   static const DexFile::Magic kExpectedDexFileMagic = {
413*795d594fSAndroid Build Coastguard Worker       0x64, 0x65, 0x78, 0x0a, 0x30, 0x33, 0x35, 0x00,  // "dex\n035\0".
414*795d594fSAndroid Build Coastguard Worker   };
415*795d594fSAndroid Build Coastguard Worker   static const DexFile::Sha1 kExpectedSha1 = {
416*795d594fSAndroid Build Coastguard Worker       0x7b, 0xb8, 0x0c, 0xd4, 0x1f, 0xd6, 0x1e, 0xc5, 0x89, 0xe8,
417*795d594fSAndroid Build Coastguard Worker       0xbe, 0xe5, 0x18, 0x02, 0x12, 0x18, 0x2e, 0xf2, 0x8c, 0x3d,
418*795d594fSAndroid Build Coastguard Worker   };
419*795d594fSAndroid Build Coastguard Worker 
420*795d594fSAndroid Build Coastguard Worker   const DexFile::Header& header = dex_file->GetHeader();
421*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(kExpectedDexFileMagic, header.magic_);
422*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(0x00d87910U, header.checksum_);
423*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(kExpectedSha1, header.signature_);
424*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(904U, header.file_size_);
425*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(112U, header.header_size_);
426*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(0U, header.link_size_);
427*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(0U, header.link_off_);
428*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(15U, header.string_ids_size_);
429*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(112U, header.string_ids_off_);
430*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(7U, header.type_ids_size_);
431*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(172U, header.type_ids_off_);
432*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(2U, header.proto_ids_size_);
433*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(200U, header.proto_ids_off_);
434*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(1U, header.field_ids_size_);
435*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(224U, header.field_ids_off_);
436*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(3U, header.method_ids_size_);
437*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(232U, header.method_ids_off_);
438*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(2U, header.class_defs_size_);
439*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(256U, header.class_defs_off_);
440*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(584U, header.data_size_);
441*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(320U, header.data_off_);
442*795d594fSAndroid Build Coastguard Worker 
443*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(header.checksum_, dex_file->GetLocationChecksum());
444*795d594fSAndroid Build Coastguard Worker }
445*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileLoaderTest,Header)446*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileLoaderTest, Header) {
447*795d594fSAndroid Build Coastguard Worker   std::vector<uint8_t> dex_bytes;
448*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<const DexFile> raw(OpenDexFileBase64(kRawDex, kLocationString, &dex_bytes));
449*795d594fSAndroid Build Coastguard Worker   ValidateDexFileHeader(std::move(raw));
450*795d594fSAndroid Build Coastguard Worker }
451*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileLoaderTest,HeaderInMemory)452*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileLoaderTest, HeaderInMemory) {
453*795d594fSAndroid Build Coastguard Worker   std::vector<uint8_t> dex_bytes;
454*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<const DexFile> raw =
455*795d594fSAndroid Build Coastguard Worker       OpenDexFileInMemoryBase64(kRawDex, kLocationString, 0x00d87910U, true, &dex_bytes);
456*795d594fSAndroid Build Coastguard Worker   ValidateDexFileHeader(std::move(raw));
457*795d594fSAndroid Build Coastguard Worker }
458*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileLoaderTest,Version38Accepted)459*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileLoaderTest, Version38Accepted) {
460*795d594fSAndroid Build Coastguard Worker   std::vector<uint8_t> dex_bytes;
461*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<const DexFile> raw(OpenDexFileBase64(kRawDex38, kLocationString, &dex_bytes));
462*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(raw.get() != nullptr);
463*795d594fSAndroid Build Coastguard Worker 
464*795d594fSAndroid Build Coastguard Worker   const DexFile::Header& header = raw->GetHeader();
465*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(38u, header.GetVersion());
466*795d594fSAndroid Build Coastguard Worker }
467*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileLoaderTest,Version39Accepted)468*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileLoaderTest, Version39Accepted) {
469*795d594fSAndroid Build Coastguard Worker   std::vector<uint8_t> dex_bytes;
470*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<const DexFile> raw(OpenDexFileBase64(kRawDex39, kLocationString, &dex_bytes));
471*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(raw.get() != nullptr);
472*795d594fSAndroid Build Coastguard Worker 
473*795d594fSAndroid Build Coastguard Worker   const DexFile::Header& header = raw->GetHeader();
474*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(39u, header.GetVersion());
475*795d594fSAndroid Build Coastguard Worker }
476*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileLoaderTest,Version40Accepted)477*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileLoaderTest, Version40Accepted) {
478*795d594fSAndroid Build Coastguard Worker   std::vector<uint8_t> dex_bytes;
479*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<const DexFile> raw(OpenDexFileBase64(kRawDex40, kLocationString, &dex_bytes));
480*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(raw.get() != nullptr);
481*795d594fSAndroid Build Coastguard Worker 
482*795d594fSAndroid Build Coastguard Worker   const DexFile::Header& header = raw->GetHeader();
483*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(40u, header.GetVersion());
484*795d594fSAndroid Build Coastguard Worker }
485*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileLoaderTest,Version41Accepted)486*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileLoaderTest, Version41Accepted) {
487*795d594fSAndroid Build Coastguard Worker   std::vector<uint8_t> dex_bytes;
488*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<const DexFile> raw(OpenDexFileBase64(kRawDex41, kLocationString, &dex_bytes, 1));
489*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(raw.get() != nullptr);
490*795d594fSAndroid Build Coastguard Worker 
491*795d594fSAndroid Build Coastguard Worker   const DexFile::Header& header = raw->GetHeader();
492*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(41u, header.GetVersion());
493*795d594fSAndroid Build Coastguard Worker }
494*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileLoaderTest,Version42Rejected)495*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileLoaderTest, Version42Rejected) {
496*795d594fSAndroid Build Coastguard Worker   std::vector<uint8_t> dex_bytes;
497*795d594fSAndroid Build Coastguard Worker   DecodeDexFile(kRawDex42, &dex_bytes);
498*795d594fSAndroid Build Coastguard Worker 
499*795d594fSAndroid Build Coastguard Worker   static constexpr bool kVerifyChecksum = true;
500*795d594fSAndroid Build Coastguard Worker   DexFileLoaderErrorCode error_code;
501*795d594fSAndroid Build Coastguard Worker   std::string error_msg;
502*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> dex_files;
503*795d594fSAndroid Build Coastguard Worker   DexFileLoader dex_file_loader(dex_bytes.data(), dex_bytes.size(), kLocationString);
504*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(dex_file_loader.Open(
505*795d594fSAndroid Build Coastguard Worker       /* verify= */ true, kVerifyChecksum, &error_code, &error_msg, &dex_files));
506*795d594fSAndroid Build Coastguard Worker }
507*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileLoaderTest,ContainerDex)508*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileLoaderTest, ContainerDex) {
509*795d594fSAndroid Build Coastguard Worker   std::vector<uint8_t> dex_bytes;
510*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<const DexFile> raw(
511*795d594fSAndroid Build Coastguard Worker       OpenDexFileBase64(kRawContainerDex, kLocationString, &dex_bytes, 2));
512*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(raw.get() != nullptr);
513*795d594fSAndroid Build Coastguard Worker 
514*795d594fSAndroid Build Coastguard Worker   const DexFile::Header& header = raw->GetHeader();
515*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(41u, header.GetVersion());
516*795d594fSAndroid Build Coastguard Worker }
517*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileLoaderTest,ZeroLengthDexRejected)518*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileLoaderTest, ZeroLengthDexRejected) {
519*795d594fSAndroid Build Coastguard Worker   std::vector<uint8_t> dex_bytes;
520*795d594fSAndroid Build Coastguard Worker   DecodeDexFile(kRawDexZeroLength, &dex_bytes);
521*795d594fSAndroid Build Coastguard Worker 
522*795d594fSAndroid Build Coastguard Worker   static constexpr bool kVerifyChecksum = true;
523*795d594fSAndroid Build Coastguard Worker   DexFileLoaderErrorCode error_code;
524*795d594fSAndroid Build Coastguard Worker   std::string error_msg;
525*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> dex_files;
526*795d594fSAndroid Build Coastguard Worker   DexFileLoader dex_file_loader(dex_bytes.data(), dex_bytes.size(), kLocationString);
527*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(dex_file_loader.Open(
528*795d594fSAndroid Build Coastguard Worker       /* verify= */ true, kVerifyChecksum, &error_code, &error_msg, &dex_files));
529*795d594fSAndroid Build Coastguard Worker }
530*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileLoaderTest,GetMultiDexClassesDexName)531*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileLoaderTest, GetMultiDexClassesDexName) {
532*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ("classes.dex", DexFileLoader::GetMultiDexClassesDexName(0));
533*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ("classes2.dex", DexFileLoader::GetMultiDexClassesDexName(1));
534*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ("classes3.dex", DexFileLoader::GetMultiDexClassesDexName(2));
535*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ("classes100.dex", DexFileLoader::GetMultiDexClassesDexName(99));
536*795d594fSAndroid Build Coastguard Worker }
537*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileLoaderTest,GetMultiDexLocation)538*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileLoaderTest, GetMultiDexLocation) {
539*795d594fSAndroid Build Coastguard Worker   std::string dex_location_str = "/system/app/framework.jar";
540*795d594fSAndroid Build Coastguard Worker   const char* dex_location = dex_location_str.c_str();
541*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ("/system/app/framework.jar", DexFileLoader::GetMultiDexLocation(0, dex_location));
542*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ("/system/app/framework.jar!classes2.dex",
543*795d594fSAndroid Build Coastguard Worker             DexFileLoader::GetMultiDexLocation(1, dex_location));
544*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ("/system/app/framework.jar!classes101.dex",
545*795d594fSAndroid Build Coastguard Worker             DexFileLoader::GetMultiDexLocation(100, dex_location));
546*795d594fSAndroid Build Coastguard Worker }
547*795d594fSAndroid Build Coastguard Worker 
TEST(DexFileUtilsTest,GetBaseLocationAndMultiDexSuffix)548*795d594fSAndroid Build Coastguard Worker TEST(DexFileUtilsTest, GetBaseLocationAndMultiDexSuffix) {
549*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ("/foo/bar/baz.jar", DexFileLoader::GetBaseLocation("/foo/bar/baz.jar"));
550*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ("/foo/bar/baz.jar", DexFileLoader::GetBaseLocation("/foo/bar/baz.jar!classes2.dex"));
551*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ("/foo/bar/baz.jar", DexFileLoader::GetBaseLocation("/foo/bar/baz.jar!classes8.dex"));
552*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ("", DexFileLoader::GetMultiDexSuffix("/foo/bar/baz.jar"));
553*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ("!classes2.dex", DexFileLoader::GetMultiDexSuffix("/foo/bar/baz.jar!classes2.dex"));
554*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ("!classes8.dex", DexFileLoader::GetMultiDexSuffix("/foo/bar/baz.jar!classes8.dex"));
555*795d594fSAndroid Build Coastguard Worker }
556*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileLoaderTest,ZipOpenClassesPresent)557*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileLoaderTest, ZipOpenClassesPresent) {
558*795d594fSAndroid Build Coastguard Worker   std::vector<uint8_t> dex_bytes;
559*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> dex_files;
560*795d594fSAndroid Build Coastguard Worker   DexFileLoaderErrorCode error_code;
561*795d594fSAndroid Build Coastguard Worker   std::string error_msg;
562*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(OpenDexFilesBase64(kRawZipClassesDexPresent,
563*795d594fSAndroid Build Coastguard Worker                                  kLocationString,
564*795d594fSAndroid Build Coastguard Worker                                  &dex_bytes,
565*795d594fSAndroid Build Coastguard Worker                                  &dex_files,
566*795d594fSAndroid Build Coastguard Worker                                  &error_code,
567*795d594fSAndroid Build Coastguard Worker                                  &error_msg));
568*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(dex_files.size(), 1u);
569*795d594fSAndroid Build Coastguard Worker }
570*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileLoaderTest,ZipOpenClassesAbsent)571*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileLoaderTest, ZipOpenClassesAbsent) {
572*795d594fSAndroid Build Coastguard Worker   std::vector<uint8_t> dex_bytes;
573*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> dex_files;
574*795d594fSAndroid Build Coastguard Worker   DexFileLoaderErrorCode error_code;
575*795d594fSAndroid Build Coastguard Worker   std::string error_msg;
576*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(OpenDexFilesBase64(kRawZipClassesDexAbsent,
577*795d594fSAndroid Build Coastguard Worker                                   kLocationString,
578*795d594fSAndroid Build Coastguard Worker                                   &dex_bytes,
579*795d594fSAndroid Build Coastguard Worker                                   &dex_files,
580*795d594fSAndroid Build Coastguard Worker                                   &error_code,
581*795d594fSAndroid Build Coastguard Worker                                   &error_msg));
582*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(error_code, DexFileLoaderErrorCode::kEntryNotFound);
583*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(dex_files.size(), 0u);
584*795d594fSAndroid Build Coastguard Worker }
585*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileLoaderTest,ZipOpenThreeDexFiles)586*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileLoaderTest, ZipOpenThreeDexFiles) {
587*795d594fSAndroid Build Coastguard Worker   std::vector<uint8_t> dex_bytes;
588*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> dex_files;
589*795d594fSAndroid Build Coastguard Worker   DexFileLoaderErrorCode error_code;
590*795d594fSAndroid Build Coastguard Worker   std::string error_msg;
591*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(OpenDexFilesBase64(kRawZipThreeDexFiles,
592*795d594fSAndroid Build Coastguard Worker                                  kLocationString,
593*795d594fSAndroid Build Coastguard Worker                                  &dex_bytes,
594*795d594fSAndroid Build Coastguard Worker                                  &dex_files,
595*795d594fSAndroid Build Coastguard Worker                                  &error_code,
596*795d594fSAndroid Build Coastguard Worker                                  &error_msg));
597*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(dex_files.size(), 3u);
598*795d594fSAndroid Build Coastguard Worker }
599*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileLoaderTest,OpenDexBadMapOffset)600*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileLoaderTest, OpenDexBadMapOffset) {
601*795d594fSAndroid Build Coastguard Worker   std::vector<uint8_t> dex_bytes;
602*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<const DexFile> raw =
603*795d594fSAndroid Build Coastguard Worker       OpenDexFileInMemoryBase64(kRawDexBadMapOffset,
604*795d594fSAndroid Build Coastguard Worker                                 kLocationString,
605*795d594fSAndroid Build Coastguard Worker                                 0xb3642819U,
606*795d594fSAndroid Build Coastguard Worker                                 false,
607*795d594fSAndroid Build Coastguard Worker                                 &dex_bytes);
608*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(raw, nullptr);
609*795d594fSAndroid Build Coastguard Worker }
610*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileLoaderTest,OpenDexDebugInfoLocalNullType)611*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileLoaderTest, OpenDexDebugInfoLocalNullType) {
612*795d594fSAndroid Build Coastguard Worker   std::vector<uint8_t> dex_bytes;
613*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<const DexFile> raw = OpenDexFileInMemoryBase64(kRawDexDebugInfoLocalNullType,
614*795d594fSAndroid Build Coastguard Worker                                                                  kLocationString,
615*795d594fSAndroid Build Coastguard Worker                                                                  0xf25f2b38U,
616*795d594fSAndroid Build Coastguard Worker                                                                  true,
617*795d594fSAndroid Build Coastguard Worker                                                                  &dex_bytes);
618*795d594fSAndroid Build Coastguard Worker   const dex::ClassDef& class_def = raw->GetClassDef(0);
619*795d594fSAndroid Build Coastguard Worker   constexpr uint32_t kMethodIdx = 1;
620*795d594fSAndroid Build Coastguard Worker   const dex::CodeItem* code_item = raw->GetCodeItem(raw->FindCodeItemOffset(class_def, kMethodIdx));
621*795d594fSAndroid Build Coastguard Worker   CodeItemDebugInfoAccessor accessor(*raw, code_item, kMethodIdx);
622*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(accessor.DecodeDebugLocalInfo(true, 1, VoidFunctor()));
623*795d594fSAndroid Build Coastguard Worker }
624*795d594fSAndroid Build Coastguard Worker 
625*795d594fSAndroid Build Coastguard Worker // Helper for tests that open and verify raw dex files to avoid boilerplate.
OpenAndVerify(const char * dex_file_base64,bool expected_success)626*795d594fSAndroid Build Coastguard Worker void OpenAndVerify(const char* dex_file_base64, bool expected_success) {
627*795d594fSAndroid Build Coastguard Worker   std::vector<uint8_t> dex_bytes;
628*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> dex_files;
629*795d594fSAndroid Build Coastguard Worker   DexFileLoaderErrorCode error_code;
630*795d594fSAndroid Build Coastguard Worker   std::string error_msg;
631*795d594fSAndroid Build Coastguard Worker   bool success = OpenDexFilesBase64(
632*795d594fSAndroid Build Coastguard Worker       dex_file_base64, kLocationString, &dex_bytes, &dex_files, &error_code, &error_msg);
633*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(success, expected_success);
634*795d594fSAndroid Build Coastguard Worker }
635*795d594fSAndroid Build Coastguard Worker 
636*795d594fSAndroid Build Coastguard Worker // Bad offset for `kDexTypeHiddenapiClassData` previously triggered a `DCHECK()`
637*795d594fSAndroid Build Coastguard Worker // before verifying the dex file. We want to reject dex files with bad offsets
638*795d594fSAndroid Build Coastguard Worker // without crashing, even in debug builds. b/281960267
TEST_F(DexFileLoaderTest,BadMapOffsets)639*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileLoaderTest, BadMapOffsets) {
640*795d594fSAndroid Build Coastguard Worker   OpenAndVerify(kRawDexBadMapOffsets, /*expected_success=*/false);
641*795d594fSAndroid Build Coastguard Worker }
642*795d594fSAndroid Build Coastguard Worker 
643*795d594fSAndroid Build Coastguard Worker // Generated dex file with a string data offset out of bounds. It should fail verification without
644*795d594fSAndroid Build Coastguard Worker // crashing. b/280066537
TEST_F(DexFileLoaderTest,StringDataOffsetOutOfBounds)645*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileLoaderTest, StringDataOffsetOutOfBounds) {
646*795d594fSAndroid Build Coastguard Worker   OpenAndVerify(kRawDexStringDataOOB, /*expected_success=*/false);
647*795d594fSAndroid Build Coastguard Worker }
648*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileLoaderTest,CodeItemOutOfBounds)649*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileLoaderTest, CodeItemOutOfBounds) {
650*795d594fSAndroid Build Coastguard Worker   OpenAndVerify(kRawDexCodeItemOOB, /*expected_success=*/false);
651*795d594fSAndroid Build Coastguard Worker }
652*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileLoaderTest,HiddenAPIClassDataBadOffset)653*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileLoaderTest, HiddenAPIClassDataBadOffset) {
654*795d594fSAndroid Build Coastguard Worker   OpenAndVerify(kHiddenAPIClassDataBadOffset, /*expected_success=*/false);
655*795d594fSAndroid Build Coastguard Worker }
656*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileLoaderTest,BadDebugInfoItem)657*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileLoaderTest, BadDebugInfoItem) {
658*795d594fSAndroid Build Coastguard Worker   OpenAndVerify(kRawBadDebugInfoItem, /*expected_success=*/false);
659*795d594fSAndroid Build Coastguard Worker }
660*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileLoaderTest,IncorrectSectionSizeInHeader)661*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileLoaderTest, IncorrectSectionSizeInHeader) {
662*795d594fSAndroid Build Coastguard Worker   OpenAndVerify(kIncorrectSectionSizeInHeader, /*expected_success=*/false);
663*795d594fSAndroid Build Coastguard Worker }
664*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileLoaderTest,FileSizeTooSmallInHeader)665*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileLoaderTest, FileSizeTooSmallInHeader) {
666*795d594fSAndroid Build Coastguard Worker   OpenAndVerify(kFileSizeTooSmallInHeader, /*expected_success=*/false);
667*795d594fSAndroid Build Coastguard Worker }
668*795d594fSAndroid Build Coastguard Worker 
669*795d594fSAndroid Build Coastguard Worker }  // namespace art
670