blob: 13f92d1e6830ed9ec358e3af26ca5b6dd94fc694 [file] [log] [blame]
Brian Carlstrom934486c2011-07-12 23:42:50 -07001// Copyright 2011 Google Inc. All Rights Reserved.
2
Brian Carlstromb0460ea2011-07-29 10:08:05 -07003#include <dirent.h>
4#include <sys/stat.h>
5#include <sys/types.h>
6
Brian Carlstrom578bbdc2011-07-21 14:07:47 -07007#include "base64.h"
8#include "heap.h"
9#include "thread.h"
Jesse Wilsonac5b9e22011-07-27 15:11:13 -040010#include "stringprintf.h"
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070011#include "class_linker.h"
12#include "dex_file.h"
Brian Carlstroma331b3c2011-07-18 17:47:56 -070013
14#include "gtest/gtest.h"
15
Brian Carlstrom934486c2011-07-12 23:42:50 -070016namespace art {
17
Brian Carlstroma331b3c2011-07-18 17:47:56 -070018// package java.lang;
19// public class Object {}
Brian Carlstrom913af1b2011-07-23 21:41:13 -070020
21// package java.lang;
22// public class Class {}
23//
24// package java.lang.reflect;
25// public class Field {}
26//
27// package java.lang.reflect;
28// public class Method {}
Brian Carlstroma331b3c2011-07-18 17:47:56 -070029//
30// package java.lang;
Brian Carlstrom75cb3b42011-07-28 02:13:36 -070031// public class String {
32// char[] value;
33// int hashCode;
34// int offset;
35// int count;
36// }
37//
38// package java.lang;
Brian Carlstrom74eb46a2011-08-02 20:10:14 -070039// public class ClassLoader {
40// Object packages;
41// ClassLoader parent;
42// }
43//
44// package dalvik.system;
45// public class BaseDexClassLoader extends ClassLoader {
46// String originalPath;
47// Object pathList;
48// }
49//
50// package dalvik.system;
51// public class PathClassLoader extends BaseDexClassLoader {}
52//
53// package java.lang;
Brian Carlstroma331b3c2011-07-18 17:47:56 -070054// public interface Cloneable {}
55//
56// package java.io;
57// public interface Serializable {}
58static const char kJavaLangDex[] =
Brian Carlstrom74eb46a2011-08-02 20:10:14 -070059 "ZGV4CjAzNQCf+7APoNCFqeL/QKrA9vK3fihkWcSko9nIBgAAcAAAAHhWNBIAAAAAAAAAADQGAAAg"
60 "AAAAcAAAAA0AAADwAAAAAQAAACQBAAAIAAAAMAEAAAgAAABwAQAACgAAALABAADYAwAA8AIAAKwD"
61 "AAC0AwAAzQMAANkDAADrAwAA+wMAAAcEAAAKBAAALgQAAE8EAABnBAAAegQAAJMEAACqBAAAvgQA"
62 "ANIEAADtBAAACQUAABYFAAAjBQAAOQUAAEwFAABZBQAAXAUAAGAFAABnBQAAcQUAAHkFAACHBQAA"
63 "kQUAAJkFAACjBQAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAAW"
64 "AAAAFwAAABYAAAALAAAAAAAAAAEACAAbAAAAAQAHAB4AAAAFAAcAHAAAAAUABQAdAAAACAAAABgA"
65 "AAAIAAAAGQAAAAgAAAAaAAAACAAMAB8AAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAFAAAAAAAA"
66 "AAcAAAAAAAAACAAAAAAAAAAJAAAAAAAAAAoAAAAAAAAABwAAAAEAAAD/////AAAAABIAAAAAAAAA"
67 "0gUAAAAAAAAFAAAAAQAAAAcAAAAAAAAAAwAAAAAAAADcBQAAAAAAAAEAAAABAAAABQAAAAAAAAAB"
68 "AAAAAAAAAOoFAAAAAAAAAgAAAAEAAAABAAAAAAAAABMAAAAAAAAA+AUAAAAAAAADAAAAAQYAAAcA"
69 "AAAAAAAAFAAAAAAAAAAAAAAAAAAAAAQAAAABAAAABwAAAAAAAAACAAAAAAAAAAIGAAAAAAAABgAA"
70 "AAEGAAAHAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAAQAAAAcAAAAAAAAAFQAAAAAAAAAMBgAA"
71 "AAAAAAkAAAABAAAABwAAAAAAAAAFAAAAAAAAAB4GAAAAAAAACgAAAAEAAAAHAAAAAAAAABEAAAAA"
72 "AAAAKAYAAAAAAAABAAEAAAAAAKoFAAABAAAADgAAAAEAAQABAAAArwUAAAQAAABwEAQAAAAOAAEA"
73 "AQABAAAAtAUAAAQAAABwEAMAAAAOAAEAAQABAAAAuQUAAAQAAABwEAAAAAAOAAEAAQABAAAAvgUA"
74 "AAQAAABwEAQAAAAOAAEAAQABAAAAwwUAAAQAAABwEAQAAAAOAAEAAQABAAAAyAUAAAQAAABwEAQA"
75 "AAAOAAEAAQABAAAAzQUAAAQAAABwEAQAAAAOAAY8aW5pdD4AF0Jhc2VEZXhDbGFzc0xvYWRlci5q"
76 "YXZhAApDbGFzcy5qYXZhABBDbGFzc0xvYWRlci5qYXZhAA5DbG9uZWFibGUuamF2YQAKRmllbGQu"
77 "amF2YQABSQAiTGRhbHZpay9zeXN0ZW0vQmFzZURleENsYXNzTG9hZGVyOwAfTGRhbHZpay9zeXN0"
78 "ZW0vUGF0aENsYXNzTG9hZGVyOwAWTGphdmEvaW8vU2VyaWFsaXphYmxlOwARTGphdmEvbGFuZy9D"
79 "bGFzczsAF0xqYXZhL2xhbmcvQ2xhc3NMb2FkZXI7ABVMamF2YS9sYW5nL0Nsb25lYWJsZTsAEkxq"
80 "YXZhL2xhbmcvT2JqZWN0OwASTGphdmEvbGFuZy9TdHJpbmc7ABlMamF2YS9sYW5nL3JlZmxlY3Qv"
81 "RmllbGQ7ABpMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwALTWV0aG9kLmphdmEAC09iamVjdC5q"
82 "YXZhABRQYXRoQ2xhc3NMb2FkZXIuamF2YQARU2VyaWFsaXphYmxlLmphdmEAC1N0cmluZy5qYXZh"
83 "AAFWAAJbQwAFY291bnQACGhhc2hDb2RlAAZvZmZzZXQADG9yaWdpbmFsUGF0aAAIcGFja2FnZXMA"
84 "BnBhcmVudAAIcGF0aExpc3QABXZhbHVlAAMABw4ABQAHDgAFAAcOAAUABw4ABQAHDgAFAAcOAAUA"
85 "Bw4ABQAHDgAAAAEABIGABPAFAAIBAAIAAQADgYAEhAYAAgEAAAABAACBgAScBgAAAQABgYAEtAYA"
86 "AAEAAoGABMwGAAQBAAQAAQABAAEABYGABOQGAAABAAaBgAT8BgAAAQAHgYAElAcAAAwAAAAAAAAA"
87 "AQAAAAAAAAABAAAAIAAAAHAAAAACAAAADQAAAPAAAAADAAAAAQAAACQBAAAEAAAACAAAADABAAAF"
88 "AAAACAAAAHABAAAGAAAACgAAALABAAABIAAACAAAAPACAAACIAAAIAAAAKwDAAADIAAACAAAAKoF"
89 "AAAAIAAACAAAANIFAAAAEAAAAQAAADQGAAA=";
Brian Carlstroma331b3c2011-07-18 17:47:56 -070090
Brian Carlstrom934486c2011-07-12 23:42:50 -070091// package java.lang;
92// public class Object {}
93//
94// class MyClass {}
95static const char kMyClassDex[] =
96 "ZGV4CjAzNQA5Nm9IrCVm91COwepff7LhIE23GZIxGjgIAgAAcAAAAHhWNBIAAAAAAAAAAIABAAAG"
97 "AAAAcAAAAAMAAACIAAAAAQAAAJQAAAAAAAAAAAAAAAIAAACgAAAAAgAAALAAAAAYAQAA8AAAABwB"
98 "AAAkAQAALwEAAEMBAABRAQAAXgEAAAEAAAACAAAABQAAAAUAAAACAAAAAAAAAAAAAAAAAAAAAQAA"
99 "AAAAAAABAAAAAQAAAP////8AAAAABAAAAAAAAABrAQAAAAAAAAAAAAAAAAAAAQAAAAAAAAADAAAA"
100 "AAAAAHUBAAAAAAAAAQABAAAAAABhAQAAAQAAAA4AAAABAAEAAQAAAGYBAAAEAAAAcBABAAAADgAG"
101 "PGluaXQ+AAlMTXlDbGFzczsAEkxqYXZhL2xhbmcvT2JqZWN0OwAMTXlDbGFzcy5qYXZhAAtPYmpl"
102 "Y3QuamF2YQABVgACAAcOAAUABw4AAAABAAGBgATwAQAAAQAAgIAEhAIACwAAAAAAAAABAAAAAAAA"
103 "AAEAAAAGAAAAcAAAAAIAAAADAAAAiAAAAAMAAAABAAAAlAAAAAUAAAACAAAAoAAAAAYAAAACAAAA"
104 "sAAAAAEgAAACAAAA8AAAAAIgAAAGAAAAHAEAAAMgAAACAAAAYQEAAAAgAAACAAAAawEAAAAQAAAB"
105 "AAAAgAEAAA==";
106
107// class Nested {
108// class Inner {
109// }
110// }
111static const char kNestedDex[] =
112 "ZGV4CjAzNQAQedgAe7gM1B/WHsWJ6L7lGAISGC7yjD2IAwAAcAAAAHhWNBIAAAAAAAAAAMQCAAAP"
113 "AAAAcAAAAAcAAACsAAAAAgAAAMgAAAABAAAA4AAAAAMAAADoAAAAAgAAAAABAABIAgAAQAEAAK4B"
114 "AAC2AQAAvQEAAM0BAADXAQAA+wEAABsCAAA+AgAAUgIAAF8CAABiAgAAZgIAAHMCAAB5AgAAgQIA"
115 "AAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAkAAAAJAAAABgAAAAAAAAAKAAAABgAAAKgBAAAAAAEA"
116 "DQAAAAAAAQAAAAAAAQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAIAAAAiAEAAKsCAAAA"
117 "AAAAAQAAAAAAAAAFAAAAAAAAAAgAAACYAQAAuAIAAAAAAAACAAAAlAIAAJoCAAABAAAAowIAAAIA"
118 "AgABAAAAiAIAAAYAAABbAQAAcBACAAAADgABAAEAAQAAAI4CAAAEAAAAcBACAAAADgBAAQAAAAAA"
119 "AAAAAAAAAAAATAEAAAAAAAAAAAAAAAAAAAEAAAABAAY8aW5pdD4ABUlubmVyAA5MTmVzdGVkJElu"
120 "bmVyOwAITE5lc3RlZDsAIkxkYWx2aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdDbGFzczsAHkxkYWx2"
121 "aWsvYW5ub3RhdGlvbi9Jbm5lckNsYXNzOwAhTGRhbHZpay9hbm5vdGF0aW9uL01lbWJlckNsYXNz"
122 "ZXM7ABJMamF2YS9sYW5nL09iamVjdDsAC05lc3RlZC5qYXZhAAFWAAJWTAALYWNjZXNzRmxhZ3MA"
123 "BG5hbWUABnRoaXMkMAAFdmFsdWUAAgEABw4AAQAHDjwAAgIBDhgBAgMCCwQADBcBAgQBDhwBGAAA"
124 "AQEAAJAgAICABNQCAAABAAGAgATwAgAAEAAAAAAAAAABAAAAAAAAAAEAAAAPAAAAcAAAAAIAAAAH"
125 "AAAArAAAAAMAAAACAAAAyAAAAAQAAAABAAAA4AAAAAUAAAADAAAA6AAAAAYAAAACAAAAAAEAAAMQ"
126 "AAACAAAAQAEAAAEgAAACAAAAVAEAAAYgAAACAAAAiAEAAAEQAAABAAAAqAEAAAIgAAAPAAAArgEA"
127 "AAMgAAACAAAAiAIAAAQgAAADAAAAlAIAAAAgAAACAAAAqwIAAAAQAAABAAAAxAIAAA==";
128
129// class ProtoCompare {
130// int m1(short x, int y, long z) { return x + y + (int)z; }
131// int m2(short x, int y, long z) { return x + y + (int)z; }
132// int m3(long x, int y, short z) { return (int)x + y + z; }
133// long m4(long x, int y, short z) { return x + y + z; }
134// }
135static const char kProtoCompareDex[] =
136 "ZGV4CjAzNQBLUetu+TVZ8gsYsCOFoij7ecsHaGSEGA8gAwAAcAAAAHhWNBIAAAAAAAAAAIwCAAAP"
137 "AAAAcAAAAAYAAACsAAAABAAAAMQAAAAAAAAAAAAAAAYAAAD0AAAAAQAAACQBAADcAQAARAEAAN4B"
138 "AADmAQAA6QEAAO8BAAD1AQAA+AEAAP4BAAAOAgAAIgIAADUCAAA4AgAAOwIAAD8CAABDAgAARwIA"
139 "AAEAAAAEAAAABgAAAAcAAAAJAAAACgAAAAIAAAAAAAAAyAEAAAMAAAAAAAAA1AEAAAUAAAABAAAA"
140 "yAEAAAoAAAAFAAAAAAAAAAIAAwAAAAAAAgABAAsAAAACAAEADAAAAAIAAAANAAAAAgACAA4AAAAD"
141 "AAMAAAAAAAIAAAAAAAAAAwAAAAAAAAAIAAAAAAAAAHACAAAAAAAAAQABAAEAAABLAgAABAAAAHAQ"
142 "BQAAAA4ABwAFAAAAAABQAgAABQAAAJAAAwSEUbAQDwAAAAcABQAAAAAAWAIAAAUAAACQAAMEhFGw"
143 "EA8AAAAGAAUAAAAAAGACAAAEAAAAhCCwQLBQDwAJAAUAAAAAAGgCAAAFAAAAgXC7UIGCuyAQAAAA"
144 "AwAAAAEAAAAEAAAAAwAAAAQAAAABAAY8aW5pdD4AAUkABElKSVMABElTSUoAAUoABEpKSVMADkxQ"
145 "cm90b0NvbXBhcmU7ABJMamF2YS9sYW5nL09iamVjdDsAEVByb3RvQ29tcGFyZS5qYXZhAAFTAAFW"
146 "AAJtMQACbTIAAm0zAAJtNAABAAcOAAIDAAAABw4AAwMAAAAHDgAEAwAAAAcOAAUDAAAABw4AAAAB"
147 "BACAgATEAgEA3AIBAPgCAQCUAwEArAMAAAwAAAAAAAAAAQAAAAAAAAABAAAADwAAAHAAAAACAAAA"
148 "BgAAAKwAAAADAAAABAAAAMQAAAAFAAAABgAAAPQAAAAGAAAAAQAAACQBAAABIAAABQAAAEQBAAAB"
149 "EAAAAgAAAMgBAAACIAAADwAAAN4BAAADIAAABQAAAEsCAAAAIAAAAQAAAHACAAAAEAAAAQAAAIwC"
150 "AAA=";
151
152// class ProtoCompare2 {
153// int m1(short x, int y, long z) { return x + y + (int)z; }
154// int m2(short x, int y, long z) { return x + y + (int)z; }
155// int m3(long x, int y, short z) { return (int)x + y + z; }
156// long m4(long x, int y, short z) { return x + y + z; }
157// }
158static const char kProtoCompare2Dex[] =
159 "ZGV4CjAzNQDVUXj687EpyTTDJZEZPA8dEYnDlm0Ir6YgAwAAcAAAAHhWNBIAAAAAAAAAAIwCAAAP"
160 "AAAAcAAAAAYAAACsAAAABAAAAMQAAAAAAAAAAAAAAAYAAAD0AAAAAQAAACQBAADcAQAARAEAAN4B"
161 "AADmAQAA6QEAAO8BAAD1AQAA+AEAAP4BAAAPAgAAIwIAADcCAAA6AgAAPQIAAEECAABFAgAASQIA"
162 "AAEAAAAEAAAABgAAAAcAAAAJAAAACgAAAAIAAAAAAAAAyAEAAAMAAAAAAAAA1AEAAAUAAAABAAAA"
163 "yAEAAAoAAAAFAAAAAAAAAAIAAwAAAAAAAgABAAsAAAACAAEADAAAAAIAAAANAAAAAgACAA4AAAAD"
164 "AAMAAAAAAAIAAAAAAAAAAwAAAAAAAAAIAAAAAAAAAHICAAAAAAAAAQABAAEAAABNAgAABAAAAHAQ"
165 "BQAAAA4ABwAFAAAAAABSAgAABQAAAJAAAwSEUbAQDwAAAAcABQAAAAAAWgIAAAUAAACQAAMEhFGw"
166 "EA8AAAAGAAUAAAAAAGICAAAEAAAAhCCwQLBQDwAJAAUAAAAAAGoCAAAFAAAAgXC7UIGCuyAQAAAA"
167 "AwAAAAEAAAAEAAAAAwAAAAQAAAABAAY8aW5pdD4AAUkABElKSVMABElTSUoAAUoABEpKSVMAD0xQ"
168 "cm90b0NvbXBhcmUyOwASTGphdmEvbGFuZy9PYmplY3Q7ABJQcm90b0NvbXBhcmUyLmphdmEAAVMA"
169 "AVYAAm0xAAJtMgACbTMAAm00AAEABw4AAgMAAAAHDgADAwAAAAcOAAQDAAAABw4ABQMAAAAHDgAA"
170 "AAEEAICABMQCAQDcAgEA+AIBAJQDAQCsAwwAAAAAAAAAAQAAAAAAAAABAAAADwAAAHAAAAACAAAA"
171 "BgAAAKwAAAADAAAABAAAAMQAAAAFAAAABgAAAPQAAAAGAAAAAQAAACQBAAABIAAABQAAAEQBAAAB"
172 "EAAAAgAAAMgBAAACIAAADwAAAN4BAAADIAAABQAAAE0CAAAAIAAAAQAAAHICAAAAEAAAAQAAAIwC"
173 "AAA=";
174
Ian Rogersb033c752011-07-20 12:22:35 -0700175// javac MyClass.java && dx --dex --output=MyClass.dex
176// --core-library MyClass.class java/lang/Object.class && base64 MyClass.dex
177// package java.lang;
178// public class Object {}
179// class MyClass {
180// native void foo();
181// native int fooI(int x);
182// native int fooII(int x, int y);
183// native double fooDD(double x, double y);
184// native Object fooIOO(int x, Object y, Object z);
185// static native Object fooSIOO(int x, Object y, Object z);
Ian Rogersdf20fe02011-07-20 20:34:16 -0700186// static synchronized native Object fooSSIOO(int x, Object y, Object z);
Ian Rogersb033c752011-07-20 12:22:35 -0700187// }
188static const char kMyClassNativesDex[] =
Ian Rogersdf20fe02011-07-20 20:34:16 -0700189 "ZGV4CjAzNQA4WWrpXgdlkoTHR8Yubx4LJO4HbGsX1p1EAwAAcAAAAHhWNBIAAAAAAAAAALACAAAT"
190 "AAAAcAAAAAUAAAC8AAAABQAAANAAAAAAAAAAAAAAAAkAAAAMAQAAAgAAAFQBAACwAQAAlAEAAOIB"
191 "AADqAQAA7QEAAPIBAAD1AQAA+QEAAP4BAAAEAgAADwIAACMCAAAxAgAAPgIAAEECAABGAgAATQIA"
192 "AFMCAABaAgAAYgIAAGsCAAABAAAAAwAAAAcAAAAIAAAACwAAAAIAAAAAAAAAwAEAAAQAAAABAAAA"
193 "yAEAAAUAAAABAAAA0AEAAAYAAAADAAAA2AEAAAsAAAAEAAAAAAAAAAIABAAAAAAAAgAEAAwAAAAC"
194 "AAAADQAAAAIAAQAOAAAAAgACAA8AAAACAAMAEAAAAAIAAwARAAAAAgADABIAAAADAAQAAAAAAAMA"
195 "AAABAAAA/////wAAAAAKAAAAAAAAAH8CAAAAAAAAAgAAAAAAAAADAAAAAAAAAAkAAAAAAAAAiQIA"
196 "AAAAAAABAAEAAAAAAHUCAAABAAAADgAAAAEAAQABAAAAegIAAAQAAABwEAgAAAAOAAIAAAAAAAAA"
197 "AQAAAAEAAAACAAAAAQABAAMAAAABAAMAAwAGPGluaXQ+AAFEAANEREQAAUkAAklJAANJSUkABExJ"
198 "TEwACUxNeUNsYXNzOwASTGphdmEvbGFuZy9PYmplY3Q7AAxNeUNsYXNzLmphdmEAC09iamVjdC5q"
199 "YXZhAAFWAANmb28ABWZvb0REAARmb29JAAVmb29JSQAGZm9vSU9PAAdmb29TSU9PAAhmb29TU0lP"
200 "TwADAAcOAAEABw4AAAABAAiBgASUAwAAAwUAgIAEqAMGiAIAAaiCCAABgAIAAYACAAGAAgABgAIA"
201 "AYACAAwAAAAAAAAAAQAAAAAAAAABAAAAEwAAAHAAAAACAAAABQAAALwAAAADAAAABQAAANAAAAAF"
202 "AAAACQAAAAwBAAAGAAAAAgAAAFQBAAABIAAAAgAAAJQBAAABEAAABAAAAMABAAACIAAAEwAAAOIB"
203 "AAADIAAAAgAAAHUCAAAAIAAAAgAAAH8CAAAAEAAAAQAAALACAAA=";
Ian Rogersb033c752011-07-20 12:22:35 -0700204
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700205// class CreateMethodDescriptor {
206// Float m1(int a, double b, long c, Object d) { return null; }
207// CreateMethodDescriptor m2(boolean x, short y, char z) { return null; }
208// }
209static const char kCreateMethodDescriptorDex[] =
210 "ZGV4CjAzNQBSU7aKdNXwH+uOpti/mvZ4/Dk8wM8VtNbgAgAAcAAAAHhWNBIAAAAAAAAAAEwCAAAQ"
211 "AAAAcAAAAAoAAACwAAAAAwAAANgAAAAAAAAAAAAAAAQAAAD8AAAAAQAAABwBAACkAQAAPAEAAJQB"
212 "AACcAQAAnwEAALwBAAC/AQAAwgEAAMUBAADfAQAA5gEAAOwBAAD/AQAAEwIAABYCAAAZAgAAHAIA"
213 "ACACAAABAAAAAwAAAAQAAAAFAAAABgAAAAkAAAAKAAAACwAAAAwAAAANAAAACAAAAAQAAAB8AQAA"
214 "BwAAAAUAAACIAQAADAAAAAgAAAAAAAAABAACAAAAAAAEAAEADgAAAAQAAAAPAAAABgACAAAAAAAE"
215 "AAAAAAAAAAYAAAAAAAAAAgAAAAAAAAA6AgAAAAAAAAEAAQABAAAAJAIAAAQAAABwEAMAAAAOAAgA"
216 "BwAAAAAAKQIAAAIAAAASABEABQAEAAAAAAAyAgAAAgAAABIAEQADAAAACQAHAAAAAAAEAAAAAgAB"
217 "AAMABgAGPGluaXQ+AAFDABtDcmVhdGVNZXRob2REZXNjcmlwdG9yLmphdmEAAUQAAUkAAUoAGExD"
218 "cmVhdGVNZXRob2REZXNjcmlwdG9yOwAFTElESkwABExaU0MAEUxqYXZhL2xhbmcvRmxvYXQ7ABJM"
219 "amF2YS9sYW5nL09iamVjdDsAAVMAAVYAAVoAAm0xAAJtMgABAAcOAAIEAAAAAAcOAAMDAAAABw4A"
220 "AAABAgCAgAS8AgEA1AIBAOgCDAAAAAAAAAABAAAAAAAAAAEAAAAQAAAAcAAAAAIAAAAKAAAAsAAA"
221 "AAMAAAADAAAA2AAAAAUAAAAEAAAA/AAAAAYAAAABAAAAHAEAAAEgAAADAAAAPAEAAAEQAAACAAAA"
222 "fAEAAAIgAAAQAAAAlAEAAAMgAAADAAAAJAIAAAAgAAABAAAAOgIAAAAQAAABAAAATAIAAA==";
223
Brian Carlstromf615a612011-07-23 12:50:34 -0700224static inline DexFile* OpenDexFileBase64(const char* base64) {
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700225 CHECK(base64 != NULL);
226 size_t length;
Brian Carlstromf615a612011-07-23 12:50:34 -0700227 byte* dex_bytes = DecodeBase64(base64, &length);
228 CHECK(dex_bytes != NULL);
229 DexFile* dex_file = DexFile::OpenPtr(dex_bytes, length);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700230 CHECK(dex_file != NULL);
Brian Carlstromf615a612011-07-23 12:50:34 -0700231 return dex_file;
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700232}
233
234class RuntimeTest : public testing::Test {
235 protected:
236 virtual void SetUp() {
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700237 is_host_ = getenv("ANDROID_BUILD_TOP") != NULL;
238
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700239 android_data_.reset(strdup(is_host_ ? "/tmp/art-data-XXXXXX" : "/sdcard/art-data-XXXXXX"));
240 ASSERT_TRUE(android_data_ != NULL);
241 const char* android_data_modified = mkdtemp(android_data_.get());
242 // note that mkdtemp side effects android_data_ as well
243 ASSERT_TRUE(android_data_modified != NULL);
244 setenv("ANDROID_DATA", android_data_modified, 1);
245 art_cache_.append(android_data_.get());
246 art_cache_.append("/art-cache");
247 int mkdir_result = mkdir(art_cache_.c_str(), 0700);
248 ASSERT_EQ(mkdir_result, 0);
249
Brian Carlstromf615a612011-07-23 12:50:34 -0700250 java_lang_dex_file_.reset(OpenDexFileBase64(kJavaLangDex));
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700251
Brian Carlstromf615a612011-07-23 12:50:34 -0700252 std::vector<DexFile*> boot_class_path;
253 boot_class_path.push_back(java_lang_dex_file_.get());
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700254
Carl Shapiro7a909592011-07-24 19:21:59 -0700255 runtime_.reset(Runtime::Create(boot_class_path));
256 ASSERT_TRUE(runtime_ != NULL);
257 class_linker_ = runtime_->GetClassLinker();
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700258 }
259
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700260 virtual void TearDown() {
261 const char* android_data = getenv("ANDROID_DATA");
262 ASSERT_TRUE(android_data != NULL);
263 DIR* dir = opendir(art_cache_.c_str());
264 ASSERT_TRUE(dir != NULL);
265 while (true) {
266 struct dirent entry;
267 struct dirent* entry_ptr;
268 int readdir_result = readdir_r(dir, &entry, &entry_ptr);
269 ASSERT_EQ(0, readdir_result);
270 if (entry_ptr == NULL) {
271 break;
272 }
273 if ((strcmp(entry_ptr->d_name, ".") == 0) || (strcmp(entry_ptr->d_name, "..") == 0)) {
274 continue;
275 }
276 std::string filename(art_cache_);
277 filename.push_back('/');
278 filename.append(entry_ptr->d_name);
279 int unlink_result = unlink(filename.c_str());
280 ASSERT_EQ(0, unlink_result);
Jesse Wilsonac5b9e22011-07-27 15:11:13 -0400281 }
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700282 closedir(dir);
283 int rmdir_cache_result = rmdir(art_cache_.c_str());
284 ASSERT_EQ(0, rmdir_cache_result);
285 int rmdir_data_result = rmdir(android_data_.get());
286 ASSERT_EQ(0, rmdir_data_result);
287 }
Jesse Wilsonac5b9e22011-07-27 15:11:13 -0400288
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700289 std::string GetLibCoreDexFileName() {
290 if (is_host_) {
291 const char* host_dir = getenv("ANDROID_HOST_OUT");
292 CHECK(host_dir != NULL);
293 return StringPrintf("%s/framework/core-hostdex.jar", host_dir);
294 }
295 return std::string("/system/framework/core.jar");
296 }
297
298 DexFile* GetLibCoreDex() {
299 std::string libcore_dex_file_name = GetLibCoreDexFileName();
300 return DexFile::OpenZip(libcore_dex_file_name.c_str());
Jesse Wilsonac5b9e22011-07-27 15:11:13 -0400301 }
302
Jesse Wilson46cdd4b2011-07-28 17:40:48 -0400303 void UseLibCoreDex() {
304 delete runtime_.release();
305 java_lang_dex_file_.reset(GetLibCoreDex());
306
307 std::vector<DexFile*> boot_class_path;
308 boot_class_path.push_back(java_lang_dex_file_.get());
309
310 runtime_.reset(Runtime::Create(boot_class_path));
311 ASSERT_TRUE(runtime_ != NULL);
312 class_linker_ = runtime_->GetClassLinker();
313 }
314
Brian Carlstrom74eb46a2011-08-02 20:10:14 -0700315 PathClassLoader* AllocPathClassLoader(const DexFile* dex_file) {
316 class_linker_->RegisterDexFile(dex_file);
317 std::vector<const DexFile*> dex_files;
318 dex_files.push_back(dex_file);
319 return class_linker_->AllocPathClassLoader(dex_files);
320 }
321
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700322 bool is_host_;
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700323 scoped_ptr_malloc<char> android_data_;
324 std::string art_cache_;
Brian Carlstromf615a612011-07-23 12:50:34 -0700325 scoped_ptr<DexFile> java_lang_dex_file_;
Carl Shapiro7a909592011-07-24 19:21:59 -0700326 scoped_ptr<Runtime> runtime_;
327 ClassLinker* class_linker_;
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700328};
329
Brian Carlstrom934486c2011-07-12 23:42:50 -0700330} // namespace art