blob: a5279200e4fc1d9a7a9a9f99328a1b5ac4391e24 [file] [log] [blame]
Jeff Haoc3acfc52016-08-29 14:18:26 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <string>
18#include <vector>
19#include <sstream>
20
21#include <sys/types.h>
22#include <unistd.h>
23
Jeff Hao042e8982016-10-19 11:17:11 -070024#include "base/unix_file/fd_file.h"
Jeff Haoc3acfc52016-08-29 14:18:26 -070025#include "common_runtime_test.h"
David Sehr97c381e2017-02-01 15:09:58 -080026#include "exec_utils.h"
Jeff Haoc3acfc52016-08-29 14:18:26 -070027#include "utils.h"
28
29namespace art {
30
Jeff Hao042e8982016-10-19 11:17:11 -070031static const char kDexFileLayoutInputDex[] =
32 "ZGV4CjAzNQD1KW3+B8NAB0f2A/ZVIBJ0aHrGIqcpVTAUAgAAcAAAAHhWNBIAAAAAAAAAAIwBAAAH"
33 "AAAAcAAAAAQAAACMAAAAAQAAAJwAAAAAAAAAAAAAAAMAAACoAAAAAgAAAMAAAAAUAQAAAAEAADAB"
34 "AAA4AQAAQAEAAEgBAABNAQAAUgEAAGYBAAADAAAABAAAAAUAAAAGAAAABgAAAAMAAAAAAAAAAAAA"
35 "AAAAAAABAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAEAAAAAAAAAdQEAAAAAAAABAAAA"
36 "AAAAAAIAAAAAAAAAAgAAAAAAAAB/AQAAAAAAAAEAAQABAAAAaQEAAAQAAABwEAIAAAAOAAEAAQAB"
37 "AAAAbwEAAAQAAABwEAIAAAAOAAY8aW5pdD4ABkEuamF2YQAGQi5qYXZhAANMQTsAA0xCOwASTGph"
38 "dmEvbGFuZy9PYmplY3Q7AAFWAAQABw48AAQABw48AAAAAQAAgIAEgAIAAAEAAYCABJgCAAAACwAA"
39 "AAAAAAABAAAAAAAAAAEAAAAHAAAAcAAAAAIAAAAEAAAAjAAAAAMAAAABAAAAnAAAAAUAAAADAAAA"
40 "qAAAAAYAAAACAAAAwAAAAAEgAAACAAAAAAEAAAIgAAAHAAAAMAEAAAMgAAACAAAAaQEAAAAgAAAC"
41 "AAAAdQEAAAAQAAABAAAAjAEAAA==";
42
43static const char kDexFileLayoutInputProfile[] =
Calin Juravle940eb0c2017-01-30 19:30:44 -080044 "cHJvADAwMwABCwABAAAAAAD1KW3+Y2xhc3Nlcy5kZXgBAA==";
Jeff Hao042e8982016-10-19 11:17:11 -070045
46static const char kDexFileLayoutExpectedOutputDex[] =
47 "ZGV4CjAzNQD1KW3+B8NAB0f2A/ZVIBJ0aHrGIqcpVTAUAgAAcAAAAHhWNBIAAAAAAAAAAIwBAAAH"
48 "AAAAcAAAAAQAAACMAAAAAQAAAJwAAAAAAAAAAAAAAAMAAACoAAAAAgAAAMAAAAAUAQAAAAEAADAB"
49 "AAA4AQAAQAEAAEgBAABNAQAAUgEAAGYBAAADAAAABAAAAAUAAAAGAAAABgAAAAMAAAAAAAAAAAAA"
50 "AAAAAAABAAAAAAAAAAIAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAIAAAAAAAAAdQEAAAAAAAAAAAAA"
51 "AAAAAAIAAAAAAAAAAQAAAAAAAAB/AQAAAAAAAAEAAQABAAAAbwEAAAQAAABwEAIAAAAOAAEAAQAB"
52 "AAAAaQEAAAQAAABwEAIAAAAOAAY8aW5pdD4ABkEuamF2YQAGQi5qYXZhAANMQTsAA0xCOwASTGph"
53 "dmEvbGFuZy9PYmplY3Q7AAFWAAQABw48AAQABw48AAAAAQABgIAEgAIAAAEAAICABJgCAAAACwAA"
54 "AAAAAAABAAAAAAAAAAEAAAAHAAAAcAAAAAIAAAAEAAAAjAAAAAMAAAABAAAAnAAAAAUAAAADAAAA"
55 "qAAAAAYAAAACAAAAwAAAAAEgAAACAAAAAAEAAAIgAAAHAAAAMAEAAAMgAAACAAAAaQEAAAAgAAAC"
56 "AAAAdQEAAAAQAAABAAAAjAEAAA==";
57
Jeff Haoe17f5892017-02-23 16:14:04 -080058// Dex file with catch handler unreferenced by try blocks.
59// Constructed by building a dex file with try/catch blocks and hex editing.
60static const char kUnreferencedCatchHandlerInputDex[] =
61 "ZGV4CjAzNQD+exd52Y0f9nY5x5GmInXq5nXrO6Kl2RV4AwAAcAAAAHhWNBIAAAAAAAAAANgCAAAS"
62 "AAAAcAAAAAgAAAC4AAAAAwAAANgAAAABAAAA/AAAAAQAAAAEAQAAAQAAACQBAAA0AgAARAEAANYB"
63 "AADeAQAA5gEAAO4BAAAAAgAADwIAACYCAAA9AgAAUQIAAGUCAAB5AgAAfwIAAIUCAACIAgAAjAIA"
64 "AKECAACnAgAArAIAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAwAAAAOAAAADAAAAAYAAAAAAAAA"
65 "DQAAAAYAAADIAQAADQAAAAYAAADQAQAABQABABAAAAAAAAAAAAAAAAAAAgAPAAAAAQABABEAAAAD"
66 "AAAAAAAAAAAAAAABAAAAAwAAAAAAAAADAAAAAAAAAMgCAAAAAAAAAQABAAEAAAC1AgAABAAAAHAQ"
67 "AwAAAA4AAwABAAIAAgC6AgAAIQAAAGIAAAAaAQoAbiACABAAYgAAABoBCwBuIAIAEAAOAA0AYgAA"
68 "ABoBAQBuIAIAEAAo8A0AYgAAABoBAgBuIAIAEAAo7gAAAAAAAAcAAQAHAAAABwABAAIBAg8BAhgA"
69 "AQAAAAQAAAABAAAABwAGPGluaXQ+AAZDYXRjaDEABkNhdGNoMgAQSGFuZGxlclRlc3QuamF2YQAN"
70 "TEhhbmRsZXJUZXN0OwAVTGphdmEvaW8vUHJpbnRTdHJlYW07ABVMamF2YS9sYW5nL0V4Y2VwdGlv"
71 "bjsAEkxqYXZhL2xhbmcvT2JqZWN0OwASTGphdmEvbGFuZy9TdHJpbmc7ABJMamF2YS9sYW5nL1N5"
72 "c3RlbTsABFRyeTEABFRyeTIAAVYAAlZMABNbTGphdmEvbGFuZy9TdHJpbmc7AARtYWluAANvdXQA"
73 "B3ByaW50bG4AAQAHDgAEAQAHDn17AncdHoseAAAAAgAAgYAExAIBCdwCAAANAAAAAAAAAAEAAAAA"
74 "AAAAAQAAABIAAABwAAAAAgAAAAgAAAC4AAAAAwAAAAMAAADYAAAABAAAAAEAAAD8AAAABQAAAAQA"
75 "AAAEAQAABgAAAAEAAAAkAQAAASAAAAIAAABEAQAAARAAAAIAAADIAQAAAiAAABIAAADWAQAAAyAA"
76 "AAIAAAC1AgAAACAAAAEAAADIAgAAABAAAAEAAADYAgAA";
77
Jeff Haoac462712017-03-02 10:59:43 -080078// Dex file with 0-size (catch all only) catch handler unreferenced by try blocks.
79// Constructed by building a dex file with try/catch blocks and hex editing.
80static const char kUnreferenced0SizeCatchHandlerInputDex[] =
81 "ZGV4CjAzNQCEbEEvMstSNpQpjPdfMEfUBS48cis2QRJoAwAAcAAAAHhWNBIAAAAAAAAAAMgCAAAR"
82 "AAAAcAAAAAcAAAC0AAAAAwAAANAAAAABAAAA9AAAAAQAAAD8AAAAAQAAABwBAAAsAgAAPAEAAOoB"
83 "AADyAQAABAIAABMCAAAqAgAAPgIAAFICAABmAgAAaQIAAG0CAACCAgAAhgIAAIoCAACQAgAAlQIA"
84 "AJ4CAACiAgAAAgAAAAMAAAAEAAAABQAAAAYAAAAHAAAACQAAAAcAAAAFAAAAAAAAAAgAAAAFAAAA"
85 "3AEAAAgAAAAFAAAA5AEAAAQAAQANAAAAAAAAAAAAAAAAAAIADAAAAAEAAQAOAAAAAgAAAAAAAAAA"
86 "AAAAAQAAAAIAAAAAAAAAAQAAAAAAAAC5AgAAAAAAAAEAAQABAAAApgIAAAQAAABwEAMAAAAOAAQA"
87 "AQACAAIAqwIAAC8AAABiAAAAGgEPAG4gAgAQAGIAAAAaAQoAbiACABAAYgAAABoBEABuIAIAEABi"
88 "AAAAGgELAG4gAgAQAA4ADQBiAQAAGgIKAG4gAgAhACcADQBiAQAAGgILAG4gAgAhACcAAAAAAAAA"
89 "BwABAA4AAAAHAAEAAgAdACYAAAABAAAAAwAAAAEAAAAGAAY8aW5pdD4AEEhhbmRsZXJUZXN0Lmph"
90 "dmEADUxIYW5kbGVyVGVzdDsAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwASTGphdmEvbGFuZy9PYmpl"
91 "Y3Q7ABJMamF2YS9sYW5nL1N0cmluZzsAEkxqYXZhL2xhbmcvU3lzdGVtOwABVgACVkwAE1tMamF2"
92 "YS9sYW5nL1N0cmluZzsAAmYxAAJmMgAEbWFpbgADb3V0AAdwcmludGxuAAJ0MQACdDIAAQAHDgAE"
93 "AQAHDnl7eXkCeB2bAAAAAgAAgYAEvAIBCdQCAA0AAAAAAAAAAQAAAAAAAAABAAAAEQAAAHAAAAAC"
94 "AAAABwAAALQAAAADAAAAAwAAANAAAAAEAAAAAQAAAPQAAAAFAAAABAAAAPwAAAAGAAAAAQAAABwB"
95 "AAABIAAAAgAAADwBAAABEAAAAgAAANwBAAACIAAAEQAAAOoBAAADIAAAAgAAAKYCAAAAIAAAAQAA"
96 "ALkCAAAAEAAAAQAAAMgCAAA=";
97
Mathieu Chartier6b0dbef2017-02-21 12:45:30 -080098// Dex file with multiple code items that have the same debug_info_off_. Constructed by a modified
99// dexlayout on XandY.
100static const char kDexFileDuplicateOffset[] =
101 "ZGV4CjAzNwAQfXfPCB8qCxo7MqdFhmHZQwCv8+udHD8MBAAAcAAAAHhWNBIAAAAAAAAAAFQDAAAT"
102 "AAAAcAAAAAgAAAC8AAAAAQAAANwAAAABAAAA6AAAAAUAAADwAAAAAwAAABgBAACUAgAAeAEAABQC"
103 "AAAeAgAAJgIAACsCAAAyAgAANwIAAFsCAAB7AgAAngIAALICAAC1AgAAvQIAAMUCAADIAgAA1QIA"
104 "AOkCAADvAgAA9QIAAPwCAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAkAAAAHAAAA"
105 "AAAAAAIAAQASAAAAAAAAAAEAAAABAAAAAQAAAAIAAAAAAAAAAgAAAAEAAAAGAAAAAQAAAAAAAAAA"
106 "AAAABgAAAAAAAAAKAAAAAAAAACsDAAAAAAAAAQAAAAAAAAAGAAAAAAAAAAsAAAD0AQAANQMAAAAA"
107 "AAACAAAAAAAAAAAAAAAAAAAACwAAAAQCAAA/AwAAAAAAAAIAAAAUAwAAGgMAAAEAAAAjAwAAAQAB"
108 "AAEAAAAFAAAABAAAAHAQBAAAAA4AAQABAAEAAAAFAAAABAAAAHAQBAAAAA4AAQAAAAEAAAAFAAAA"
109 "CAAAACIAAQBwEAEAAABpAAAADgABAAEAAQAAAAUAAAAEAAAAcBAAAAAADgB4AQAAAAAAAAAAAAAA"
110 "AAAAhAEAAAAAAAAAAAAAAAAAAAg8Y2xpbml0PgAGPGluaXQ+AANMWDsABUxZJFo7AANMWTsAIkxk"
111 "YWx2aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdDbGFzczsAHkxkYWx2aWsvYW5ub3RhdGlvbi9Jbm5l"
112 "ckNsYXNzOwAhTGRhbHZpay9hbm5vdGF0aW9uL01lbWJlckNsYXNzZXM7ABJMamF2YS9sYW5nL09i"
113 "amVjdDsAAVYABlguamF2YQAGWS5qYXZhAAFaAAthY2Nlc3NGbGFncwASZW1pdHRlcjogamFjay00"
114 "LjI1AARuYW1lAAR0aGlzAAV2YWx1ZQABegARAAcOABMABw4AEgAHDnYAEQAHDgACAwERGAICBAIN"
115 "BAgPFwwCBQERHAEYAQAAAQAAgIAEjAMAAAEAAYCABKQDAQACAAAIAoiABLwDAYCABNwDAAAADwAA"
116 "AAAAAAABAAAAAAAAAAEAAAATAAAAcAAAAAIAAAAIAAAAvAAAAAMAAAABAAAA3AAAAAQAAAABAAAA"
117 "6AAAAAUAAAAFAAAA8AAAAAYAAAADAAAAGAEAAAMQAAACAAAAeAEAAAEgAAAEAAAAjAEAAAYgAAAC"
118 "AAAA9AEAAAIgAAATAAAAFAIAAAMgAAAEAAAA/wIAAAQgAAADAAAAFAMAAAAgAAADAAAAKwMAAAAQ"
119 "AAABAAAAVAMAAA==";
120
Jeff Haof914f8e2017-02-21 16:14:23 -0800121// Dex file with null value for annotations_off in the annotation_set_ref_list.
122// Constructed by building a dex file with annotations and hex editing.
123static const char kNullSetRefListElementInputDex[] =
124 "ZGV4CjAzNQB1iA+7ZwgkF+7E6ZesYFc2lRAR3qnRAanwAwAAcAAAAHhWNBIAAAAAAAAAACADAAAS"
125 "AAAAcAAAAAgAAAC4AAAAAwAAANgAAAABAAAA/AAAAAQAAAAEAQAAAgAAACQBAACMAgAAZAEAAOgB"
126 "AADwAQAAAAIAAAMCAAAQAgAAIAIAADQCAABIAgAAawIAAI0CAAC1AgAAyAIAANECAADUAgAA2QIA"
127 "ANwCAADjAgAA6QIAAAMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAMAAAAAgAAAAMAAAAAAAAA"
128 "DAAAAAcAAAAAAAAADQAAAAcAAADgAQAABgAGAAsAAAAAAAEAAAAAAAAAAgAOAAAAAQAAABAAAAAC"
129 "AAEAAAAAAAAAAAAAAAAAAgAAAAAAAAABAAAAsAEAAAgDAAAAAAAAAQAAAAEmAAACAAAA2AEAAAoA"
130 "AADIAQAAFgMAAAAAAAACAAAAAAAAAHwBAAABAAAA/AIAAAAAAAABAAAAAgMAAAEAAQABAAAA8AIA"
131 "AAQAAABwEAMAAAAOAAIAAgAAAAAA9QIAAAEAAAAOAAAAAAAAAAAAAAAAAAAAAQAAAAEAAABkAQAA"
132 "cAEAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAgAAAAMAAwAGPGluaXQ+AA5Bbm5vQ2xhc3MuamF2YQAB"
133 "TAALTEFubm9DbGFzczsADkxNeUFubm90YXRpb247ABJMamF2YS9sYW5nL09iamVjdDsAEkxqYXZh"
134 "L2xhbmcvU3RyaW5nOwAhTGphdmEvbGFuZy9hbm5vdGF0aW9uL0Fubm90YXRpb247ACBMamF2YS9s"
135 "YW5nL2Fubm90YXRpb24vUmV0ZW50aW9uOwAmTGphdmEvbGFuZy9hbm5vdGF0aW9uL1JldGVudGlv"
136 "blBvbGljeTsAEU15QW5ub3RhdGlvbi5qYXZhAAdSVU5USU1FAAFWAANWTEwAAWEABWFOYW1lAARu"
137 "YW1lAAV2YWx1ZQABAAcOAAICAAAHDgABBQERGwABAQEQFw8AAAIAAICABIQDAQmcAwAAAAECgQgA"
138 "AAARAAAAAAAAAAEAAAAAAAAAAQAAABIAAABwAAAAAgAAAAgAAAC4AAAAAwAAAAMAAADYAAAABAAA"
139 "AAEAAAD8AAAABQAAAAQAAAAEAQAABgAAAAIAAAAkAQAAAhAAAAEAAABkAQAAAxAAAAMAAABwAQAA"
140 "ASAAAAIAAACEAQAABiAAAAIAAACwAQAAARAAAAIAAADYAQAAAiAAABIAAADoAQAAAyAAAAIAAADw"
141 "AgAABCAAAAIAAAD8AgAAACAAAAIAAAAIAwAAABAAAAEAAAAgAwAA";
142
Jeff Haoe17f5892017-02-23 16:14:04 -0800143// Dex file with shared empty class data item for multiple class defs.
144// Constructing by building a dex file with multiple classes and hex editing.
145static const char kMultiClassDataInputDex[] =
146 "ZGV4CjAzNQALJgF9TtnLq748xVe/+wyxETrT9lTEiW6YAQAAcAAAAHhWNBIAAAAAAAAAADQBAAAI"
147 "AAAAcAAAAAQAAACQAAAAAAAAAAAAAAACAAAAoAAAAAAAAAAAAAAAAgAAALAAAACoAAAA8AAAAPAA"
148 "AAD4AAAAAAEAAAMBAAAIAQAADQEAACEBAAAkAQAAAgAAAAMAAAAEAAAABQAAAAEAAAAGAAAAAgAA"
149 "AAcAAAABAAAAAQYAAAMAAAAAAAAAAAAAAAAAAAAnAQAAAAAAAAIAAAABBgAAAwAAAAAAAAABAAAA"
150 "AAAAACcBAAAAAAAABkEuamF2YQAGQi5qYXZhAAFJAANMQTsAA0xCOwASTGphdmEvbGFuZy9PYmpl"
151 "Y3Q7AAFhAAFiAAAAAAABAAAAARkAAAAIAAAAAAAAAAEAAAAAAAAAAQAAAAgAAABwAAAAAgAAAAQA"
152 "AACQAAAABAAAAAIAAACgAAAABgAAAAIAAACwAAAAAiAAAAgAAADwAAAAACAAAAIAAAAnAQAAABAA"
153 "AAEAAAA0AQAA";
154
155// Dex file with code info followed by non 4-byte aligned section.
156// Constructed a dex file with code info followed by string data and hex edited.
157static const char kUnalignedCodeInfoInputDex[] =
158 "ZGV4CjAzNQDXJzXNb4iWn2SLhmLydW/8h1K9moERIw7UAQAAcAAAAHhWNBIAAAAAAAAAAEwBAAAG"
159 "AAAAcAAAAAMAAACIAAAAAQAAAJQAAAAAAAAAAAAAAAMAAACgAAAAAQAAALgAAAD8AAAA2AAAAAIB"
160 "AAAKAQAAEgEAABcBAAArAQAALgEAAAIAAAADAAAABAAAAAQAAAACAAAAAAAAAAAAAAAAAAAAAAAA"
161 "AAUAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAAAABAAAAAAAAADsBAAAAAAAAAQABAAEAAAAxAQAA"
162 "BAAAAHAQAgAAAA4AAQABAAAAAAA2AQAAAQAAAA4ABjxpbml0PgAGQS5qYXZhAANMQTsAEkxqYXZh"
163 "L2xhbmcvT2JqZWN0OwABVgABYQABAAcOAAMABw4AAAABAQCBgATYAQEB8AEAAAALAAAAAAAAAAEA"
164 "AAAAAAAAAQAAAAYAAABwAAAAAgAAAAMAAACIAAAAAwAAAAEAAACUAAAABQAAAAMAAACgAAAABgAA"
165 "AAEAAAC4AAAAASAAAAIAAADYAAAAAiAAAAYAAAACAQAAAyAAAAIAAAAxAQAAACAAAAEAAAA7AQAA"
166 "ABAAAAEAAABMAQAA";
Jeff Hao44652a32017-02-22 14:20:41 -0800167
Mathieu Chartier6b0dbef2017-02-21 12:45:30 -0800168static void WriteBase64ToFile(const char* base64, File* file) {
Jeff Hao042e8982016-10-19 11:17:11 -0700169 // Decode base64.
170 CHECK(base64 != nullptr);
171 size_t length;
172 std::unique_ptr<uint8_t[]> bytes(DecodeBase64(base64, &length));
Mathieu Chartier6b0dbef2017-02-21 12:45:30 -0800173 CHECK(bytes != nullptr);
Jeff Hao042e8982016-10-19 11:17:11 -0700174 if (!file->WriteFully(bytes.get(), length)) {
175 PLOG(FATAL) << "Failed to write base64 as file";
176 }
Mathieu Chartier6b0dbef2017-02-21 12:45:30 -0800177}
178
179static void WriteFileBase64(const char* base64, const char* location) {
180 // Write to provided file.
181 std::unique_ptr<File> file(OS::CreateEmptyFile(location));
182 CHECK(file != nullptr);
183 WriteBase64ToFile(base64, file.get());
Jeff Hao042e8982016-10-19 11:17:11 -0700184 if (file->FlushCloseOrErase() != 0) {
185 PLOG(FATAL) << "Could not flush and close test file.";
186 }
187}
188
Jeff Haoc3acfc52016-08-29 14:18:26 -0700189class DexLayoutTest : public CommonRuntimeTest {
190 protected:
191 virtual void SetUp() {
192 CommonRuntimeTest::SetUp();
Jeff Haoc3acfc52016-08-29 14:18:26 -0700193 }
194
Jeff Haoa8621002016-10-04 18:13:44 +0000195 // Runs FullPlainOutput test.
196 bool FullPlainOutputExec(std::string* error_msg) {
Jeff Haoc3acfc52016-08-29 14:18:26 -0700197 // TODO: dexdump2 -> dexdump ?
198 ScratchFile dexdump_output;
Andreas Gampeca620d72016-11-08 08:09:33 -0800199 const std::string& dexdump_filename = dexdump_output.GetFilename();
Jeff Haoc3acfc52016-08-29 14:18:26 -0700200 std::string dexdump = GetTestAndroidRoot() + "/bin/dexdump2";
201 EXPECT_TRUE(OS::FileExists(dexdump.c_str())) << dexdump << " should be a valid file path";
Jeff Haoc3acfc52016-08-29 14:18:26 -0700202
203 ScratchFile dexlayout_output;
Andreas Gampeca620d72016-11-08 08:09:33 -0800204 const std::string& dexlayout_filename = dexlayout_output.GetFilename();
Jeff Haoc3acfc52016-08-29 14:18:26 -0700205 std::string dexlayout = GetTestAndroidRoot() + "/bin/dexlayout";
206 EXPECT_TRUE(OS::FileExists(dexlayout.c_str())) << dexlayout << " should be a valid file path";
Jeff Haoc3acfc52016-08-29 14:18:26 -0700207
Jeff Haoa8621002016-10-04 18:13:44 +0000208 for (const std::string &dex_file : GetLibCoreDexFileNames()) {
209 std::vector<std::string> dexdump_exec_argv =
210 { dexdump, "-d", "-f", "-h", "-l", "plain", "-o", dexdump_filename, dex_file };
211 std::vector<std::string> dexlayout_exec_argv =
212 { dexlayout, "-d", "-f", "-h", "-l", "plain", "-o", dexlayout_filename, dex_file };
Jeff Haoa8621002016-10-04 18:13:44 +0000213 if (!::art::Exec(dexdump_exec_argv, error_msg)) {
214 return false;
215 }
216 if (!::art::Exec(dexlayout_exec_argv, error_msg)) {
217 return false;
218 }
219 std::vector<std::string> diff_exec_argv =
220 { "/usr/bin/diff", dexdump_filename, dexlayout_filename };
221 if (!::art::Exec(diff_exec_argv, error_msg)) {
222 return false;
223 }
Jeff Haoc3acfc52016-08-29 14:18:26 -0700224 }
225 return true;
226 }
227
Jeff Haoa8621002016-10-04 18:13:44 +0000228 // Runs DexFileOutput test.
229 bool DexFileOutputExec(std::string* error_msg) {
230 ScratchFile tmp_file;
Andreas Gampeca620d72016-11-08 08:09:33 -0800231 const std::string& tmp_name = tmp_file.GetFilename();
232 size_t tmp_last_slash = tmp_name.rfind('/');
Jeff Haoa8621002016-10-04 18:13:44 +0000233 std::string tmp_dir = tmp_name.substr(0, tmp_last_slash + 1);
234 std::string dexlayout = GetTestAndroidRoot() + "/bin/dexlayout";
235 EXPECT_TRUE(OS::FileExists(dexlayout.c_str())) << dexlayout << " should be a valid file path";
236
237 for (const std::string &dex_file : GetLibCoreDexFileNames()) {
238 std::vector<std::string> dexlayout_exec_argv =
Jeff Hao042e8982016-10-19 11:17:11 -0700239 { dexlayout, "-w", tmp_dir, "-o", tmp_name, dex_file };
Jeff Haoa8621002016-10-04 18:13:44 +0000240 if (!::art::Exec(dexlayout_exec_argv, error_msg)) {
241 return false;
242 }
Jeff Hao042e8982016-10-19 11:17:11 -0700243 size_t dex_file_last_slash = dex_file.rfind("/");
Jeff Haoa8621002016-10-04 18:13:44 +0000244 std::string dex_file_name = dex_file.substr(dex_file_last_slash + 1);
245 std::vector<std::string> unzip_exec_argv =
246 { "/usr/bin/unzip", dex_file, "classes.dex", "-d", tmp_dir};
247 if (!::art::Exec(unzip_exec_argv, error_msg)) {
248 return false;
249 }
250 std::vector<std::string> diff_exec_argv =
251 { "/usr/bin/diff", tmp_dir + "classes.dex" , tmp_dir + dex_file_name };
252 if (!::art::Exec(diff_exec_argv, error_msg)) {
253 return false;
254 }
255 std::vector<std::string> rm_zip_exec_argv = { "/bin/rm", tmp_dir + "classes.dex" };
256 if (!::art::Exec(rm_zip_exec_argv, error_msg)) {
257 return false;
258 }
259 std::vector<std::string> rm_out_exec_argv = { "/bin/rm", tmp_dir + dex_file_name };
260 if (!::art::Exec(rm_out_exec_argv, error_msg)) {
261 return false;
262 }
263 }
Jeff Hao042e8982016-10-19 11:17:11 -0700264 return true;
265 }
Jeff Haoa8621002016-10-04 18:13:44 +0000266
Jeff Hao042e8982016-10-19 11:17:11 -0700267 // Runs DexFileOutput test.
268 bool DexFileLayoutExec(std::string* error_msg) {
269 ScratchFile tmp_file;
270 std::string tmp_name = tmp_file.GetFilename();
271 size_t tmp_last_slash = tmp_name.rfind("/");
272 std::string tmp_dir = tmp_name.substr(0, tmp_last_slash + 1);
273
274 // Write inputs and expected outputs.
275 std::string dex_file = tmp_dir + "classes.dex";
276 WriteFileBase64(kDexFileLayoutInputDex, dex_file.c_str());
277 std::string profile_file = tmp_dir + "primary.prof";
278 WriteFileBase64(kDexFileLayoutInputProfile, profile_file.c_str());
279 std::string expected_output = tmp_dir + "expected.dex";
280 WriteFileBase64(kDexFileLayoutExpectedOutputDex, expected_output.c_str());
281 std::string output_dex = tmp_dir + "classes.dex.new";
282
283 std::string dexlayout = GetTestAndroidRoot() + "/bin/dexlayout";
284 EXPECT_TRUE(OS::FileExists(dexlayout.c_str())) << dexlayout << " should be a valid file path";
285
286 std::vector<std::string> dexlayout_exec_argv =
Jeff Hao44652a32017-02-22 14:20:41 -0800287 { dexlayout, "-w", tmp_dir, "-o", tmp_name, "-p", profile_file, dex_file };
Jeff Hao042e8982016-10-19 11:17:11 -0700288 if (!::art::Exec(dexlayout_exec_argv, error_msg)) {
289 return false;
290 }
291 std::vector<std::string> diff_exec_argv =
292 { "/usr/bin/diff", expected_output, output_dex };
293 if (!::art::Exec(diff_exec_argv, error_msg)) {
294 return false;
295 }
296
297 std::vector<std::string> rm_exec_argv =
298 { "/bin/rm", dex_file, profile_file, expected_output, output_dex };
299 if (!::art::Exec(rm_exec_argv, error_msg)) {
300 return false;
301 }
Jeff Haoa8621002016-10-04 18:13:44 +0000302 return true;
303 }
Jeff Hao44652a32017-02-22 14:20:41 -0800304
Jeff Haoac462712017-03-02 10:59:43 -0800305 // Runs UnreferencedCatchHandlerTest & Unreferenced0SizeCatchHandlerTest.
306 bool UnreferencedCatchHandlerExec(std::string* error_msg, const char* filename) {
Jeff Hao44652a32017-02-22 14:20:41 -0800307 ScratchFile tmp_file;
308 std::string tmp_name = tmp_file.GetFilename();
309 size_t tmp_last_slash = tmp_name.rfind("/");
310 std::string tmp_dir = tmp_name.substr(0, tmp_last_slash + 1);
311
312 // Write inputs and expected outputs.
313 std::string input_dex = tmp_dir + "classes.dex";
Jeff Haoac462712017-03-02 10:59:43 -0800314 WriteFileBase64(filename, input_dex.c_str());
Jeff Hao44652a32017-02-22 14:20:41 -0800315 std::string output_dex = tmp_dir + "classes.dex.new";
316
317 std::string dexlayout = GetTestAndroidRoot() + "/bin/dexlayout";
318 EXPECT_TRUE(OS::FileExists(dexlayout.c_str())) << dexlayout << " should be a valid file path";
319
320 std::vector<std::string> dexlayout_exec_argv =
321 { dexlayout, "-w", tmp_dir, "-o", "/dev/null", input_dex };
322 if (!::art::Exec(dexlayout_exec_argv, error_msg)) {
323 return false;
324 }
325
326 // Diff input and output. They should be the same.
327 std::vector<std::string> diff_exec_argv = { "/usr/bin/diff", input_dex, output_dex };
328 if (!::art::Exec(diff_exec_argv, error_msg)) {
329 return false;
330 }
331
332 std::vector<std::string> rm_exec_argv = { "/bin/rm", input_dex, output_dex };
333 if (!::art::Exec(rm_exec_argv, error_msg)) {
334 return false;
335 }
336 return true;
337 }
Jeff Haoc3acfc52016-08-29 14:18:26 -0700338};
339
340
341TEST_F(DexLayoutTest, FullPlainOutput) {
Jeff Hao0f7eaeb2016-08-31 17:56:13 -0700342 // Disable test on target.
343 TEST_DISABLED_FOR_TARGET();
Jeff Haoc3acfc52016-08-29 14:18:26 -0700344 std::string error_msg;
Jeff Haoa8621002016-10-04 18:13:44 +0000345 ASSERT_TRUE(FullPlainOutputExec(&error_msg)) << error_msg;
346}
347
348TEST_F(DexLayoutTest, DexFileOutput) {
349 // Disable test on target.
350 TEST_DISABLED_FOR_TARGET();
351 std::string error_msg;
352 ASSERT_TRUE(DexFileOutputExec(&error_msg)) << error_msg;
Jeff Haoc3acfc52016-08-29 14:18:26 -0700353}
354
Jeff Hao042e8982016-10-19 11:17:11 -0700355TEST_F(DexLayoutTest, DexFileLayout) {
356 // Disable test on target.
357 TEST_DISABLED_FOR_TARGET();
358 std::string error_msg;
359 ASSERT_TRUE(DexFileLayoutExec(&error_msg)) << error_msg;
360}
361
Jeff Haoe17f5892017-02-23 16:14:04 -0800362TEST_F(DexLayoutTest, UnreferencedCatchHandler) {
363 // Disable test on target.
364 TEST_DISABLED_FOR_TARGET();
365 std::string error_msg;
Jeff Haoac462712017-03-02 10:59:43 -0800366 ASSERT_TRUE(UnreferencedCatchHandlerExec(&error_msg,
367 kUnreferencedCatchHandlerInputDex)) << error_msg;
Jeff Haoe17f5892017-02-23 16:14:04 -0800368}
Jeff Haoac462712017-03-02 10:59:43 -0800369
370TEST_F(DexLayoutTest, Unreferenced0SizeCatchHandler) {
371 // Disable test on target.
372 TEST_DISABLED_FOR_TARGET();
373 std::string error_msg;
374 ASSERT_TRUE(UnreferencedCatchHandlerExec(&error_msg,
375 kUnreferenced0SizeCatchHandlerInputDex)) << error_msg;
376}
377
Mathieu Chartier6b0dbef2017-02-21 12:45:30 -0800378TEST_F(DexLayoutTest, DuplicateOffset) {
379 ScratchFile temp;
380 WriteBase64ToFile(kDexFileDuplicateOffset, temp.GetFile());
381 EXPECT_EQ(temp.GetFile()->Flush(), 0);
382 std::string dexlayout = GetTestAndroidRoot() + "/bin/dexlayout";
383 EXPECT_TRUE(OS::FileExists(dexlayout.c_str())) << dexlayout << " should be a valid file path";
384 std::vector<std::string> dexlayout_exec_argv = {
385 dexlayout,
386 "-a",
387 "-i",
388 "-o",
389 "/dev/null",
390 temp.GetFilename()};
391 std::string error_msg;
392 const bool result = ::art::Exec(dexlayout_exec_argv, &error_msg);
393 EXPECT_TRUE(result);
394 if (!result) {
395 LOG(ERROR) << "Error " << error_msg;
396 }
397}
398
Jeff Haof914f8e2017-02-21 16:14:23 -0800399TEST_F(DexLayoutTest, NullSetRefListElement) {
400 ScratchFile temp;
401 WriteBase64ToFile(kNullSetRefListElementInputDex, temp.GetFile());
402 EXPECT_EQ(temp.GetFile()->Flush(), 0);
403 std::string dexlayout = GetTestAndroidRoot() + "/bin/dexlayout";
404 EXPECT_TRUE(OS::FileExists(dexlayout.c_str())) << dexlayout << " should be a valid file path";
405 std::vector<std::string> dexlayout_exec_argv =
406 { dexlayout, "-o", "/dev/null", temp.GetFilename() };
407 std::string error_msg;
408 const bool result = ::art::Exec(dexlayout_exec_argv, &error_msg);
409 EXPECT_TRUE(result);
410 if (!result) {
411 LOG(ERROR) << "Error " << error_msg;
412 }
413}
414
Jeff Haoe17f5892017-02-23 16:14:04 -0800415TEST_F(DexLayoutTest, MultiClassData) {
416 ScratchFile temp;
417 WriteBase64ToFile(kMultiClassDataInputDex, temp.GetFile());
418 ScratchFile temp2;
419 WriteBase64ToFile(kDexFileLayoutInputProfile, temp2.GetFile());
420 EXPECT_EQ(temp.GetFile()->Flush(), 0);
421 std::string dexlayout = GetTestAndroidRoot() + "/bin/dexlayout";
422 EXPECT_TRUE(OS::FileExists(dexlayout.c_str())) << dexlayout << " should be a valid file path";
423 std::vector<std::string> dexlayout_exec_argv =
424 { dexlayout, "-p", temp2.GetFilename(), "-o", "/dev/null", temp.GetFilename() };
Jeff Hao44652a32017-02-22 14:20:41 -0800425 std::string error_msg;
Jeff Haoe17f5892017-02-23 16:14:04 -0800426 const bool result = ::art::Exec(dexlayout_exec_argv, &error_msg);
427 EXPECT_TRUE(result);
428 if (!result) {
429 LOG(ERROR) << "Error " << error_msg;
430 }
431}
432
433TEST_F(DexLayoutTest, UnalignedCodeInfo) {
434 ScratchFile temp;
435 WriteBase64ToFile(kUnalignedCodeInfoInputDex, temp.GetFile());
436 ScratchFile temp2;
437 WriteBase64ToFile(kDexFileLayoutInputProfile, temp2.GetFile());
438 EXPECT_EQ(temp.GetFile()->Flush(), 0);
439 std::string dexlayout = GetTestAndroidRoot() + "/bin/dexlayout";
440 EXPECT_TRUE(OS::FileExists(dexlayout.c_str())) << dexlayout << " should be a valid file path";
441 std::vector<std::string> dexlayout_exec_argv =
442 { dexlayout, "-p", temp2.GetFilename(), "-o", "/dev/null", temp.GetFilename() };
443 std::string error_msg;
444 const bool result = ::art::Exec(dexlayout_exec_argv, &error_msg);
445 EXPECT_TRUE(result);
446 if (!result) {
447 LOG(ERROR) << "Error " << error_msg;
448 }
Jeff Hao44652a32017-02-22 14:20:41 -0800449}
450
Jeff Haoc3acfc52016-08-29 14:18:26 -0700451} // namespace art