summaryrefslogtreecommitdiff
path: root/runtime/class_loader_context_test.cc
diff options
context:
space:
mode:
author Calin Juravle <calin@google.com> 2020-04-15 20:02:00 -0700
committer Treehugger Robot <treehugger-gerrit@google.com> 2020-06-25 23:06:30 +0000
commita63a2e971079f57d86acd2e736be99fe3f4f4a91 (patch)
tree0e776f7888f5942145427c6cb888d2e4f36ed930 /runtime/class_loader_context_test.cc
parentb50d453318b2db76d055ae135ebbfc538ed6c19e (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.cc41
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