diff options
author | 2020-04-15 20:02:00 -0700 | |
---|---|---|
committer | 2020-06-25 23:06:30 +0000 | |
commit | a63a2e971079f57d86acd2e736be99fe3f4f4a91 (patch) | |
tree | 0e776f7888f5942145427c6cb888d2e4f36ed930 /runtime/class_loader_context_test.cc | |
parent | b50d453318b2db76d055ae135ebbfc538ed6c19e (diff) |
Search only the current class loader when checking for duplicates
Do not check the entire class loader hierarchy for duplicate dex files
because some use cases might be valid. The most error prone cases are
actually duplicates within the same class loader.
Test: gtest
Bug: 154032843
Change-Id: I8c5efd4b2053a5b4052de6041d561554dddf4780
Merged-In: I8c5efd4b2053a5b4052de6041d561554dddf4780
(cherry picked from commit 86ac525b1f42876518c9040aeaf1a9710cc4332e)
Diffstat (limited to 'runtime/class_loader_context_test.cc')
-rw-r--r-- | runtime/class_loader_context_test.cc | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/runtime/class_loader_context_test.cc b/runtime/class_loader_context_test.cc index ff466c0d96..2447616729 100644 --- a/runtime/class_loader_context_test.cc +++ b/runtime/class_loader_context_test.cc @@ -1637,23 +1637,44 @@ TEST_F(ClassLoaderContextTest, CreateContextForClassLoaderWithSharedLibraries) { ClassLoaderContext::VerificationResult::kVerifies); } -TEST_F(ClassLoaderContextTest, CheckForDuplicateDexFiles) { - jobject class_loader_a = LoadDexInPathClassLoader("Main", nullptr); - jobject class_loader_b = - LoadDexInInMemoryDexClassLoader("MyClass", class_loader_a); +TEST_F(ClassLoaderContextTest, CheckForDuplicateDexFilesNotFoundSingleCL) { + jobject class_loader = LoadDexInPathClassLoader("Main", nullptr); - std::unique_ptr<ClassLoaderContext> context = - CreateContextForClassLoader(class_loader_b); + std::unique_ptr<ClassLoaderContext> context = CreateContextForClassLoader(class_loader); - std::vector<const DexFile*> result = context->CheckForDuplicateDexFiles( + std::set<const DexFile*> result = context->CheckForDuplicateDexFiles( std::vector<const DexFile*>()); ASSERT_EQ(0u, result.size()); - std::vector<std::unique_ptr<const DexFile>> dex1 = OpenTestDexFiles("Main"); + std::vector<std::unique_ptr<const DexFile>> dex1 = OpenTestDexFiles("ForClassLoaderA"); std::vector<const DexFile*> dex1_raw = MakeNonOwningPointerVector(dex1); result = context->CheckForDuplicateDexFiles(dex1_raw); - ASSERT_EQ(1u, result.size()); - ASSERT_EQ(dex1_raw[0], result[0]); + ASSERT_EQ(0u, result.size()); +} + +TEST_F(ClassLoaderContextTest, CheckForDuplicateDexFilesFound) { + jobject class_loader = LoadDexInPathClassLoader(std::vector<std::string> { "Main", "Main" }, nullptr); + + std::unique_ptr<ClassLoaderContext> context = CreateContextForClassLoader(class_loader); + + std::vector<std::unique_ptr<const DexFile>> dex1 = OpenTestDexFiles("Main"); + std::vector<const DexFile*> dex1_raw = MakeNonOwningPointerVector(dex1); + std::set<const DexFile*> result = context->CheckForDuplicateDexFiles(dex1_raw); + ASSERT_EQ(1u, result.size()) << context->EncodeContextForOatFile(""); + ASSERT_EQ(dex1_raw[0], *(result.begin())); +} + + +TEST_F(ClassLoaderContextTest, CheckForDuplicateCrossCLNotFound) { + jobject class_loader_a = LoadDexInPathClassLoader("ForClassLoaderA", nullptr); + jobject class_loader_b = LoadDexInInMemoryDexClassLoader("ForClassLoaderB", class_loader_a); + + std::unique_ptr<ClassLoaderContext> context = CreateContextForClassLoader(class_loader_b); + + std::vector<std::unique_ptr<const DexFile>> dex1 = OpenTestDexFiles("ForClassLoaderA"); + std::vector<const DexFile*> dex1_raw = MakeNonOwningPointerVector(dex1); + std::set<const DexFile*> result = context->CheckForDuplicateDexFiles(dex1_raw); + ASSERT_EQ(0u, result.size()); } } // namespace art |