dex_file_test.cc revision 90a3369d3b6238f1a4c9b19ca68978dab1c39bc4
1// Copyright 2011 Google Inc. All Rights Reserved.
2
3#include "dex_file.h"
4
5#include <stdio.h>
6
7#include "UniquePtr.h"
8#include "common_test.h"
9
10namespace art {
11
12class DexFileTest : public CommonTest {};
13
14TEST_F(DexFileTest, Open) {
15  UniquePtr<const DexFile> dex(OpenTestDexFile("Nested"));
16  ASSERT_TRUE(dex.get() != NULL);
17}
18
19// Although this is the same content logically as the Nested test dex,
20// the DexFileHeader test is sensitive to subtle changes in the
21// contents due to the checksum etc, so we embed the exact input here.
22//
23// class Nested {
24//     class Inner {
25//     }
26// }
27static const char kRawDex[] =
28  "ZGV4CjAzNQAQedgAe7gM1B/WHsWJ6L7lGAISGC7yjD2IAwAAcAAAAHhWNBIAAAAAAAAAAMQCAAAP"
29  "AAAAcAAAAAcAAACsAAAAAgAAAMgAAAABAAAA4AAAAAMAAADoAAAAAgAAAAABAABIAgAAQAEAAK4B"
30  "AAC2AQAAvQEAAM0BAADXAQAA+wEAABsCAAA+AgAAUgIAAF8CAABiAgAAZgIAAHMCAAB5AgAAgQIA"
31  "AAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAkAAAAJAAAABgAAAAAAAAAKAAAABgAAAKgBAAAAAAEA"
32  "DQAAAAAAAQAAAAAAAQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAIAAAAiAEAAKsCAAAA"
33  "AAAAAQAAAAAAAAAFAAAAAAAAAAgAAACYAQAAuAIAAAAAAAACAAAAlAIAAJoCAAABAAAAowIAAAIA"
34  "AgABAAAAiAIAAAYAAABbAQAAcBACAAAADgABAAEAAQAAAI4CAAAEAAAAcBACAAAADgBAAQAAAAAA"
35  "AAAAAAAAAAAATAEAAAAAAAAAAAAAAAAAAAEAAAABAAY8aW5pdD4ABUlubmVyAA5MTmVzdGVkJElu"
36  "bmVyOwAITE5lc3RlZDsAIkxkYWx2aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdDbGFzczsAHkxkYWx2"
37  "aWsvYW5ub3RhdGlvbi9Jbm5lckNsYXNzOwAhTGRhbHZpay9hbm5vdGF0aW9uL01lbWJlckNsYXNz"
38  "ZXM7ABJMamF2YS9sYW5nL09iamVjdDsAC05lc3RlZC5qYXZhAAFWAAJWTAALYWNjZXNzRmxhZ3MA"
39  "BG5hbWUABnRoaXMkMAAFdmFsdWUAAgEABw4AAQAHDjwAAgIBDhgBAgMCCwQADBcBAgQBDhwBGAAA"
40  "AQEAAJAgAICABNQCAAABAAGAgATwAgAAEAAAAAAAAAABAAAAAAAAAAEAAAAPAAAAcAAAAAIAAAAH"
41  "AAAArAAAAAMAAAACAAAAyAAAAAQAAAABAAAA4AAAAAUAAAADAAAA6AAAAAYAAAACAAAAAAEAAAMQ"
42  "AAACAAAAQAEAAAEgAAACAAAAVAEAAAYgAAACAAAAiAEAAAEQAAABAAAAqAEAAAIgAAAPAAAArgEA"
43  "AAMgAAACAAAAiAIAAAQgAAADAAAAlAIAAAAgAAACAAAAqwIAAAAQAAABAAAAxAIAAA==";
44
45TEST_F(DexFileTest, Header) {
46  UniquePtr<const DexFile> raw(OpenDexFileBase64(kRawDex, "kRawDex"));
47  ASSERT_TRUE(raw.get() != NULL);
48
49  const DexFile::Header& header = raw->GetHeader();
50  // TODO: header.magic_
51  EXPECT_EQ(0x00d87910U, header.checksum_);
52  // TODO: header.signature_
53  EXPECT_EQ(904U, header.file_size_);
54  EXPECT_EQ(112U, header.header_size_);
55  EXPECT_EQ(0U, header.link_size_);
56  EXPECT_EQ(0U, header.link_off_);
57  EXPECT_EQ(15U, header.string_ids_size_);
58  EXPECT_EQ(112U, header.string_ids_off_);
59  EXPECT_EQ(7U, header.type_ids_size_);
60  EXPECT_EQ(172U, header.type_ids_off_);
61  EXPECT_EQ(2U, header.proto_ids_size_);
62  EXPECT_EQ(200U, header.proto_ids_off_);
63  EXPECT_EQ(1U, header.field_ids_size_);
64  EXPECT_EQ(224U, header.field_ids_off_);
65  EXPECT_EQ(3U, header.method_ids_size_);
66  EXPECT_EQ(232U, header.method_ids_off_);
67  EXPECT_EQ(2U, header.class_defs_size_);
68  EXPECT_EQ(256U, header.class_defs_off_);
69  EXPECT_EQ(584U, header.data_size_);
70  EXPECT_EQ(320U, header.data_off_);
71}
72
73TEST_F(DexFileTest, ClassDefs) {
74  UniquePtr<const DexFile> raw(OpenTestDexFile("Nested"));
75  ASSERT_TRUE(raw.get() != NULL);
76  EXPECT_EQ(2U, raw->NumClassDefs());
77
78  const DexFile::ClassDef& c0 = raw->GetClassDef(0);
79  EXPECT_STREQ("LNested$Inner;", raw->GetClassDescriptor(c0));
80
81  const DexFile::ClassDef& c1 = raw->GetClassDef(1);
82  EXPECT_STREQ("LNested;", raw->GetClassDescriptor(c1));
83}
84
85TEST_F(DexFileTest, CreateMethodDescriptor) {
86  UniquePtr<const DexFile> raw(OpenTestDexFile("CreateMethodDescriptor"));
87  ASSERT_TRUE(raw.get() != NULL);
88  EXPECT_EQ(1U, raw->NumClassDefs());
89
90  const DexFile::ClassDef& class_def = raw->GetClassDef(0);
91  ASSERT_STREQ("LCreateMethodDescriptor;", raw->GetClassDescriptor(class_def));
92
93  const byte* class_data = raw->GetClassData(class_def);
94  ASSERT_TRUE(class_data != NULL);
95  DexFile::ClassDataHeader header = raw->ReadClassDataHeader(&class_data);
96
97  EXPECT_EQ(1u, header.direct_methods_size_);
98
99  // Check the descriptor for the static initializer.
100  {
101    uint32_t last_idx = 0;
102    ASSERT_EQ(1U, header.direct_methods_size_);
103    DexFile::Method method;
104    raw->dexReadClassDataMethod(&class_data, &method, &last_idx);
105    const DexFile::MethodId& method_id = raw->GetMethodId(method.method_idx_);
106    uint32_t proto_idx = method_id.proto_idx_;
107    const char* name = raw->dexStringById(method_id.name_idx_);
108    ASSERT_STREQ("<init>", name);
109    int32_t length;
110    std::string descriptor(raw->CreateMethodDescriptor(proto_idx, &length));
111    ASSERT_EQ("()V", descriptor);
112  }
113
114  // Check both virtual methods.
115  ASSERT_EQ(2U, header.virtual_methods_size_);
116  uint32_t last_idx = 0;
117
118  {
119    DexFile::Method method;
120    raw->dexReadClassDataMethod(&class_data, &method, &last_idx);
121    const DexFile::MethodId& method_id = raw->GetMethodId(method.method_idx_);
122
123    const char* name = raw->dexStringById(method_id.name_idx_);
124    ASSERT_STREQ("m1", name);
125
126    uint32_t proto_idx = method_id.proto_idx_;
127    int32_t length;
128    std::string descriptor(raw->CreateMethodDescriptor(proto_idx, &length));
129    ASSERT_EQ("(IDJLjava/lang/Object;)Ljava/lang/Float;", descriptor);
130  }
131
132  {
133    DexFile::Method method;
134    raw->dexReadClassDataMethod(&class_data, &method, &last_idx);
135    const DexFile::MethodId& method_id = raw->GetMethodId(method.method_idx_);
136
137    const char* name = raw->dexStringById(method_id.name_idx_);
138    ASSERT_STREQ("m2", name);
139
140    uint32_t proto_idx = method_id.proto_idx_;
141    int32_t length;
142    std::string descriptor(raw->CreateMethodDescriptor(proto_idx, &length));
143    ASSERT_EQ("(ZSC)LCreateMethodDescriptor;", descriptor);
144  }
145
146}
147
148}  // namespace art
149