common_test.h revision f734cf55d510976f4862b15e35fc86eae2a3daf8
1934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom// Copyright 2011 Google Inc. All Rights Reserved.
2934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom
3b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom#include <dirent.h>
40af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes#include <dlfcn.h>
5b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom#include <sys/stat.h>
6b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom#include <sys/types.h>
7b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom
8578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "base64.h"
9578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "heap.h"
10578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "thread.h"
11ac5b9e22d32c4f986783a2207b08ade769619f6fJesse Wilson#include "stringprintf.h"
12578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "class_linker.h"
13578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "dex_file.h"
14a331b3cc392132c7333d36649a8310f38f4822ccBrian Carlstrom
150af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes#include "unicode/uclean.h"
160af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes#include "unicode/uvernum.h"
170af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes
18a331b3cc392132c7333d36649a8310f38f4822ccBrian Carlstrom#include "gtest/gtest.h"
19a331b3cc392132c7333d36649a8310f38f4822ccBrian Carlstrom
20934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstromnamespace art {
21934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom
22a331b3cc392132c7333d36649a8310f38f4822ccBrian Carlstrom// package java.lang;
23a331b3cc392132c7333d36649a8310f38f4822ccBrian Carlstrom// public class Object {}
24934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom//
25934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom// class MyClass {}
26934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstromstatic const char kMyClassDex[] =
27934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "ZGV4CjAzNQA5Nm9IrCVm91COwepff7LhIE23GZIxGjgIAgAAcAAAAHhWNBIAAAAAAAAAAIABAAAG"
28934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAAAcAAAAAMAAACIAAAAAQAAAJQAAAAAAAAAAAAAAAIAAACgAAAAAgAAALAAAAAYAQAA8AAAABwB"
29934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAAkAQAALwEAAEMBAABRAQAAXgEAAAEAAAACAAAABQAAAAUAAAACAAAAAAAAAAAAAAAAAAAAAQAA"
30934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAAAAAABAAAAAQAAAP////8AAAAABAAAAAAAAABrAQAAAAAAAAAAAAAAAAAAAQAAAAAAAAADAAAA"
31934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAAAAHUBAAAAAAAAAQABAAAAAABhAQAAAQAAAA4AAAABAAEAAQAAAGYBAAAEAAAAcBABAAAADgAG"
32934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "PGluaXQ+AAlMTXlDbGFzczsAEkxqYXZhL2xhbmcvT2JqZWN0OwAMTXlDbGFzcy5qYXZhAAtPYmpl"
33934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "Y3QuamF2YQABVgACAAcOAAUABw4AAAABAAGBgATwAQAAAQAAgIAEhAIACwAAAAAAAAABAAAAAAAA"
34934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAEAAAAGAAAAcAAAAAIAAAADAAAAiAAAAAMAAAABAAAAlAAAAAUAAAACAAAAoAAAAAYAAAACAAAA"
35934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "sAAAAAEgAAACAAAA8AAAAAIgAAAGAAAAHAEAAAMgAAACAAAAYQEAAAAgAAACAAAAawEAAAAQAAAB"
36934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAAAgAEAAA==";
37934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom
38934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom// class Nested {
39934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom//     class Inner {
40934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom//     }
41934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom// }
42934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstromstatic const char kNestedDex[] =
43934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "ZGV4CjAzNQAQedgAe7gM1B/WHsWJ6L7lGAISGC7yjD2IAwAAcAAAAHhWNBIAAAAAAAAAAMQCAAAP"
44934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAAAcAAAAAcAAACsAAAAAgAAAMgAAAABAAAA4AAAAAMAAADoAAAAAgAAAAABAABIAgAAQAEAAK4B"
45934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAC2AQAAvQEAAM0BAADXAQAA+wEAABsCAAA+AgAAUgIAAF8CAABiAgAAZgIAAHMCAAB5AgAAgQIA"
46934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAkAAAAJAAAABgAAAAAAAAAKAAAABgAAAKgBAAAAAAEA"
47934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "DQAAAAAAAQAAAAAAAQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAIAAAAiAEAAKsCAAAA"
48934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAAAAQAAAAAAAAAFAAAAAAAAAAgAAACYAQAAuAIAAAAAAAACAAAAlAIAAJoCAAABAAAAowIAAAIA"
49934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AgABAAAAiAIAAAYAAABbAQAAcBACAAAADgABAAEAAQAAAI4CAAAEAAAAcBACAAAADgBAAQAAAAAA"
50934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAAAAAAAAAAATAEAAAAAAAAAAAAAAAAAAAEAAAABAAY8aW5pdD4ABUlubmVyAA5MTmVzdGVkJElu"
51934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "bmVyOwAITE5lc3RlZDsAIkxkYWx2aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdDbGFzczsAHkxkYWx2"
52934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "aWsvYW5ub3RhdGlvbi9Jbm5lckNsYXNzOwAhTGRhbHZpay9hbm5vdGF0aW9uL01lbWJlckNsYXNz"
53934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "ZXM7ABJMamF2YS9sYW5nL09iamVjdDsAC05lc3RlZC5qYXZhAAFWAAJWTAALYWNjZXNzRmxhZ3MA"
54934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "BG5hbWUABnRoaXMkMAAFdmFsdWUAAgEABw4AAQAHDjwAAgIBDhgBAgMCCwQADBcBAgQBDhwBGAAA"
55934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AQEAAJAgAICABNQCAAABAAGAgATwAgAAEAAAAAAAAAABAAAAAAAAAAEAAAAPAAAAcAAAAAIAAAAH"
56934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAAArAAAAAMAAAACAAAAyAAAAAQAAAABAAAA4AAAAAUAAAADAAAA6AAAAAYAAAACAAAAAAEAAAMQ"
57934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAACAAAAQAEAAAEgAAACAAAAVAEAAAYgAAACAAAAiAEAAAEQAAABAAAAqAEAAAIgAAAPAAAArgEA"
58934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAMgAAACAAAAiAIAAAQgAAADAAAAlAIAAAAgAAACAAAAqwIAAAAQAAABAAAAxAIAAA==";
59934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom
60934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom// class ProtoCompare {
61934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom//     int m1(short x, int y, long z) { return x + y + (int)z; }
62934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom//     int m2(short x, int y, long z) { return x + y + (int)z; }
63934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom//     int m3(long x, int y, short z) { return (int)x + y + z; }
64934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom//     long m4(long x, int y, short z) { return x + y + z; }
65934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom// }
66934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstromstatic const char kProtoCompareDex[] =
67934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "ZGV4CjAzNQBLUetu+TVZ8gsYsCOFoij7ecsHaGSEGA8gAwAAcAAAAHhWNBIAAAAAAAAAAIwCAAAP"
68934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAAAcAAAAAYAAACsAAAABAAAAMQAAAAAAAAAAAAAAAYAAAD0AAAAAQAAACQBAADcAQAARAEAAN4B"
69934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AADmAQAA6QEAAO8BAAD1AQAA+AEAAP4BAAAOAgAAIgIAADUCAAA4AgAAOwIAAD8CAABDAgAARwIA"
70934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAEAAAAEAAAABgAAAAcAAAAJAAAACgAAAAIAAAAAAAAAyAEAAAMAAAAAAAAA1AEAAAUAAAABAAAA"
71934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "yAEAAAoAAAAFAAAAAAAAAAIAAwAAAAAAAgABAAsAAAACAAEADAAAAAIAAAANAAAAAgACAA4AAAAD"
72934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAMAAAAAAAIAAAAAAAAAAwAAAAAAAAAIAAAAAAAAAHACAAAAAAAAAQABAAEAAABLAgAABAAAAHAQ"
73934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "BQAAAA4ABwAFAAAAAABQAgAABQAAAJAAAwSEUbAQDwAAAAcABQAAAAAAWAIAAAUAAACQAAMEhFGw"
74934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "EA8AAAAGAAUAAAAAAGACAAAEAAAAhCCwQLBQDwAJAAUAAAAAAGgCAAAFAAAAgXC7UIGCuyAQAAAA"
75934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AwAAAAEAAAAEAAAAAwAAAAQAAAABAAY8aW5pdD4AAUkABElKSVMABElTSUoAAUoABEpKSVMADkxQ"
76934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "cm90b0NvbXBhcmU7ABJMamF2YS9sYW5nL09iamVjdDsAEVByb3RvQ29tcGFyZS5qYXZhAAFTAAFW"
77934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAJtMQACbTIAAm0zAAJtNAABAAcOAAIDAAAABw4AAwMAAAAHDgAEAwAAAAcOAAUDAAAABw4AAAAB"
78934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "BACAgATEAgEA3AIBAPgCAQCUAwEArAMAAAwAAAAAAAAAAQAAAAAAAAABAAAADwAAAHAAAAACAAAA"
79934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "BgAAAKwAAAADAAAABAAAAMQAAAAFAAAABgAAAPQAAAAGAAAAAQAAACQBAAABIAAABQAAAEQBAAAB"
80934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "EAAAAgAAAMgBAAACIAAADwAAAN4BAAADIAAABQAAAEsCAAAAIAAAAQAAAHACAAAAEAAAAQAAAIwC"
81934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAA=";
82934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom
83934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom// class ProtoCompare2 {
84934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom//     int m1(short x, int y, long z) { return x + y + (int)z; }
85934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom//     int m2(short x, int y, long z) { return x + y + (int)z; }
86934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom//     int m3(long x, int y, short z) { return (int)x + y + z; }
87934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom//     long m4(long x, int y, short z) { return x + y + z; }
88934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom// }
89934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstromstatic const char kProtoCompare2Dex[] =
90934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "ZGV4CjAzNQDVUXj687EpyTTDJZEZPA8dEYnDlm0Ir6YgAwAAcAAAAHhWNBIAAAAAAAAAAIwCAAAP"
91934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAAAcAAAAAYAAACsAAAABAAAAMQAAAAAAAAAAAAAAAYAAAD0AAAAAQAAACQBAADcAQAARAEAAN4B"
92934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AADmAQAA6QEAAO8BAAD1AQAA+AEAAP4BAAAPAgAAIwIAADcCAAA6AgAAPQIAAEECAABFAgAASQIA"
93934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAEAAAAEAAAABgAAAAcAAAAJAAAACgAAAAIAAAAAAAAAyAEAAAMAAAAAAAAA1AEAAAUAAAABAAAA"
94934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "yAEAAAoAAAAFAAAAAAAAAAIAAwAAAAAAAgABAAsAAAACAAEADAAAAAIAAAANAAAAAgACAA4AAAAD"
95934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAMAAAAAAAIAAAAAAAAAAwAAAAAAAAAIAAAAAAAAAHICAAAAAAAAAQABAAEAAABNAgAABAAAAHAQ"
96934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "BQAAAA4ABwAFAAAAAABSAgAABQAAAJAAAwSEUbAQDwAAAAcABQAAAAAAWgIAAAUAAACQAAMEhFGw"
97934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "EA8AAAAGAAUAAAAAAGICAAAEAAAAhCCwQLBQDwAJAAUAAAAAAGoCAAAFAAAAgXC7UIGCuyAQAAAA"
98934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AwAAAAEAAAAEAAAAAwAAAAQAAAABAAY8aW5pdD4AAUkABElKSVMABElTSUoAAUoABEpKSVMAD0xQ"
99934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "cm90b0NvbXBhcmUyOwASTGphdmEvbGFuZy9PYmplY3Q7ABJQcm90b0NvbXBhcmUyLmphdmEAAVMA"
100934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AVYAAm0xAAJtMgACbTMAAm00AAEABw4AAgMAAAAHDgADAwAAAAcOAAQDAAAABw4ABQMAAAAHDgAA"
101934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAEEAICABMQCAQDcAgEA+AIBAJQDAQCsAwwAAAAAAAAAAQAAAAAAAAABAAAADwAAAHAAAAACAAAA"
102934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "BgAAAKwAAAADAAAABAAAAMQAAAAFAAAABgAAAPQAAAAGAAAAAQAAACQBAAABIAAABQAAAEQBAAAB"
103934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "EAAAAgAAAMgBAAACIAAADwAAAN4BAAADIAAABQAAAE0CAAAAIAAAAQAAAHICAAAAEAAAAQAAAIwC"
104934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAA=";
105934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom
106b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// javac MyClass.java && dx --dex --output=MyClass.dex
107b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   --core-library MyClass.class java/lang/Object.class && base64 MyClass.dex
108b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// package java.lang;
109b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// public class Object {}
110b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// class MyClass {
111b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   native void foo();
112b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   native int fooI(int x);
113b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   native int fooII(int x, int y);
114b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   native double fooDD(double x, double y);
115b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   native Object fooIOO(int x, Object y, Object z);
116b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   static native Object fooSIOO(int x, Object y, Object z);
117df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers//   static synchronized native Object fooSSIOO(int x, Object y, Object z);
118b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// }
119b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersstatic const char kMyClassNativesDex[] =
120df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "ZGV4CjAzNQA4WWrpXgdlkoTHR8Yubx4LJO4HbGsX1p1EAwAAcAAAAHhWNBIAAAAAAAAAALACAAAT"
121df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "AAAAcAAAAAUAAAC8AAAABQAAANAAAAAAAAAAAAAAAAkAAAAMAQAAAgAAAFQBAACwAQAAlAEAAOIB"
122df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "AADqAQAA7QEAAPIBAAD1AQAA+QEAAP4BAAAEAgAADwIAACMCAAAxAgAAPgIAAEECAABGAgAATQIA"
123df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "AFMCAABaAgAAYgIAAGsCAAABAAAAAwAAAAcAAAAIAAAACwAAAAIAAAAAAAAAwAEAAAQAAAABAAAA"
124df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "yAEAAAUAAAABAAAA0AEAAAYAAAADAAAA2AEAAAsAAAAEAAAAAAAAAAIABAAAAAAAAgAEAAwAAAAC"
125df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "AAAADQAAAAIAAQAOAAAAAgACAA8AAAACAAMAEAAAAAIAAwARAAAAAgADABIAAAADAAQAAAAAAAMA"
126df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "AAABAAAA/////wAAAAAKAAAAAAAAAH8CAAAAAAAAAgAAAAAAAAADAAAAAAAAAAkAAAAAAAAAiQIA"
127df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "AAAAAAABAAEAAAAAAHUCAAABAAAADgAAAAEAAQABAAAAegIAAAQAAABwEAgAAAAOAAIAAAAAAAAA"
128df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "AQAAAAEAAAACAAAAAQABAAMAAAABAAMAAwAGPGluaXQ+AAFEAANEREQAAUkAAklJAANJSUkABExJ"
129df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "TEwACUxNeUNsYXNzOwASTGphdmEvbGFuZy9PYmplY3Q7AAxNeUNsYXNzLmphdmEAC09iamVjdC5q"
130df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "YXZhAAFWAANmb28ABWZvb0REAARmb29JAAVmb29JSQAGZm9vSU9PAAdmb29TSU9PAAhmb29TU0lP"
131df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "TwADAAcOAAEABw4AAAABAAiBgASUAwAAAwUAgIAEqAMGiAIAAaiCCAABgAIAAYACAAGAAgABgAIA"
132df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "AYACAAwAAAAAAAAAAQAAAAAAAAABAAAAEwAAAHAAAAACAAAABQAAALwAAAADAAAABQAAANAAAAAF"
133df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "AAAACQAAAAwBAAAGAAAAAgAAAFQBAAABIAAAAgAAAJQBAAABEAAABAAAAMABAAACIAAAEwAAAOIB"
134df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "AAADIAAAAgAAAHUCAAAAIAAAAgAAAH8CAAAAEAAAAQAAALACAAA=";
135b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
136419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro// class CreateMethodDescriptor {
137419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro//     Float m1(int a, double b, long c, Object d) { return null; }
138419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro//     CreateMethodDescriptor m2(boolean x, short y, char z) { return null; }
139419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro// }
140419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapirostatic const char kCreateMethodDescriptorDex[] =
141419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  "ZGV4CjAzNQBSU7aKdNXwH+uOpti/mvZ4/Dk8wM8VtNbgAgAAcAAAAHhWNBIAAAAAAAAAAEwCAAAQ"
142419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  "AAAAcAAAAAoAAACwAAAAAwAAANgAAAAAAAAAAAAAAAQAAAD8AAAAAQAAABwBAACkAQAAPAEAAJQB"
143419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  "AACcAQAAnwEAALwBAAC/AQAAwgEAAMUBAADfAQAA5gEAAOwBAAD/AQAAEwIAABYCAAAZAgAAHAIA"
144419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  "ACACAAABAAAAAwAAAAQAAAAFAAAABgAAAAkAAAAKAAAACwAAAAwAAAANAAAACAAAAAQAAAB8AQAA"
145419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  "BwAAAAUAAACIAQAADAAAAAgAAAAAAAAABAACAAAAAAAEAAEADgAAAAQAAAAPAAAABgACAAAAAAAE"
146419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  "AAAAAAAAAAYAAAAAAAAAAgAAAAAAAAA6AgAAAAAAAAEAAQABAAAAJAIAAAQAAABwEAMAAAAOAAgA"
147419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  "BwAAAAAAKQIAAAIAAAASABEABQAEAAAAAAAyAgAAAgAAABIAEQADAAAACQAHAAAAAAAEAAAAAgAB"
148419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  "AAMABgAGPGluaXQ+AAFDABtDcmVhdGVNZXRob2REZXNjcmlwdG9yLmphdmEAAUQAAUkAAUoAGExD"
149419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  "cmVhdGVNZXRob2REZXNjcmlwdG9yOwAFTElESkwABExaU0MAEUxqYXZhL2xhbmcvRmxvYXQ7ABJM"
150419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  "amF2YS9sYW5nL09iamVjdDsAAVMAAVYAAVoAAm0xAAJtMgABAAcOAAIEAAAAAAcOAAMDAAAABw4A"
151419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  "AAABAgCAgAS8AgEA1AIBAOgCDAAAAAAAAAABAAAAAAAAAAEAAAAQAAAAcAAAAAIAAAAKAAAAsAAA"
152419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  "AAMAAAADAAAA2AAAAAUAAAAEAAAA/AAAAAYAAAABAAAAHAEAAAEgAAADAAAAPAEAAAEQAAACAAAA"
153419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro  "fAEAAAIgAAAQAAAAlAEAAAMgAAADAAAAJAIAAAAgAAABAAAAOgIAAAAQAAABAAAATAIAAA==";
154419ec7bbcdbf56a9d2a9fd7f91f9ace279e0b664Carl Shapiro
155f7ed11ae81002f83b78012c4bbe01e5e994ecc3bBrian Carlstrom// class X {}
156f7ed11ae81002f83b78012c4bbe01e5e994ecc3bBrian Carlstrom// class Y extends X {}
157f7ed11ae81002f83b78012c4bbe01e5e994ecc3bBrian Carlstromstatic const char kXandY[] =
158f7ed11ae81002f83b78012c4bbe01e5e994ecc3bBrian Carlstrom  "ZGV4CjAzNQAlLMqyB72TxJW4zl5w75F072u4Ig6KvCMEAgAAcAAAAHhWNBIAAAAAAAAAAHwBAAAG"
159f7ed11ae81002f83b78012c4bbe01e5e994ecc3bBrian Carlstrom  "AAAAcAAAAAQAAACIAAAAAQAAAJgAAAAAAAAAAAAAAAMAAACkAAAAAgAAALwAAAAIAQAA/AAAACwB"
160f7ed11ae81002f83b78012c4bbe01e5e994ecc3bBrian Carlstrom  "AAA0AQAAOQEAAD4BAABSAQAAVQEAAAEAAAACAAAAAwAAAAQAAAAEAAAAAwAAAAAAAAAAAAAAAAAA"
161f7ed11ae81002f83b78012c4bbe01e5e994ecc3bBrian Carlstrom  "AAEAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAIAAAAAAAAABQAAAAAAAABnAQAAAAAAAAEAAAAAAAAA"
162f7ed11ae81002f83b78012c4bbe01e5e994ecc3bBrian Carlstrom  "AAAAAAAAAAAFAAAAAAAAAHEBAAAAAAAAAQABAAEAAABdAQAABAAAAHAQAgAAAA4AAQABAAEAAABi"
163f7ed11ae81002f83b78012c4bbe01e5e994ecc3bBrian Carlstrom  "AQAABAAAAHAQAAAAAA4ABjxpbml0PgADTFg7AANMWTsAEkxqYXZhL2xhbmcvT2JqZWN0OwABVgAG"
164f7ed11ae81002f83b78012c4bbe01e5e994ecc3bBrian Carlstrom  "WC5qYXZhAAIABw4AAwAHDgAAAAEAAICABPwBAAABAAGAgASUAgALAAAAAAAAAAEAAAAAAAAAAQAA"
165f7ed11ae81002f83b78012c4bbe01e5e994ecc3bBrian Carlstrom  "AAYAAABwAAAAAgAAAAQAAACIAAAAAwAAAAEAAACYAAAABQAAAAMAAACkAAAABgAAAAIAAAC8AAAA"
166f7ed11ae81002f83b78012c4bbe01e5e994ecc3bBrian Carlstrom  "ASAAAAIAAAD8AAAAAiAAAAYAAAAsAQAAAyAAAAIAAABdAQAAACAAAAIAAABnAQAAABAAAAEAAAB8"
167f7ed11ae81002f83b78012c4bbe01e5e994ecc3bBrian Carlstrom  "AQAA";
168f7ed11ae81002f83b78012c4bbe01e5e994ecc3bBrian Carlstrom
1697833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson// class Statics {
1707833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson//   static boolean s0 = true;
1717833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson//   static byte s1 = 5;
1727833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson//   static char s2 = 'a';
1737833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson//   static short s3 = (short) 65000;
1747833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson//   static int s4 = 2000000000;
1757833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson//   static long s5 = 0x123456789abcdefL;
1767833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson//   static float s6 = 0.5f;
1777833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson//   static double s7 = 16777217;
1787833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson//   static Object s8 = "android";
1797833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson//   static Object[] s9 = { "a", "b" };
1807833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson// }
1817833bd261d78be2c42284031f169a62c9065cc3cJesse Wilsonstatic const char kStatics[] =
1827833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson  "ZGV4CjAzNQAYalInXcX4y0OBgb2yCw2/jGzZBSe34zmwAwAAcAAAAHhWNBIAAAAAAAAAABwDAAAc"
1837833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson  "AAAAcAAAAAwAAADgAAAAAQAAABABAAAKAAAAHAEAAAMAAABsAQAAAQAAAIQBAAAMAgAApAEAADwC"
1847833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson  "AABGAgAATgIAAFECAABUAgAAVwIAAFoCAABdAgAAYAIAAGsCAAB/AgAAggIAAJACAACTAgAAlgIA"
1857833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson  "AKsCAACuAgAAtwIAALoCAAC+AgAAwgIAAMYCAADKAgAAzgIAANICAADWAgAA2gIAAN4CAAACAAAA"
1867833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson  "AwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAAMAAAADQAAAA4AAAAMAAAACQAAAAAAAAAG"
1877833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson  "AAoAEgAAAAYAAAATAAAABgABABQAAAAGAAgAFQAAAAYABAAWAAAABgAFABcAAAAGAAMAGAAAAAYA"
1887833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson  "AgAZAAAABgAHABoAAAAGAAsAGwAAAAYAAAAAAAAABgAAAAEAAAAHAAAAAQAAAAYAAAAAAAAABwAA"
1897833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson  "AAAAAAALAAAAAAAAAPUCAAAAAAAABAAAAAAAAADiAgAAOAAAABITagMAABJQawABABMAYQBsAAIA"
1907833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson  "EwDo/W0AAwAUAACUNXdnAAQAGADvzauJZ0UjAWgABQAVAAA/ZwAGABgAAAAAEAAAcEFoAAcAGgAQ"
1917833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson  "AGkACAASICMACwASARoCDwBNAgABGgERAE0BAANpAAkADgABAAEAAQAAAPACAAAEAAAAcBACAAAA"
1927833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson  "DgAIPGNsaW5pdD4ABjxpbml0PgABQgABQwABRAABRgABSQABSgAJTFN0YXRpY3M7ABJMamF2YS9s"
1937833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson  "YW5nL09iamVjdDsAAVMADFN0YXRpY3MuamF2YQABVgABWgATW0xqYXZhL2xhbmcvT2JqZWN0OwAB"
1947833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson  "YQAHYW5kcm9pZAABYgACczAAAnMxAAJzMgACczMAAnM0AAJzNQACczYAAnM3AAJzOAACczkAAgAH"
1957833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson  "HS08S0taeEt4SwABAAcOAAoAAgAACAEIAQgBCAEIAQgBCAEIAQgBCACIgASkAwGAgASkBAAAAAwA"
1967833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson  "AAAAAAAAAQAAAAAAAAABAAAAHAAAAHAAAAACAAAADAAAAOAAAAADAAAAAQAAABABAAAEAAAACgAA"
1977833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson  "ABwBAAAFAAAAAwAAAGwBAAAGAAAAAQAAAIQBAAABIAAAAgAAAKQBAAACIAAAHAAAADwCAAADIAAA"
1987833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson  "AgAAAOICAAAAIAAAAQAAAPUCAAAAEAAAAQAAABwDAAA=";
1997833bd261d78be2c42284031f169a62c9065cc3cJesse Wilson
2009b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro// class Main {
2019b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   public static void main(String args[]) {
2029b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   }
2039b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro// }
2049b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapirostatic const char kMainDex[] =
2059b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "ZGV4CjAzNQAPNypTL1TulODHFdpEa2pP98I7InUu7uQgAgAAcAAAAHhWNBIAAAAAAAAAAIwBAAAI"
2069b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "AAAAcAAAAAQAAACQAAAAAgAAAKAAAAAAAAAAAAAAAAMAAAC4AAAAAQAAANAAAAAwAQAA8AAAACIB"
2079b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "AAAqAQAAMgEAAEYBAABRAQAAVAEAAFgBAABtAQAAAQAAAAIAAAAEAAAABgAAAAQAAAACAAAAAAAA"
2089b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "AAUAAAACAAAAHAEAAAAAAAAAAAAAAAABAAcAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAADAAAA"
2099b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "AAAAAH4BAAAAAAAAAQABAAEAAABzAQAABAAAAHAQAgAAAA4AAQABAAAAAAB4AQAAAQAAAA4AAAAB"
2109b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "AAAAAwAGPGluaXQ+AAZMTWFpbjsAEkxqYXZhL2xhbmcvT2JqZWN0OwAJTWFpbi5qYXZhAAFWAAJW"
2119b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "TAATW0xqYXZhL2xhbmcvU3RyaW5nOwAEbWFpbgABAAcOAAMBAAcOAAAAAgAAgIAE8AEBCYgCDAAA"
2129b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "AAAAAAABAAAAAAAAAAEAAAAIAAAAcAAAAAIAAAAEAAAAkAAAAAMAAAACAAAAoAAAAAUAAAADAAAA"
2139b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "uAAAAAYAAAABAAAA0AAAAAEgAAACAAAA8AAAAAEQAAABAAAAHAEAAAIgAAAIAAAAIgEAAAMgAAAC"
2149b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "AAAAcwEAAAAgAAABAAAAfgEAAAAQAAABAAAAjAEAAA==";
2159b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
2169b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro// class StaticLeafMethods {
2179b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   static void nop() {
2189b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   }
2199b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   static byte identity(byte x) {
2209b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//     return x;
2219b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   }
2229b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   static int identity(int x) {
2239b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//     return x;
2249b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   }
2259b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   static int sum(int a, int b) {
2269b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//     return a + b;
2279b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   }
2289b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   static int sum(int a, int b, int c) {
2299b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//     return a + b + c;
2309b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   }
2319b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   static int sum(int a, int b, int c, int d) {
2329b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//     return a + b + c + d;
2339b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   }
2349b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   static int sum(int a, int b, int c, int d, int e) {
2359b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//     return a + b + c + d + e;
2369b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   }
2379b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   static double identity(double x) {
2389b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//     return x;
2399b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   }
2409b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   static double sum(double a, double b) {
2419b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//     return a + b;
2429b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   }
2439b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   static double sum(double a, double b, double c) {
2449b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//     return a + b + c;
2459b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   }
2469b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   static double sum(double a, double b, double c, double d) {
2479b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//     return a + b + c + d;
2489b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   }
2499b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   static double sum(double a, double b, double c, double d, double e) {
2509b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//     return a + b + c + d + e;
2519b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro//   }
2529b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro// }
2539b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapirostatic const char kStaticLeafMethodsDex[] =
2549b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "ZGV4CjAzNQD8gEpaFD0w5dM8dsPaCQ3wIh0xaUjfni+IBQAAcAAAAHhWNBIAAAAAAAAAAPQEAAAW"
2559b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "AAAAcAAAAAYAAADIAAAADAAAAOAAAAAAAAAAAAAAAA4AAABwAQAAAQAAAOABAACIAwAAAAIAAK4D"
2569b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "AAC2AwAAuQMAAL0DAADAAwAAxAMAAMkDAADPAwAA1gMAAN4DAADhAwAA5QMAAOoDAADwAwAA9wMA"
2579b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "AP8DAAAUBAAAKAQAAEAEAABDBAAATQQAAFIEAAABAAAAAwAAAAkAAAAPAAAAEAAAABIAAAACAAAA"
2589b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "AAAAADgDAAAEAAAAAQAAAEADAAAFAAAAAQAAAEgDAAAGAAAAAQAAAFADAAAHAAAAAQAAAFwDAAAI"
2599b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "AAAAAQAAAGgDAAAKAAAAAgAAAHgDAAALAAAAAgAAAIADAAAMAAAAAgAAAIgDAAANAAAAAgAAAJQD"
2609b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "AAAOAAAAAgAAAKADAAASAAAABQAAAAAAAAADAAsAAAAAAAMAAAATAAAAAwABABMAAAADAAYAEwAA"
2619b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "AAMACwAUAAAAAwACABUAAAADAAMAFQAAAAMABAAVAAAAAwAFABUAAAADAAcAFQAAAAMACAAVAAAA"
2629b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "AwAJABUAAAADAAoAFQAAAAQACwAAAAAAAwAAAAAAAAAEAAAAAAAAABEAAAAAAAAAtwQAAAAAAAAB"
2639b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "AAEAAQAAAFcEAAAEAAAAcBANAAAADgABAAEAAAAAAFwEAAABAAAADwAAAAIAAgAAAAAAYgQAAAEA"
2649b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "AAAQAAAAAQABAAAAAABoBAAAAQAAAA8AAAAAAAAAAAAAAG4EAAABAAAADgAAAAYABAAAAAAAcwQA"
2659b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "AAMAAACrAAIEEAAAAAgABgAAAAAAegQAAAQAAACrAAIEy2AQAAoACAAAAAAAggQAAAUAAACrAAIE"
2669b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "y2DLgBAAAAAMAAoAAAAAAIsEAAAGAAAAqwACBMtgy4DLoBAAAwACAAAAAACVBAAAAwAAAJAAAQIP"
2679b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "AAAABAADAAAAAACcBAAABAAAAJAAAQKwMA8ABQAEAAAAAACkBAAABQAAAJAAAQKwMLBADwAAAAYA"
2689b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "BQAAAAAArQQAAAYAAACQAAECsDCwQLBQDwABAAAAAAAAAAEAAAABAAAAAgAAAAEAAQADAAAAAQAB"
2699b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "AAEAAAAEAAAAAQABAAEAAQAFAAAAAQABAAEAAQABAAAAAQAAAAIAAAACAAAAAgACAAMAAAACAAIA"
2709b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "AgAAAAQAAAACAAIAAgACAAUAAAACAAIAAgACAAIABjxpbml0PgABQgACQkIAAUQAAkREAANEREQA"
2719b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "BEREREQABUREREREAAZEREREREQAAUkAAklJAANJSUkABElJSUkABUlJSUlJAAZJSUlJSUkAE0xT"
2729b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "dGF0aWNMZWFmTWV0aG9kczsAEkxqYXZhL2xhbmcvT2JqZWN0OwAWU3RhdGljTGVhZk1ldGhvZHMu"
2739b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "amF2YQABVgAIaWRlbnRpdHkAA25vcAADc3VtAAEABw4ABQEABw4AFwEABw4ACAEABw4AAwAHDgAa"
2749b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "AgAABw4AHQMAAAAHDgAgBAAAAAAHDgAjBQAAAAAABw4ACwIAAAcOAA4DAAAABw4AEQQAAAAABw4A"
2759b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "FAUAAAAAAAcOAAAADQAAgIAEgAQBCJgEAQisBAEIwAQBCNQEAQjoBAEIgAUBCJgFAQi0BQEI0AUB"
2769b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "COgFAQiABgEInAYAAAAMAAAAAAAAAAEAAAAAAAAAAQAAABYAAABwAAAAAgAAAAYAAADIAAAAAwAA"
2779b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "AAwAAADgAAAABQAAAA4AAABwAQAABgAAAAEAAADgAQAAASAAAA0AAAAAAgAAARAAAAsAAAA4AwAA"
2789b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro  "AiAAABYAAACuAwAAAyAAAA0AAABXBAAAACAAAAEAAAC3BAAAABAAAAEAAAD0BAAA";
2799b9ba28b1277b4ddb967c5a968c6d550febce6afCarl Shapiro
280f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstromstatic inline DexFile* OpenDexFileBase64(const char* base64) {
281578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom  CHECK(base64 != NULL);
282578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom  size_t length;
283f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom  byte* dex_bytes = DecodeBase64(base64, &length);
284f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom  CHECK(dex_bytes != NULL);
285f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom  DexFile* dex_file = DexFile::OpenPtr(dex_bytes, length);
286578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom  CHECK(dex_file != NULL);
287f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom  return dex_file;
288578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom}
289578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom
290db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstromclass ScratchFile {
291db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom public:
292db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom  ScratchFile() {
293db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom    std::string filename_template;
294db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom    filename_template = getenv("ANDROID_DATA");
295db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom    filename_template += "/TmpFile-XXXXXX";
296db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom    filename_.reset(strdup(filename_template.c_str()));
297db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom    CHECK(filename_ != NULL);
298db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom    fd_ = mkstemp(filename_.get());
299db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom    CHECK_NE(-1, fd_);
300db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom  }
301db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom
302db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom  ~ScratchFile() {
303db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom    int unlink_result = unlink(filename_.get());
304db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom    CHECK_EQ(0, unlink_result);
305db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom    int close_result = close(fd_);
306db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom    CHECK_EQ(0, close_result);
307db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom  }
308db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom
309db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom  const char* GetFilename() const {
310db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom    return filename_.get();
311db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom  }
312db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom
313db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom  int GetFd() const {
314db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom    return fd_;
315db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom  }
316db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom
317db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom private:
318db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom  scoped_ptr_malloc<char> filename_;
319db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom  int fd_;
320db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom};
321db4d54081f09abcbe97ffdf615874f2809a9e777Brian Carlstrom
322f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstromclass CommonTest : public testing::Test {
323578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom protected:
324578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom  virtual void SetUp() {
3254a96b60e45fba4a9d4a2e9c8fc849660eacef684Brian Carlstrom    is_host_ = getenv("ANDROID_BUILD_TOP") != NULL;
3264a96b60e45fba4a9d4a2e9c8fc849660eacef684Brian Carlstrom
3270af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes    if (is_host_) {
3280af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes      // $ANDROID_ROOT is set on the device, but not on the host.
3290af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes      // We need to set this so that icu4c can find its locale data.
3300af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes      std::string root;
3310af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes      root += getenv("ANDROID_BUILD_TOP");
3320af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes      root += "/out/host/linux-x86";
3330af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes      setenv("ANDROID_ROOT", root.c_str(), 1);
3340af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes    }
3350af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes
336b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    android_data_.reset(strdup(is_host_ ? "/tmp/art-data-XXXXXX" : "/sdcard/art-data-XXXXXX"));
337b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    ASSERT_TRUE(android_data_ != NULL);
338b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    const char* android_data_modified = mkdtemp(android_data_.get());
339b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    // note that mkdtemp side effects android_data_ as well
340b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    ASSERT_TRUE(android_data_modified != NULL);
341b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    setenv("ANDROID_DATA", android_data_modified, 1);
342b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    art_cache_.append(android_data_.get());
343b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    art_cache_.append("/art-cache");
344b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    int mkdir_result = mkdir(art_cache_.c_str(), 0700);
345b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    ASSERT_EQ(mkdir_result, 0);
346b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom
347a5b897eae4b6f9f9608faa9eada7ddf42bf1bfd2Elliott Hughes    java_lang_dex_file_.reset(GetLibCoreDex());
348578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom
3498a436595d36c1e4935984fcac249d7d877e00383Brian Carlstrom    std::vector<const DexFile*> boot_class_path;
350f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom    boot_class_path.push_back(java_lang_dex_file_.get());
351578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom
3527a90959d4ef7a69f3bcb7b8763f646e12d9267d3Carl Shapiro    runtime_.reset(Runtime::Create(boot_class_path));
3537a90959d4ef7a69f3bcb7b8763f646e12d9267d3Carl Shapiro    ASSERT_TRUE(runtime_ != NULL);
3547a90959d4ef7a69f3bcb7b8763f646e12d9267d3Carl Shapiro    class_linker_ = runtime_->GetClassLinker();
355578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom  }
356578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom
357b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  virtual void TearDown() {
358b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    const char* android_data = getenv("ANDROID_DATA");
359b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    ASSERT_TRUE(android_data != NULL);
360b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    DIR* dir = opendir(art_cache_.c_str());
361b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    ASSERT_TRUE(dir != NULL);
362b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    while (true) {
363b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      struct dirent entry;
364b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      struct dirent* entry_ptr;
365b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      int readdir_result = readdir_r(dir, &entry, &entry_ptr);
366b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      ASSERT_EQ(0, readdir_result);
367b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      if (entry_ptr == NULL) {
368b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom        break;
369b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      }
370b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      if ((strcmp(entry_ptr->d_name, ".") == 0) || (strcmp(entry_ptr->d_name, "..") == 0)) {
371b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom        continue;
372b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      }
373b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      std::string filename(art_cache_);
374b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      filename.push_back('/');
375b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      filename.append(entry_ptr->d_name);
376b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      int unlink_result = unlink(filename.c_str());
377b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      ASSERT_EQ(0, unlink_result);
378b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    }
379b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    closedir(dir);
380b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    int rmdir_cache_result = rmdir(art_cache_.c_str());
381b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    ASSERT_EQ(0, rmdir_cache_result);
382b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    int rmdir_data_result = rmdir(android_data_.get());
383b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    ASSERT_EQ(0, rmdir_data_result);
3840af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes
3850af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes    // icu4c has a fixed 10-element array "gCommonICUDataArray".
3860af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes    // If we run > 10 tests, we fill that array and u_setCommonData fails.
3870af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes    // There's a function to clear the array, but it's not public...
3880af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes    typedef void (*IcuCleanupFn)();
3890af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes    void* sym = dlsym(RTLD_DEFAULT, "u_cleanup_" U_ICU_VERSION_SHORT);
3900af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes    CHECK(sym != NULL);
3910af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes    IcuCleanupFn icu_cleanup_fn = reinterpret_cast<IcuCleanupFn>(sym);
3920af5543f8ea20c3e655b2d748a1b7dcf283792feElliott Hughes    (*icu_cleanup_fn)();
393b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  }
394b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom
395b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  std::string GetLibCoreDexFileName() {
396b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    if (is_host_) {
397b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      const char* host_dir = getenv("ANDROID_HOST_OUT");
398b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      CHECK(host_dir != NULL);
399b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      return StringPrintf("%s/framework/core-hostdex.jar", host_dir);
400ac5b9e22d32c4f986783a2207b08ade769619f6fJesse Wilson    }
401b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    return std::string("/system/framework/core.jar");
402b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  }
403ac5b9e22d32c4f986783a2207b08ade769619f6fJesse Wilson
404b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  DexFile* GetLibCoreDex() {
405b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    std::string libcore_dex_file_name = GetLibCoreDexFileName();
40640ef99eb9dd91c2fa549f40973964529c927bb3cElliott Hughes    return DexFile::OpenZip(libcore_dex_file_name);
407ac5b9e22d32c4f986783a2207b08ade769619f6fJesse Wilson  }
408ac5b9e22d32c4f986783a2207b08ade769619f6fJesse Wilson
40974eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom  PathClassLoader* AllocPathClassLoader(const DexFile* dex_file) {
41074eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom    class_linker_->RegisterDexFile(dex_file);
41174eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom    std::vector<const DexFile*> dex_files;
41274eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom    dex_files.push_back(dex_file);
41374eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom    return class_linker_->AllocPathClassLoader(dex_files);
41474eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom  }
41574eb46ab15c5b9cb39bf15246db84aea7fd4cc27Brian Carlstrom
4164a96b60e45fba4a9d4a2e9c8fc849660eacef684Brian Carlstrom  bool is_host_;
417b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  scoped_ptr_malloc<char> android_data_;
418b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  std::string art_cache_;
419f734cf55d510976f4862b15e35fc86eae2a3daf8Brian Carlstrom  scoped_ptr<const DexFile> java_lang_dex_file_;
4207a90959d4ef7a69f3bcb7b8763f646e12d9267d3Carl Shapiro  scoped_ptr<Runtime> runtime_;
4217a90959d4ef7a69f3bcb7b8763f646e12d9267d3Carl Shapiro  ClassLinker* class_linker_;
422578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom};
423578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom
424934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom}  // namespace art
425