1 /* 2 * Copyright (C) 2016 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 */ 16 17 // Test is in compiler, as it uses compiler related code. 18 #include "verifier/verifier_deps.h" 19 20 #include "art_method-inl.h" 21 #include "class_linker.h" 22 #include "common_compiler_test.h" 23 #include "compiler_callbacks.h" 24 #include "dex/verification_results.h" 25 #include "dex/verified_method.h" 26 #include "dex_file.h" 27 #include "dex_file_types.h" 28 #include "driver/compiler_driver-inl.h" 29 #include "driver/compiler_options.h" 30 #include "handle_scope-inl.h" 31 #include "indenter.h" 32 #include "mirror/class_loader.h" 33 #include "runtime.h" 34 #include "scoped_thread_state_change-inl.h" 35 #include "thread.h" 36 #include "utils/atomic_dex_ref_map-inl.h" 37 #include "verifier/method_verifier-inl.h" 38 39 namespace art { 40 namespace verifier { 41 42 class VerifierDepsCompilerCallbacks : public CompilerCallbacks { 43 public: 44 explicit VerifierDepsCompilerCallbacks() 45 : CompilerCallbacks(CompilerCallbacks::CallbackMode::kCompileApp), 46 deps_(nullptr) {} 47 48 void MethodVerified(verifier::MethodVerifier* verifier ATTRIBUTE_UNUSED) OVERRIDE {} 49 void ClassRejected(ClassReference ref ATTRIBUTE_UNUSED) OVERRIDE {} 50 bool IsRelocationPossible() OVERRIDE { return false; } 51 52 verifier::VerifierDeps* GetVerifierDeps() const OVERRIDE { return deps_; } 53 void SetVerifierDeps(verifier::VerifierDeps* deps) { deps_ = deps; } 54 55 private: 56 verifier::VerifierDeps* deps_; 57 }; 58 59 class VerifierDepsTest : public CommonCompilerTest { 60 public: 61 void SetUpRuntimeOptions(RuntimeOptions* options) { 62 CommonCompilerTest::SetUpRuntimeOptions(options); 63 callbacks_.reset(new VerifierDepsCompilerCallbacks()); 64 } 65 66 mirror::Class* FindClassByName(const std::string& name, ScopedObjectAccess* soa) 67 REQUIRES_SHARED(Locks::mutator_lock_) { 68 StackHandleScope<1> hs(Thread::Current()); 69 Handle<mirror::ClassLoader> class_loader_handle( 70 hs.NewHandle(soa->Decode<mirror::ClassLoader>(class_loader_))); 71 mirror::Class* klass = class_linker_->FindClass(Thread::Current(), 72 name.c_str(), 73 class_loader_handle); 74 if (klass == nullptr) { 75 DCHECK(Thread::Current()->IsExceptionPending()); 76 Thread::Current()->ClearException(); 77 } 78 return klass; 79 } 80 81 void SetupCompilerDriver() { 82 compiler_options_->boot_image_ = false; 83 compiler_driver_->InitializeThreadPools(); 84 } 85 86 void VerifyWithCompilerDriver(verifier::VerifierDeps* deps) { 87 TimingLogger timings("Verify", false, false); 88 // The compiler driver handles the verifier deps in the callbacks, so 89 // remove what this class did for unit testing. 90 if (deps == nullptr) { 91 // Create some verifier deps by default if they are not already specified. 92 deps = new verifier::VerifierDeps(dex_files_); 93 verifier_deps_.reset(deps); 94 } 95 callbacks_->SetVerifierDeps(deps); 96 compiler_driver_->Verify(class_loader_, dex_files_, &timings); 97 callbacks_->SetVerifierDeps(nullptr); 98 // Clear entries in the verification results to avoid hitting a DCHECK that 99 // we always succeed inserting a new entry after verifying. 100 AtomicDexRefMap<const VerifiedMethod*>* map = 101 &compiler_driver_->GetVerificationResults()->atomic_verified_methods_; 102 map->Visit([](const DexFileReference& ref ATTRIBUTE_UNUSED, const VerifiedMethod* method) { 103 delete method; 104 }); 105 map->ClearEntries(); 106 } 107 108 void SetVerifierDeps(const std::vector<const DexFile*>& dex_files) { 109 verifier_deps_.reset(new verifier::VerifierDeps(dex_files)); 110 VerifierDepsCompilerCallbacks* callbacks = 111 reinterpret_cast<VerifierDepsCompilerCallbacks*>(callbacks_.get()); 112 callbacks->SetVerifierDeps(verifier_deps_.get()); 113 } 114 115 void LoadDexFile(ScopedObjectAccess* soa, const char* name1, const char* name2 = nullptr) 116 REQUIRES_SHARED(Locks::mutator_lock_) { 117 class_loader_ = (name2 == nullptr) ? LoadDex(name1) : LoadMultiDex(name1, name2); 118 dex_files_ = GetDexFiles(class_loader_); 119 primary_dex_file_ = dex_files_.front(); 120 121 SetVerifierDeps(dex_files_); 122 StackHandleScope<1> hs(soa->Self()); 123 Handle<mirror::ClassLoader> loader = 124 hs.NewHandle(soa->Decode<mirror::ClassLoader>(class_loader_)); 125 for (const DexFile* dex_file : dex_files_) { 126 class_linker_->RegisterDexFile(*dex_file, loader.Get()); 127 } 128 for (const DexFile* dex_file : dex_files_) { 129 compiler_driver_->GetVerificationResults()->AddDexFile(dex_file); 130 } 131 compiler_driver_->SetDexFilesForOatFile(dex_files_); 132 } 133 134 void LoadDexFile(ScopedObjectAccess* soa) REQUIRES_SHARED(Locks::mutator_lock_) { 135 LoadDexFile(soa, "VerifierDeps"); 136 CHECK_EQ(dex_files_.size(), 1u); 137 klass_Main_ = FindClassByName("LMain;", soa); 138 CHECK(klass_Main_ != nullptr); 139 } 140 141 bool VerifyMethod(const std::string& method_name) { 142 ScopedObjectAccess soa(Thread::Current()); 143 LoadDexFile(&soa); 144 145 StackHandleScope<2> hs(soa.Self()); 146 Handle<mirror::ClassLoader> class_loader_handle( 147 hs.NewHandle(soa.Decode<mirror::ClassLoader>(class_loader_))); 148 Handle<mirror::DexCache> dex_cache_handle(hs.NewHandle(klass_Main_->GetDexCache())); 149 150 const DexFile::ClassDef* class_def = klass_Main_->GetClassDef(); 151 const uint8_t* class_data = primary_dex_file_->GetClassData(*class_def); 152 CHECK(class_data != nullptr); 153 154 ClassDataItemIterator it(*primary_dex_file_, class_data); 155 it.SkipAllFields(); 156 157 ArtMethod* method = nullptr; 158 while (it.HasNextDirectMethod()) { 159 ArtMethod* resolved_method = 160 class_linker_->ResolveMethod<ClassLinker::ResolveMode::kNoChecks>( 161 *primary_dex_file_, 162 it.GetMemberIndex(), 163 dex_cache_handle, 164 class_loader_handle, 165 nullptr, 166 it.GetMethodInvokeType(*class_def)); 167 CHECK(resolved_method != nullptr); 168 if (method_name == resolved_method->GetName()) { 169 method = resolved_method; 170 break; 171 } 172 it.Next(); 173 } 174 CHECK(method != nullptr); 175 176 Thread::Current()->SetVerifierDeps(callbacks_->GetVerifierDeps()); 177 MethodVerifier verifier(Thread::Current(), 178 primary_dex_file_, 179 dex_cache_handle, 180 class_loader_handle, 181 *class_def, 182 it.GetMethodCodeItem(), 183 it.GetMemberIndex(), 184 method, 185 it.GetMethodAccessFlags(), 186 true /* can_load_classes */, 187 true /* allow_soft_failures */, 188 true /* need_precise_constants */, 189 false /* verify to dump */, 190 true /* allow_thread_suspension */); 191 verifier.Verify(); 192 Thread::Current()->SetVerifierDeps(nullptr); 193 return !verifier.HasFailures(); 194 } 195 196 void VerifyDexFile(const char* multidex = nullptr) { 197 { 198 ScopedObjectAccess soa(Thread::Current()); 199 LoadDexFile(&soa, "VerifierDeps", multidex); 200 } 201 SetupCompilerDriver(); 202 VerifyWithCompilerDriver(/* verifier_deps */ nullptr); 203 } 204 205 bool TestAssignabilityRecording(const std::string& dst, 206 const std::string& src, 207 bool is_strict, 208 bool is_assignable) { 209 ScopedObjectAccess soa(Thread::Current()); 210 LoadDexFile(&soa); 211 mirror::Class* klass_dst = FindClassByName(dst, &soa); 212 DCHECK(klass_dst != nullptr) << dst; 213 mirror::Class* klass_src = FindClassByName(src, &soa); 214 DCHECK(klass_src != nullptr) << src; 215 verifier_deps_->AddAssignability(*primary_dex_file_, 216 klass_dst, 217 klass_src, 218 is_strict, 219 is_assignable); 220 return true; 221 } 222 223 // Check that the status of classes in `class_loader_` match the 224 // expected status in `deps`. 225 void VerifyClassStatus(const verifier::VerifierDeps& deps) { 226 ScopedObjectAccess soa(Thread::Current()); 227 StackHandleScope<2> hs(soa.Self()); 228 Handle<mirror::ClassLoader> class_loader_handle( 229 hs.NewHandle(soa.Decode<mirror::ClassLoader>(class_loader_))); 230 MutableHandle<mirror::Class> cls(hs.NewHandle<mirror::Class>(nullptr)); 231 for (const DexFile* dex_file : dex_files_) { 232 const std::set<dex::TypeIndex>& unverified_classes = deps.GetUnverifiedClasses(*dex_file); 233 for (uint32_t i = 0; i < dex_file->NumClassDefs(); ++i) { 234 const DexFile::ClassDef& class_def = dex_file->GetClassDef(i); 235 const char* descriptor = dex_file->GetClassDescriptor(class_def); 236 cls.Assign(class_linker_->FindClass(soa.Self(), descriptor, class_loader_handle)); 237 if (cls == nullptr) { 238 CHECK(soa.Self()->IsExceptionPending()); 239 soa.Self()->ClearException(); 240 } else if (unverified_classes.find(class_def.class_idx_) == unverified_classes.end()) { 241 ASSERT_EQ(cls->GetStatus(), mirror::Class::kStatusVerified); 242 } else { 243 ASSERT_LT(cls->GetStatus(), mirror::Class::kStatusVerified); 244 } 245 } 246 } 247 } 248 249 bool HasUnverifiedClass(const std::string& cls) { 250 return HasUnverifiedClass(cls, *primary_dex_file_); 251 } 252 253 bool HasUnverifiedClass(const std::string& cls, const DexFile& dex_file) { 254 const DexFile::TypeId* type_id = dex_file.FindTypeId(cls.c_str()); 255 DCHECK(type_id != nullptr); 256 dex::TypeIndex index = dex_file.GetIndexForTypeId(*type_id); 257 for (const auto& dex_dep : verifier_deps_->dex_deps_) { 258 for (dex::TypeIndex entry : dex_dep.second->unverified_classes_) { 259 if (index == entry) { 260 return true; 261 } 262 } 263 } 264 return false; 265 } 266 267 // Iterates over all assignability records and tries to find an entry which 268 // matches the expected destination/source pair. 269 bool HasAssignable(const std::string& expected_destination, 270 const std::string& expected_source, 271 bool expected_is_assignable) { 272 for (auto& dex_dep : verifier_deps_->dex_deps_) { 273 const DexFile& dex_file = *dex_dep.first; 274 auto& storage = expected_is_assignable ? dex_dep.second->assignable_types_ 275 : dex_dep.second->unassignable_types_; 276 for (auto& entry : storage) { 277 std::string actual_destination = 278 verifier_deps_->GetStringFromId(dex_file, entry.GetDestination()); 279 std::string actual_source = verifier_deps_->GetStringFromId(dex_file, entry.GetSource()); 280 if ((expected_destination == actual_destination) && (expected_source == actual_source)) { 281 return true; 282 } 283 } 284 } 285 return false; 286 } 287 288 // Iterates over all class resolution records, finds an entry which matches 289 // the given class descriptor and tests its properties. 290 bool HasClass(const std::string& expected_klass, 291 bool expected_resolved, 292 const std::string& expected_access_flags = "") { 293 for (auto& dex_dep : verifier_deps_->dex_deps_) { 294 for (auto& entry : dex_dep.second->classes_) { 295 if (expected_resolved != entry.IsResolved()) { 296 continue; 297 } 298 299 std::string actual_klass = dex_dep.first->StringByTypeIdx(entry.GetDexTypeIndex()); 300 if (expected_klass != actual_klass) { 301 continue; 302 } 303 304 if (expected_resolved) { 305 // Test access flags. Note that PrettyJavaAccessFlags always appends 306 // a space after the modifiers. Add it to the expected access flags. 307 std::string actual_access_flags = PrettyJavaAccessFlags(entry.GetAccessFlags()); 308 if (expected_access_flags + " " != actual_access_flags) { 309 continue; 310 } 311 } 312 313 return true; 314 } 315 } 316 return false; 317 } 318 319 // Iterates over all field resolution records, finds an entry which matches 320 // the given field class+name+type and tests its properties. 321 bool HasField(const std::string& expected_klass, 322 const std::string& expected_name, 323 const std::string& expected_type, 324 bool expected_resolved, 325 const std::string& expected_access_flags = "", 326 const std::string& expected_decl_klass = "") { 327 for (auto& dex_dep : verifier_deps_->dex_deps_) { 328 for (auto& entry : dex_dep.second->fields_) { 329 if (expected_resolved != entry.IsResolved()) { 330 continue; 331 } 332 333 const DexFile::FieldId& field_id = dex_dep.first->GetFieldId(entry.GetDexFieldIndex()); 334 335 std::string actual_klass = dex_dep.first->StringByTypeIdx(field_id.class_idx_); 336 if (expected_klass != actual_klass) { 337 continue; 338 } 339 340 std::string actual_name = dex_dep.first->StringDataByIdx(field_id.name_idx_); 341 if (expected_name != actual_name) { 342 continue; 343 } 344 345 std::string actual_type = dex_dep.first->StringByTypeIdx(field_id.type_idx_); 346 if (expected_type != actual_type) { 347 continue; 348 } 349 350 if (expected_resolved) { 351 // Test access flags. Note that PrettyJavaAccessFlags always appends 352 // a space after the modifiers. Add it to the expected access flags. 353 std::string actual_access_flags = PrettyJavaAccessFlags(entry.GetAccessFlags()); 354 if (expected_access_flags + " " != actual_access_flags) { 355 continue; 356 } 357 358 std::string actual_decl_klass = verifier_deps_->GetStringFromId( 359 *dex_dep.first, entry.GetDeclaringClassIndex()); 360 if (expected_decl_klass != actual_decl_klass) { 361 continue; 362 } 363 } 364 365 return true; 366 } 367 } 368 return false; 369 } 370 371 // Iterates over all method resolution records, finds an entry which matches 372 // the given field kind+class+name+signature and tests its properties. 373 bool HasMethod(const std::string& expected_klass, 374 const std::string& expected_name, 375 const std::string& expected_signature, 376 bool expected_resolved, 377 const std::string& expected_access_flags = "", 378 const std::string& expected_decl_klass = "") { 379 for (auto& dex_dep : verifier_deps_->dex_deps_) { 380 for (const VerifierDeps::MethodResolution& entry : dex_dep.second->methods_) { 381 if (expected_resolved != entry.IsResolved()) { 382 continue; 383 } 384 385 const DexFile::MethodId& method_id = dex_dep.first->GetMethodId(entry.GetDexMethodIndex()); 386 387 std::string actual_klass = dex_dep.first->StringByTypeIdx(method_id.class_idx_); 388 if (expected_klass != actual_klass) { 389 continue; 390 } 391 392 std::string actual_name = dex_dep.first->StringDataByIdx(method_id.name_idx_); 393 if (expected_name != actual_name) { 394 continue; 395 } 396 397 std::string actual_signature = dex_dep.first->GetMethodSignature(method_id).ToString(); 398 if (expected_signature != actual_signature) { 399 continue; 400 } 401 402 if (expected_resolved) { 403 // Test access flags. Note that PrettyJavaAccessFlags always appends 404 // a space after the modifiers. Add it to the expected access flags. 405 std::string actual_access_flags = PrettyJavaAccessFlags(entry.GetAccessFlags()); 406 if (expected_access_flags + " " != actual_access_flags) { 407 continue; 408 } 409 410 std::string actual_decl_klass = verifier_deps_->GetStringFromId( 411 *dex_dep.first, entry.GetDeclaringClassIndex()); 412 if (expected_decl_klass != actual_decl_klass) { 413 continue; 414 } 415 } 416 417 return true; 418 } 419 } 420 return false; 421 } 422 423 size_t NumberOfCompiledDexFiles() { 424 return verifier_deps_->dex_deps_.size(); 425 } 426 427 size_t HasEachKindOfRecord() { 428 bool has_strings = false; 429 bool has_assignability = false; 430 bool has_classes = false; 431 bool has_fields = false; 432 bool has_methods = false; 433 bool has_unverified_classes = false; 434 435 for (auto& entry : verifier_deps_->dex_deps_) { 436 has_strings |= !entry.second->strings_.empty(); 437 has_assignability |= !entry.second->assignable_types_.empty(); 438 has_assignability |= !entry.second->unassignable_types_.empty(); 439 has_classes |= !entry.second->classes_.empty(); 440 has_fields |= !entry.second->fields_.empty(); 441 has_methods |= !entry.second->methods_.empty(); 442 has_unverified_classes |= !entry.second->unverified_classes_.empty(); 443 } 444 445 return has_strings && 446 has_assignability && 447 has_classes && 448 has_fields && 449 has_methods && 450 has_unverified_classes; 451 } 452 453 std::unique_ptr<verifier::VerifierDeps> verifier_deps_; 454 std::vector<const DexFile*> dex_files_; 455 const DexFile* primary_dex_file_; 456 jobject class_loader_; 457 mirror::Class* klass_Main_; 458 }; 459 460 TEST_F(VerifierDepsTest, StringToId) { 461 ScopedObjectAccess soa(Thread::Current()); 462 LoadDexFile(&soa); 463 464 dex::StringIndex id_Main1 = verifier_deps_->GetIdFromString(*primary_dex_file_, "LMain;"); 465 ASSERT_LT(id_Main1.index_, primary_dex_file_->NumStringIds()); 466 ASSERT_EQ("LMain;", verifier_deps_->GetStringFromId(*primary_dex_file_, id_Main1)); 467 468 dex::StringIndex id_Main2 = verifier_deps_->GetIdFromString(*primary_dex_file_, "LMain;"); 469 ASSERT_LT(id_Main2.index_, primary_dex_file_->NumStringIds()); 470 ASSERT_EQ("LMain;", verifier_deps_->GetStringFromId(*primary_dex_file_, id_Main2)); 471 472 dex::StringIndex id_Lorem1 = verifier_deps_->GetIdFromString(*primary_dex_file_, "Lorem ipsum"); 473 ASSERT_GE(id_Lorem1.index_, primary_dex_file_->NumStringIds()); 474 ASSERT_EQ("Lorem ipsum", verifier_deps_->GetStringFromId(*primary_dex_file_, id_Lorem1)); 475 476 dex::StringIndex id_Lorem2 = verifier_deps_->GetIdFromString(*primary_dex_file_, "Lorem ipsum"); 477 ASSERT_GE(id_Lorem2.index_, primary_dex_file_->NumStringIds()); 478 ASSERT_EQ("Lorem ipsum", verifier_deps_->GetStringFromId(*primary_dex_file_, id_Lorem2)); 479 480 ASSERT_EQ(id_Main1, id_Main2); 481 ASSERT_EQ(id_Lorem1, id_Lorem2); 482 ASSERT_NE(id_Main1, id_Lorem1); 483 } 484 485 TEST_F(VerifierDepsTest, Assignable_BothInBoot) { 486 ASSERT_TRUE(TestAssignabilityRecording(/* dst */ "Ljava/util/TimeZone;", 487 /* src */ "Ljava/util/SimpleTimeZone;", 488 /* is_strict */ true, 489 /* is_assignable */ true)); 490 ASSERT_TRUE(HasAssignable("Ljava/util/TimeZone;", "Ljava/util/SimpleTimeZone;", true)); 491 } 492 493 TEST_F(VerifierDepsTest, Assignable_DestinationInBoot1) { 494 ASSERT_TRUE(TestAssignabilityRecording(/* dst */ "Ljava/net/Socket;", 495 /* src */ "LMySSLSocket;", 496 /* is_strict */ true, 497 /* is_assignable */ true)); 498 ASSERT_TRUE(HasAssignable("Ljava/net/Socket;", "Ljavax/net/ssl/SSLSocket;", true)); 499 } 500 501 TEST_F(VerifierDepsTest, Assignable_DestinationInBoot2) { 502 ASSERT_TRUE(TestAssignabilityRecording(/* dst */ "Ljava/util/TimeZone;", 503 /* src */ "LMySimpleTimeZone;", 504 /* is_strict */ true, 505 /* is_assignable */ true)); 506 ASSERT_TRUE(HasAssignable("Ljava/util/TimeZone;", "Ljava/util/SimpleTimeZone;", true)); 507 } 508 509 TEST_F(VerifierDepsTest, Assignable_DestinationInBoot3) { 510 ASSERT_TRUE(TestAssignabilityRecording(/* dst */ "Ljava/util/Collection;", 511 /* src */ "LMyThreadSet;", 512 /* is_strict */ true, 513 /* is_assignable */ true)); 514 ASSERT_TRUE(HasAssignable("Ljava/util/Collection;", "Ljava/util/Set;", true)); 515 } 516 517 TEST_F(VerifierDepsTest, Assignable_BothArrays_Resolved) { 518 ASSERT_TRUE(TestAssignabilityRecording(/* dst */ "[[Ljava/util/TimeZone;", 519 /* src */ "[[Ljava/util/SimpleTimeZone;", 520 /* is_strict */ true, 521 /* is_assignable */ true)); 522 // If the component types of both arrays are resolved, we optimize the list of 523 // dependencies by recording a dependency on the component types. 524 ASSERT_FALSE(HasAssignable("[[Ljava/util/TimeZone;", "[[Ljava/util/SimpleTimeZone;", true)); 525 ASSERT_FALSE(HasAssignable("[Ljava/util/TimeZone;", "[Ljava/util/SimpleTimeZone;", true)); 526 ASSERT_TRUE(HasAssignable("Ljava/util/TimeZone;", "Ljava/util/SimpleTimeZone;", true)); 527 } 528 529 TEST_F(VerifierDepsTest, NotAssignable_BothInBoot) { 530 ASSERT_TRUE(TestAssignabilityRecording(/* dst */ "Ljava/lang/Exception;", 531 /* src */ "Ljava/util/SimpleTimeZone;", 532 /* is_strict */ true, 533 /* is_assignable */ false)); 534 ASSERT_TRUE(HasAssignable("Ljava/lang/Exception;", "Ljava/util/SimpleTimeZone;", false)); 535 } 536 537 TEST_F(VerifierDepsTest, NotAssignable_DestinationInBoot1) { 538 ASSERT_TRUE(TestAssignabilityRecording(/* dst */ "Ljava/lang/Exception;", 539 /* src */ "LMySSLSocket;", 540 /* is_strict */ true, 541 /* is_assignable */ false)); 542 ASSERT_TRUE(HasAssignable("Ljava/lang/Exception;", "Ljavax/net/ssl/SSLSocket;", false)); 543 } 544 545 TEST_F(VerifierDepsTest, NotAssignable_DestinationInBoot2) { 546 ASSERT_TRUE(TestAssignabilityRecording(/* dst */ "Ljava/lang/Exception;", 547 /* src */ "LMySimpleTimeZone;", 548 /* is_strict */ true, 549 /* is_assignable */ false)); 550 ASSERT_TRUE(HasAssignable("Ljava/lang/Exception;", "Ljava/util/SimpleTimeZone;", false)); 551 } 552 553 TEST_F(VerifierDepsTest, NotAssignable_BothArrays) { 554 ASSERT_TRUE(TestAssignabilityRecording(/* dst */ "[Ljava/lang/Exception;", 555 /* src */ "[Ljava/util/SimpleTimeZone;", 556 /* is_strict */ true, 557 /* is_assignable */ false)); 558 ASSERT_TRUE(HasAssignable("Ljava/lang/Exception;", "Ljava/util/SimpleTimeZone;", false)); 559 } 560 561 TEST_F(VerifierDepsTest, ArgumentType_ResolvedClass) { 562 ASSERT_TRUE(VerifyMethod("ArgumentType_ResolvedClass")); 563 ASSERT_TRUE(HasClass("Ljava/lang/Thread;", true, "public")); 564 } 565 566 TEST_F(VerifierDepsTest, ArgumentType_UnresolvedClass) { 567 ASSERT_TRUE(VerifyMethod("ArgumentType_UnresolvedClass")); 568 ASSERT_TRUE(HasClass("LUnresolvedClass;", false)); 569 } 570 571 TEST_F(VerifierDepsTest, ArgumentType_UnresolvedSuper) { 572 ASSERT_TRUE(VerifyMethod("ArgumentType_UnresolvedSuper")); 573 ASSERT_TRUE(HasClass("LMySetWithUnresolvedSuper;", false)); 574 } 575 576 TEST_F(VerifierDepsTest, ReturnType_Reference) { 577 ASSERT_TRUE(VerifyMethod("ReturnType_Reference")); 578 ASSERT_TRUE(HasAssignable("Ljava/lang/Throwable;", "Ljava/lang/IllegalStateException;", true)); 579 } 580 581 TEST_F(VerifierDepsTest, ReturnType_Array) { 582 ASSERT_FALSE(VerifyMethod("ReturnType_Array")); 583 ASSERT_TRUE(HasAssignable("Ljava/lang/Integer;", "Ljava/lang/IllegalStateException;", false)); 584 } 585 586 TEST_F(VerifierDepsTest, InvokeArgumentType) { 587 ASSERT_TRUE(VerifyMethod("InvokeArgumentType")); 588 ASSERT_TRUE(HasClass("Ljava/text/SimpleDateFormat;", true, "public")); 589 ASSERT_TRUE(HasClass("Ljava/util/SimpleTimeZone;", true, "public")); 590 ASSERT_TRUE(HasMethod("Ljava/text/SimpleDateFormat;", 591 "setTimeZone", 592 "(Ljava/util/TimeZone;)V", 593 /* expect_resolved */ true, 594 "public", 595 "Ljava/text/DateFormat;")); 596 ASSERT_TRUE(HasAssignable("Ljava/util/TimeZone;", "Ljava/util/SimpleTimeZone;", true)); 597 } 598 599 TEST_F(VerifierDepsTest, MergeTypes_RegisterLines) { 600 ASSERT_TRUE(VerifyMethod("MergeTypes_RegisterLines")); 601 ASSERT_TRUE(HasAssignable("Ljava/lang/Exception;", "Ljava/net/SocketTimeoutException;", true)); 602 ASSERT_TRUE(HasAssignable( 603 "Ljava/lang/Exception;", "Ljava/util/concurrent/TimeoutException;", true)); 604 } 605 606 TEST_F(VerifierDepsTest, MergeTypes_IfInstanceOf) { 607 ASSERT_TRUE(VerifyMethod("MergeTypes_IfInstanceOf")); 608 ASSERT_TRUE(HasAssignable("Ljava/lang/Exception;", "Ljava/net/SocketTimeoutException;", true)); 609 ASSERT_TRUE(HasAssignable( 610 "Ljava/lang/Exception;", "Ljava/util/concurrent/TimeoutException;", true)); 611 ASSERT_TRUE(HasAssignable("Ljava/net/SocketTimeoutException;", "Ljava/lang/Exception;", false)); 612 } 613 614 TEST_F(VerifierDepsTest, MergeTypes_Unresolved) { 615 ASSERT_TRUE(VerifyMethod("MergeTypes_Unresolved")); 616 ASSERT_TRUE(HasAssignable("Ljava/lang/Exception;", "Ljava/net/SocketTimeoutException;", true)); 617 ASSERT_TRUE(HasAssignable( 618 "Ljava/lang/Exception;", "Ljava/util/concurrent/TimeoutException;", true)); 619 } 620 621 TEST_F(VerifierDepsTest, ConstClass_Resolved) { 622 ASSERT_TRUE(VerifyMethod("ConstClass_Resolved")); 623 ASSERT_TRUE(HasClass("Ljava/lang/IllegalStateException;", true, "public")); 624 } 625 626 TEST_F(VerifierDepsTest, ConstClass_Unresolved) { 627 ASSERT_TRUE(VerifyMethod("ConstClass_Unresolved")); 628 ASSERT_TRUE(HasClass("LUnresolvedClass;", false)); 629 } 630 631 TEST_F(VerifierDepsTest, CheckCast_Resolved) { 632 ASSERT_TRUE(VerifyMethod("CheckCast_Resolved")); 633 ASSERT_TRUE(HasClass("Ljava/lang/IllegalStateException;", true, "public")); 634 } 635 636 TEST_F(VerifierDepsTest, CheckCast_Unresolved) { 637 ASSERT_TRUE(VerifyMethod("CheckCast_Unresolved")); 638 ASSERT_TRUE(HasClass("LUnresolvedClass;", false)); 639 } 640 641 TEST_F(VerifierDepsTest, InstanceOf_Resolved) { 642 ASSERT_TRUE(VerifyMethod("InstanceOf_Resolved")); 643 ASSERT_TRUE(HasClass("Ljava/lang/IllegalStateException;", true, "public")); 644 } 645 646 TEST_F(VerifierDepsTest, InstanceOf_Unresolved) { 647 ASSERT_TRUE(VerifyMethod("InstanceOf_Unresolved")); 648 ASSERT_TRUE(HasClass("LUnresolvedClass;", false)); 649 } 650 651 TEST_F(VerifierDepsTest, NewInstance_Resolved) { 652 ASSERT_TRUE(VerifyMethod("NewInstance_Resolved")); 653 ASSERT_TRUE(HasClass("Ljava/lang/IllegalStateException;", true, "public")); 654 } 655 656 TEST_F(VerifierDepsTest, NewInstance_Unresolved) { 657 ASSERT_TRUE(VerifyMethod("NewInstance_Unresolved")); 658 ASSERT_TRUE(HasClass("LUnresolvedClass;", false)); 659 } 660 661 TEST_F(VerifierDepsTest, NewArray_Unresolved) { 662 ASSERT_TRUE(VerifyMethod("NewArray_Unresolved")); 663 ASSERT_TRUE(HasClass("[LUnresolvedClass;", false)); 664 } 665 666 TEST_F(VerifierDepsTest, Throw) { 667 ASSERT_TRUE(VerifyMethod("Throw")); 668 ASSERT_TRUE(HasAssignable("Ljava/lang/Throwable;", "Ljava/lang/IllegalStateException;", true)); 669 } 670 671 TEST_F(VerifierDepsTest, MoveException_Resolved) { 672 ASSERT_TRUE(VerifyMethod("MoveException_Resolved")); 673 ASSERT_TRUE(HasClass("Ljava/io/InterruptedIOException;", true, "public")); 674 ASSERT_TRUE(HasClass("Ljava/net/SocketTimeoutException;", true, "public")); 675 ASSERT_TRUE(HasClass("Ljava/util/zip/ZipException;", true, "public")); 676 677 // Testing that all exception types are assignable to Throwable. 678 ASSERT_TRUE(HasAssignable("Ljava/lang/Throwable;", "Ljava/io/InterruptedIOException;", true)); 679 ASSERT_TRUE(HasAssignable("Ljava/lang/Throwable;", "Ljava/net/SocketTimeoutException;", true)); 680 ASSERT_TRUE(HasAssignable("Ljava/lang/Throwable;", "Ljava/util/zip/ZipException;", true)); 681 682 // Testing that the merge type is assignable to Throwable. 683 ASSERT_TRUE(HasAssignable("Ljava/lang/Throwable;", "Ljava/io/IOException;", true)); 684 685 // Merging of exception types. 686 ASSERT_TRUE(HasAssignable("Ljava/io/IOException;", "Ljava/io/InterruptedIOException;", true)); 687 ASSERT_TRUE(HasAssignable("Ljava/io/IOException;", "Ljava/util/zip/ZipException;", true)); 688 ASSERT_TRUE(HasAssignable( 689 "Ljava/io/InterruptedIOException;", "Ljava/net/SocketTimeoutException;", true)); 690 } 691 692 TEST_F(VerifierDepsTest, MoveException_Unresolved) { 693 ASSERT_FALSE(VerifyMethod("MoveException_Unresolved")); 694 ASSERT_TRUE(HasClass("LUnresolvedException;", false)); 695 } 696 697 TEST_F(VerifierDepsTest, StaticField_Resolved_DeclaredInReferenced) { 698 ASSERT_TRUE(VerifyMethod("StaticField_Resolved_DeclaredInReferenced")); 699 ASSERT_TRUE(HasClass("Ljava/lang/System;", true, "public")); 700 ASSERT_TRUE(HasField("Ljava/lang/System;", 701 "out", 702 "Ljava/io/PrintStream;", 703 true, 704 "public static", 705 "Ljava/lang/System;")); 706 } 707 708 TEST_F(VerifierDepsTest, StaticField_Resolved_DeclaredInSuperclass1) { 709 ASSERT_TRUE(VerifyMethod("StaticField_Resolved_DeclaredInSuperclass1")); 710 ASSERT_TRUE(HasClass("Ljava/util/SimpleTimeZone;", true, "public")); 711 ASSERT_TRUE(HasField( 712 "Ljava/util/SimpleTimeZone;", "LONG", "I", true, "public static", "Ljava/util/TimeZone;")); 713 } 714 715 TEST_F(VerifierDepsTest, StaticField_Resolved_DeclaredInSuperclass2) { 716 ASSERT_TRUE(VerifyMethod("StaticField_Resolved_DeclaredInSuperclass2")); 717 ASSERT_TRUE(HasField( 718 "LMySimpleTimeZone;", "SHORT", "I", true, "public static", "Ljava/util/TimeZone;")); 719 } 720 721 TEST_F(VerifierDepsTest, StaticField_Resolved_DeclaredInInterface1) { 722 ASSERT_TRUE(VerifyMethod("StaticField_Resolved_DeclaredInInterface1")); 723 ASSERT_TRUE(HasClass("Ljavax/xml/transform/dom/DOMResult;", true, "public")); 724 ASSERT_TRUE(HasField("Ljavax/xml/transform/dom/DOMResult;", 725 "PI_ENABLE_OUTPUT_ESCAPING", 726 "Ljava/lang/String;", 727 true, 728 "public static", 729 "Ljavax/xml/transform/Result;")); 730 } 731 732 TEST_F(VerifierDepsTest, StaticField_Resolved_DeclaredInInterface2) { 733 ASSERT_TRUE(VerifyMethod("StaticField_Resolved_DeclaredInInterface2")); 734 ASSERT_TRUE(HasField("LMyDOMResult;", 735 "PI_ENABLE_OUTPUT_ESCAPING", 736 "Ljava/lang/String;", 737 true, 738 "public static", 739 "Ljavax/xml/transform/Result;")); 740 } 741 742 TEST_F(VerifierDepsTest, StaticField_Resolved_DeclaredInInterface3) { 743 ASSERT_TRUE(VerifyMethod("StaticField_Resolved_DeclaredInInterface3")); 744 ASSERT_TRUE(HasField("LMyResult;", 745 "PI_ENABLE_OUTPUT_ESCAPING", 746 "Ljava/lang/String;", 747 true, 748 "public static", 749 "Ljavax/xml/transform/Result;")); 750 } 751 752 TEST_F(VerifierDepsTest, StaticField_Resolved_DeclaredInInterface4) { 753 ASSERT_TRUE(VerifyMethod("StaticField_Resolved_DeclaredInInterface4")); 754 ASSERT_TRUE(HasField("LMyDocument;", 755 "ELEMENT_NODE", 756 "S", 757 true, 758 "public static", 759 "Lorg/w3c/dom/Node;")); 760 } 761 762 TEST_F(VerifierDepsTest, StaticField_Unresolved_ReferrerInBoot) { 763 ASSERT_TRUE(VerifyMethod("StaticField_Unresolved_ReferrerInBoot")); 764 ASSERT_TRUE(HasClass("Ljava/util/TimeZone;", true, "public")); 765 ASSERT_TRUE(HasField("Ljava/util/TimeZone;", "x", "I", false)); 766 } 767 768 TEST_F(VerifierDepsTest, StaticField_Unresolved_ReferrerInDex) { 769 ASSERT_TRUE(VerifyMethod("StaticField_Unresolved_ReferrerInDex")); 770 ASSERT_TRUE(HasField("LMyThreadSet;", "x", "I", false)); 771 } 772 773 TEST_F(VerifierDepsTest, InstanceField_Resolved_DeclaredInReferenced) { 774 ASSERT_TRUE(VerifyMethod("InstanceField_Resolved_DeclaredInReferenced")); 775 ASSERT_TRUE(HasClass("Ljava/io/InterruptedIOException;", true, "public")); 776 ASSERT_TRUE(HasField("Ljava/io/InterruptedIOException;", 777 "bytesTransferred", 778 "I", 779 true, 780 "public", 781 "Ljava/io/InterruptedIOException;")); 782 ASSERT_TRUE(HasAssignable( 783 "Ljava/io/InterruptedIOException;", "Ljava/net/SocketTimeoutException;", true)); 784 } 785 786 TEST_F(VerifierDepsTest, InstanceField_Resolved_DeclaredInSuperclass1) { 787 ASSERT_TRUE(VerifyMethod("InstanceField_Resolved_DeclaredInSuperclass1")); 788 ASSERT_TRUE(HasClass("Ljava/net/SocketTimeoutException;", true, "public")); 789 ASSERT_TRUE(HasField("Ljava/net/SocketTimeoutException;", 790 "bytesTransferred", 791 "I", 792 true, 793 "public", 794 "Ljava/io/InterruptedIOException;")); 795 ASSERT_TRUE(HasAssignable( 796 "Ljava/io/InterruptedIOException;", "Ljava/net/SocketTimeoutException;", true)); 797 } 798 799 TEST_F(VerifierDepsTest, InstanceField_Resolved_DeclaredInSuperclass2) { 800 ASSERT_TRUE(VerifyMethod("InstanceField_Resolved_DeclaredInSuperclass2")); 801 ASSERT_TRUE(HasField("LMySocketTimeoutException;", 802 "bytesTransferred", 803 "I", 804 true, 805 "public", 806 "Ljava/io/InterruptedIOException;")); 807 ASSERT_TRUE(HasAssignable( 808 "Ljava/io/InterruptedIOException;", "Ljava/net/SocketTimeoutException;", true)); 809 } 810 811 TEST_F(VerifierDepsTest, InstanceField_Unresolved_ReferrerInBoot) { 812 ASSERT_TRUE(VerifyMethod("InstanceField_Unresolved_ReferrerInBoot")); 813 ASSERT_TRUE(HasClass("Ljava/io/InterruptedIOException;", true, "public")); 814 ASSERT_TRUE(HasField("Ljava/io/InterruptedIOException;", "x", "I", false)); 815 } 816 817 TEST_F(VerifierDepsTest, InstanceField_Unresolved_ReferrerInDex) { 818 ASSERT_TRUE(VerifyMethod("InstanceField_Unresolved_ReferrerInDex")); 819 ASSERT_TRUE(HasField("LMyThreadSet;", "x", "I", false)); 820 } 821 822 TEST_F(VerifierDepsTest, InvokeStatic_Resolved_DeclaredInReferenced) { 823 ASSERT_TRUE(VerifyMethod("InvokeStatic_Resolved_DeclaredInReferenced")); 824 ASSERT_TRUE(HasClass("Ljava/net/Socket;", true, "public")); 825 ASSERT_TRUE(HasMethod("Ljava/net/Socket;", 826 "setSocketImplFactory", 827 "(Ljava/net/SocketImplFactory;)V", 828 /* expect_resolved */ true, 829 "public static", 830 "Ljava/net/Socket;")); 831 } 832 833 TEST_F(VerifierDepsTest, InvokeStatic_Resolved_DeclaredInSuperclass1) { 834 ASSERT_TRUE(VerifyMethod("InvokeStatic_Resolved_DeclaredInSuperclass1")); 835 ASSERT_TRUE(HasClass("Ljavax/net/ssl/SSLSocket;", true, "public")); 836 ASSERT_TRUE(HasMethod("Ljavax/net/ssl/SSLSocket;", 837 "setSocketImplFactory", 838 "(Ljava/net/SocketImplFactory;)V", 839 /* expect_resolved */ true, 840 "public static", 841 "Ljava/net/Socket;")); 842 } 843 844 TEST_F(VerifierDepsTest, InvokeStatic_Resolved_DeclaredInSuperclass2) { 845 ASSERT_TRUE(VerifyMethod("InvokeStatic_Resolved_DeclaredInSuperclass2")); 846 ASSERT_TRUE(HasMethod("LMySSLSocket;", 847 "setSocketImplFactory", 848 "(Ljava/net/SocketImplFactory;)V", 849 /* expect_resolved */ true, 850 "public static", 851 "Ljava/net/Socket;")); 852 } 853 854 TEST_F(VerifierDepsTest, InvokeStatic_DeclaredInInterface1) { 855 ASSERT_TRUE(VerifyMethod("InvokeStatic_DeclaredInInterface1")); 856 ASSERT_TRUE(HasClass("Ljava/util/Map$Entry;", true, "public interface")); 857 ASSERT_TRUE(HasMethod("Ljava/util/Map$Entry;", 858 "comparingByKey", 859 "()Ljava/util/Comparator;", 860 /* expect_resolved */ true, 861 "public static", 862 "Ljava/util/Map$Entry;")); 863 } 864 865 TEST_F(VerifierDepsTest, InvokeStatic_DeclaredInInterface2) { 866 ASSERT_FALSE(VerifyMethod("InvokeStatic_DeclaredInInterface2")); 867 ASSERT_TRUE(HasClass("Ljava/util/AbstractMap$SimpleEntry;", true, "public")); 868 ASSERT_TRUE(HasMethod("Ljava/util/AbstractMap$SimpleEntry;", 869 "comparingByKey", 870 "()Ljava/util/Comparator;", 871 /* expect_resolved */ false)); 872 } 873 874 TEST_F(VerifierDepsTest, InvokeStatic_Unresolved1) { 875 ASSERT_FALSE(VerifyMethod("InvokeStatic_Unresolved1")); 876 ASSERT_TRUE(HasClass("Ljavax/net/ssl/SSLSocket;", true, "public")); 877 ASSERT_TRUE(HasMethod("Ljavax/net/ssl/SSLSocket;", 878 "x", 879 "()V", 880 /* expect_resolved */ false)); 881 } 882 883 TEST_F(VerifierDepsTest, InvokeStatic_Unresolved2) { 884 ASSERT_FALSE(VerifyMethod("InvokeStatic_Unresolved2")); 885 ASSERT_TRUE(HasMethod("LMySSLSocket;", 886 "x", 887 "()V", 888 /* expect_resolved */ false)); 889 } 890 891 TEST_F(VerifierDepsTest, InvokeDirect_Resolved_DeclaredInReferenced) { 892 ASSERT_TRUE(VerifyMethod("InvokeDirect_Resolved_DeclaredInReferenced")); 893 ASSERT_TRUE(HasClass("Ljava/net/Socket;", true, "public")); 894 ASSERT_TRUE(HasMethod("Ljava/net/Socket;", 895 "<init>", 896 "()V", 897 /* expect_resolved */ true, 898 "public", 899 "Ljava/net/Socket;")); 900 } 901 902 TEST_F(VerifierDepsTest, InvokeDirect_Resolved_DeclaredInSuperclass1) { 903 ASSERT_FALSE(VerifyMethod("InvokeDirect_Resolved_DeclaredInSuperclass1")); 904 ASSERT_TRUE(HasClass("Ljavax/net/ssl/SSLSocket;", true, "public")); 905 ASSERT_TRUE(HasMethod("Ljavax/net/ssl/SSLSocket;", 906 "checkOldImpl", 907 "()V", 908 /* expect_resolved */ true, 909 "private", 910 "Ljava/net/Socket;")); 911 } 912 913 TEST_F(VerifierDepsTest, InvokeDirect_Resolved_DeclaredInSuperclass2) { 914 ASSERT_FALSE(VerifyMethod("InvokeDirect_Resolved_DeclaredInSuperclass2")); 915 ASSERT_TRUE(HasMethod("LMySSLSocket;", 916 "checkOldImpl", 917 "()V", 918 /* expect_resolved */ true, 919 "private", 920 "Ljava/net/Socket;")); 921 } 922 923 TEST_F(VerifierDepsTest, InvokeDirect_Unresolved1) { 924 ASSERT_FALSE(VerifyMethod("InvokeDirect_Unresolved1")); 925 ASSERT_TRUE(HasClass("Ljavax/net/ssl/SSLSocket;", true, "public")); 926 ASSERT_TRUE(HasMethod("Ljavax/net/ssl/SSLSocket;", 927 "x", 928 "()V", 929 /* expect_resolved */ false)); 930 } 931 932 TEST_F(VerifierDepsTest, InvokeDirect_Unresolved2) { 933 ASSERT_FALSE(VerifyMethod("InvokeDirect_Unresolved2")); 934 ASSERT_TRUE(HasMethod("LMySSLSocket;", 935 "x", 936 "()V", 937 /* expect_resolved */ false)); 938 } 939 940 TEST_F(VerifierDepsTest, InvokeVirtual_Resolved_DeclaredInReferenced) { 941 ASSERT_TRUE(VerifyMethod("InvokeVirtual_Resolved_DeclaredInReferenced")); 942 ASSERT_TRUE(HasClass("Ljava/lang/Throwable;", true, "public")); 943 ASSERT_TRUE(HasMethod("Ljava/lang/Throwable;", 944 "getMessage", 945 "()Ljava/lang/String;", 946 /* expect_resolved */ true, 947 "public", 948 "Ljava/lang/Throwable;")); 949 // Type dependency on `this` argument. 950 ASSERT_TRUE(HasAssignable("Ljava/lang/Throwable;", "Ljava/net/SocketTimeoutException;", true)); 951 } 952 953 TEST_F(VerifierDepsTest, InvokeVirtual_Resolved_DeclaredInSuperclass1) { 954 ASSERT_TRUE(VerifyMethod("InvokeVirtual_Resolved_DeclaredInSuperclass1")); 955 ASSERT_TRUE(HasClass("Ljava/io/InterruptedIOException;", true, "public")); 956 ASSERT_TRUE(HasMethod("Ljava/io/InterruptedIOException;", 957 "getMessage", 958 "()Ljava/lang/String;", 959 /* expect_resolved */ true, 960 "public", 961 "Ljava/lang/Throwable;")); 962 // Type dependency on `this` argument. 963 ASSERT_TRUE(HasAssignable("Ljava/lang/Throwable;", "Ljava/net/SocketTimeoutException;", true)); 964 } 965 966 TEST_F(VerifierDepsTest, InvokeVirtual_Resolved_DeclaredInSuperclass2) { 967 ASSERT_TRUE(VerifyMethod("InvokeVirtual_Resolved_DeclaredInSuperclass2")); 968 ASSERT_TRUE(HasMethod("LMySocketTimeoutException;", 969 "getMessage", 970 "()Ljava/lang/String;", 971 /* expect_resolved */ true, 972 "public", 973 "Ljava/lang/Throwable;")); 974 } 975 976 TEST_F(VerifierDepsTest, InvokeVirtual_Resolved_DeclaredInSuperinterface) { 977 ASSERT_TRUE(VerifyMethod("InvokeVirtual_Resolved_DeclaredInSuperinterface")); 978 ASSERT_TRUE(HasMethod("LMyThreadSet;", 979 "size", 980 "()I", 981 /* expect_resolved */ true, 982 "public", 983 "Ljava/util/Set;")); 984 } 985 986 TEST_F(VerifierDepsTest, InvokeVirtual_Unresolved1) { 987 ASSERT_FALSE(VerifyMethod("InvokeVirtual_Unresolved1")); 988 ASSERT_TRUE(HasClass("Ljava/io/InterruptedIOException;", true, "public")); 989 ASSERT_TRUE(HasMethod("Ljava/io/InterruptedIOException;", 990 "x", 991 "()V", 992 /* expect_resolved */ false)); 993 } 994 995 TEST_F(VerifierDepsTest, InvokeVirtual_Unresolved2) { 996 ASSERT_FALSE(VerifyMethod("InvokeVirtual_Unresolved2")); 997 ASSERT_TRUE(HasMethod("LMySocketTimeoutException;", 998 "x", 999 "()V", 1000 /* expect_resolved */ false)); 1001 } 1002 1003 TEST_F(VerifierDepsTest, InvokeInterface_Resolved_DeclaredInReferenced) { 1004 ASSERT_TRUE(VerifyMethod("InvokeInterface_Resolved_DeclaredInReferenced")); 1005 ASSERT_TRUE(HasClass("Ljava/lang/Runnable;", true, "public interface")); 1006 ASSERT_TRUE(HasMethod("Ljava/lang/Runnable;", 1007 "run", 1008 "()V", 1009 /* expect_resolved */ true, 1010 "public", 1011 "Ljava/lang/Runnable;")); 1012 } 1013 1014 TEST_F(VerifierDepsTest, InvokeInterface_Resolved_DeclaredInSuperclass) { 1015 ASSERT_FALSE(VerifyMethod("InvokeInterface_Resolved_DeclaredInSuperclass")); 1016 // TODO: Maybe we should not record dependency if the invoke type does not match the lookup type. 1017 ASSERT_TRUE(HasMethod("LMyThread;", 1018 "join", 1019 "()V", 1020 /* expect_resolved */ true, 1021 "public", 1022 "Ljava/lang/Thread;")); 1023 } 1024 1025 TEST_F(VerifierDepsTest, InvokeInterface_Resolved_DeclaredInSuperinterface1) { 1026 ASSERT_FALSE(VerifyMethod("InvokeInterface_Resolved_DeclaredInSuperinterface1")); 1027 // TODO: Maybe we should not record dependency if the invoke type does not match the lookup type. 1028 ASSERT_TRUE(HasMethod("LMyThreadSet;", 1029 "run", 1030 "()V", 1031 /* expect_resolved */ true, 1032 "public", 1033 "Ljava/lang/Thread;")); 1034 } 1035 1036 TEST_F(VerifierDepsTest, InvokeInterface_Resolved_DeclaredInSuperinterface2) { 1037 ASSERT_FALSE(VerifyMethod("InvokeInterface_Resolved_DeclaredInSuperinterface2")); 1038 ASSERT_TRUE(HasMethod("LMyThreadSet;", 1039 "isEmpty", 1040 "()Z", 1041 /* expect_resolved */ true, 1042 "public", 1043 "Ljava/util/Set;")); 1044 } 1045 1046 TEST_F(VerifierDepsTest, InvokeInterface_Unresolved1) { 1047 ASSERT_FALSE(VerifyMethod("InvokeInterface_Unresolved1")); 1048 ASSERT_TRUE(HasClass("Ljava/lang/Runnable;", true, "public interface")); 1049 ASSERT_TRUE(HasMethod("Ljava/lang/Runnable;", 1050 "x", 1051 "()V", 1052 /* expect_resolved */ false)); 1053 } 1054 1055 TEST_F(VerifierDepsTest, InvokeInterface_Unresolved2) { 1056 ASSERT_FALSE(VerifyMethod("InvokeInterface_Unresolved2")); 1057 ASSERT_TRUE(HasMethod("LMyThreadSet;", "x", "()V", /* expect_resolved */ false)); 1058 } 1059 1060 TEST_F(VerifierDepsTest, InvokeSuper_ThisAssignable) { 1061 ASSERT_TRUE(VerifyMethod("InvokeSuper_ThisAssignable")); 1062 ASSERT_TRUE(HasClass("Ljava/lang/Runnable;", true, "public interface")); 1063 ASSERT_TRUE(HasAssignable("Ljava/lang/Runnable;", "Ljava/lang/Thread;", true)); 1064 ASSERT_TRUE(HasMethod("Ljava/lang/Runnable;", 1065 "run", 1066 "()V", 1067 /* expect_resolved */ true, 1068 "public", 1069 "Ljava/lang/Runnable;")); 1070 } 1071 1072 TEST_F(VerifierDepsTest, InvokeSuper_ThisNotAssignable) { 1073 ASSERT_FALSE(VerifyMethod("InvokeSuper_ThisNotAssignable")); 1074 ASSERT_TRUE(HasClass("Ljava/lang/Integer;", true, "public")); 1075 ASSERT_TRUE(HasAssignable("Ljava/lang/Integer;", "Ljava/lang/Thread;", false)); 1076 ASSERT_TRUE(HasMethod("Ljava/lang/Integer;", 1077 "intValue", "()I", 1078 /* expect_resolved */ true, 1079 "public", "Ljava/lang/Integer;")); 1080 } 1081 1082 TEST_F(VerifierDepsTest, ArgumentType_ResolvedReferenceArray) { 1083 ASSERT_TRUE(VerifyMethod("ArgumentType_ResolvedReferenceArray")); 1084 ASSERT_TRUE(HasClass("[Ljava/lang/Thread;", true, "public")); 1085 } 1086 1087 TEST_F(VerifierDepsTest, NewArray_Resolved) { 1088 ASSERT_TRUE(VerifyMethod("NewArray_Resolved")); 1089 ASSERT_TRUE(HasClass("[Ljava/lang/IllegalStateException;", true, "public")); 1090 } 1091 1092 TEST_F(VerifierDepsTest, EncodeDecode) { 1093 VerifyDexFile(); 1094 1095 ASSERT_EQ(1u, NumberOfCompiledDexFiles()); 1096 ASSERT_TRUE(HasEachKindOfRecord()); 1097 1098 std::vector<uint8_t> buffer; 1099 verifier_deps_->Encode(dex_files_, &buffer); 1100 ASSERT_FALSE(buffer.empty()); 1101 1102 VerifierDeps decoded_deps(dex_files_, ArrayRef<const uint8_t>(buffer)); 1103 ASSERT_TRUE(verifier_deps_->Equals(decoded_deps)); 1104 } 1105 1106 TEST_F(VerifierDepsTest, EncodeDecodeMulti) { 1107 VerifyDexFile("MultiDex"); 1108 1109 ASSERT_GT(NumberOfCompiledDexFiles(), 1u); 1110 std::vector<uint8_t> buffer; 1111 verifier_deps_->Encode(dex_files_, &buffer); 1112 ASSERT_FALSE(buffer.empty()); 1113 1114 // Create new DexFile, to mess with std::map order: the verifier deps used 1115 // to iterate over the map, which doesn't guarantee insertion order. We fixed 1116 // this by passing the expected order when encoding/decoding. 1117 std::vector<std::unique_ptr<const DexFile>> first_dex_files = OpenTestDexFiles("VerifierDeps"); 1118 std::vector<std::unique_ptr<const DexFile>> second_dex_files = OpenTestDexFiles("MultiDex"); 1119 std::vector<const DexFile*> dex_files; 1120 for (auto& dex_file : first_dex_files) { 1121 dex_files.push_back(dex_file.get()); 1122 } 1123 for (auto& dex_file : second_dex_files) { 1124 dex_files.push_back(dex_file.get()); 1125 } 1126 1127 // Dump the new verifier deps to ensure it can properly read the data. 1128 VerifierDeps decoded_deps(dex_files, ArrayRef<const uint8_t>(buffer)); 1129 std::ostringstream stream; 1130 VariableIndentationOutputStream os(&stream); 1131 decoded_deps.Dump(&os); 1132 } 1133 1134 TEST_F(VerifierDepsTest, UnverifiedClasses) { 1135 VerifyDexFile(); 1136 ASSERT_FALSE(HasUnverifiedClass("LMyThread;")); 1137 // Test that a class with a soft failure is recorded. 1138 ASSERT_TRUE(HasUnverifiedClass("LMain;")); 1139 // Test that a class with hard failure is recorded. 1140 ASSERT_TRUE(HasUnverifiedClass("LMyVerificationFailure;")); 1141 // Test that a class with unresolved super is recorded. 1142 ASSERT_TRUE(HasUnverifiedClass("LMyClassWithNoSuper;")); 1143 // Test that a class with unresolved super and hard failure is recorded. 1144 ASSERT_TRUE(HasUnverifiedClass("LMyClassWithNoSuperButFailures;")); 1145 } 1146 1147 TEST_F(VerifierDepsTest, UnverifiedOrder) { 1148 ScopedObjectAccess soa(Thread::Current()); 1149 jobject loader = LoadDex("VerifierDeps"); 1150 std::vector<const DexFile*> dex_files = GetDexFiles(loader); 1151 ASSERT_GT(dex_files.size(), 0u); 1152 const DexFile* dex_file = dex_files[0]; 1153 VerifierDeps deps1(dex_files); 1154 Thread* const self = Thread::Current(); 1155 ASSERT_TRUE(self->GetVerifierDeps() == nullptr); 1156 self->SetVerifierDeps(&deps1); 1157 deps1.MaybeRecordVerificationStatus(*dex_file, 1158 dex::TypeIndex(0), 1159 verifier::FailureKind::kHardFailure); 1160 deps1.MaybeRecordVerificationStatus(*dex_file, 1161 dex::TypeIndex(1), 1162 verifier::FailureKind::kHardFailure); 1163 VerifierDeps deps2(dex_files); 1164 self->SetVerifierDeps(nullptr); 1165 self->SetVerifierDeps(&deps2); 1166 deps2.MaybeRecordVerificationStatus(*dex_file, 1167 dex::TypeIndex(1), 1168 verifier::FailureKind::kHardFailure); 1169 deps2.MaybeRecordVerificationStatus(*dex_file, 1170 dex::TypeIndex(0), 1171 verifier::FailureKind::kHardFailure); 1172 self->SetVerifierDeps(nullptr); 1173 std::vector<uint8_t> buffer1; 1174 deps1.Encode(dex_files, &buffer1); 1175 std::vector<uint8_t> buffer2; 1176 deps2.Encode(dex_files, &buffer2); 1177 EXPECT_EQ(buffer1, buffer2); 1178 } 1179 1180 TEST_F(VerifierDepsTest, VerifyDeps) { 1181 VerifyDexFile(); 1182 1183 ASSERT_EQ(1u, NumberOfCompiledDexFiles()); 1184 ASSERT_TRUE(HasEachKindOfRecord()); 1185 1186 // When validating, we create a new class loader, as 1187 // the existing `class_loader_` may contain erroneous classes, 1188 // that ClassLinker::FindClass won't return. 1189 1190 ScopedObjectAccess soa(Thread::Current()); 1191 StackHandleScope<1> hs(soa.Self()); 1192 MutableHandle<mirror::ClassLoader> new_class_loader(hs.NewHandle<mirror::ClassLoader>(nullptr)); 1193 { 1194 new_class_loader.Assign(soa.Decode<mirror::ClassLoader>(LoadDex("VerifierDeps"))); 1195 ASSERT_TRUE(verifier_deps_->ValidateDependencies(new_class_loader, soa.Self())); 1196 } 1197 1198 std::vector<uint8_t> buffer; 1199 verifier_deps_->Encode(dex_files_, &buffer); 1200 ASSERT_FALSE(buffer.empty()); 1201 1202 { 1203 VerifierDeps decoded_deps(dex_files_, ArrayRef<const uint8_t>(buffer)); 1204 new_class_loader.Assign(soa.Decode<mirror::ClassLoader>(LoadDex("VerifierDeps"))); 1205 ASSERT_TRUE(decoded_deps.ValidateDependencies(new_class_loader, soa.Self())); 1206 } 1207 1208 // Fiddle with the dependencies to make sure we catch any change and fail to verify. 1209 1210 { 1211 // Mess up with the assignable_types. 1212 VerifierDeps decoded_deps(dex_files_, ArrayRef<const uint8_t>(buffer)); 1213 VerifierDeps::DexFileDeps* deps = decoded_deps.GetDexFileDeps(*primary_dex_file_); 1214 deps->assignable_types_.insert(*deps->unassignable_types_.begin()); 1215 new_class_loader.Assign(soa.Decode<mirror::ClassLoader>(LoadDex("VerifierDeps"))); 1216 ASSERT_FALSE(decoded_deps.ValidateDependencies(new_class_loader, soa.Self())); 1217 } 1218 1219 { 1220 // Mess up with the unassignable_types. 1221 VerifierDeps decoded_deps(dex_files_, ArrayRef<const uint8_t>(buffer)); 1222 VerifierDeps::DexFileDeps* deps = decoded_deps.GetDexFileDeps(*primary_dex_file_); 1223 deps->unassignable_types_.insert(*deps->assignable_types_.begin()); 1224 new_class_loader.Assign(soa.Decode<mirror::ClassLoader>(LoadDex("VerifierDeps"))); 1225 ASSERT_FALSE(decoded_deps.ValidateDependencies(new_class_loader, soa.Self())); 1226 } 1227 1228 // Mess up with classes. 1229 { 1230 VerifierDeps decoded_deps(dex_files_, ArrayRef<const uint8_t>(buffer)); 1231 VerifierDeps::DexFileDeps* deps = decoded_deps.GetDexFileDeps(*primary_dex_file_); 1232 bool found = false; 1233 for (const auto& entry : deps->classes_) { 1234 if (entry.IsResolved()) { 1235 deps->classes_.insert(VerifierDeps::ClassResolution( 1236 entry.GetDexTypeIndex(), VerifierDeps::kUnresolvedMarker)); 1237 found = true; 1238 break; 1239 } 1240 } 1241 ASSERT_TRUE(found); 1242 new_class_loader.Assign(soa.Decode<mirror::ClassLoader>(LoadDex("VerifierDeps"))); 1243 ASSERT_FALSE(decoded_deps.ValidateDependencies(new_class_loader, soa.Self())); 1244 } 1245 1246 { 1247 VerifierDeps decoded_deps(dex_files_, ArrayRef<const uint8_t>(buffer)); 1248 VerifierDeps::DexFileDeps* deps = decoded_deps.GetDexFileDeps(*primary_dex_file_); 1249 bool found = false; 1250 for (const auto& entry : deps->classes_) { 1251 if (!entry.IsResolved()) { 1252 deps->classes_.insert(VerifierDeps::ClassResolution( 1253 entry.GetDexTypeIndex(), VerifierDeps::kUnresolvedMarker - 1)); 1254 found = true; 1255 break; 1256 } 1257 } 1258 ASSERT_TRUE(found); 1259 new_class_loader.Assign(soa.Decode<mirror::ClassLoader>(LoadDex("VerifierDeps"))); 1260 ASSERT_FALSE(decoded_deps.ValidateDependencies(new_class_loader, soa.Self())); 1261 } 1262 1263 { 1264 VerifierDeps decoded_deps(dex_files_, ArrayRef<const uint8_t>(buffer)); 1265 VerifierDeps::DexFileDeps* deps = decoded_deps.GetDexFileDeps(*primary_dex_file_); 1266 bool found = false; 1267 for (const auto& entry : deps->classes_) { 1268 if (entry.IsResolved()) { 1269 deps->classes_.insert(VerifierDeps::ClassResolution( 1270 entry.GetDexTypeIndex(), entry.GetAccessFlags() - 1)); 1271 found = true; 1272 break; 1273 } 1274 } 1275 ASSERT_TRUE(found); 1276 new_class_loader.Assign(soa.Decode<mirror::ClassLoader>(LoadDex("VerifierDeps"))); 1277 ASSERT_FALSE(decoded_deps.ValidateDependencies(new_class_loader, soa.Self())); 1278 } 1279 1280 // Mess up with fields. 1281 { 1282 VerifierDeps decoded_deps(dex_files_, ArrayRef<const uint8_t>(buffer)); 1283 VerifierDeps::DexFileDeps* deps = decoded_deps.GetDexFileDeps(*primary_dex_file_); 1284 bool found = false; 1285 for (const auto& entry : deps->fields_) { 1286 if (entry.IsResolved()) { 1287 deps->fields_.insert(VerifierDeps::FieldResolution(entry.GetDexFieldIndex(), 1288 VerifierDeps::kUnresolvedMarker, 1289 entry.GetDeclaringClassIndex())); 1290 found = true; 1291 break; 1292 } 1293 } 1294 ASSERT_TRUE(found); 1295 new_class_loader.Assign(soa.Decode<mirror::ClassLoader>(LoadDex("VerifierDeps"))); 1296 ASSERT_FALSE(decoded_deps.ValidateDependencies(new_class_loader, soa.Self())); 1297 } 1298 1299 { 1300 VerifierDeps decoded_deps(dex_files_, ArrayRef<const uint8_t>(buffer)); 1301 VerifierDeps::DexFileDeps* deps = decoded_deps.GetDexFileDeps(*primary_dex_file_); 1302 bool found = false; 1303 for (const auto& entry : deps->fields_) { 1304 if (!entry.IsResolved()) { 1305 constexpr dex::StringIndex kStringIndexZero(0); // We know there is a class there. 1306 deps->fields_.insert(VerifierDeps::FieldResolution(0 /* we know there is a field there */, 1307 VerifierDeps::kUnresolvedMarker - 1, 1308 kStringIndexZero)); 1309 found = true; 1310 break; 1311 } 1312 } 1313 ASSERT_TRUE(found); 1314 new_class_loader.Assign(soa.Decode<mirror::ClassLoader>(LoadDex("VerifierDeps"))); 1315 ASSERT_FALSE(decoded_deps.ValidateDependencies(new_class_loader, soa.Self())); 1316 } 1317 1318 { 1319 VerifierDeps decoded_deps(dex_files_, ArrayRef<const uint8_t>(buffer)); 1320 VerifierDeps::DexFileDeps* deps = decoded_deps.GetDexFileDeps(*primary_dex_file_); 1321 bool found = false; 1322 for (const auto& entry : deps->fields_) { 1323 if (entry.IsResolved()) { 1324 deps->fields_.insert(VerifierDeps::FieldResolution(entry.GetDexFieldIndex(), 1325 entry.GetAccessFlags() - 1, 1326 entry.GetDeclaringClassIndex())); 1327 found = true; 1328 break; 1329 } 1330 } 1331 ASSERT_TRUE(found); 1332 new_class_loader.Assign(soa.Decode<mirror::ClassLoader>(LoadDex("VerifierDeps"))); 1333 ASSERT_FALSE(decoded_deps.ValidateDependencies(new_class_loader, soa.Self())); 1334 } 1335 1336 { 1337 VerifierDeps decoded_deps(dex_files_, ArrayRef<const uint8_t>(buffer)); 1338 VerifierDeps::DexFileDeps* deps = decoded_deps.GetDexFileDeps(*primary_dex_file_); 1339 bool found = false; 1340 for (const auto& entry : deps->fields_) { 1341 constexpr dex::StringIndex kNewTypeIndex(0); 1342 if (entry.GetDeclaringClassIndex() != kNewTypeIndex) { 1343 deps->fields_.insert(VerifierDeps::FieldResolution(entry.GetDexFieldIndex(), 1344 entry.GetAccessFlags(), 1345 kNewTypeIndex)); 1346 found = true; 1347 break; 1348 } 1349 } 1350 ASSERT_TRUE(found); 1351 new_class_loader.Assign(soa.Decode<mirror::ClassLoader>(LoadDex("VerifierDeps"))); 1352 ASSERT_FALSE(decoded_deps.ValidateDependencies(new_class_loader, soa.Self())); 1353 } 1354 1355 // Mess up with methods. 1356 { 1357 VerifierDeps decoded_deps(dex_files_, ArrayRef<const uint8_t>(buffer)); 1358 VerifierDeps::DexFileDeps* deps = decoded_deps.GetDexFileDeps(*primary_dex_file_); 1359 bool found = false; 1360 std::set<VerifierDeps::MethodResolution>* methods = &deps->methods_; 1361 for (const auto& entry : *methods) { 1362 if (entry.IsResolved()) { 1363 methods->insert(VerifierDeps::MethodResolution(entry.GetDexMethodIndex(), 1364 VerifierDeps::kUnresolvedMarker, 1365 entry.GetDeclaringClassIndex())); 1366 found = true; 1367 break; 1368 } 1369 } 1370 ASSERT_TRUE(found); 1371 new_class_loader.Assign(soa.Decode<mirror::ClassLoader>(LoadDex("VerifierDeps"))); 1372 ASSERT_FALSE(decoded_deps.ValidateDependencies(new_class_loader, soa.Self())); 1373 } 1374 1375 { 1376 VerifierDeps decoded_deps(dex_files_, ArrayRef<const uint8_t>(buffer)); 1377 VerifierDeps::DexFileDeps* deps = decoded_deps.GetDexFileDeps(*primary_dex_file_); 1378 bool found = false; 1379 std::set<VerifierDeps::MethodResolution>* methods = &deps->methods_; 1380 for (const auto& entry : *methods) { 1381 if (!entry.IsResolved()) { 1382 constexpr dex::StringIndex kStringIndexZero(0); // We know there is a class there. 1383 methods->insert(VerifierDeps::MethodResolution(0 /* we know there is a method there */, 1384 VerifierDeps::kUnresolvedMarker - 1, 1385 kStringIndexZero)); 1386 found = true; 1387 break; 1388 } 1389 } 1390 ASSERT_TRUE(found); 1391 new_class_loader.Assign(soa.Decode<mirror::ClassLoader>(LoadDex("VerifierDeps"))); 1392 ASSERT_FALSE(decoded_deps.ValidateDependencies(new_class_loader, soa.Self())); 1393 } 1394 1395 { 1396 VerifierDeps decoded_deps(dex_files_, ArrayRef<const uint8_t>(buffer)); 1397 VerifierDeps::DexFileDeps* deps = decoded_deps.GetDexFileDeps(*primary_dex_file_); 1398 bool found = false; 1399 std::set<VerifierDeps::MethodResolution>* methods = &deps->methods_; 1400 for (const auto& entry : *methods) { 1401 if (entry.IsResolved()) { 1402 methods->insert(VerifierDeps::MethodResolution(entry.GetDexMethodIndex(), 1403 entry.GetAccessFlags() - 1, 1404 entry.GetDeclaringClassIndex())); 1405 found = true; 1406 break; 1407 } 1408 } 1409 ASSERT_TRUE(found); 1410 new_class_loader.Assign(soa.Decode<mirror::ClassLoader>(LoadDex("VerifierDeps"))); 1411 ASSERT_FALSE(decoded_deps.ValidateDependencies(new_class_loader, soa.Self())); 1412 } 1413 1414 { 1415 VerifierDeps decoded_deps(dex_files_, ArrayRef<const uint8_t>(buffer)); 1416 VerifierDeps::DexFileDeps* deps = decoded_deps.GetDexFileDeps(*primary_dex_file_); 1417 bool found = false; 1418 std::set<VerifierDeps::MethodResolution>* methods = &deps->methods_; 1419 for (const auto& entry : *methods) { 1420 constexpr dex::StringIndex kNewTypeIndex(0); 1421 if (entry.IsResolved() && entry.GetDeclaringClassIndex() != kNewTypeIndex) { 1422 methods->insert(VerifierDeps::MethodResolution(entry.GetDexMethodIndex(), 1423 entry.GetAccessFlags(), 1424 kNewTypeIndex)); 1425 found = true; 1426 break; 1427 } 1428 } 1429 ASSERT_TRUE(found); 1430 new_class_loader.Assign(soa.Decode<mirror::ClassLoader>(LoadDex("VerifierDeps"))); 1431 ASSERT_FALSE(decoded_deps.ValidateDependencies(new_class_loader, soa.Self())); 1432 } 1433 } 1434 1435 TEST_F(VerifierDepsTest, CompilerDriver) { 1436 SetupCompilerDriver(); 1437 1438 // Test both multi-dex and single-dex configuration. 1439 for (const char* multi : { "MultiDex", static_cast<const char*>(nullptr) }) { 1440 // Test that the compiler driver behaves as expected when the dependencies 1441 // verify and when they don't verify. 1442 for (bool verify_failure : { false, true }) { 1443 { 1444 ScopedObjectAccess soa(Thread::Current()); 1445 LoadDexFile(&soa, "VerifierDeps", multi); 1446 } 1447 VerifyWithCompilerDriver(/* verifier_deps */ nullptr); 1448 1449 std::vector<uint8_t> buffer; 1450 verifier_deps_->Encode(dex_files_, &buffer); 1451 1452 { 1453 ScopedObjectAccess soa(Thread::Current()); 1454 LoadDexFile(&soa, "VerifierDeps", multi); 1455 } 1456 verifier::VerifierDeps decoded_deps(dex_files_, ArrayRef<const uint8_t>(buffer)); 1457 if (verify_failure) { 1458 // Just taint the decoded VerifierDeps with one invalid entry. 1459 VerifierDeps::DexFileDeps* deps = decoded_deps.GetDexFileDeps(*primary_dex_file_); 1460 bool found = false; 1461 for (const auto& entry : deps->classes_) { 1462 if (entry.IsResolved()) { 1463 deps->classes_.insert(VerifierDeps::ClassResolution( 1464 entry.GetDexTypeIndex(), VerifierDeps::kUnresolvedMarker)); 1465 found = true; 1466 break; 1467 } 1468 } 1469 ASSERT_TRUE(found); 1470 } 1471 VerifyWithCompilerDriver(&decoded_deps); 1472 1473 if (verify_failure) { 1474 ASSERT_FALSE(verifier_deps_ == nullptr); 1475 ASSERT_FALSE(verifier_deps_->Equals(decoded_deps)); 1476 } else { 1477 VerifyClassStatus(decoded_deps); 1478 } 1479 } 1480 } 1481 } 1482 1483 TEST_F(VerifierDepsTest, MultiDexVerification) { 1484 VerifyDexFile("VerifierDepsMulti"); 1485 ASSERT_EQ(NumberOfCompiledDexFiles(), 2u); 1486 1487 ASSERT_TRUE(HasUnverifiedClass("LMySoftVerificationFailure;", *dex_files_[1])); 1488 ASSERT_TRUE(HasUnverifiedClass("LMySub1SoftVerificationFailure;", *dex_files_[0])); 1489 ASSERT_TRUE(HasUnverifiedClass("LMySub2SoftVerificationFailure;", *dex_files_[0])); 1490 1491 std::vector<uint8_t> buffer; 1492 verifier_deps_->Encode(dex_files_, &buffer); 1493 ASSERT_FALSE(buffer.empty()); 1494 } 1495 1496 TEST_F(VerifierDepsTest, NotAssignable_InterfaceWithClassInBoot) { 1497 ASSERT_TRUE(TestAssignabilityRecording(/* dst */ "Ljava/lang/Exception;", 1498 /* src */ "LIface;", 1499 /* is_strict */ true, 1500 /* is_assignable */ false)); 1501 ASSERT_TRUE(HasAssignable("Ljava/lang/Exception;", "LIface;", false)); 1502 } 1503 1504 TEST_F(VerifierDepsTest, Assignable_Arrays) { 1505 ASSERT_TRUE(TestAssignabilityRecording(/* dst */ "[LIface;", 1506 /* src */ "[LMyClassExtendingInterface;", 1507 /* is_strict */ false, 1508 /* is_assignable */ true)); 1509 ASSERT_FALSE(HasAssignable( 1510 "LIface;", "LMyClassExtendingInterface;", /* expected_is_assignable */ true)); 1511 ASSERT_FALSE(HasAssignable( 1512 "LIface;", "LMyClassExtendingInterface;", /* expected_is_assignable */ false)); 1513 } 1514 1515 } // namespace verifier 1516 } // namespace art 1517