blob: 86c282e894cce522b5624b37ecb08892d2a061a3 [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 Rogers507dfdd2014-05-15 16:42:40 -070019#include "UniquePtrCompat.h"
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080020#include "common_runtime_test.h"
Elliott Hughes90a33692011-08-30 13:27:07 -070021
Carl Shapiro1fb86202011-06-27 17:43:13 -070022namespace art {
23
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080024class DexFileTest : public CommonRuntimeTest {};
Brian Carlstrom9f30b382011-08-28 22:41:38 -070025
26TEST_F(DexFileTest, Open) {
Ian Rogers33e95662013-05-20 20:29:14 -070027 ScopedObjectAccess soa(Thread::Current());
Elliott Hughes4d6850c2012-01-18 15:55:06 -080028 const DexFile* dex(OpenTestDexFile("Nested"));
29 ASSERT_TRUE(dex != NULL);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -070030}
Brian Carlstrom578bbdc2011-07-21 14:07:47 -070031
Brian Carlstroma1ce1fe2014-02-24 23:23:58 -080032static const byte kBase64Map[256] = {
33 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
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, 62, 255, 255, 255, 63,
37 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255,
38 255, 254, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6,
39 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, // NOLINT
40 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255, // NOLINT
41 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
42 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, // NOLINT
43 49, 50, 51, 255, 255, 255, 255, 255, 255, 255, 255, 255, // NOLINT
44 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
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
55};
56
57static inline byte* DecodeBase64(const char* src, size_t* dst_size) {
58 std::vector<byte> tmp;
59 uint32_t t = 0, y = 0;
60 int g = 3;
61 for (size_t i = 0; src[i] != '\0'; ++i) {
62 byte c = kBase64Map[src[i] & 0xFF];
63 if (c == 255) continue;
64 // the final = symbols are read and used to trim the remaining bytes
65 if (c == 254) {
66 c = 0;
67 // prevent g < 0 which would potentially allow an overflow later
68 if (--g < 0) {
69 *dst_size = 0;
70 return nullptr;
71 }
72 } else if (g != 3) {
73 // we only allow = to be at the end
74 *dst_size = 0;
75 return nullptr;
76 }
77 t = (t << 6) | c;
78 if (++y == 4) {
79 tmp.push_back((t >> 16) & 255);
80 if (g > 1) {
81 tmp.push_back((t >> 8) & 255);
82 }
83 if (g > 2) {
84 tmp.push_back(t & 255);
85 }
86 y = t = 0;
87 }
88 }
89 if (y != 0) {
90 *dst_size = 0;
91 return nullptr;
92 }
93 UniquePtr<byte[]> dst(new byte[tmp.size()]);
94 if (dst_size != nullptr) {
95 *dst_size = tmp.size();
96 } else {
97 *dst_size = 0;
98 }
99 std::copy(tmp.begin(), tmp.end(), dst.get());
100 return dst.release();
101}
102
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700103// Although this is the same content logically as the Nested test dex,
104// the DexFileHeader test is sensitive to subtle changes in the
105// contents due to the checksum etc, so we embed the exact input here.
106//
107// class Nested {
108// class Inner {
109// }
110// }
111static const char kRawDex[] =
112 "ZGV4CjAzNQAQedgAe7gM1B/WHsWJ6L7lGAISGC7yjD2IAwAAcAAAAHhWNBIAAAAAAAAAAMQCAAAP"
113 "AAAAcAAAAAcAAACsAAAAAgAAAMgAAAABAAAA4AAAAAMAAADoAAAAAgAAAAABAABIAgAAQAEAAK4B"
114 "AAC2AQAAvQEAAM0BAADXAQAA+wEAABsCAAA+AgAAUgIAAF8CAABiAgAAZgIAAHMCAAB5AgAAgQIA"
115 "AAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAkAAAAJAAAABgAAAAAAAAAKAAAABgAAAKgBAAAAAAEA"
116 "DQAAAAAAAQAAAAAAAQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAIAAAAiAEAAKsCAAAA"
117 "AAAAAQAAAAAAAAAFAAAAAAAAAAgAAACYAQAAuAIAAAAAAAACAAAAlAIAAJoCAAABAAAAowIAAAIA"
118 "AgABAAAAiAIAAAYAAABbAQAAcBACAAAADgABAAEAAQAAAI4CAAAEAAAAcBACAAAADgBAAQAAAAAA"
119 "AAAAAAAAAAAATAEAAAAAAAAAAAAAAAAAAAEAAAABAAY8aW5pdD4ABUlubmVyAA5MTmVzdGVkJElu"
120 "bmVyOwAITE5lc3RlZDsAIkxkYWx2aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdDbGFzczsAHkxkYWx2"
121 "aWsvYW5ub3RhdGlvbi9Jbm5lckNsYXNzOwAhTGRhbHZpay9hbm5vdGF0aW9uL01lbWJlckNsYXNz"
122 "ZXM7ABJMamF2YS9sYW5nL09iamVjdDsAC05lc3RlZC5qYXZhAAFWAAJWTAALYWNjZXNzRmxhZ3MA"
123 "BG5hbWUABnRoaXMkMAAFdmFsdWUAAgEABw4AAQAHDjwAAgIBDhgBAgMCCwQADBcBAgQBDhwBGAAA"
124 "AQEAAJAgAICABNQCAAABAAGAgATwAgAAEAAAAAAAAAABAAAAAAAAAAEAAAAPAAAAcAAAAAIAAAAH"
125 "AAAArAAAAAMAAAACAAAAyAAAAAQAAAABAAAA4AAAAAUAAAADAAAA6AAAAAYAAAACAAAAAAEAAAMQ"
126 "AAACAAAAQAEAAAEgAAACAAAAVAEAAAYgAAACAAAAiAEAAAEQAAABAAAAqAEAAAIgAAAPAAAArgEA"
127 "AAMgAAACAAAAiAIAAAQgAAADAAAAlAIAAAAgAAACAAAAqwIAAAAQAAABAAAAxAIAAA==";
128
Ian Rogers33e95662013-05-20 20:29:14 -0700129static const DexFile* OpenDexFileBase64(const char* base64,
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700130 const char* location) {
Ian Rogers33e95662013-05-20 20:29:14 -0700131 // decode base64
132 CHECK(base64 != NULL);
133 size_t length;
134 UniquePtr<byte[]> dex_bytes(DecodeBase64(base64, &length));
135 CHECK(dex_bytes.get() != NULL);
136
137 // write to provided file
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700138 UniquePtr<File> file(OS::CreateEmptyFile(location));
Ian Rogers33e95662013-05-20 20:29:14 -0700139 CHECK(file.get() != NULL);
140 if (!file->WriteFully(dex_bytes.get(), length)) {
141 PLOG(FATAL) << "Failed to write base64 as dex file";
142 }
143 file.reset();
144
145 // read dex file
146 ScopedObjectAccess soa(Thread::Current());
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700147 std::string error_msg;
148 const DexFile* dex_file = DexFile::Open(location, location, &error_msg);
149 CHECK(dex_file != nullptr) << error_msg;
Brian Carlstrome0948e12013-08-29 09:36:15 -0700150 EXPECT_EQ(PROT_READ, dex_file->GetPermissions());
151 EXPECT_TRUE(dex_file->IsReadOnly());
Ian Rogers33e95662013-05-20 20:29:14 -0700152 return dex_file;
153}
154
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700155TEST_F(DexFileTest, Header) {
Brian Carlstrom33f741e2011-10-03 11:24:05 -0700156 ScratchFile tmp;
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700157 UniquePtr<const DexFile> raw(OpenDexFileBase64(kRawDex, tmp.GetFilename().c_str()));
Elliott Hughes90a33692011-08-30 13:27:07 -0700158 ASSERT_TRUE(raw.get() != NULL);
Brian Carlstrom578bbdc2011-07-21 14:07:47 -0700159
Brian Carlstromf615a612011-07-23 12:50:34 -0700160 const DexFile::Header& header = raw->GetHeader();
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700161 // TODO: header.magic_
162 EXPECT_EQ(0x00d87910U, header.checksum_);
163 // TODO: header.signature_
164 EXPECT_EQ(904U, header.file_size_);
165 EXPECT_EQ(112U, header.header_size_);
166 EXPECT_EQ(0U, header.link_size_);
167 EXPECT_EQ(0U, header.link_off_);
168 EXPECT_EQ(15U, header.string_ids_size_);
169 EXPECT_EQ(112U, header.string_ids_off_);
170 EXPECT_EQ(7U, header.type_ids_size_);
171 EXPECT_EQ(172U, header.type_ids_off_);
172 EXPECT_EQ(2U, header.proto_ids_size_);
173 EXPECT_EQ(200U, header.proto_ids_off_);
174 EXPECT_EQ(1U, header.field_ids_size_);
175 EXPECT_EQ(224U, header.field_ids_off_);
176 EXPECT_EQ(3U, header.method_ids_size_);
177 EXPECT_EQ(232U, header.method_ids_off_);
178 EXPECT_EQ(2U, header.class_defs_size_);
179 EXPECT_EQ(256U, header.class_defs_off_);
180 EXPECT_EQ(584U, header.data_size_);
181 EXPECT_EQ(320U, header.data_off_);
Brian Carlstrom5b332c82012-02-01 15:02:31 -0800182
183 EXPECT_EQ(header.checksum_, raw->GetLocationChecksum());
184}
185
186TEST_F(DexFileTest, GetLocationChecksum) {
Ian Rogers33e95662013-05-20 20:29:14 -0700187 ScopedObjectAccess soa(Thread::Current());
Brian Carlstrom5b332c82012-02-01 15:02:31 -0800188 const DexFile* raw(OpenTestDexFile("Main"));
189 EXPECT_NE(raw->GetHeader().checksum_, raw->GetLocationChecksum());
190}
191
192TEST_F(DexFileTest, GetChecksum) {
193 uint32_t checksum;
Ian Rogers33e95662013-05-20 20:29:14 -0700194 ScopedObjectAccess soa(Thread::Current());
Ian Rogers8d31bbd2013-10-13 10:44:14 -0700195 std::string error_msg;
196 EXPECT_TRUE(DexFile::GetChecksum(GetLibCoreDexFileName().c_str(), &checksum, &error_msg))
197 << error_msg;
Brian Carlstrom5b332c82012-02-01 15:02:31 -0800198 EXPECT_EQ(java_lang_dex_file_->GetLocationChecksum(), checksum);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700199}
200
Brian Carlstrom9f30b382011-08-28 22:41:38 -0700201TEST_F(DexFileTest, ClassDefs) {
Ian Rogers33e95662013-05-20 20:29:14 -0700202 ScopedObjectAccess soa(Thread::Current());
Elliott Hughes4d6850c2012-01-18 15:55:06 -0800203 const DexFile* raw(OpenTestDexFile("Nested"));
204 ASSERT_TRUE(raw != NULL);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700205 EXPECT_EQ(2U, raw->NumClassDefs());
206
Brian Carlstromf615a612011-07-23 12:50:34 -0700207 const DexFile::ClassDef& c0 = raw->GetClassDef(0);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700208 EXPECT_STREQ("LNested$Inner;", raw->GetClassDescriptor(c0));
209
Brian Carlstromf615a612011-07-23 12:50:34 -0700210 const DexFile::ClassDef& c1 = raw->GetClassDef(1);
Brian Carlstrom7e49dca2011-07-22 18:07:34 -0700211 EXPECT_STREQ("LNested;", raw->GetClassDescriptor(c1));
Carl Shapiro1fb86202011-06-27 17:43:13 -0700212}
213
Ian Rogersd91d6d62013-09-25 20:26:14 -0700214TEST_F(DexFileTest, GetMethodSignature) {
Ian Rogers33e95662013-05-20 20:29:14 -0700215 ScopedObjectAccess soa(Thread::Current());
Ian Rogersd91d6d62013-09-25 20:26:14 -0700216 const DexFile* raw(OpenTestDexFile("GetMethodSignature"));
Elliott Hughes4d6850c2012-01-18 15:55:06 -0800217 ASSERT_TRUE(raw != NULL);
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700218 EXPECT_EQ(1U, raw->NumClassDefs());
219
220 const DexFile::ClassDef& class_def = raw->GetClassDef(0);
Ian Rogersd91d6d62013-09-25 20:26:14 -0700221 ASSERT_STREQ("LGetMethodSignature;", raw->GetClassDescriptor(class_def));
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700222
223 const byte* class_data = raw->GetClassData(class_def);
224 ASSERT_TRUE(class_data != NULL);
Elliott Hughes4d6850c2012-01-18 15:55:06 -0800225 ClassDataItemIterator it(*raw, class_data);
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700226
Ian Rogers0571d352011-11-03 19:51:38 -0700227 EXPECT_EQ(1u, it.NumDirectMethods());
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700228
Ian Rogers0571d352011-11-03 19:51:38 -0700229 // Check the signature for the static initializer.
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700230 {
Ian Rogers0571d352011-11-03 19:51:38 -0700231 ASSERT_EQ(1U, it.NumDirectMethods());
232 const DexFile::MethodId& method_id = raw->GetMethodId(it.GetMemberIndex());
Ian Rogers0571d352011-11-03 19:51:38 -0700233 const char* name = raw->StringDataByIdx(method_id.name_idx_);
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700234 ASSERT_STREQ("<init>", name);
Ian Rogersd91d6d62013-09-25 20:26:14 -0700235 std::string signature(raw->GetMethodSignature(method_id).ToString());
Ian Rogers0571d352011-11-03 19:51:38 -0700236 ASSERT_EQ("()V", signature);
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700237 }
238
239 // Check both virtual methods.
Ian Rogers0571d352011-11-03 19:51:38 -0700240 ASSERT_EQ(2U, it.NumVirtualMethods());
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700241 {
Ian Rogers0571d352011-11-03 19:51:38 -0700242 it.Next();
243 const DexFile::MethodId& method_id = raw->GetMethodId(it.GetMemberIndex());
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700244
Ian Rogers0571d352011-11-03 19:51:38 -0700245 const char* name = raw->StringDataByIdx(method_id.name_idx_);
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700246 ASSERT_STREQ("m1", name);
247
Ian Rogersd91d6d62013-09-25 20:26:14 -0700248 std::string signature(raw->GetMethodSignature(method_id).ToString());
Ian Rogers0571d352011-11-03 19:51:38 -0700249 ASSERT_EQ("(IDJLjava/lang/Object;)Ljava/lang/Float;", signature);
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700250 }
251
252 {
Ian Rogers0571d352011-11-03 19:51:38 -0700253 it.Next();
254 const DexFile::MethodId& method_id = raw->GetMethodId(it.GetMemberIndex());
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700255
Ian Rogers0571d352011-11-03 19:51:38 -0700256 const char* name = raw->StringDataByIdx(method_id.name_idx_);
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700257 ASSERT_STREQ("m2", name);
258
Ian Rogersd91d6d62013-09-25 20:26:14 -0700259 std::string signature(raw->GetMethodSignature(method_id).ToString());
260 ASSERT_EQ("(ZSC)LGetMethodSignature;", signature);
Ian Rogers0571d352011-11-03 19:51:38 -0700261 }
262}
263
264TEST_F(DexFileTest, FindStringId) {
Ian Rogers33e95662013-05-20 20:29:14 -0700265 ScopedObjectAccess soa(Thread::Current());
Ian Rogersd91d6d62013-09-25 20:26:14 -0700266 const DexFile* raw(OpenTestDexFile("GetMethodSignature"));
Elliott Hughes4d6850c2012-01-18 15:55:06 -0800267 ASSERT_TRUE(raw != NULL);
Ian Rogers0571d352011-11-03 19:51:38 -0700268 EXPECT_EQ(1U, raw->NumClassDefs());
269
Ian Rogersd91d6d62013-09-25 20:26:14 -0700270 const char* strings[] = { "LGetMethodSignature;", "Ljava/lang/Float;", "Ljava/lang/Object;",
Ian Rogers0571d352011-11-03 19:51:38 -0700271 "D", "I", "J", NULL };
272 for (size_t i = 0; strings[i] != NULL; i++) {
273 const char* str = strings[i];
274 const DexFile::StringId* str_id = raw->FindStringId(str);
275 const char* dex_str = raw->GetStringData(*str_id);
276 EXPECT_STREQ(dex_str, str);
277 }
278}
279
280TEST_F(DexFileTest, FindTypeId) {
281 for (size_t i = 0; i < java_lang_dex_file_->NumTypeIds(); i++) {
282 const char* type_str = java_lang_dex_file_->StringByTypeIdx(i);
283 const DexFile::StringId* type_str_id = java_lang_dex_file_->FindStringId(type_str);
284 ASSERT_TRUE(type_str_id != NULL);
285 uint32_t type_str_idx = java_lang_dex_file_->GetIndexForStringId(*type_str_id);
286 const DexFile::TypeId* type_id = java_lang_dex_file_->FindTypeId(type_str_idx);
287 ASSERT_TRUE(type_id != NULL);
288 EXPECT_EQ(java_lang_dex_file_->GetIndexForTypeId(*type_id), i);
289 }
290}
291
292TEST_F(DexFileTest, FindProtoId) {
293 for (size_t i = 0; i < java_lang_dex_file_->NumProtoIds(); i++) {
294 const DexFile::ProtoId& to_find = java_lang_dex_file_->GetProtoId(i);
295 const DexFile::TypeList* to_find_tl = java_lang_dex_file_->GetProtoParameters(to_find);
296 std::vector<uint16_t> to_find_types;
297 if (to_find_tl != NULL) {
298 for (size_t j = 0; j < to_find_tl->Size(); j++) {
299 to_find_types.push_back(to_find_tl->GetTypeItem(j).type_idx_);
300 }
301 }
302 const DexFile::ProtoId* found =
303 java_lang_dex_file_->FindProtoId(to_find.return_type_idx_, to_find_types);
304 ASSERT_TRUE(found != NULL);
305 EXPECT_EQ(java_lang_dex_file_->GetIndexForProtoId(*found), i);
306 }
307}
308
309TEST_F(DexFileTest, FindMethodId) {
310 for (size_t i = 0; i < java_lang_dex_file_->NumMethodIds(); i++) {
311 const DexFile::MethodId& to_find = java_lang_dex_file_->GetMethodId(i);
312 const DexFile::TypeId& klass = java_lang_dex_file_->GetTypeId(to_find.class_idx_);
313 const DexFile::StringId& name = java_lang_dex_file_->GetStringId(to_find.name_idx_);
314 const DexFile::ProtoId& signature = java_lang_dex_file_->GetProtoId(to_find.proto_idx_);
315 const DexFile::MethodId* found = java_lang_dex_file_->FindMethodId(klass, name, signature);
Ian Rogers0571d352011-11-03 19:51:38 -0700316 ASSERT_TRUE(found != NULL) << "Didn't find method " << i << ": "
317 << java_lang_dex_file_->StringByTypeIdx(to_find.class_idx_) << "."
318 << java_lang_dex_file_->GetStringData(name)
Ian Rogersd91d6d62013-09-25 20:26:14 -0700319 << java_lang_dex_file_->GetMethodSignature(to_find);
Ian Rogers0571d352011-11-03 19:51:38 -0700320 EXPECT_EQ(java_lang_dex_file_->GetIndexForMethodId(*found), i);
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700321 }
Carl Shapiro419ec7b2011-08-03 14:48:33 -0700322}
323
Ian Rogers9b1a4f42011-11-14 18:35:10 -0800324TEST_F(DexFileTest, FindFieldId) {
325 for (size_t i = 0; i < java_lang_dex_file_->NumFieldIds(); i++) {
326 const DexFile::FieldId& to_find = java_lang_dex_file_->GetFieldId(i);
327 const DexFile::TypeId& klass = java_lang_dex_file_->GetTypeId(to_find.class_idx_);
328 const DexFile::StringId& name = java_lang_dex_file_->GetStringId(to_find.name_idx_);
329 const DexFile::TypeId& type = java_lang_dex_file_->GetTypeId(to_find.type_idx_);
330 const DexFile::FieldId* found = java_lang_dex_file_->FindFieldId(klass, name, type);
331 ASSERT_TRUE(found != NULL) << "Didn't find field " << i << ": "
332 << java_lang_dex_file_->StringByTypeIdx(to_find.type_idx_) << " "
333 << java_lang_dex_file_->StringByTypeIdx(to_find.class_idx_) << "."
334 << java_lang_dex_file_->GetStringData(name);
335 EXPECT_EQ(java_lang_dex_file_->GetIndexForFieldId(*found), i);
336 }
337}
338
Carl Shapiro1fb86202011-06-27 17:43:13 -0700339} // namespace art