blob: e33276b881d4f6f6797302f6ea3d5e3193d92b78 [file] [log] [blame]
Carl Shapiro1fb86202011-06-27 17:43:13 -07001// Copyright 2011 Google Inc. All Rights Reserved.
2
Brian Carlstrom578bbdc2011-07-21 14:07:47 -07003#include "dex_file.h"
Carl Shapiro1fb86202011-06-27 17:43:13 -07004
Elliott Hughes90a33692011-08-30 13:27:07 -07005#include "UniquePtr.h"
6#include "common_test.h"
7
Carl Shapiro1fb86202011-06-27 17:43:13 -07008namespace art {
9
Brian Carlstrom9f30b382011-08-28 22:41:38 -070010class DexFileTest : public CommonTest {};
11
12TEST_F(DexFileTest, Open) {
Elliott Hughes90a33692011-08-30 13:27:07 -070013 UniquePtr<const DexFile> dex(OpenTestDexFile("Nested"));
14 ASSERT_TRUE(dex.get() != NULL);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070015}
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070016
Brian Carlstrom9f30b382011-08-28 22:41:38 -070017// Although this is the same content logically as the Nested test dex,
18// the DexFileHeader test is sensitive to subtle changes in the
19// contents due to the checksum etc, so we embed the exact input here.
20//
21// class Nested {
22// class Inner {
23// }
24// }
25static const char kRawDex[] =
26 "ZGV4CjAzNQAQedgAe7gM1B/WHsWJ6L7lGAISGC7yjD2IAwAAcAAAAHhWNBIAAAAAAAAAAMQCAAAP"
27 "AAAAcAAAAAcAAACsAAAAAgAAAMgAAAABAAAA4AAAAAMAAADoAAAAAgAAAAABAABIAgAAQAEAAK4B"
28 "AAC2AQAAvQEAAM0BAADXAQAA+wEAABsCAAA+AgAAUgIAAF8CAABiAgAAZgIAAHMCAAB5AgAAgQIA"
29 "AAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAkAAAAJAAAABgAAAAAAAAAKAAAABgAAAKgBAAAAAAEA"
30 "DQAAAAAAAQAAAAAAAQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAIAAAAiAEAAKsCAAAA"
31 "AAAAAQAAAAAAAAAFAAAAAAAAAAgAAACYAQAAuAIAAAAAAAACAAAAlAIAAJoCAAABAAAAowIAAAIA"
32 "AgABAAAAiAIAAAYAAABbAQAAcBACAAAADgABAAEAAQAAAI4CAAAEAAAAcBACAAAADgBAAQAAAAAA"
33 "AAAAAAAAAAAATAEAAAAAAAAAAAAAAAAAAAEAAAABAAY8aW5pdD4ABUlubmVyAA5MTmVzdGVkJElu"
34 "bmVyOwAITE5lc3RlZDsAIkxkYWx2aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdDbGFzczsAHkxkYWx2"
35 "aWsvYW5ub3RhdGlvbi9Jbm5lckNsYXNzOwAhTGRhbHZpay9hbm5vdGF0aW9uL01lbWJlckNsYXNz"
36 "ZXM7ABJMamF2YS9sYW5nL09iamVjdDsAC05lc3RlZC5qYXZhAAFWAAJWTAALYWNjZXNzRmxhZ3MA"
37 "BG5hbWUABnRoaXMkMAAFdmFsdWUAAgEABw4AAQAHDjwAAgIBDhgBAgMCCwQADBcBAgQBDhwBGAAA"
38 "AQEAAJAgAICABNQCAAABAAGAgATwAgAAEAAAAAAAAAABAAAAAAAAAAEAAAAPAAAAcAAAAAIAAAAH"
39 "AAAArAAAAAMAAAACAAAAyAAAAAQAAAABAAAA4AAAAAUAAAADAAAA6AAAAAYAAAACAAAAAAEAAAMQ"
40 "AAACAAAAQAEAAAEgAAACAAAAVAEAAAYgAAACAAAAiAEAAAEQAAABAAAAqAEAAAIgAAAPAAAArgEA"
41 "AAMgAAACAAAAiAIAAAQgAAADAAAAlAIAAAAgAAACAAAAqwIAAAAQAAABAAAAxAIAAA==";
42
43TEST_F(DexFileTest, Header) {
Brian Carlstrom33f741e2011-10-03 11:24:05 -070044 ScratchFile tmp;
45 UniquePtr<const DexFile> raw(OpenDexFileBase64(kRawDex, tmp.GetFilename()));
Elliott Hughes90a33692011-08-30 13:27:07 -070046 ASSERT_TRUE(raw.get() != NULL);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070047
Brian Carlstromf615a612011-07-23 12:50:34 -070048 const DexFile::Header& header = raw->GetHeader();
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070049 // TODO: header.magic_
50 EXPECT_EQ(0x00d87910U, header.checksum_);
51 // TODO: header.signature_
52 EXPECT_EQ(904U, header.file_size_);
53 EXPECT_EQ(112U, header.header_size_);
54 EXPECT_EQ(0U, header.link_size_);
55 EXPECT_EQ(0U, header.link_off_);
56 EXPECT_EQ(15U, header.string_ids_size_);
57 EXPECT_EQ(112U, header.string_ids_off_);
58 EXPECT_EQ(7U, header.type_ids_size_);
59 EXPECT_EQ(172U, header.type_ids_off_);
60 EXPECT_EQ(2U, header.proto_ids_size_);
61 EXPECT_EQ(200U, header.proto_ids_off_);
62 EXPECT_EQ(1U, header.field_ids_size_);
63 EXPECT_EQ(224U, header.field_ids_off_);
64 EXPECT_EQ(3U, header.method_ids_size_);
65 EXPECT_EQ(232U, header.method_ids_off_);
66 EXPECT_EQ(2U, header.class_defs_size_);
67 EXPECT_EQ(256U, header.class_defs_off_);
68 EXPECT_EQ(584U, header.data_size_);
69 EXPECT_EQ(320U, header.data_off_);
70}
71
Brian Carlstrom9f30b382011-08-28 22:41:38 -070072TEST_F(DexFileTest, ClassDefs) {
Elliott Hughes90a33692011-08-30 13:27:07 -070073 UniquePtr<const DexFile> raw(OpenTestDexFile("Nested"));
74 ASSERT_TRUE(raw.get() != NULL);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070075 EXPECT_EQ(2U, raw->NumClassDefs());
76
Brian Carlstromf615a612011-07-23 12:50:34 -070077 const DexFile::ClassDef& c0 = raw->GetClassDef(0);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070078 EXPECT_STREQ("LNested$Inner;", raw->GetClassDescriptor(c0));
79
Brian Carlstromf615a612011-07-23 12:50:34 -070080 const DexFile::ClassDef& c1 = raw->GetClassDef(1);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070081 EXPECT_STREQ("LNested;", raw->GetClassDescriptor(c1));
Carl Shapiro1fb86202011-06-27 17:43:13 -070082}
83
Brian Carlstrom9f30b382011-08-28 22:41:38 -070084TEST_F(DexFileTest, CreateMethodDescriptor) {
Elliott Hughes90a33692011-08-30 13:27:07 -070085 UniquePtr<const DexFile> raw(OpenTestDexFile("CreateMethodDescriptor"));
86 ASSERT_TRUE(raw.get() != NULL);
Carl Shapiro419ec7b2011-08-03 14:48:33 -070087 EXPECT_EQ(1U, raw->NumClassDefs());
88
89 const DexFile::ClassDef& class_def = raw->GetClassDef(0);
90 ASSERT_STREQ("LCreateMethodDescriptor;", raw->GetClassDescriptor(class_def));
91
92 const byte* class_data = raw->GetClassData(class_def);
93 ASSERT_TRUE(class_data != NULL);
94 DexFile::ClassDataHeader header = raw->ReadClassDataHeader(&class_data);
95
96 EXPECT_EQ(1u, header.direct_methods_size_);
97
98 // Check the descriptor for the static initializer.
99 {
100 uint32_t last_idx = 0;
101 ASSERT_EQ(1U, header.direct_methods_size_);
102 DexFile::Method method;
103 raw->dexReadClassDataMethod(&class_data, &method, &last_idx);
104 const DexFile::MethodId& method_id = raw->GetMethodId(method.method_idx_);
105 uint32_t proto_idx = method_id.proto_idx_;
106 const char* name = raw->dexStringById(method_id.name_idx_);
107 ASSERT_STREQ("<init>", name);
108 int32_t length;
Elliott Hughes0c424cb2011-08-26 10:16:25 -0700109 std::string descriptor(raw->CreateMethodDescriptor(proto_idx, &length));
110 ASSERT_EQ("()V", descriptor);
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700111 }
112
113 // Check both virtual methods.
114 ASSERT_EQ(2U, header.virtual_methods_size_);
115 uint32_t last_idx = 0;
116
117 {
118 DexFile::Method method;
119 raw->dexReadClassDataMethod(&class_data, &method, &last_idx);
120 const DexFile::MethodId& method_id = raw->GetMethodId(method.method_idx_);
121
122 const char* name = raw->dexStringById(method_id.name_idx_);
123 ASSERT_STREQ("m1", name);
124
125 uint32_t proto_idx = method_id.proto_idx_;
126 int32_t length;
Elliott Hughes0c424cb2011-08-26 10:16:25 -0700127 std::string descriptor(raw->CreateMethodDescriptor(proto_idx, &length));
128 ASSERT_EQ("(IDJLjava/lang/Object;)Ljava/lang/Float;", descriptor);
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700129 }
130
131 {
132 DexFile::Method method;
133 raw->dexReadClassDataMethod(&class_data, &method, &last_idx);
134 const DexFile::MethodId& method_id = raw->GetMethodId(method.method_idx_);
135
136 const char* name = raw->dexStringById(method_id.name_idx_);
137 ASSERT_STREQ("m2", name);
138
139 uint32_t proto_idx = method_id.proto_idx_;
140 int32_t length;
Elliott Hughes0c424cb2011-08-26 10:16:25 -0700141 std::string descriptor(raw->CreateMethodDescriptor(proto_idx, &length));
142 ASSERT_EQ("(ZSC)LCreateMethodDescriptor;", descriptor);
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700143 }
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700144}
145
Carl Shapiro1fb86202011-06-27 17:43:13 -0700146} // namespace art