blob: 685a06c81e17c7ee32e307e0cec2567c72e97e41 [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 Carlstroma331b3c2011-07-18 17:47:56 -070039// public interface Cloneable {}
40//
41// package java.io;
42// public interface Serializable {}
43static const char kJavaLangDex[] =
Brian Carlstrom75cb3b42011-07-28 02:13:36 -070044 "ZGV4CjAzNQDgopvWPbyCTsLOzSYO4VPqS6aRqcz6ZQu0BAAAcAAAAHhWNBIAAAAAAAAAACAEAAAW"
45 "AAAAcAAAAAoAAADIAAAAAQAAAPAAAAAEAAAA/AAAAAUAAAAcAQAABwAAAEQBAACQAgAAJAIAAJgC"
46 "AACgAgAArAIAALwCAADIAgAAywIAAOMCAAD2AgAADQMAACEDAAA1AwAAUAMAAGwDAAB5AwAAhgMA"
47 "AJkDAACmAwAAqQMAAK0DAAC0AwAAvgMAAMYDAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAA"
48 "CwAAABAAAAARAAAAEAAAAAgAAAAAAAAABQAAABIAAAAFAAAAEwAAAAUAAAAUAAAABQAJABUAAAAC"
49 "AAAAAAAAAAQAAAAAAAAABQAAAAAAAAAGAAAAAAAAAAcAAAAAAAAABAAAAAEAAAD/////AAAAAA0A"
50 "AAAAAAAA5gMAAAAAAAABAAAAAQYAAAQAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAIAAAABAAAABAAA"
51 "AAAAAAABAAAAAAAAAPADAAAAAAAAAwAAAAEGAAAEAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAFAAAA"
52 "AQAAAAQAAAAAAAAADwAAAAAAAAD6AwAAAAAAAAYAAAABAAAABAAAAAAAAAADAAAAAAAAAAwEAAAA"
53 "AAAABwAAAAEAAAAEAAAAAAAAAAwAAAAAAAAAFgQAAAAAAAABAAEAAAAAAM0DAAABAAAADgAAAAEA"
54 "AQABAAAA0gMAAAQAAABwEAEAAAAOAAEAAQABAAAA1wMAAAQAAABwEAEAAAAOAAEAAQABAAAA3AMA"
55 "AAQAAABwEAEAAAAOAAEAAQABAAAA4QMAAAQAAABwEAEAAAAOAAY8aW5pdD4ACkNsYXNzLmphdmEA"
56 "DkNsb25lYWJsZS5qYXZhAApGaWVsZC5qYXZhAAFJABZMamF2YS9pby9TZXJpYWxpemFibGU7ABFM"
57 "amF2YS9sYW5nL0NsYXNzOwAVTGphdmEvbGFuZy9DbG9uZWFibGU7ABJMamF2YS9sYW5nL09iamVj"
58 "dDsAEkxqYXZhL2xhbmcvU3RyaW5nOwAZTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOwAaTGphdmEv"
59 "bGFuZy9yZWZsZWN0L01ldGhvZDsAC01ldGhvZC5qYXZhAAtPYmplY3QuamF2YQARU2VyaWFsaXph"
60 "YmxlLmphdmEAC1N0cmluZy5qYXZhAAFWAAJbQwAFY291bnQACGhhc2hDb2RlAAZvZmZzZXQABXZh"
61 "bHVlAAMABw4ABQAHDgAFAAcOAAUABw4ABQAHDgAAAAEAAYGABKQEAAABAACBgAS4BAAEAQAAAAEA"
62 "AQABAAKBgATQBAAAAQADgYAE6AQAAAEABIGABIAFDAAAAAAAAAABAAAAAAAAAAEAAAAWAAAAcAAA"
63 "AAIAAAAKAAAAyAAAAAMAAAABAAAA8AAAAAQAAAAEAAAA/AAAAAUAAAAFAAAAHAEAAAYAAAAHAAAA"
64 "RAEAAAEgAAAFAAAAJAIAAAIgAAAWAAAAmAIAAAMgAAAFAAAAzQMAAAAgAAAFAAAA5gMAAAAQAAAB"
65 "AAAAIAQAAA==";
Brian Carlstroma331b3c2011-07-18 17:47:56 -070066
Brian Carlstrom934486c2011-07-12 23:42:50 -070067// package java.lang;
68// public class Object {}
69//
70// class MyClass {}
71static const char kMyClassDex[] =
72 "ZGV4CjAzNQA5Nm9IrCVm91COwepff7LhIE23GZIxGjgIAgAAcAAAAHhWNBIAAAAAAAAAAIABAAAG"
73 "AAAAcAAAAAMAAACIAAAAAQAAAJQAAAAAAAAAAAAAAAIAAACgAAAAAgAAALAAAAAYAQAA8AAAABwB"
74 "AAAkAQAALwEAAEMBAABRAQAAXgEAAAEAAAACAAAABQAAAAUAAAACAAAAAAAAAAAAAAAAAAAAAQAA"
75 "AAAAAAABAAAAAQAAAP////8AAAAABAAAAAAAAABrAQAAAAAAAAAAAAAAAAAAAQAAAAAAAAADAAAA"
76 "AAAAAHUBAAAAAAAAAQABAAAAAABhAQAAAQAAAA4AAAABAAEAAQAAAGYBAAAEAAAAcBABAAAADgAG"
77 "PGluaXQ+AAlMTXlDbGFzczsAEkxqYXZhL2xhbmcvT2JqZWN0OwAMTXlDbGFzcy5qYXZhAAtPYmpl"
78 "Y3QuamF2YQABVgACAAcOAAUABw4AAAABAAGBgATwAQAAAQAAgIAEhAIACwAAAAAAAAABAAAAAAAA"
79 "AAEAAAAGAAAAcAAAAAIAAAADAAAAiAAAAAMAAAABAAAAlAAAAAUAAAACAAAAoAAAAAYAAAACAAAA"
80 "sAAAAAEgAAACAAAA8AAAAAIgAAAGAAAAHAEAAAMgAAACAAAAYQEAAAAgAAACAAAAawEAAAAQAAAB"
81 "AAAAgAEAAA==";
82
83// class Nested {
84// class Inner {
85// }
86// }
87static const char kNestedDex[] =
88 "ZGV4CjAzNQAQedgAe7gM1B/WHsWJ6L7lGAISGC7yjD2IAwAAcAAAAHhWNBIAAAAAAAAAAMQCAAAP"
89 "AAAAcAAAAAcAAACsAAAAAgAAAMgAAAABAAAA4AAAAAMAAADoAAAAAgAAAAABAABIAgAAQAEAAK4B"
90 "AAC2AQAAvQEAAM0BAADXAQAA+wEAABsCAAA+AgAAUgIAAF8CAABiAgAAZgIAAHMCAAB5AgAAgQIA"
91 "AAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAkAAAAJAAAABgAAAAAAAAAKAAAABgAAAKgBAAAAAAEA"
92 "DQAAAAAAAQAAAAAAAQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAIAAAAiAEAAKsCAAAA"
93 "AAAAAQAAAAAAAAAFAAAAAAAAAAgAAACYAQAAuAIAAAAAAAACAAAAlAIAAJoCAAABAAAAowIAAAIA"
94 "AgABAAAAiAIAAAYAAABbAQAAcBACAAAADgABAAEAAQAAAI4CAAAEAAAAcBACAAAADgBAAQAAAAAA"
95 "AAAAAAAAAAAATAEAAAAAAAAAAAAAAAAAAAEAAAABAAY8aW5pdD4ABUlubmVyAA5MTmVzdGVkJElu"
96 "bmVyOwAITE5lc3RlZDsAIkxkYWx2aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdDbGFzczsAHkxkYWx2"
97 "aWsvYW5ub3RhdGlvbi9Jbm5lckNsYXNzOwAhTGRhbHZpay9hbm5vdGF0aW9uL01lbWJlckNsYXNz"
98 "ZXM7ABJMamF2YS9sYW5nL09iamVjdDsAC05lc3RlZC5qYXZhAAFWAAJWTAALYWNjZXNzRmxhZ3MA"
99 "BG5hbWUABnRoaXMkMAAFdmFsdWUAAgEABw4AAQAHDjwAAgIBDhgBAgMCCwQADBcBAgQBDhwBGAAA"
100 "AQEAAJAgAICABNQCAAABAAGAgATwAgAAEAAAAAAAAAABAAAAAAAAAAEAAAAPAAAAcAAAAAIAAAAH"
101 "AAAArAAAAAMAAAACAAAAyAAAAAQAAAABAAAA4AAAAAUAAAADAAAA6AAAAAYAAAACAAAAAAEAAAMQ"
102 "AAACAAAAQAEAAAEgAAACAAAAVAEAAAYgAAACAAAAiAEAAAEQAAABAAAAqAEAAAIgAAAPAAAArgEA"
103 "AAMgAAACAAAAiAIAAAQgAAADAAAAlAIAAAAgAAACAAAAqwIAAAAQAAABAAAAxAIAAA==";
104
105// class ProtoCompare {
106// int m1(short x, int y, long z) { return x + y + (int)z; }
107// int m2(short x, int y, long z) { return x + y + (int)z; }
108// int m3(long x, int y, short z) { return (int)x + y + z; }
109// long m4(long x, int y, short z) { return x + y + z; }
110// }
111static const char kProtoCompareDex[] =
112 "ZGV4CjAzNQBLUetu+TVZ8gsYsCOFoij7ecsHaGSEGA8gAwAAcAAAAHhWNBIAAAAAAAAAAIwCAAAP"
113 "AAAAcAAAAAYAAACsAAAABAAAAMQAAAAAAAAAAAAAAAYAAAD0AAAAAQAAACQBAADcAQAARAEAAN4B"
114 "AADmAQAA6QEAAO8BAAD1AQAA+AEAAP4BAAAOAgAAIgIAADUCAAA4AgAAOwIAAD8CAABDAgAARwIA"
115 "AAEAAAAEAAAABgAAAAcAAAAJAAAACgAAAAIAAAAAAAAAyAEAAAMAAAAAAAAA1AEAAAUAAAABAAAA"
116 "yAEAAAoAAAAFAAAAAAAAAAIAAwAAAAAAAgABAAsAAAACAAEADAAAAAIAAAANAAAAAgACAA4AAAAD"
117 "AAMAAAAAAAIAAAAAAAAAAwAAAAAAAAAIAAAAAAAAAHACAAAAAAAAAQABAAEAAABLAgAABAAAAHAQ"
118 "BQAAAA4ABwAFAAAAAABQAgAABQAAAJAAAwSEUbAQDwAAAAcABQAAAAAAWAIAAAUAAACQAAMEhFGw"
119 "EA8AAAAGAAUAAAAAAGACAAAEAAAAhCCwQLBQDwAJAAUAAAAAAGgCAAAFAAAAgXC7UIGCuyAQAAAA"
120 "AwAAAAEAAAAEAAAAAwAAAAQAAAABAAY8aW5pdD4AAUkABElKSVMABElTSUoAAUoABEpKSVMADkxQ"
121 "cm90b0NvbXBhcmU7ABJMamF2YS9sYW5nL09iamVjdDsAEVByb3RvQ29tcGFyZS5qYXZhAAFTAAFW"
122 "AAJtMQACbTIAAm0zAAJtNAABAAcOAAIDAAAABw4AAwMAAAAHDgAEAwAAAAcOAAUDAAAABw4AAAAB"
123 "BACAgATEAgEA3AIBAPgCAQCUAwEArAMAAAwAAAAAAAAAAQAAAAAAAAABAAAADwAAAHAAAAACAAAA"
124 "BgAAAKwAAAADAAAABAAAAMQAAAAFAAAABgAAAPQAAAAGAAAAAQAAACQBAAABIAAABQAAAEQBAAAB"
125 "EAAAAgAAAMgBAAACIAAADwAAAN4BAAADIAAABQAAAEsCAAAAIAAAAQAAAHACAAAAEAAAAQAAAIwC"
126 "AAA=";
127
128// class ProtoCompare2 {
129// int m1(short x, int y, long z) { return x + y + (int)z; }
130// int m2(short x, int y, long z) { return x + y + (int)z; }
131// int m3(long x, int y, short z) { return (int)x + y + z; }
132// long m4(long x, int y, short z) { return x + y + z; }
133// }
134static const char kProtoCompare2Dex[] =
135 "ZGV4CjAzNQDVUXj687EpyTTDJZEZPA8dEYnDlm0Ir6YgAwAAcAAAAHhWNBIAAAAAAAAAAIwCAAAP"
136 "AAAAcAAAAAYAAACsAAAABAAAAMQAAAAAAAAAAAAAAAYAAAD0AAAAAQAAACQBAADcAQAARAEAAN4B"
137 "AADmAQAA6QEAAO8BAAD1AQAA+AEAAP4BAAAPAgAAIwIAADcCAAA6AgAAPQIAAEECAABFAgAASQIA"
138 "AAEAAAAEAAAABgAAAAcAAAAJAAAACgAAAAIAAAAAAAAAyAEAAAMAAAAAAAAA1AEAAAUAAAABAAAA"
139 "yAEAAAoAAAAFAAAAAAAAAAIAAwAAAAAAAgABAAsAAAACAAEADAAAAAIAAAANAAAAAgACAA4AAAAD"
140 "AAMAAAAAAAIAAAAAAAAAAwAAAAAAAAAIAAAAAAAAAHICAAAAAAAAAQABAAEAAABNAgAABAAAAHAQ"
141 "BQAAAA4ABwAFAAAAAABSAgAABQAAAJAAAwSEUbAQDwAAAAcABQAAAAAAWgIAAAUAAACQAAMEhFGw"
142 "EA8AAAAGAAUAAAAAAGICAAAEAAAAhCCwQLBQDwAJAAUAAAAAAGoCAAAFAAAAgXC7UIGCuyAQAAAA"
143 "AwAAAAEAAAAEAAAAAwAAAAQAAAABAAY8aW5pdD4AAUkABElKSVMABElTSUoAAUoABEpKSVMAD0xQ"
144 "cm90b0NvbXBhcmUyOwASTGphdmEvbGFuZy9PYmplY3Q7ABJQcm90b0NvbXBhcmUyLmphdmEAAVMA"
145 "AVYAAm0xAAJtMgACbTMAAm00AAEABw4AAgMAAAAHDgADAwAAAAcOAAQDAAAABw4ABQMAAAAHDgAA"
146 "AAEEAICABMQCAQDcAgEA+AIBAJQDAQCsAwwAAAAAAAAAAQAAAAAAAAABAAAADwAAAHAAAAACAAAA"
147 "BgAAAKwAAAADAAAABAAAAMQAAAAFAAAABgAAAPQAAAAGAAAAAQAAACQBAAABIAAABQAAAEQBAAAB"
148 "EAAAAgAAAMgBAAACIAAADwAAAN4BAAADIAAABQAAAE0CAAAAIAAAAQAAAHICAAAAEAAAAQAAAIwC"
149 "AAA=";
150
Ian Rogersb033c752011-07-20 12:22:35 -0700151// javac MyClass.java && dx --dex --output=MyClass.dex
152// --core-library MyClass.class java/lang/Object.class && base64 MyClass.dex
153// package java.lang;
154// public class Object {}
155// class MyClass {
156// native void foo();
157// native int fooI(int x);
158// native int fooII(int x, int y);
159// native double fooDD(double x, double y);
160// native Object fooIOO(int x, Object y, Object z);
161// static native Object fooSIOO(int x, Object y, Object z);
Ian Rogersdf20fe02011-07-20 20:34:16 -0700162// static synchronized native Object fooSSIOO(int x, Object y, Object z);
Ian Rogersb033c752011-07-20 12:22:35 -0700163// }
164static const char kMyClassNativesDex[] =
Ian Rogersdf20fe02011-07-20 20:34:16 -0700165 "ZGV4CjAzNQA4WWrpXgdlkoTHR8Yubx4LJO4HbGsX1p1EAwAAcAAAAHhWNBIAAAAAAAAAALACAAAT"
166 "AAAAcAAAAAUAAAC8AAAABQAAANAAAAAAAAAAAAAAAAkAAAAMAQAAAgAAAFQBAACwAQAAlAEAAOIB"
167 "AADqAQAA7QEAAPIBAAD1AQAA+QEAAP4BAAAEAgAADwIAACMCAAAxAgAAPgIAAEECAABGAgAATQIA"
168 "AFMCAABaAgAAYgIAAGsCAAABAAAAAwAAAAcAAAAIAAAACwAAAAIAAAAAAAAAwAEAAAQAAAABAAAA"
169 "yAEAAAUAAAABAAAA0AEAAAYAAAADAAAA2AEAAAsAAAAEAAAAAAAAAAIABAAAAAAAAgAEAAwAAAAC"
170 "AAAADQAAAAIAAQAOAAAAAgACAA8AAAACAAMAEAAAAAIAAwARAAAAAgADABIAAAADAAQAAAAAAAMA"
171 "AAABAAAA/////wAAAAAKAAAAAAAAAH8CAAAAAAAAAgAAAAAAAAADAAAAAAAAAAkAAAAAAAAAiQIA"
172 "AAAAAAABAAEAAAAAAHUCAAABAAAADgAAAAEAAQABAAAAegIAAAQAAABwEAgAAAAOAAIAAAAAAAAA"
173 "AQAAAAEAAAACAAAAAQABAAMAAAABAAMAAwAGPGluaXQ+AAFEAANEREQAAUkAAklJAANJSUkABExJ"
174 "TEwACUxNeUNsYXNzOwASTGphdmEvbGFuZy9PYmplY3Q7AAxNeUNsYXNzLmphdmEAC09iamVjdC5q"
175 "YXZhAAFWAANmb28ABWZvb0REAARmb29JAAVmb29JSQAGZm9vSU9PAAdmb29TSU9PAAhmb29TU0lP"
176 "TwADAAcOAAEABw4AAAABAAiBgASUAwAAAwUAgIAEqAMGiAIAAaiCCAABgAIAAYACAAGAAgABgAIA"
177 "AYACAAwAAAAAAAAAAQAAAAAAAAABAAAAEwAAAHAAAAACAAAABQAAALwAAAADAAAABQAAANAAAAAF"
178 "AAAACQAAAAwBAAAGAAAAAgAAAFQBAAABIAAAAgAAAJQBAAABEAAABAAAAMABAAACIAAAEwAAAOIB"
179 "AAADIAAAAgAAAHUCAAAAIAAAAgAAAH8CAAAAEAAAAQAAALACAAA=";
Ian Rogersb033c752011-07-20 12:22:35 -0700180
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700181// class CreateMethodDescriptor {
182// Float m1(int a, double b, long c, Object d) { return null; }
183// CreateMethodDescriptor m2(boolean x, short y, char z) { return null; }
184// }
185static const char kCreateMethodDescriptorDex[] =
186 "ZGV4CjAzNQBSU7aKdNXwH+uOpti/mvZ4/Dk8wM8VtNbgAgAAcAAAAHhWNBIAAAAAAAAAAEwCAAAQ"
187 "AAAAcAAAAAoAAACwAAAAAwAAANgAAAAAAAAAAAAAAAQAAAD8AAAAAQAAABwBAACkAQAAPAEAAJQB"
188 "AACcAQAAnwEAALwBAAC/AQAAwgEAAMUBAADfAQAA5gEAAOwBAAD/AQAAEwIAABYCAAAZAgAAHAIA"
189 "ACACAAABAAAAAwAAAAQAAAAFAAAABgAAAAkAAAAKAAAACwAAAAwAAAANAAAACAAAAAQAAAB8AQAA"
190 "BwAAAAUAAACIAQAADAAAAAgAAAAAAAAABAACAAAAAAAEAAEADgAAAAQAAAAPAAAABgACAAAAAAAE"
191 "AAAAAAAAAAYAAAAAAAAAAgAAAAAAAAA6AgAAAAAAAAEAAQABAAAAJAIAAAQAAABwEAMAAAAOAAgA"
192 "BwAAAAAAKQIAAAIAAAASABEABQAEAAAAAAAyAgAAAgAAABIAEQADAAAACQAHAAAAAAAEAAAAAgAB"
193 "AAMABgAGPGluaXQ+AAFDABtDcmVhdGVNZXRob2REZXNjcmlwdG9yLmphdmEAAUQAAUkAAUoAGExD"
194 "cmVhdGVNZXRob2REZXNjcmlwdG9yOwAFTElESkwABExaU0MAEUxqYXZhL2xhbmcvRmxvYXQ7ABJM"
195 "amF2YS9sYW5nL09iamVjdDsAAVMAAVYAAVoAAm0xAAJtMgABAAcOAAIEAAAAAAcOAAMDAAAABw4A"
196 "AAABAgCAgAS8AgEA1AIBAOgCDAAAAAAAAAABAAAAAAAAAAEAAAAQAAAAcAAAAAIAAAAKAAAAsAAA"
197 "AAMAAAADAAAA2AAAAAUAAAAEAAAA/AAAAAYAAAABAAAAHAEAAAEgAAADAAAAPAEAAAEQAAACAAAA"
198 "fAEAAAIgAAAQAAAAlAEAAAMgAAADAAAAJAIAAAAgAAABAAAAOgIAAAAQAAABAAAATAIAAA==";
199
Brian Carlstromf615a612011-07-23 12:50:34 -0700200static inline DexFile* OpenDexFileBase64(const char* base64) {
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700201 CHECK(base64 != NULL);
202 size_t length;
Brian Carlstromf615a612011-07-23 12:50:34 -0700203 byte* dex_bytes = DecodeBase64(base64, &length);
204 CHECK(dex_bytes != NULL);
205 DexFile* dex_file = DexFile::OpenPtr(dex_bytes, length);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700206 CHECK(dex_file != NULL);
Brian Carlstromf615a612011-07-23 12:50:34 -0700207 return dex_file;
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700208}
209
210class RuntimeTest : public testing::Test {
211 protected:
212 virtual void SetUp() {
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700213 is_host_ = getenv("ANDROID_BUILD_TOP") != NULL;
214
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700215 android_data_.reset(strdup(is_host_ ? "/tmp/art-data-XXXXXX" : "/sdcard/art-data-XXXXXX"));
216 ASSERT_TRUE(android_data_ != NULL);
217 const char* android_data_modified = mkdtemp(android_data_.get());
218 // note that mkdtemp side effects android_data_ as well
219 ASSERT_TRUE(android_data_modified != NULL);
220 setenv("ANDROID_DATA", android_data_modified, 1);
221 art_cache_.append(android_data_.get());
222 art_cache_.append("/art-cache");
223 int mkdir_result = mkdir(art_cache_.c_str(), 0700);
224 ASSERT_EQ(mkdir_result, 0);
225
Brian Carlstromf615a612011-07-23 12:50:34 -0700226 java_lang_dex_file_.reset(OpenDexFileBase64(kJavaLangDex));
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700227
Brian Carlstromf615a612011-07-23 12:50:34 -0700228 std::vector<DexFile*> boot_class_path;
229 boot_class_path.push_back(java_lang_dex_file_.get());
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700230
Carl Shapiro7a909592011-07-24 19:21:59 -0700231 runtime_.reset(Runtime::Create(boot_class_path));
232 ASSERT_TRUE(runtime_ != NULL);
233 class_linker_ = runtime_->GetClassLinker();
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700234 }
235
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700236 virtual void TearDown() {
237 const char* android_data = getenv("ANDROID_DATA");
238 ASSERT_TRUE(android_data != NULL);
239 DIR* dir = opendir(art_cache_.c_str());
240 ASSERT_TRUE(dir != NULL);
241 while (true) {
242 struct dirent entry;
243 struct dirent* entry_ptr;
244 int readdir_result = readdir_r(dir, &entry, &entry_ptr);
245 ASSERT_EQ(0, readdir_result);
246 if (entry_ptr == NULL) {
247 break;
248 }
249 if ((strcmp(entry_ptr->d_name, ".") == 0) || (strcmp(entry_ptr->d_name, "..") == 0)) {
250 continue;
251 }
252 std::string filename(art_cache_);
253 filename.push_back('/');
254 filename.append(entry_ptr->d_name);
255 int unlink_result = unlink(filename.c_str());
256 ASSERT_EQ(0, unlink_result);
Jesse Wilsonac5b9e22011-07-27 15:11:13 -0400257 }
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700258 closedir(dir);
259 int rmdir_cache_result = rmdir(art_cache_.c_str());
260 ASSERT_EQ(0, rmdir_cache_result);
261 int rmdir_data_result = rmdir(android_data_.get());
262 ASSERT_EQ(0, rmdir_data_result);
263 }
Jesse Wilsonac5b9e22011-07-27 15:11:13 -0400264
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700265 std::string GetLibCoreDexFileName() {
266 if (is_host_) {
267 const char* host_dir = getenv("ANDROID_HOST_OUT");
268 CHECK(host_dir != NULL);
269 return StringPrintf("%s/framework/core-hostdex.jar", host_dir);
270 }
271 return std::string("/system/framework/core.jar");
272 }
273
274 DexFile* GetLibCoreDex() {
275 std::string libcore_dex_file_name = GetLibCoreDexFileName();
276 return DexFile::OpenZip(libcore_dex_file_name.c_str());
Jesse Wilsonac5b9e22011-07-27 15:11:13 -0400277 }
278
Jesse Wilson46cdd4b2011-07-28 17:40:48 -0400279 void UseLibCoreDex() {
280 delete runtime_.release();
281 java_lang_dex_file_.reset(GetLibCoreDex());
282
283 std::vector<DexFile*> boot_class_path;
284 boot_class_path.push_back(java_lang_dex_file_.get());
285
286 runtime_.reset(Runtime::Create(boot_class_path));
287 ASSERT_TRUE(runtime_ != NULL);
288 class_linker_ = runtime_->GetClassLinker();
289 }
290
Brian Carlstrom4a96b602011-07-26 16:40:23 -0700291 bool is_host_;
Brian Carlstromb0460ea2011-07-29 10:08:05 -0700292 scoped_ptr_malloc<char> android_data_;
293 std::string art_cache_;
Brian Carlstromf615a612011-07-23 12:50:34 -0700294 scoped_ptr<DexFile> java_lang_dex_file_;
Carl Shapiro7a909592011-07-24 19:21:59 -0700295 scoped_ptr<Runtime> runtime_;
296 ClassLinker* class_linker_;
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700297};
298
Brian Carlstrom934486c2011-07-12 23:42:50 -0700299} // namespace art