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