common_test.h revision b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995
1934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom// Copyright 2011 Google Inc. All Rights Reserved.
2934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom
3b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom#include <dirent.h>
4b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom#include <sys/stat.h>
5b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom#include <sys/types.h>
6b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom
7578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "base64.h"
8578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "heap.h"
9578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "thread.h"
10ac5b9e22d32c4f986783a2207b08ade769619f6fJesse Wilson#include "stringprintf.h"
11578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "class_linker.h"
12578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom#include "dex_file.h"
13a331b3cc392132c7333d36649a8310f38f4822ccBrian Carlstrom
14a331b3cc392132c7333d36649a8310f38f4822ccBrian Carlstrom#include "gtest/gtest.h"
15a331b3cc392132c7333d36649a8310f38f4822ccBrian Carlstrom
16934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstromnamespace art {
17934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom
18a331b3cc392132c7333d36649a8310f38f4822ccBrian Carlstrom// package java.lang;
19a331b3cc392132c7333d36649a8310f38f4822ccBrian Carlstrom// public class Object {}
20913af1bd90a6e8fd56f1f851db1f098636dae6a5Brian Carlstrom
21913af1bd90a6e8fd56f1f851db1f098636dae6a5Brian Carlstrom// package java.lang;
22913af1bd90a6e8fd56f1f851db1f098636dae6a5Brian Carlstrom// public class Class {}
23913af1bd90a6e8fd56f1f851db1f098636dae6a5Brian Carlstrom//
24913af1bd90a6e8fd56f1f851db1f098636dae6a5Brian Carlstrom// package java.lang.reflect;
25913af1bd90a6e8fd56f1f851db1f098636dae6a5Brian Carlstrom// public class Field {}
26913af1bd90a6e8fd56f1f851db1f098636dae6a5Brian Carlstrom//
27913af1bd90a6e8fd56f1f851db1f098636dae6a5Brian Carlstrom// package java.lang.reflect;
28913af1bd90a6e8fd56f1f851db1f098636dae6a5Brian Carlstrom// public class Method {}
29a331b3cc392132c7333d36649a8310f38f4822ccBrian Carlstrom//
30a331b3cc392132c7333d36649a8310f38f4822ccBrian Carlstrom// package java.lang;
3175cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom// public class String {
3275cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom//   char[] value;
3375cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom//   int hashCode;
3475cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom//   int offset;
3575cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom//   int count;
3675cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom// }
3775cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom//
3875cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom// package java.lang;
39a331b3cc392132c7333d36649a8310f38f4822ccBrian Carlstrom// public interface Cloneable {}
40a331b3cc392132c7333d36649a8310f38f4822ccBrian Carlstrom//
41a331b3cc392132c7333d36649a8310f38f4822ccBrian Carlstrom// package java.io;
42a331b3cc392132c7333d36649a8310f38f4822ccBrian Carlstrom// public interface Serializable {}
43a331b3cc392132c7333d36649a8310f38f4822ccBrian Carlstromstatic const char kJavaLangDex[] =
4475cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  "ZGV4CjAzNQDgopvWPbyCTsLOzSYO4VPqS6aRqcz6ZQu0BAAAcAAAAHhWNBIAAAAAAAAAACAEAAAW"
4575cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  "AAAAcAAAAAoAAADIAAAAAQAAAPAAAAAEAAAA/AAAAAUAAAAcAQAABwAAAEQBAACQAgAAJAIAAJgC"
4675cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  "AACgAgAArAIAALwCAADIAgAAywIAAOMCAAD2AgAADQMAACEDAAA1AwAAUAMAAGwDAAB5AwAAhgMA"
4775cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  "AJkDAACmAwAAqQMAAK0DAAC0AwAAvgMAAMYDAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAA"
4875cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  "CwAAABAAAAARAAAAEAAAAAgAAAAAAAAABQAAABIAAAAFAAAAEwAAAAUAAAAUAAAABQAJABUAAAAC"
4975cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  "AAAAAAAAAAQAAAAAAAAABQAAAAAAAAAGAAAAAAAAAAcAAAAAAAAABAAAAAEAAAD/////AAAAAA0A"
5075cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  "AAAAAAAA5gMAAAAAAAABAAAAAQYAAAQAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAIAAAABAAAABAAA"
5175cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  "AAAAAAABAAAAAAAAAPADAAAAAAAAAwAAAAEGAAAEAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAFAAAA"
5275cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  "AQAAAAQAAAAAAAAADwAAAAAAAAD6AwAAAAAAAAYAAAABAAAABAAAAAAAAAADAAAAAAAAAAwEAAAA"
5375cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  "AAAABwAAAAEAAAAEAAAAAAAAAAwAAAAAAAAAFgQAAAAAAAABAAEAAAAAAM0DAAABAAAADgAAAAEA"
5475cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  "AQABAAAA0gMAAAQAAABwEAEAAAAOAAEAAQABAAAA1wMAAAQAAABwEAEAAAAOAAEAAQABAAAA3AMA"
5575cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  "AAQAAABwEAEAAAAOAAEAAQABAAAA4QMAAAQAAABwEAEAAAAOAAY8aW5pdD4ACkNsYXNzLmphdmEA"
5675cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  "DkNsb25lYWJsZS5qYXZhAApGaWVsZC5qYXZhAAFJABZMamF2YS9pby9TZXJpYWxpemFibGU7ABFM"
5775cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  "amF2YS9sYW5nL0NsYXNzOwAVTGphdmEvbGFuZy9DbG9uZWFibGU7ABJMamF2YS9sYW5nL09iamVj"
5875cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  "dDsAEkxqYXZhL2xhbmcvU3RyaW5nOwAZTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOwAaTGphdmEv"
5975cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  "bGFuZy9yZWZsZWN0L01ldGhvZDsAC01ldGhvZC5qYXZhAAtPYmplY3QuamF2YQARU2VyaWFsaXph"
6075cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  "YmxlLmphdmEAC1N0cmluZy5qYXZhAAFWAAJbQwAFY291bnQACGhhc2hDb2RlAAZvZmZzZXQABXZh"
6175cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  "bHVlAAMABw4ABQAHDgAFAAcOAAUABw4ABQAHDgAAAAEAAYGABKQEAAABAACBgAS4BAAEAQAAAAEA"
6275cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  "AQABAAKBgATQBAAAAQADgYAE6AQAAAEABIGABIAFDAAAAAAAAAABAAAAAAAAAAEAAAAWAAAAcAAA"
6375cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  "AAIAAAAKAAAAyAAAAAMAAAABAAAA8AAAAAQAAAAEAAAA/AAAAAUAAAAFAAAAHAEAAAYAAAAHAAAA"
6475cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  "RAEAAAEgAAAFAAAAJAIAAAIgAAAWAAAAmAIAAAMgAAAFAAAAzQMAAAAgAAAFAAAA5gMAAAAQAAAB"
6575cb3b477be3757a0351fb6ab1cb70751a71e2bfBrian Carlstrom  "AAAAIAQAAA==";
66a331b3cc392132c7333d36649a8310f38f4822ccBrian Carlstrom
67934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom// package java.lang;
68934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom// public class Object {}
69934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom//
70934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom// class MyClass {}
71934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstromstatic const char kMyClassDex[] =
72934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "ZGV4CjAzNQA5Nm9IrCVm91COwepff7LhIE23GZIxGjgIAgAAcAAAAHhWNBIAAAAAAAAAAIABAAAG"
73934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAAAcAAAAAMAAACIAAAAAQAAAJQAAAAAAAAAAAAAAAIAAACgAAAAAgAAALAAAAAYAQAA8AAAABwB"
74934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAAkAQAALwEAAEMBAABRAQAAXgEAAAEAAAACAAAABQAAAAUAAAACAAAAAAAAAAAAAAAAAAAAAQAA"
75934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAAAAAABAAAAAQAAAP////8AAAAABAAAAAAAAABrAQAAAAAAAAAAAAAAAAAAAQAAAAAAAAADAAAA"
76934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAAAAHUBAAAAAAAAAQABAAAAAABhAQAAAQAAAA4AAAABAAEAAQAAAGYBAAAEAAAAcBABAAAADgAG"
77934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "PGluaXQ+AAlMTXlDbGFzczsAEkxqYXZhL2xhbmcvT2JqZWN0OwAMTXlDbGFzcy5qYXZhAAtPYmpl"
78934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "Y3QuamF2YQABVgACAAcOAAUABw4AAAABAAGBgATwAQAAAQAAgIAEhAIACwAAAAAAAAABAAAAAAAA"
79934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAEAAAAGAAAAcAAAAAIAAAADAAAAiAAAAAMAAAABAAAAlAAAAAUAAAACAAAAoAAAAAYAAAACAAAA"
80934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "sAAAAAEgAAACAAAA8AAAAAIgAAAGAAAAHAEAAAMgAAACAAAAYQEAAAAgAAACAAAAawEAAAAQAAAB"
81934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAAAgAEAAA==";
82934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom
83934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom// class Nested {
84934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom//     class Inner {
85934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom//     }
86934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom// }
87934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstromstatic const char kNestedDex[] =
88934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "ZGV4CjAzNQAQedgAe7gM1B/WHsWJ6L7lGAISGC7yjD2IAwAAcAAAAHhWNBIAAAAAAAAAAMQCAAAP"
89934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAAAcAAAAAcAAACsAAAAAgAAAMgAAAABAAAA4AAAAAMAAADoAAAAAgAAAAABAABIAgAAQAEAAK4B"
90934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAC2AQAAvQEAAM0BAADXAQAA+wEAABsCAAA+AgAAUgIAAF8CAABiAgAAZgIAAHMCAAB5AgAAgQIA"
91934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAkAAAAJAAAABgAAAAAAAAAKAAAABgAAAKgBAAAAAAEA"
92934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "DQAAAAAAAQAAAAAAAQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAIAAAAiAEAAKsCAAAA"
93934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAAAAQAAAAAAAAAFAAAAAAAAAAgAAACYAQAAuAIAAAAAAAACAAAAlAIAAJoCAAABAAAAowIAAAIA"
94934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AgABAAAAiAIAAAYAAABbAQAAcBACAAAADgABAAEAAQAAAI4CAAAEAAAAcBACAAAADgBAAQAAAAAA"
95934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAAAAAAAAAAATAEAAAAAAAAAAAAAAAAAAAEAAAABAAY8aW5pdD4ABUlubmVyAA5MTmVzdGVkJElu"
96934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "bmVyOwAITE5lc3RlZDsAIkxkYWx2aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdDbGFzczsAHkxkYWx2"
97934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "aWsvYW5ub3RhdGlvbi9Jbm5lckNsYXNzOwAhTGRhbHZpay9hbm5vdGF0aW9uL01lbWJlckNsYXNz"
98934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "ZXM7ABJMamF2YS9sYW5nL09iamVjdDsAC05lc3RlZC5qYXZhAAFWAAJWTAALYWNjZXNzRmxhZ3MA"
99934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "BG5hbWUABnRoaXMkMAAFdmFsdWUAAgEABw4AAQAHDjwAAgIBDhgBAgMCCwQADBcBAgQBDhwBGAAA"
100934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AQEAAJAgAICABNQCAAABAAGAgATwAgAAEAAAAAAAAAABAAAAAAAAAAEAAAAPAAAAcAAAAAIAAAAH"
101934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAAArAAAAAMAAAACAAAAyAAAAAQAAAABAAAA4AAAAAUAAAADAAAA6AAAAAYAAAACAAAAAAEAAAMQ"
102934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAACAAAAQAEAAAEgAAACAAAAVAEAAAYgAAACAAAAiAEAAAEQAAABAAAAqAEAAAIgAAAPAAAArgEA"
103934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAMgAAACAAAAiAIAAAQgAAADAAAAlAIAAAAgAAACAAAAqwIAAAAQAAABAAAAxAIAAA==";
104934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom
105934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom// class ProtoCompare {
106934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom//     int m1(short x, int y, long z) { return x + y + (int)z; }
107934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom//     int m2(short x, int y, long z) { return x + y + (int)z; }
108934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom//     int m3(long x, int y, short z) { return (int)x + y + z; }
109934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom//     long m4(long x, int y, short z) { return x + y + z; }
110934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom// }
111934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstromstatic const char kProtoCompareDex[] =
112934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "ZGV4CjAzNQBLUetu+TVZ8gsYsCOFoij7ecsHaGSEGA8gAwAAcAAAAHhWNBIAAAAAAAAAAIwCAAAP"
113934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAAAcAAAAAYAAACsAAAABAAAAMQAAAAAAAAAAAAAAAYAAAD0AAAAAQAAACQBAADcAQAARAEAAN4B"
114934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AADmAQAA6QEAAO8BAAD1AQAA+AEAAP4BAAAOAgAAIgIAADUCAAA4AgAAOwIAAD8CAABDAgAARwIA"
115934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAEAAAAEAAAABgAAAAcAAAAJAAAACgAAAAIAAAAAAAAAyAEAAAMAAAAAAAAA1AEAAAUAAAABAAAA"
116934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "yAEAAAoAAAAFAAAAAAAAAAIAAwAAAAAAAgABAAsAAAACAAEADAAAAAIAAAANAAAAAgACAA4AAAAD"
117934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAMAAAAAAAIAAAAAAAAAAwAAAAAAAAAIAAAAAAAAAHACAAAAAAAAAQABAAEAAABLAgAABAAAAHAQ"
118934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "BQAAAA4ABwAFAAAAAABQAgAABQAAAJAAAwSEUbAQDwAAAAcABQAAAAAAWAIAAAUAAACQAAMEhFGw"
119934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "EA8AAAAGAAUAAAAAAGACAAAEAAAAhCCwQLBQDwAJAAUAAAAAAGgCAAAFAAAAgXC7UIGCuyAQAAAA"
120934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AwAAAAEAAAAEAAAAAwAAAAQAAAABAAY8aW5pdD4AAUkABElKSVMABElTSUoAAUoABEpKSVMADkxQ"
121934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "cm90b0NvbXBhcmU7ABJMamF2YS9sYW5nL09iamVjdDsAEVByb3RvQ29tcGFyZS5qYXZhAAFTAAFW"
122934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAJtMQACbTIAAm0zAAJtNAABAAcOAAIDAAAABw4AAwMAAAAHDgAEAwAAAAcOAAUDAAAABw4AAAAB"
123934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "BACAgATEAgEA3AIBAPgCAQCUAwEArAMAAAwAAAAAAAAAAQAAAAAAAAABAAAADwAAAHAAAAACAAAA"
124934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "BgAAAKwAAAADAAAABAAAAMQAAAAFAAAABgAAAPQAAAAGAAAAAQAAACQBAAABIAAABQAAAEQBAAAB"
125934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "EAAAAgAAAMgBAAACIAAADwAAAN4BAAADIAAABQAAAEsCAAAAIAAAAQAAAHACAAAAEAAAAQAAAIwC"
126934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAA=";
127934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom
128934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom// class ProtoCompare2 {
129934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom//     int m1(short x, int y, long z) { return x + y + (int)z; }
130934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom//     int m2(short x, int y, long z) { return x + y + (int)z; }
131934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom//     int m3(long x, int y, short z) { return (int)x + y + z; }
132934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom//     long m4(long x, int y, short z) { return x + y + z; }
133934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom// }
134934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstromstatic const char kProtoCompare2Dex[] =
135934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "ZGV4CjAzNQDVUXj687EpyTTDJZEZPA8dEYnDlm0Ir6YgAwAAcAAAAHhWNBIAAAAAAAAAAIwCAAAP"
136934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAAAcAAAAAYAAACsAAAABAAAAMQAAAAAAAAAAAAAAAYAAAD0AAAAAQAAACQBAADcAQAARAEAAN4B"
137934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AADmAQAA6QEAAO8BAAD1AQAA+AEAAP4BAAAPAgAAIwIAADcCAAA6AgAAPQIAAEECAABFAgAASQIA"
138934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAEAAAAEAAAABgAAAAcAAAAJAAAACgAAAAIAAAAAAAAAyAEAAAMAAAAAAAAA1AEAAAUAAAABAAAA"
139934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "yAEAAAoAAAAFAAAAAAAAAAIAAwAAAAAAAgABAAsAAAACAAEADAAAAAIAAAANAAAAAgACAA4AAAAD"
140934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAMAAAAAAAIAAAAAAAAAAwAAAAAAAAAIAAAAAAAAAHICAAAAAAAAAQABAAEAAABNAgAABAAAAHAQ"
141934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "BQAAAA4ABwAFAAAAAABSAgAABQAAAJAAAwSEUbAQDwAAAAcABQAAAAAAWgIAAAUAAACQAAMEhFGw"
142934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "EA8AAAAGAAUAAAAAAGICAAAEAAAAhCCwQLBQDwAJAAUAAAAAAGoCAAAFAAAAgXC7UIGCuyAQAAAA"
143934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AwAAAAEAAAAEAAAAAwAAAAQAAAABAAY8aW5pdD4AAUkABElKSVMABElTSUoAAUoABEpKSVMAD0xQ"
144934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "cm90b0NvbXBhcmUyOwASTGphdmEvbGFuZy9PYmplY3Q7ABJQcm90b0NvbXBhcmUyLmphdmEAAVMA"
145934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AVYAAm0xAAJtMgACbTMAAm00AAEABw4AAgMAAAAHDgADAwAAAAcOAAQDAAAABw4ABQMAAAAHDgAA"
146934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAEEAICABMQCAQDcAgEA+AIBAJQDAQCsAwwAAAAAAAAAAQAAAAAAAAABAAAADwAAAHAAAAACAAAA"
147934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "BgAAAKwAAAADAAAABAAAAMQAAAAFAAAABgAAAPQAAAAGAAAAAQAAACQBAAABIAAABQAAAEQBAAAB"
148934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "EAAAAgAAAMgBAAACIAAADwAAAN4BAAADIAAABQAAAE0CAAAAIAAAAQAAAHICAAAAEAAAAQAAAIwC"
149934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom  "AAA=";
150934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom
151b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// javac MyClass.java && dx --dex --output=MyClass.dex
152b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   --core-library MyClass.class java/lang/Object.class && base64 MyClass.dex
153b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// package java.lang;
154b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// public class Object {}
155b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// class MyClass {
156b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   native void foo();
157b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   native int fooI(int x);
158b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   native int fooII(int x, int y);
159b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   native double fooDD(double x, double y);
160b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   native Object fooIOO(int x, Object y, Object z);
161b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers//   static native Object fooSIOO(int x, Object y, Object z);
162df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers//   static synchronized native Object fooSSIOO(int x, Object y, Object z);
163b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers// }
164b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogersstatic const char kMyClassNativesDex[] =
165df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "ZGV4CjAzNQA4WWrpXgdlkoTHR8Yubx4LJO4HbGsX1p1EAwAAcAAAAHhWNBIAAAAAAAAAALACAAAT"
166df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "AAAAcAAAAAUAAAC8AAAABQAAANAAAAAAAAAAAAAAAAkAAAAMAQAAAgAAAFQBAACwAQAAlAEAAOIB"
167df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "AADqAQAA7QEAAPIBAAD1AQAA+QEAAP4BAAAEAgAADwIAACMCAAAxAgAAPgIAAEECAABGAgAATQIA"
168df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "AFMCAABaAgAAYgIAAGsCAAABAAAAAwAAAAcAAAAIAAAACwAAAAIAAAAAAAAAwAEAAAQAAAABAAAA"
169df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "yAEAAAUAAAABAAAA0AEAAAYAAAADAAAA2AEAAAsAAAAEAAAAAAAAAAIABAAAAAAAAgAEAAwAAAAC"
170df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "AAAADQAAAAIAAQAOAAAAAgACAA8AAAACAAMAEAAAAAIAAwARAAAAAgADABIAAAADAAQAAAAAAAMA"
171df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "AAABAAAA/////wAAAAAKAAAAAAAAAH8CAAAAAAAAAgAAAAAAAAADAAAAAAAAAAkAAAAAAAAAiQIA"
172df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "AAAAAAABAAEAAAAAAHUCAAABAAAADgAAAAEAAQABAAAAegIAAAQAAABwEAgAAAAOAAIAAAAAAAAA"
173df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "AQAAAAEAAAACAAAAAQABAAMAAAABAAMAAwAGPGluaXQ+AAFEAANEREQAAUkAAklJAANJSUkABExJ"
174df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "TEwACUxNeUNsYXNzOwASTGphdmEvbGFuZy9PYmplY3Q7AAxNeUNsYXNzLmphdmEAC09iamVjdC5q"
175df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "YXZhAAFWAANmb28ABWZvb0REAARmb29JAAVmb29JSQAGZm9vSU9PAAdmb29TSU9PAAhmb29TU0lP"
176df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "TwADAAcOAAEABw4AAAABAAiBgASUAwAAAwUAgIAEqAMGiAIAAaiCCAABgAIAAYACAAGAAgABgAIA"
177df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "AYACAAwAAAAAAAAAAQAAAAAAAAABAAAAEwAAAHAAAAACAAAABQAAALwAAAADAAAABQAAANAAAAAF"
178df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "AAAACQAAAAwBAAAGAAAAAgAAAFQBAAABIAAAAgAAAJQBAAABEAAABAAAAMABAAACIAAAEwAAAOIB"
179df20fe0c097073f75f22d16e72fd3636a31d3ca1Ian Rogers  "AAADIAAAAgAAAHUCAAAAIAAAAgAAAH8CAAAAEAAAAQAAALACAAA=";
180b033c75ebda80ac75f936366fe78d1edf5cec937Ian Rogers
181f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstromstatic inline DexFile* OpenDexFileBase64(const char* base64) {
182578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom  CHECK(base64 != NULL);
183578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom  size_t length;
184f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom  byte* dex_bytes = DecodeBase64(base64, &length);
185f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom  CHECK(dex_bytes != NULL);
186f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom  DexFile* dex_file = DexFile::OpenPtr(dex_bytes, length);
187578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom  CHECK(dex_file != NULL);
188f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom  return dex_file;
189578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom}
190578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom
191578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstromclass RuntimeTest : public testing::Test {
192578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom protected:
193578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom  virtual void SetUp() {
1944a96b60e45fba4a9d4a2e9c8fc849660eacef684Brian Carlstrom    is_host_ = getenv("ANDROID_BUILD_TOP") != NULL;
1954a96b60e45fba4a9d4a2e9c8fc849660eacef684Brian Carlstrom
196b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    android_data_.reset(strdup(is_host_ ? "/tmp/art-data-XXXXXX" : "/sdcard/art-data-XXXXXX"));
197b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    ASSERT_TRUE(android_data_ != NULL);
198b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    const char* android_data_modified = mkdtemp(android_data_.get());
199b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    // note that mkdtemp side effects android_data_ as well
200b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    ASSERT_TRUE(android_data_modified != NULL);
201b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    setenv("ANDROID_DATA", android_data_modified, 1);
202b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    art_cache_.append(android_data_.get());
203b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    art_cache_.append("/art-cache");
204b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    int mkdir_result = mkdir(art_cache_.c_str(), 0700);
205b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    ASSERT_EQ(mkdir_result, 0);
206b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom
207f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom    java_lang_dex_file_.reset(OpenDexFileBase64(kJavaLangDex));
208578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom
209f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom    std::vector<DexFile*> boot_class_path;
210f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom    boot_class_path.push_back(java_lang_dex_file_.get());
211578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom
2127a90959d4ef7a69f3bcb7b8763f646e12d9267d3Carl Shapiro    runtime_.reset(Runtime::Create(boot_class_path));
2137a90959d4ef7a69f3bcb7b8763f646e12d9267d3Carl Shapiro    ASSERT_TRUE(runtime_ != NULL);
2147a90959d4ef7a69f3bcb7b8763f646e12d9267d3Carl Shapiro    class_linker_ = runtime_->GetClassLinker();
215578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom  }
216578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom
217b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  virtual void TearDown() {
218b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    const char* android_data = getenv("ANDROID_DATA");
219b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    ASSERT_TRUE(android_data != NULL);
220b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    DIR* dir = opendir(art_cache_.c_str());
221b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    ASSERT_TRUE(dir != NULL);
222b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    while (true) {
223b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      struct dirent entry;
224b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      struct dirent* entry_ptr;
225b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      int readdir_result = readdir_r(dir, &entry, &entry_ptr);
226b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      ASSERT_EQ(0, readdir_result);
227b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      if (entry_ptr == NULL) {
228b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom        break;
229b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      }
230b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      if ((strcmp(entry_ptr->d_name, ".") == 0) || (strcmp(entry_ptr->d_name, "..") == 0)) {
231b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom        continue;
232b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      }
233b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      std::string filename(art_cache_);
234b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      filename.push_back('/');
235b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      filename.append(entry_ptr->d_name);
236b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      int unlink_result = unlink(filename.c_str());
237b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      ASSERT_EQ(0, unlink_result);
238b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    }
239b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    closedir(dir);
240b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    int rmdir_cache_result = rmdir(art_cache_.c_str());
241b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    ASSERT_EQ(0, rmdir_cache_result);
242b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    int rmdir_data_result = rmdir(android_data_.get());
243b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    ASSERT_EQ(0, rmdir_data_result);
244b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  }
245b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom
246b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  std::string GetLibCoreDexFileName() {
247b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    if (is_host_) {
248b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      const char* host_dir = getenv("ANDROID_HOST_OUT");
249b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      CHECK(host_dir != NULL);
250b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom      return StringPrintf("%s/framework/core-hostdex.jar", host_dir);
251ac5b9e22d32c4f986783a2207b08ade769619f6fJesse Wilson    }
252b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    return std::string("/system/framework/core.jar");
253b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  }
254ac5b9e22d32c4f986783a2207b08ade769619f6fJesse Wilson
255b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  DexFile* GetLibCoreDex() {
256b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    std::string libcore_dex_file_name = GetLibCoreDexFileName();
257b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom    return DexFile::OpenZip(libcore_dex_file_name.c_str());
258ac5b9e22d32c4f986783a2207b08ade769619f6fJesse Wilson  }
259ac5b9e22d32c4f986783a2207b08ade769619f6fJesse Wilson
26046cdd4bd0f69c519fc31114bdec2cb8a9c3b162dJesse Wilson  void UseLibCoreDex() {
26146cdd4bd0f69c519fc31114bdec2cb8a9c3b162dJesse Wilson    delete runtime_.release();
26246cdd4bd0f69c519fc31114bdec2cb8a9c3b162dJesse Wilson    java_lang_dex_file_.reset(GetLibCoreDex());
26346cdd4bd0f69c519fc31114bdec2cb8a9c3b162dJesse Wilson
26446cdd4bd0f69c519fc31114bdec2cb8a9c3b162dJesse Wilson    std::vector<DexFile*> boot_class_path;
26546cdd4bd0f69c519fc31114bdec2cb8a9c3b162dJesse Wilson    boot_class_path.push_back(java_lang_dex_file_.get());
26646cdd4bd0f69c519fc31114bdec2cb8a9c3b162dJesse Wilson
26746cdd4bd0f69c519fc31114bdec2cb8a9c3b162dJesse Wilson    runtime_.reset(Runtime::Create(boot_class_path));
26846cdd4bd0f69c519fc31114bdec2cb8a9c3b162dJesse Wilson    ASSERT_TRUE(runtime_ != NULL);
26946cdd4bd0f69c519fc31114bdec2cb8a9c3b162dJesse Wilson    class_linker_ = runtime_->GetClassLinker();
27046cdd4bd0f69c519fc31114bdec2cb8a9c3b162dJesse Wilson  }
27146cdd4bd0f69c519fc31114bdec2cb8a9c3b162dJesse Wilson
2724a96b60e45fba4a9d4a2e9c8fc849660eacef684Brian Carlstrom  bool is_host_;
273b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  scoped_ptr_malloc<char> android_data_;
274b0460eaa2cb131f1dbdd5a7217bd36b9a9f1b995Brian Carlstrom  std::string art_cache_;
275f615a61aef972cfc1dc23931ac2ed0da14c3fedbBrian Carlstrom  scoped_ptr<DexFile> java_lang_dex_file_;
2767a90959d4ef7a69f3bcb7b8763f646e12d9267d3Carl Shapiro  scoped_ptr<Runtime> runtime_;
2777a90959d4ef7a69f3bcb7b8763f646e12d9267d3Carl Shapiro  ClassLinker* class_linker_;
278578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom};
279578bbdc684db8ed68e9fedbc678669d27fa68b6eBrian Carlstrom
280934486cf07c578b6494417ca5dcbae89cf04b019Brian Carlstrom}  // namespace art
281