blob: a814c343cdb3b33fee6561940218297646325fe9 [file] [log] [blame]
Elliott Hughes2faa5f12012-01-30 14:42:07 -08001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Carl Shapiro1fb86202011-06-27 17:43:13 -070016
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070017#include "dex_file.h"
Carl Shapiro1fb86202011-06-27 17:43:13 -070018
Ian Rogers700a4022014-05-19 16:49:03 -070019#include <memory>
20
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080021#include "common_runtime_test.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070022
Carl Shapiro1fb86202011-06-27 17:43:13 -070023namespace art {
24
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080025class DexFileTest : public CommonRuntimeTest {};
Brian Carlstrom9f30b382011-08-28 22:41:38 -070026
27TEST_F(DexFileTest, Open) {
Ian Rogers33e95662013-05-20 20:29:14 -070028 ScopedObjectAccess soa(Thread::Current());
Elliott Hughes4d6850c2012-01-18 15:55:06 -080029 const DexFile* dex(OpenTestDexFile("Nested"));
30 ASSERT_TRUE(dex != NULL);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070031}
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070032
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080033static const byte kBase64Map[256] = {
34 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
35 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
36 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
37 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63,
38 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255,
39 255, 254, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6,
40 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, // NOLINT
41 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255, // NOLINT
42 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
43 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, // NOLINT
44 49, 50, 51, 255, 255, 255, 255, 255, 255, 255, 255, 255, // NOLINT
45 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
46 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
47 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
48 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
49 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
50 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
51 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
52 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
53 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
54 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
55 255, 255, 255, 255
56};
57
58static inline byte* DecodeBase64(const char* src, size_t* dst_size) {
59 std::vector<byte> tmp;
60 uint32_t t = 0, y = 0;
61 int g = 3;
62 for (size_t i = 0; src[i] != '\0'; ++i) {
63 byte c = kBase64Map[src[i] & 0xFF];
64 if (c == 255) continue;
65 // the final = symbols are read and used to trim the remaining bytes
66 if (c == 254) {
67 c = 0;
68 // prevent g < 0 which would potentially allow an overflow later
69 if (--g < 0) {
70 *dst_size = 0;
71 return nullptr;
72 }
73 } else if (g != 3) {
74 // we only allow = to be at the end
75 *dst_size = 0;
76 return nullptr;
77 }
78 t = (t << 6) | c;
79 if (++y == 4) {
80 tmp.push_back((t >> 16) & 255);
81 if (g > 1) {
82 tmp.push_back((t >> 8) & 255);
83 }
84 if (g > 2) {
85 tmp.push_back(t & 255);
86 }
87 y = t = 0;
88 }
89 }
90 if (y != 0) {
91 *dst_size = 0;
92 return nullptr;
93 }
Ian Rogers700a4022014-05-19 16:49:03 -070094 std::unique_ptr<byte[]> dst(new byte[tmp.size()]);
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080095 if (dst_size != nullptr) {
96 *dst_size = tmp.size();
97 } else {
98 *dst_size = 0;
99 }
100 std::copy(tmp.begin(), tmp.end(), dst.get());
101 return dst.release();
102}
103
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700104// Although this is the same content logically as the Nested test dex,
105// the DexFileHeader test is sensitive to subtle changes in the
106// contents due to the checksum etc, so we embed the exact input here.
107//
108// class Nested {
109// class Inner {
110// }
111// }
112static const char kRawDex[] =
113 "ZGV4CjAzNQAQedgAe7gM1B/WHsWJ6L7lGAISGC7yjD2IAwAAcAAAAHhWNBIAAAAAAAAAAMQCAAAP"
114 "AAAAcAAAAAcAAACsAAAAAgAAAMgAAAABAAAA4AAAAAMAAADoAAAAAgAAAAABAABIAgAAQAEAAK4B"
115 "AAC2AQAAvQEAAM0BAADXAQAA+wEAABsCAAA+AgAAUgIAAF8CAABiAgAAZgIAAHMCAAB5AgAAgQIA"
116 "AAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAkAAAAJAAAABgAAAAAAAAAKAAAABgAAAKgBAAAAAAEA"
117 "DQAAAAAAAQAAAAAAAQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAIAAAAiAEAAKsCAAAA"
118 "AAAAAQAAAAAAAAAFAAAAAAAAAAgAAACYAQAAuAIAAAAAAAACAAAAlAIAAJoCAAABAAAAowIAAAIA"
119 "AgABAAAAiAIAAAYAAABbAQAAcBACAAAADgABAAEAAQAAAI4CAAAEAAAAcBACAAAADgBAAQAAAAAA"
120 "AAAAAAAAAAAATAEAAAAAAAAAAAAAAAAAAAEAAAABAAY8aW5pdD4ABUlubmVyAA5MTmVzdGVkJElu"
121 "bmVyOwAITE5lc3RlZDsAIkxkYWx2aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdDbGFzczsAHkxkYWx2"
122 "aWsvYW5ub3RhdGlvbi9Jbm5lckNsYXNzOwAhTGRhbHZpay9hbm5vdGF0aW9uL01lbWJlckNsYXNz"
123 "ZXM7ABJMamF2YS9sYW5nL09iamVjdDsAC05lc3RlZC5qYXZhAAFWAAJWTAALYWNjZXNzRmxhZ3MA"
124 "BG5hbWUABnRoaXMkMAAFdmFsdWUAAgEABw4AAQAHDjwAAgIBDhgBAgMCCwQADBcBAgQBDhwBGAAA"
125 "AQEAAJAgAICABNQCAAABAAGAgATwAgAAEAAAAAAAAAABAAAAAAAAAAEAAAAPAAAAcAAAAAIAAAAH"
126 "AAAArAAAAAMAAAACAAAAyAAAAAQAAAABAAAA4AAAAAUAAAADAAAA6AAAAAYAAAACAAAAAAEAAAMQ"
127 "AAACAAAAQAEAAAEgAAACAAAAVAEAAAYgAAACAAAAiAEAAAEQAAABAAAAqAEAAAIgAAAPAAAArgEA"
128 "AAMgAAACAAAAiAIAAAQgAAADAAAAlAIAAAAgAAACAAAAqwIAAAAQAAABAAAAxAIAAA==";
129
Ian Rogers33e95662013-05-20 20:29:14 -0700130static const DexFile* OpenDexFileBase64(const char* base64,
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700131 const char* location) {
Ian Rogers33e95662013-05-20 20:29:14 -0700132 // decode base64
133 CHECK(base64 != NULL);
134 size_t length;
Ian Rogers700a4022014-05-19 16:49:03 -0700135 std::unique_ptr<byte[]> dex_bytes(DecodeBase64(base64, &length));
Ian Rogers33e95662013-05-20 20:29:14 -0700136 CHECK(dex_bytes.get() != NULL);
137
138 // write to provided file
Ian Rogers700a4022014-05-19 16:49:03 -0700139 std::unique_ptr<File> file(OS::CreateEmptyFile(location));
Ian Rogers33e95662013-05-20 20:29:14 -0700140 CHECK(file.get() != NULL);
141 if (!file->WriteFully(dex_bytes.get(), length)) {
142 PLOG(FATAL) << "Failed to write base64 as dex file";
143 }
144 file.reset();
145
146 // read dex file
147 ScopedObjectAccess soa(Thread::Current());
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700148 std::string error_msg;
149 const DexFile* dex_file = DexFile::Open(location, location, &error_msg);
150 CHECK(dex_file != nullptr) << error_msg;
Brian Carlstrome0948e12013-08-29 09:36:15 -0700151 EXPECT_EQ(PROT_READ, dex_file->GetPermissions());
152 EXPECT_TRUE(dex_file->IsReadOnly());
Ian Rogers33e95662013-05-20 20:29:14 -0700153 return dex_file;
154}
155
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700156TEST_F(DexFileTest, Header) {
Brian Carlstrom33f741e2011-10-03 11:24:05 -0700157 ScratchFile tmp;
Ian Rogers700a4022014-05-19 16:49:03 -0700158 std::unique_ptr<const DexFile> raw(OpenDexFileBase64(kRawDex, tmp.GetFilename().c_str()));
Elliott Hughes90a33692011-08-30 13:27:07 -0700159 ASSERT_TRUE(raw.get() != NULL);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700160
Brian Carlstromf615a612011-07-23 12:50:34 -0700161 const DexFile::Header& header = raw->GetHeader();
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700162 // TODO: header.magic_
163 EXPECT_EQ(0x00d87910U, header.checksum_);
164 // TODO: header.signature_
165 EXPECT_EQ(904U, header.file_size_);
166 EXPECT_EQ(112U, header.header_size_);
167 EXPECT_EQ(0U, header.link_size_);
168 EXPECT_EQ(0U, header.link_off_);
169 EXPECT_EQ(15U, header.string_ids_size_);
170 EXPECT_EQ(112U, header.string_ids_off_);
171 EXPECT_EQ(7U, header.type_ids_size_);
172 EXPECT_EQ(172U, header.type_ids_off_);
173 EXPECT_EQ(2U, header.proto_ids_size_);
174 EXPECT_EQ(200U, header.proto_ids_off_);
175 EXPECT_EQ(1U, header.field_ids_size_);
176 EXPECT_EQ(224U, header.field_ids_off_);
177 EXPECT_EQ(3U, header.method_ids_size_);
178 EXPECT_EQ(232U, header.method_ids_off_);
179 EXPECT_EQ(2U, header.class_defs_size_);
180 EXPECT_EQ(256U, header.class_defs_off_);
181 EXPECT_EQ(584U, header.data_size_);
182 EXPECT_EQ(320U, header.data_off_);
Brian Carlstrom5b332c82012-02-01 15:02:31 -0800183
184 EXPECT_EQ(header.checksum_, raw->GetLocationChecksum());
185}
186
187TEST_F(DexFileTest, GetLocationChecksum) {
Ian Rogers33e95662013-05-20 20:29:14 -0700188 ScopedObjectAccess soa(Thread::Current());
Brian Carlstrom5b332c82012-02-01 15:02:31 -0800189 const DexFile* raw(OpenTestDexFile("Main"));
190 EXPECT_NE(raw->GetHeader().checksum_, raw->GetLocationChecksum());
191}
192
193TEST_F(DexFileTest, GetChecksum) {
194 uint32_t checksum;
Ian Rogers33e95662013-05-20 20:29:14 -0700195 ScopedObjectAccess soa(Thread::Current());
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700196 std::string error_msg;
197 EXPECT_TRUE(DexFile::GetChecksum(GetLibCoreDexFileName().c_str(), &checksum, &error_msg))
198 << error_msg;
Brian Carlstrom5b332c82012-02-01 15:02:31 -0800199 EXPECT_EQ(java_lang_dex_file_->GetLocationChecksum(), checksum);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700200}
201
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700202TEST_F(DexFileTest, ClassDefs) {
Ian Rogers33e95662013-05-20 20:29:14 -0700203 ScopedObjectAccess soa(Thread::Current());
Elliott Hughes4d6850c2012-01-18 15:55:06 -0800204 const DexFile* raw(OpenTestDexFile("Nested"));
205 ASSERT_TRUE(raw != NULL);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700206 EXPECT_EQ(2U, raw->NumClassDefs());
207
Brian Carlstromf615a612011-07-23 12:50:34 -0700208 const DexFile::ClassDef& c0 = raw->GetClassDef(0);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700209 EXPECT_STREQ("LNested$Inner;", raw->GetClassDescriptor(c0));
210
Brian Carlstromf615a612011-07-23 12:50:34 -0700211 const DexFile::ClassDef& c1 = raw->GetClassDef(1);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700212 EXPECT_STREQ("LNested;", raw->GetClassDescriptor(c1));
Carl Shapiro1fb86202011-06-27 17:43:13 -0700213}
214
Ian Rogersd91d6d62013-09-25 20:26:14 -0700215TEST_F(DexFileTest, GetMethodSignature) {
Ian Rogers33e95662013-05-20 20:29:14 -0700216 ScopedObjectAccess soa(Thread::Current());
Ian Rogersd91d6d62013-09-25 20:26:14 -0700217 const DexFile* raw(OpenTestDexFile("GetMethodSignature"));
Elliott Hughes4d6850c2012-01-18 15:55:06 -0800218 ASSERT_TRUE(raw != NULL);
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700219 EXPECT_EQ(1U, raw->NumClassDefs());
220
221 const DexFile::ClassDef& class_def = raw->GetClassDef(0);
Ian Rogersd91d6d62013-09-25 20:26:14 -0700222 ASSERT_STREQ("LGetMethodSignature;", raw->GetClassDescriptor(class_def));
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700223
224 const byte* class_data = raw->GetClassData(class_def);
225 ASSERT_TRUE(class_data != NULL);
Elliott Hughes4d6850c2012-01-18 15:55:06 -0800226 ClassDataItemIterator it(*raw, class_data);
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700227
Ian Rogers0571d352011-11-03 19:51:38 -0700228 EXPECT_EQ(1u, it.NumDirectMethods());
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700229
Ian Rogers0571d352011-11-03 19:51:38 -0700230 // Check the signature for the static initializer.
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700231 {
Ian Rogers0571d352011-11-03 19:51:38 -0700232 ASSERT_EQ(1U, it.NumDirectMethods());
233 const DexFile::MethodId& method_id = raw->GetMethodId(it.GetMemberIndex());
Ian Rogers0571d352011-11-03 19:51:38 -0700234 const char* name = raw->StringDataByIdx(method_id.name_idx_);
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700235 ASSERT_STREQ("<init>", name);
Ian Rogersd91d6d62013-09-25 20:26:14 -0700236 std::string signature(raw->GetMethodSignature(method_id).ToString());
Ian Rogers0571d352011-11-03 19:51:38 -0700237 ASSERT_EQ("()V", signature);
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700238 }
239
240 // Check both virtual methods.
Ian Rogers0571d352011-11-03 19:51:38 -0700241 ASSERT_EQ(2U, it.NumVirtualMethods());
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700242 {
Ian Rogers0571d352011-11-03 19:51:38 -0700243 it.Next();
244 const DexFile::MethodId& method_id = raw->GetMethodId(it.GetMemberIndex());
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700245
Ian Rogers0571d352011-11-03 19:51:38 -0700246 const char* name = raw->StringDataByIdx(method_id.name_idx_);
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700247 ASSERT_STREQ("m1", name);
248
Ian Rogersd91d6d62013-09-25 20:26:14 -0700249 std::string signature(raw->GetMethodSignature(method_id).ToString());
Ian Rogers0571d352011-11-03 19:51:38 -0700250 ASSERT_EQ("(IDJLjava/lang/Object;)Ljava/lang/Float;", signature);
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700251 }
252
253 {
Ian Rogers0571d352011-11-03 19:51:38 -0700254 it.Next();
255 const DexFile::MethodId& method_id = raw->GetMethodId(it.GetMemberIndex());
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700256
Ian Rogers0571d352011-11-03 19:51:38 -0700257 const char* name = raw->StringDataByIdx(method_id.name_idx_);
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700258 ASSERT_STREQ("m2", name);
259
Ian Rogersd91d6d62013-09-25 20:26:14 -0700260 std::string signature(raw->GetMethodSignature(method_id).ToString());
261 ASSERT_EQ("(ZSC)LGetMethodSignature;", signature);
Ian Rogers0571d352011-11-03 19:51:38 -0700262 }
263}
264
265TEST_F(DexFileTest, FindStringId) {
Ian Rogers33e95662013-05-20 20:29:14 -0700266 ScopedObjectAccess soa(Thread::Current());
Ian Rogersd91d6d62013-09-25 20:26:14 -0700267 const DexFile* raw(OpenTestDexFile("GetMethodSignature"));
Elliott Hughes4d6850c2012-01-18 15:55:06 -0800268 ASSERT_TRUE(raw != NULL);
Ian Rogers0571d352011-11-03 19:51:38 -0700269 EXPECT_EQ(1U, raw->NumClassDefs());
270
Ian Rogersd91d6d62013-09-25 20:26:14 -0700271 const char* strings[] = { "LGetMethodSignature;", "Ljava/lang/Float;", "Ljava/lang/Object;",
Ian Rogers0571d352011-11-03 19:51:38 -0700272 "D", "I", "J", NULL };
273 for (size_t i = 0; strings[i] != NULL; i++) {
274 const char* str = strings[i];
275 const DexFile::StringId* str_id = raw->FindStringId(str);
276 const char* dex_str = raw->GetStringData(*str_id);
277 EXPECT_STREQ(dex_str, str);
278 }
279}
280
281TEST_F(DexFileTest, FindTypeId) {
282 for (size_t i = 0; i < java_lang_dex_file_->NumTypeIds(); i++) {
283 const char* type_str = java_lang_dex_file_->StringByTypeIdx(i);
284 const DexFile::StringId* type_str_id = java_lang_dex_file_->FindStringId(type_str);
285 ASSERT_TRUE(type_str_id != NULL);
286 uint32_t type_str_idx = java_lang_dex_file_->GetIndexForStringId(*type_str_id);
287 const DexFile::TypeId* type_id = java_lang_dex_file_->FindTypeId(type_str_idx);
288 ASSERT_TRUE(type_id != NULL);
289 EXPECT_EQ(java_lang_dex_file_->GetIndexForTypeId(*type_id), i);
290 }
291}
292
293TEST_F(DexFileTest, FindProtoId) {
294 for (size_t i = 0; i < java_lang_dex_file_->NumProtoIds(); i++) {
295 const DexFile::ProtoId& to_find = java_lang_dex_file_->GetProtoId(i);
296 const DexFile::TypeList* to_find_tl = java_lang_dex_file_->GetProtoParameters(to_find);
297 std::vector<uint16_t> to_find_types;
298 if (to_find_tl != NULL) {
299 for (size_t j = 0; j < to_find_tl->Size(); j++) {
300 to_find_types.push_back(to_find_tl->GetTypeItem(j).type_idx_);
301 }
302 }
303 const DexFile::ProtoId* found =
304 java_lang_dex_file_->FindProtoId(to_find.return_type_idx_, to_find_types);
305 ASSERT_TRUE(found != NULL);
306 EXPECT_EQ(java_lang_dex_file_->GetIndexForProtoId(*found), i);
307 }
308}
309
310TEST_F(DexFileTest, FindMethodId) {
311 for (size_t i = 0; i < java_lang_dex_file_->NumMethodIds(); i++) {
312 const DexFile::MethodId& to_find = java_lang_dex_file_->GetMethodId(i);
313 const DexFile::TypeId& klass = java_lang_dex_file_->GetTypeId(to_find.class_idx_);
314 const DexFile::StringId& name = java_lang_dex_file_->GetStringId(to_find.name_idx_);
315 const DexFile::ProtoId& signature = java_lang_dex_file_->GetProtoId(to_find.proto_idx_);
316 const DexFile::MethodId* found = java_lang_dex_file_->FindMethodId(klass, name, signature);
Ian Rogers0571d352011-11-03 19:51:38 -0700317 ASSERT_TRUE(found != NULL) << "Didn't find method " << i << ": "
318 << java_lang_dex_file_->StringByTypeIdx(to_find.class_idx_) << "."
319 << java_lang_dex_file_->GetStringData(name)
Ian Rogersd91d6d62013-09-25 20:26:14 -0700320 << java_lang_dex_file_->GetMethodSignature(to_find);
Ian Rogers0571d352011-11-03 19:51:38 -0700321 EXPECT_EQ(java_lang_dex_file_->GetIndexForMethodId(*found), i);
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700322 }
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700323}
324
Ian Rogers9b1a4f42011-11-14 18:35:10 -0800325TEST_F(DexFileTest, FindFieldId) {
326 for (size_t i = 0; i < java_lang_dex_file_->NumFieldIds(); i++) {
327 const DexFile::FieldId& to_find = java_lang_dex_file_->GetFieldId(i);
328 const DexFile::TypeId& klass = java_lang_dex_file_->GetTypeId(to_find.class_idx_);
329 const DexFile::StringId& name = java_lang_dex_file_->GetStringId(to_find.name_idx_);
330 const DexFile::TypeId& type = java_lang_dex_file_->GetTypeId(to_find.type_idx_);
331 const DexFile::FieldId* found = java_lang_dex_file_->FindFieldId(klass, name, type);
332 ASSERT_TRUE(found != NULL) << "Didn't find field " << i << ": "
333 << java_lang_dex_file_->StringByTypeIdx(to_find.type_idx_) << " "
334 << java_lang_dex_file_->StringByTypeIdx(to_find.class_idx_) << "."
335 << java_lang_dex_file_->GetStringData(name);
336 EXPECT_EQ(java_lang_dex_file_->GetIndexForFieldId(*found), i);
337 }
338}
339
Carl Shapiro1fb86202011-06-27 17:43:13 -0700340} // namespace art