xref: /aosp_15_r20/art/runtime/class_loader_context_test.cc (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #include "class_loader_context.h"
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
20*795d594fSAndroid Build Coastguard Worker 
21*795d594fSAndroid Build Coastguard Worker #include <filesystem>
22*795d594fSAndroid Build Coastguard Worker #include <fstream>
23*795d594fSAndroid Build Coastguard Worker #include <optional>
24*795d594fSAndroid Build Coastguard Worker #include <vector>
25*795d594fSAndroid Build Coastguard Worker 
26*795d594fSAndroid Build Coastguard Worker #include "android-base/stringprintf.h"
27*795d594fSAndroid Build Coastguard Worker #include "android-base/strings.h"
28*795d594fSAndroid Build Coastguard Worker #include "art_field-inl.h"
29*795d594fSAndroid Build Coastguard Worker #include "art_method-alloc-inl.h"
30*795d594fSAndroid Build Coastguard Worker #include "base/dchecked_vector.h"
31*795d594fSAndroid Build Coastguard Worker #include "base/stl_util.h"
32*795d594fSAndroid Build Coastguard Worker #include "class_linker.h"
33*795d594fSAndroid Build Coastguard Worker #include "class_root-inl.h"
34*795d594fSAndroid Build Coastguard Worker #include "common_runtime_test.h"
35*795d594fSAndroid Build Coastguard Worker #include "dex/dex_file.h"
36*795d594fSAndroid Build Coastguard Worker #include "handle_scope-inl.h"
37*795d594fSAndroid Build Coastguard Worker #include "jni/jni_internal.h"
38*795d594fSAndroid Build Coastguard Worker #include "mirror/class.h"
39*795d594fSAndroid Build Coastguard Worker #include "mirror/class_loader-inl.h"
40*795d594fSAndroid Build Coastguard Worker #include "mirror/object-inl.h"
41*795d594fSAndroid Build Coastguard Worker #include "mirror/object_array-alloc-inl.h"
42*795d594fSAndroid Build Coastguard Worker #include "oat/oat_file_assistant.h"
43*795d594fSAndroid Build Coastguard Worker #include "runtime.h"
44*795d594fSAndroid Build Coastguard Worker #include "scoped_thread_state_change-inl.h"
45*795d594fSAndroid Build Coastguard Worker #include "thread.h"
46*795d594fSAndroid Build Coastguard Worker #include "well_known_classes-inl.h"
47*795d594fSAndroid Build Coastguard Worker 
48*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
49*795d594fSAndroid Build Coastguard Worker 
50*795d594fSAndroid Build Coastguard Worker class ClassLoaderContextTest : public CommonRuntimeTest {
51*795d594fSAndroid Build Coastguard Worker  public:
ClassLoaderContextTest()52*795d594fSAndroid Build Coastguard Worker   ClassLoaderContextTest() {
53*795d594fSAndroid Build Coastguard Worker     use_boot_image_ = true;  // Make the Runtime creation cheaper.
54*795d594fSAndroid Build Coastguard Worker   }
55*795d594fSAndroid Build Coastguard Worker 
SetUp()56*795d594fSAndroid Build Coastguard Worker   void SetUp() override {
57*795d594fSAndroid Build Coastguard Worker     CommonRuntimeTest::SetUp();
58*795d594fSAndroid Build Coastguard Worker     scratch_dir_ = std::make_unique<ScratchDir>();
59*795d594fSAndroid Build Coastguard Worker     scratch_path_ = scratch_dir_->GetPath();
60*795d594fSAndroid Build Coastguard Worker     // Remove the trailing '/';
61*795d594fSAndroid Build Coastguard Worker     scratch_path_.resize(scratch_path_.length() - 1);
62*795d594fSAndroid Build Coastguard Worker   }
63*795d594fSAndroid Build Coastguard Worker 
TearDown()64*795d594fSAndroid Build Coastguard Worker   void TearDown() override {
65*795d594fSAndroid Build Coastguard Worker     scratch_dir_.reset();
66*795d594fSAndroid Build Coastguard Worker     CommonRuntimeTest::TearDown();
67*795d594fSAndroid Build Coastguard Worker   }
68*795d594fSAndroid Build Coastguard Worker 
VerifyContextSize(ClassLoaderContext * context,size_t expected_size)69*795d594fSAndroid Build Coastguard Worker   void VerifyContextSize(ClassLoaderContext* context, size_t expected_size) {
70*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(context != nullptr);
71*795d594fSAndroid Build Coastguard Worker     ASSERT_EQ(expected_size, context->GetParentChainSize());
72*795d594fSAndroid Build Coastguard Worker   }
73*795d594fSAndroid Build Coastguard Worker 
VerifyClassLoaderPCL(ClassLoaderContext * context,size_t index,const std::string & classpath)74*795d594fSAndroid Build Coastguard Worker   void VerifyClassLoaderPCL(ClassLoaderContext* context,
75*795d594fSAndroid Build Coastguard Worker                             size_t index,
76*795d594fSAndroid Build Coastguard Worker                             const std::string& classpath) {
77*795d594fSAndroid Build Coastguard Worker     VerifyClassLoaderInfo(
78*795d594fSAndroid Build Coastguard Worker         context, index, ClassLoaderContext::kPathClassLoader, classpath);
79*795d594fSAndroid Build Coastguard Worker   }
80*795d594fSAndroid Build Coastguard Worker 
VerifyClassLoaderDLC(ClassLoaderContext * context,size_t index,const std::string & classpath)81*795d594fSAndroid Build Coastguard Worker   void VerifyClassLoaderDLC(ClassLoaderContext* context,
82*795d594fSAndroid Build Coastguard Worker                             size_t index,
83*795d594fSAndroid Build Coastguard Worker                             const std::string& classpath) {
84*795d594fSAndroid Build Coastguard Worker     VerifyClassLoaderInfo(
85*795d594fSAndroid Build Coastguard Worker         context, index, ClassLoaderContext::kDelegateLastClassLoader, classpath);
86*795d594fSAndroid Build Coastguard Worker   }
87*795d594fSAndroid Build Coastguard Worker 
VerifyClassLoaderIMC(ClassLoaderContext * context,size_t index,const std::string & classpath)88*795d594fSAndroid Build Coastguard Worker   void VerifyClassLoaderIMC(ClassLoaderContext* context,
89*795d594fSAndroid Build Coastguard Worker                             size_t index,
90*795d594fSAndroid Build Coastguard Worker                             const std::string& classpath) {
91*795d594fSAndroid Build Coastguard Worker     VerifyClassLoaderInfo(
92*795d594fSAndroid Build Coastguard Worker         context, index, ClassLoaderContext::kInMemoryDexClassLoader, classpath);
93*795d594fSAndroid Build Coastguard Worker   }
94*795d594fSAndroid Build Coastguard Worker 
VerifyClassLoaderSharedLibraryPCL(ClassLoaderContext * context,size_t loader_index,size_t shared_library_index,const std::string & classpath)95*795d594fSAndroid Build Coastguard Worker   void VerifyClassLoaderSharedLibraryPCL(ClassLoaderContext* context,
96*795d594fSAndroid Build Coastguard Worker                                          size_t loader_index,
97*795d594fSAndroid Build Coastguard Worker                                          size_t shared_library_index,
98*795d594fSAndroid Build Coastguard Worker                                          const std::string& classpath) {
99*795d594fSAndroid Build Coastguard Worker     VerifyClassLoaderInfoSL(
100*795d594fSAndroid Build Coastguard Worker         context, loader_index, shared_library_index, ClassLoaderContext::kPathClassLoader,
101*795d594fSAndroid Build Coastguard Worker         classpath);
102*795d594fSAndroid Build Coastguard Worker   }
103*795d594fSAndroid Build Coastguard Worker 
VerifyClassLoaderSharedLibraryPCLAfter(ClassLoaderContext * context,size_t loader_index,size_t shared_library_index,const std::string & classpath)104*795d594fSAndroid Build Coastguard Worker   void VerifyClassLoaderSharedLibraryPCLAfter(ClassLoaderContext* context,
105*795d594fSAndroid Build Coastguard Worker                                               size_t loader_index,
106*795d594fSAndroid Build Coastguard Worker                                               size_t shared_library_index,
107*795d594fSAndroid Build Coastguard Worker                                               const std::string& classpath) {
108*795d594fSAndroid Build Coastguard Worker     VerifyClassLoaderInfoSLAfter(
109*795d594fSAndroid Build Coastguard Worker         context, loader_index, shared_library_index, ClassLoaderContext::kPathClassLoader,
110*795d594fSAndroid Build Coastguard Worker         classpath);
111*795d594fSAndroid Build Coastguard Worker   }
112*795d594fSAndroid Build Coastguard Worker 
VerifyClassLoaderSharedLibraryIMC(ClassLoaderContext * context,size_t loader_index,size_t shared_library_index,const std::string & classpath)113*795d594fSAndroid Build Coastguard Worker   void VerifyClassLoaderSharedLibraryIMC(ClassLoaderContext* context,
114*795d594fSAndroid Build Coastguard Worker                                          size_t loader_index,
115*795d594fSAndroid Build Coastguard Worker                                          size_t shared_library_index,
116*795d594fSAndroid Build Coastguard Worker                                          const std::string& classpath) {
117*795d594fSAndroid Build Coastguard Worker     VerifyClassLoaderInfoSL(
118*795d594fSAndroid Build Coastguard Worker         context, loader_index, shared_library_index, ClassLoaderContext::kInMemoryDexClassLoader,
119*795d594fSAndroid Build Coastguard Worker         classpath);
120*795d594fSAndroid Build Coastguard Worker   }
121*795d594fSAndroid Build Coastguard Worker 
VerifySharedLibrariesSize(ClassLoaderContext * context,size_t loader_index,size_t expected_size)122*795d594fSAndroid Build Coastguard Worker   void VerifySharedLibrariesSize(ClassLoaderContext* context,
123*795d594fSAndroid Build Coastguard Worker                                  size_t loader_index,
124*795d594fSAndroid Build Coastguard Worker                                  size_t expected_size) {
125*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(context != nullptr);
126*795d594fSAndroid Build Coastguard Worker     ASSERT_GT(context->GetParentChainSize(), loader_index);
127*795d594fSAndroid Build Coastguard Worker     const ClassLoaderContext::ClassLoaderInfo& info = *context->GetParent(loader_index);
128*795d594fSAndroid Build Coastguard Worker     ASSERT_EQ(info.shared_libraries.size(), expected_size);
129*795d594fSAndroid Build Coastguard Worker   }
130*795d594fSAndroid Build Coastguard Worker 
VerifyClassLoaderSharedLibraryDLC(ClassLoaderContext * context,size_t loader_index,size_t shared_library_index,const std::string & classpath)131*795d594fSAndroid Build Coastguard Worker   void VerifyClassLoaderSharedLibraryDLC(ClassLoaderContext* context,
132*795d594fSAndroid Build Coastguard Worker                                          size_t loader_index,
133*795d594fSAndroid Build Coastguard Worker                                          size_t shared_library_index,
134*795d594fSAndroid Build Coastguard Worker                                          const std::string& classpath) {
135*795d594fSAndroid Build Coastguard Worker     VerifyClassLoaderInfoSL(
136*795d594fSAndroid Build Coastguard Worker         context, loader_index, shared_library_index, ClassLoaderContext::kDelegateLastClassLoader,
137*795d594fSAndroid Build Coastguard Worker         classpath);
138*795d594fSAndroid Build Coastguard Worker   }
139*795d594fSAndroid Build Coastguard Worker 
VerifyClassLoaderPCLFromTestDex(ClassLoaderContext * context,size_t index,const std::string & test_name)140*795d594fSAndroid Build Coastguard Worker   void VerifyClassLoaderPCLFromTestDex(ClassLoaderContext* context,
141*795d594fSAndroid Build Coastguard Worker                                        size_t index,
142*795d594fSAndroid Build Coastguard Worker                                        const std::string& test_name) {
143*795d594fSAndroid Build Coastguard Worker     VerifyClassLoaderFromTestDex(
144*795d594fSAndroid Build Coastguard Worker         context, index, ClassLoaderContext::kPathClassLoader, test_name);
145*795d594fSAndroid Build Coastguard Worker   }
146*795d594fSAndroid Build Coastguard Worker 
VerifyClassLoaderDLCFromTestDex(ClassLoaderContext * context,size_t index,const std::string & test_name)147*795d594fSAndroid Build Coastguard Worker   void VerifyClassLoaderDLCFromTestDex(ClassLoaderContext* context,
148*795d594fSAndroid Build Coastguard Worker                                        size_t index,
149*795d594fSAndroid Build Coastguard Worker                                        const std::string& test_name) {
150*795d594fSAndroid Build Coastguard Worker     VerifyClassLoaderFromTestDex(
151*795d594fSAndroid Build Coastguard Worker         context, index, ClassLoaderContext::kDelegateLastClassLoader, test_name);
152*795d594fSAndroid Build Coastguard Worker   }
153*795d594fSAndroid Build Coastguard Worker 
VerifyClassLoaderIMCFromTestDex(ClassLoaderContext * context,size_t index,const std::string & test_name)154*795d594fSAndroid Build Coastguard Worker   void VerifyClassLoaderIMCFromTestDex(ClassLoaderContext* context,
155*795d594fSAndroid Build Coastguard Worker                                        size_t index,
156*795d594fSAndroid Build Coastguard Worker                                        const std::string& test_name) {
157*795d594fSAndroid Build Coastguard Worker     VerifyClassLoaderFromTestDex(
158*795d594fSAndroid Build Coastguard Worker         context, index, ClassLoaderContext::kInMemoryDexClassLoader, test_name, "<unknown>");
159*795d594fSAndroid Build Coastguard Worker   }
160*795d594fSAndroid Build Coastguard Worker 
161*795d594fSAndroid Build Coastguard Worker   enum class LocationCheck {
162*795d594fSAndroid Build Coastguard Worker     kEquals,
163*795d594fSAndroid Build Coastguard Worker     kEndsWith
164*795d594fSAndroid Build Coastguard Worker   };
165*795d594fSAndroid Build Coastguard Worker   enum class BaseLocationCheck {
166*795d594fSAndroid Build Coastguard Worker     kEquals,
167*795d594fSAndroid Build Coastguard Worker     kEndsWith
168*795d594fSAndroid Build Coastguard Worker   };
169*795d594fSAndroid Build Coastguard Worker 
IsAbsoluteLocation(const std::string & location)170*795d594fSAndroid Build Coastguard Worker   static bool IsAbsoluteLocation(const std::string& location) {
171*795d594fSAndroid Build Coastguard Worker     return !location.empty() && location[0] == '/';
172*795d594fSAndroid Build Coastguard Worker   }
173*795d594fSAndroid Build Coastguard Worker 
VerifyOpenDexFiles(ClassLoaderContext * context,size_t index,std::vector<std::unique_ptr<const DexFile>> * all_dex_files,bool classpath_matches_dex_location=true,bool only_read_checksums=false)174*795d594fSAndroid Build Coastguard Worker   void VerifyOpenDexFiles(
175*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext* context,
176*795d594fSAndroid Build Coastguard Worker       size_t index,
177*795d594fSAndroid Build Coastguard Worker       std::vector<std::unique_ptr<const DexFile>>* all_dex_files,
178*795d594fSAndroid Build Coastguard Worker       bool classpath_matches_dex_location = true,
179*795d594fSAndroid Build Coastguard Worker       bool only_read_checksums = false) {
180*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(context != nullptr);
181*795d594fSAndroid Build Coastguard Worker     if (only_read_checksums) {
182*795d594fSAndroid Build Coastguard Worker       ASSERT_EQ(context->dex_files_state_,
183*795d594fSAndroid Build Coastguard Worker                 ClassLoaderContext::ContextDexFilesState::kDexFilesChecksumsRead);
184*795d594fSAndroid Build Coastguard Worker     } else {
185*795d594fSAndroid Build Coastguard Worker       ASSERT_EQ(context->dex_files_state_,
186*795d594fSAndroid Build Coastguard Worker                 ClassLoaderContext::ContextDexFilesState::kDexFilesOpened);
187*795d594fSAndroid Build Coastguard Worker     }
188*795d594fSAndroid Build Coastguard Worker     ClassLoaderContext::ClassLoaderInfo& info = *context->GetParent(index);
189*795d594fSAndroid Build Coastguard Worker 
190*795d594fSAndroid Build Coastguard Worker     std::vector<const DexFile*> primary_dex_files;
191*795d594fSAndroid Build Coastguard Worker     std::vector<std::optional<uint32_t>> primary_checksums;
192*795d594fSAndroid Build Coastguard Worker     for (size_t i = 0; i < all_dex_files->size();) {
193*795d594fSAndroid Build Coastguard Worker       primary_dex_files.push_back((*all_dex_files)[i].get());
194*795d594fSAndroid Build Coastguard Worker       primary_checksums.push_back(DexFileLoader::GetMultiDexChecksum(*all_dex_files, &i));
195*795d594fSAndroid Build Coastguard Worker     }
196*795d594fSAndroid Build Coastguard Worker     ASSERT_EQ(primary_dex_files.size(), info.classpath.size());
197*795d594fSAndroid Build Coastguard Worker     ASSERT_EQ(primary_dex_files.size(), info.checksums.size());
198*795d594fSAndroid Build Coastguard Worker 
199*795d594fSAndroid Build Coastguard Worker     if (only_read_checksums) {
200*795d594fSAndroid Build Coastguard Worker       ASSERT_EQ(0u, info.opened_dex_files.size());
201*795d594fSAndroid Build Coastguard Worker       for (size_t k = 0; k < primary_dex_files.size(); k++) {
202*795d594fSAndroid Build Coastguard Worker         const std::string& opened_location = info.classpath[k];
203*795d594fSAndroid Build Coastguard Worker         uint32_t opened_checksum = info.checksums[k];
204*795d594fSAndroid Build Coastguard Worker 
205*795d594fSAndroid Build Coastguard Worker         const DexFile* expected_dex_file = primary_dex_files[k];
206*795d594fSAndroid Build Coastguard Worker         std::string expected_location = expected_dex_file->GetLocation();
207*795d594fSAndroid Build Coastguard Worker 
208*795d594fSAndroid Build Coastguard Worker         if (!IsAbsoluteLocation(opened_location)) {
209*795d594fSAndroid Build Coastguard Worker           // If the opened location is relative (it was open from a relative path without a
210*795d594fSAndroid Build Coastguard Worker           // classpath_dir) it might not match the expected location which is absolute in tests).
211*795d594fSAndroid Build Coastguard Worker           // So we compare the endings (the checksum will validate it's actually the same file).
212*795d594fSAndroid Build Coastguard Worker           ASSERT_TRUE(expected_location.ends_with(opened_location))
213*795d594fSAndroid Build Coastguard Worker               << expected_location << " " << opened_location;
214*795d594fSAndroid Build Coastguard Worker         } else {
215*795d594fSAndroid Build Coastguard Worker           ASSERT_EQ(expected_location, opened_location);
216*795d594fSAndroid Build Coastguard Worker         }
217*795d594fSAndroid Build Coastguard Worker         ASSERT_EQ(primary_checksums[k], opened_checksum);
218*795d594fSAndroid Build Coastguard Worker         if (classpath_matches_dex_location) {
219*795d594fSAndroid Build Coastguard Worker           ASSERT_EQ(info.classpath[k], opened_location);
220*795d594fSAndroid Build Coastguard Worker         }
221*795d594fSAndroid Build Coastguard Worker       }
222*795d594fSAndroid Build Coastguard Worker     } else {
223*795d594fSAndroid Build Coastguard Worker       ASSERT_EQ(all_dex_files->size(), info.opened_dex_files.size());
224*795d594fSAndroid Build Coastguard Worker 
225*795d594fSAndroid Build Coastguard Worker       for (size_t k = 0; k < all_dex_files->size(); k++) {
226*795d594fSAndroid Build Coastguard Worker         const std::string& opened_location = info.opened_dex_files[k]->GetLocation();
227*795d594fSAndroid Build Coastguard Worker         uint32_t opened_checksum = info.opened_dex_files[k]->GetLocationChecksum();
228*795d594fSAndroid Build Coastguard Worker 
229*795d594fSAndroid Build Coastguard Worker         std::unique_ptr<const DexFile>& expected_dex_file = (*all_dex_files)[k];
230*795d594fSAndroid Build Coastguard Worker         std::string expected_location = expected_dex_file->GetLocation();
231*795d594fSAndroid Build Coastguard Worker 
232*795d594fSAndroid Build Coastguard Worker         if (!IsAbsoluteLocation(opened_location)) {
233*795d594fSAndroid Build Coastguard Worker           // If the opened location is relative (it was open from a relative path without a
234*795d594fSAndroid Build Coastguard Worker           // classpath_dir) it might not match the expected location which is absolute in tests).
235*795d594fSAndroid Build Coastguard Worker           // So we compare the endings (the checksum will validate it's actually the same file).
236*795d594fSAndroid Build Coastguard Worker           ASSERT_TRUE(expected_location.ends_with(opened_location))
237*795d594fSAndroid Build Coastguard Worker               << expected_location << " " << opened_location;
238*795d594fSAndroid Build Coastguard Worker         } else {
239*795d594fSAndroid Build Coastguard Worker           ASSERT_EQ(expected_location, opened_location);
240*795d594fSAndroid Build Coastguard Worker         }
241*795d594fSAndroid Build Coastguard Worker         ASSERT_EQ(expected_dex_file->GetLocationChecksum(), opened_checksum);
242*795d594fSAndroid Build Coastguard Worker         if (classpath_matches_dex_location) {
243*795d594fSAndroid Build Coastguard Worker           ASSERT_EQ(info.classpath[k], opened_location);
244*795d594fSAndroid Build Coastguard Worker         }
245*795d594fSAndroid Build Coastguard Worker       }
246*795d594fSAndroid Build Coastguard Worker     }
247*795d594fSAndroid Build Coastguard Worker   }
248*795d594fSAndroid Build Coastguard Worker 
CreateContextForClassLoader(jobject class_loader)249*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> CreateContextForClassLoader(jobject class_loader) {
250*795d594fSAndroid Build Coastguard Worker     return ClassLoaderContext::CreateContextForClassLoader(class_loader, nullptr);
251*795d594fSAndroid Build Coastguard Worker   }
252*795d594fSAndroid Build Coastguard Worker 
ParseContextWithChecksums(const std::string & context_spec)253*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> ParseContextWithChecksums(const std::string& context_spec) {
254*795d594fSAndroid Build Coastguard Worker     std::unique_ptr<ClassLoaderContext> context(new ClassLoaderContext());
255*795d594fSAndroid Build Coastguard Worker     if (!context->Parse(context_spec, /*parse_checksums=*/ true)) {
256*795d594fSAndroid Build Coastguard Worker       return nullptr;
257*795d594fSAndroid Build Coastguard Worker     }
258*795d594fSAndroid Build Coastguard Worker     return context;
259*795d594fSAndroid Build Coastguard Worker   }
260*795d594fSAndroid Build Coastguard Worker 
VerifyContextForClassLoader(ClassLoaderContext * context)261*795d594fSAndroid Build Coastguard Worker   void VerifyContextForClassLoader(ClassLoaderContext* context) {
262*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(context != nullptr);
263*795d594fSAndroid Build Coastguard Worker     ASSERT_EQ(context->dex_files_state_, ClassLoaderContext::ContextDexFilesState::kDexFilesOpened);
264*795d594fSAndroid Build Coastguard Worker     ASSERT_FALSE(context->owns_the_dex_files_);
265*795d594fSAndroid Build Coastguard Worker   }
266*795d594fSAndroid Build Coastguard Worker 
VerifyClassLoaderDexFiles(Thread * self,Handle<mirror::ClassLoader> class_loader,ObjPtr<mirror::Class> type,std::vector<const DexFile * > & expected_dex_files)267*795d594fSAndroid Build Coastguard Worker   void VerifyClassLoaderDexFiles(Thread* self,
268*795d594fSAndroid Build Coastguard Worker                                  Handle<mirror::ClassLoader> class_loader,
269*795d594fSAndroid Build Coastguard Worker                                  ObjPtr<mirror::Class> type,
270*795d594fSAndroid Build Coastguard Worker                                  std::vector<const DexFile*>& expected_dex_files)
271*795d594fSAndroid Build Coastguard Worker       REQUIRES_SHARED(Locks::mutator_lock_) {
272*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(class_loader->GetClass() == type);
273*795d594fSAndroid Build Coastguard Worker 
274*795d594fSAndroid Build Coastguard Worker     std::vector<const DexFile*> class_loader_dex_files = GetDexFiles(self, class_loader);
275*795d594fSAndroid Build Coastguard Worker     ASSERT_EQ(expected_dex_files.size(), class_loader_dex_files.size());
276*795d594fSAndroid Build Coastguard Worker 
277*795d594fSAndroid Build Coastguard Worker     for (size_t i = 0; i < expected_dex_files.size(); i++) {
278*795d594fSAndroid Build Coastguard Worker       ASSERT_EQ(expected_dex_files[i]->GetLocation(),
279*795d594fSAndroid Build Coastguard Worker                 class_loader_dex_files[i]->GetLocation());
280*795d594fSAndroid Build Coastguard Worker       ASSERT_EQ(expected_dex_files[i]->GetLocationChecksum(),
281*795d594fSAndroid Build Coastguard Worker                 class_loader_dex_files[i]->GetLocationChecksum());
282*795d594fSAndroid Build Coastguard Worker     }
283*795d594fSAndroid Build Coastguard Worker   }
284*795d594fSAndroid Build Coastguard Worker 
PretendContextOpenedDexFiles(ClassLoaderContext * context)285*795d594fSAndroid Build Coastguard Worker   void PretendContextOpenedDexFiles(ClassLoaderContext* context) {
286*795d594fSAndroid Build Coastguard Worker     context->dex_files_state_ = ClassLoaderContext::ContextDexFilesState::kDexFilesOpened;
287*795d594fSAndroid Build Coastguard Worker   }
288*795d594fSAndroid Build Coastguard Worker 
PretendContextOpenedDexFilesForChecksums(ClassLoaderContext * context)289*795d594fSAndroid Build Coastguard Worker   void PretendContextOpenedDexFilesForChecksums(ClassLoaderContext* context) {
290*795d594fSAndroid Build Coastguard Worker     context->dex_files_state_ = ClassLoaderContext::ContextDexFilesState::kDexFilesChecksumsRead;
291*795d594fSAndroid Build Coastguard Worker   }
292*795d594fSAndroid Build Coastguard Worker 
TestOpenDexFiles(bool only_read_checksums)293*795d594fSAndroid Build Coastguard Worker   void TestOpenDexFiles(bool only_read_checksums) {
294*795d594fSAndroid Build Coastguard Worker     std::string multidex_name = GetTestDexFileName("MultiDex");
295*795d594fSAndroid Build Coastguard Worker     std::string myclass_dex_name = GetTestDexFileName("MyClass");
296*795d594fSAndroid Build Coastguard Worker     std::string dex_name = GetTestDexFileName("Main");
297*795d594fSAndroid Build Coastguard Worker 
298*795d594fSAndroid Build Coastguard Worker     std::unique_ptr<ClassLoaderContext> context =
299*795d594fSAndroid Build Coastguard Worker         ClassLoaderContext::Create(
300*795d594fSAndroid Build Coastguard Worker             "PCL[" + multidex_name + ":" + myclass_dex_name + "];" +
301*795d594fSAndroid Build Coastguard Worker             "DLC[" + dex_name + "]");
302*795d594fSAndroid Build Coastguard Worker 
303*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(context->OpenDexFiles(
304*795d594fSAndroid Build Coastguard Worker         /*classpath_dir=*/ "",
305*795d594fSAndroid Build Coastguard Worker         /*context_fds=*/ std::vector<int>(),
306*795d594fSAndroid Build Coastguard Worker         only_read_checksums));
307*795d594fSAndroid Build Coastguard Worker 
308*795d594fSAndroid Build Coastguard Worker     VerifyContextSize(context.get(), 2);
309*795d594fSAndroid Build Coastguard Worker 
310*795d594fSAndroid Build Coastguard Worker     std::vector<std::unique_ptr<const DexFile>> all_dex_files0 = OpenTestDexFiles("MultiDex");
311*795d594fSAndroid Build Coastguard Worker     std::vector<std::unique_ptr<const DexFile>> myclass_dex_files = OpenTestDexFiles("MyClass");
312*795d594fSAndroid Build Coastguard Worker     for (size_t i = 0; i < myclass_dex_files.size(); i++) {
313*795d594fSAndroid Build Coastguard Worker       all_dex_files0.emplace_back(myclass_dex_files[i].release());
314*795d594fSAndroid Build Coastguard Worker     }
315*795d594fSAndroid Build Coastguard Worker     VerifyOpenDexFiles(context.get(),
316*795d594fSAndroid Build Coastguard Worker                        /*index=*/ 0,
317*795d594fSAndroid Build Coastguard Worker                        &all_dex_files0,
318*795d594fSAndroid Build Coastguard Worker                        /*classpath_matches_dex_location=*/ false,
319*795d594fSAndroid Build Coastguard Worker                        only_read_checksums);
320*795d594fSAndroid Build Coastguard Worker     std::vector<std::unique_ptr<const DexFile>> all_dex_files1 = OpenTestDexFiles("Main");
321*795d594fSAndroid Build Coastguard Worker     VerifyOpenDexFiles(context.get(),
322*795d594fSAndroid Build Coastguard Worker                        /*index=*/ 1,
323*795d594fSAndroid Build Coastguard Worker                        &all_dex_files1,
324*795d594fSAndroid Build Coastguard Worker                        /*classpath_matches_dex_location=*/ false,
325*795d594fSAndroid Build Coastguard Worker                        only_read_checksums);
326*795d594fSAndroid Build Coastguard Worker   }
327*795d594fSAndroid Build Coastguard Worker 
TestOpenValidDexFilesRelative(bool use_classpath_dir,bool only_read_checksums)328*795d594fSAndroid Build Coastguard Worker   void TestOpenValidDexFilesRelative(bool use_classpath_dir, bool only_read_checksums) {
329*795d594fSAndroid Build Coastguard Worker     char cwd_buf[4096];
330*795d594fSAndroid Build Coastguard Worker     if (getcwd(cwd_buf, arraysize(cwd_buf)) == nullptr) {
331*795d594fSAndroid Build Coastguard Worker       PLOG(FATAL) << "Could not get working directory";
332*795d594fSAndroid Build Coastguard Worker     }
333*795d594fSAndroid Build Coastguard Worker     std::string multidex_name;
334*795d594fSAndroid Build Coastguard Worker     std::string myclass_dex_name;
335*795d594fSAndroid Build Coastguard Worker     std::string dex_name;
336*795d594fSAndroid Build Coastguard Worker     if (!CreateRelativeString(GetTestDexFileName("MultiDex"), cwd_buf, &multidex_name) ||
337*795d594fSAndroid Build Coastguard Worker         !CreateRelativeString(GetTestDexFileName("MyClass"), cwd_buf, &myclass_dex_name) ||
338*795d594fSAndroid Build Coastguard Worker         !CreateRelativeString(GetTestDexFileName("Main"), cwd_buf, &dex_name)) {
339*795d594fSAndroid Build Coastguard Worker       LOG(ERROR) << "Test OpenValidDexFilesRelative cannot be run because target dex files have no "
340*795d594fSAndroid Build Coastguard Worker                 << "relative path.";
341*795d594fSAndroid Build Coastguard Worker       SUCCEED();
342*795d594fSAndroid Build Coastguard Worker       return;
343*795d594fSAndroid Build Coastguard Worker     }
344*795d594fSAndroid Build Coastguard Worker 
345*795d594fSAndroid Build Coastguard Worker     std::unique_ptr<ClassLoaderContext> context =
346*795d594fSAndroid Build Coastguard Worker         ClassLoaderContext::Create(
347*795d594fSAndroid Build Coastguard Worker             "PCL[" + multidex_name + ":" + myclass_dex_name + "];" +
348*795d594fSAndroid Build Coastguard Worker             "DLC[" + dex_name + "]");
349*795d594fSAndroid Build Coastguard Worker 
350*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(context->OpenDexFiles(
351*795d594fSAndroid Build Coastguard Worker         /*classpath_dir=*/ use_classpath_dir ? cwd_buf : "",
352*795d594fSAndroid Build Coastguard Worker         /*context_fds=*/ std::vector<int>(),
353*795d594fSAndroid Build Coastguard Worker         only_read_checksums));
354*795d594fSAndroid Build Coastguard Worker     VerifyContextSize(context.get(), 2);
355*795d594fSAndroid Build Coastguard Worker 
356*795d594fSAndroid Build Coastguard Worker     std::vector<std::unique_ptr<const DexFile>> all_dex_files0 = OpenTestDexFiles("MultiDex");
357*795d594fSAndroid Build Coastguard Worker     std::vector<std::unique_ptr<const DexFile>> myclass_dex_files = OpenTestDexFiles("MyClass");
358*795d594fSAndroid Build Coastguard Worker     for (size_t i = 0; i < myclass_dex_files.size(); i++) {
359*795d594fSAndroid Build Coastguard Worker       all_dex_files0.emplace_back(myclass_dex_files[i].release());
360*795d594fSAndroid Build Coastguard Worker     }
361*795d594fSAndroid Build Coastguard Worker     VerifyOpenDexFiles(context.get(),
362*795d594fSAndroid Build Coastguard Worker                        /*index=*/ 0,
363*795d594fSAndroid Build Coastguard Worker                        &all_dex_files0,
364*795d594fSAndroid Build Coastguard Worker                        /*classpath_matches_dex_location=*/ false,
365*795d594fSAndroid Build Coastguard Worker                        only_read_checksums);
366*795d594fSAndroid Build Coastguard Worker 
367*795d594fSAndroid Build Coastguard Worker     std::vector<std::unique_ptr<const DexFile>> all_dex_files1 = OpenTestDexFiles("Main");
368*795d594fSAndroid Build Coastguard Worker     VerifyOpenDexFiles(context.get(),
369*795d594fSAndroid Build Coastguard Worker                        /*index=*/ 1,
370*795d594fSAndroid Build Coastguard Worker                        &all_dex_files1,
371*795d594fSAndroid Build Coastguard Worker                        /*classpath_matches_dex_location=*/ false,
372*795d594fSAndroid Build Coastguard Worker                        only_read_checksums);
373*795d594fSAndroid Build Coastguard Worker   }
374*795d594fSAndroid Build Coastguard Worker 
375*795d594fSAndroid Build Coastguard Worker   // Creates a relative path from cwd to 'in'. Returns false if it cannot be done.
376*795d594fSAndroid Build Coastguard Worker   // TODO We should somehow support this in all situations. b/72042237.
CreateRelativeString(const std::string & in,const char * cwd,std::string * out)377*795d594fSAndroid Build Coastguard Worker   bool CreateRelativeString(const std::string& in, const char* cwd, std::string* out) {
378*795d594fSAndroid Build Coastguard Worker     int cwd_len = strlen(cwd);
379*795d594fSAndroid Build Coastguard Worker     if (!in.starts_with(cwd) || (cwd_len < 1)) {
380*795d594fSAndroid Build Coastguard Worker       return false;
381*795d594fSAndroid Build Coastguard Worker     }
382*795d594fSAndroid Build Coastguard Worker     bool contains_trailing_slash = (cwd[cwd_len - 1] == '/');
383*795d594fSAndroid Build Coastguard Worker     int start_position = cwd_len + (contains_trailing_slash ? 0 : 1);
384*795d594fSAndroid Build Coastguard Worker     *out = in.substr(start_position);
385*795d594fSAndroid Build Coastguard Worker     return true;
386*795d594fSAndroid Build Coastguard Worker   }
387*795d594fSAndroid Build Coastguard Worker 
388*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ScratchDir> scratch_dir_;
389*795d594fSAndroid Build Coastguard Worker   std::string scratch_path_;
390*795d594fSAndroid Build Coastguard Worker 
391*795d594fSAndroid Build Coastguard Worker  private:
VerifyClassLoaderInfo(ClassLoaderContext * context,size_t index,ClassLoaderContext::ClassLoaderType type,const std::string & classpath)392*795d594fSAndroid Build Coastguard Worker   void VerifyClassLoaderInfo(ClassLoaderContext* context,
393*795d594fSAndroid Build Coastguard Worker                              size_t index,
394*795d594fSAndroid Build Coastguard Worker                              ClassLoaderContext::ClassLoaderType type,
395*795d594fSAndroid Build Coastguard Worker                              const std::string& classpath) {
396*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(context != nullptr);
397*795d594fSAndroid Build Coastguard Worker     ASSERT_GT(context->GetParentChainSize(), index);
398*795d594fSAndroid Build Coastguard Worker     ClassLoaderContext::ClassLoaderInfo& info = *context->GetParent(index);
399*795d594fSAndroid Build Coastguard Worker     ASSERT_EQ(type, info.type);
400*795d594fSAndroid Build Coastguard Worker     std::vector<std::string> expected_classpath;
401*795d594fSAndroid Build Coastguard Worker     Split(classpath, ':', &expected_classpath);
402*795d594fSAndroid Build Coastguard Worker     ASSERT_EQ(expected_classpath, info.classpath);
403*795d594fSAndroid Build Coastguard Worker   }
404*795d594fSAndroid Build Coastguard Worker 
VerifyClassLoaderInfoSL(ClassLoaderContext * context,size_t loader_index,size_t shared_library_index,ClassLoaderContext::ClassLoaderType type,const std::string & classpath)405*795d594fSAndroid Build Coastguard Worker   void VerifyClassLoaderInfoSL(ClassLoaderContext* context,
406*795d594fSAndroid Build Coastguard Worker                                size_t loader_index,
407*795d594fSAndroid Build Coastguard Worker                                size_t shared_library_index,
408*795d594fSAndroid Build Coastguard Worker                                ClassLoaderContext::ClassLoaderType type,
409*795d594fSAndroid Build Coastguard Worker                                const std::string& classpath) {
410*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(context != nullptr);
411*795d594fSAndroid Build Coastguard Worker     ASSERT_GT(context->GetParentChainSize(), loader_index);
412*795d594fSAndroid Build Coastguard Worker     const ClassLoaderContext::ClassLoaderInfo& info = *context->GetParent(loader_index);
413*795d594fSAndroid Build Coastguard Worker     ASSERT_GT(info.shared_libraries.size(), shared_library_index);
414*795d594fSAndroid Build Coastguard Worker     const ClassLoaderContext::ClassLoaderInfo& sl =
415*795d594fSAndroid Build Coastguard Worker         *info.shared_libraries[shared_library_index].get();
416*795d594fSAndroid Build Coastguard Worker     ASSERT_EQ(type, sl.type);
417*795d594fSAndroid Build Coastguard Worker     std::vector<std::string> expected_classpath;
418*795d594fSAndroid Build Coastguard Worker     Split(classpath, ':', &expected_classpath);
419*795d594fSAndroid Build Coastguard Worker     ASSERT_EQ(expected_classpath, sl.classpath);
420*795d594fSAndroid Build Coastguard Worker   }
421*795d594fSAndroid Build Coastguard Worker 
VerifyClassLoaderInfoSLAfter(ClassLoaderContext * context,size_t loader_index,size_t shared_library_index,ClassLoaderContext::ClassLoaderType type,const std::string & classpath)422*795d594fSAndroid Build Coastguard Worker   void VerifyClassLoaderInfoSLAfter(ClassLoaderContext* context,
423*795d594fSAndroid Build Coastguard Worker                                size_t loader_index,
424*795d594fSAndroid Build Coastguard Worker                                size_t shared_library_index,
425*795d594fSAndroid Build Coastguard Worker                                ClassLoaderContext::ClassLoaderType type,
426*795d594fSAndroid Build Coastguard Worker                                const std::string& classpath) {
427*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(context != nullptr);
428*795d594fSAndroid Build Coastguard Worker     ASSERT_GT(context->GetParentChainSize(), loader_index);
429*795d594fSAndroid Build Coastguard Worker     const ClassLoaderContext::ClassLoaderInfo& info = *context->GetParent(loader_index);
430*795d594fSAndroid Build Coastguard Worker     ASSERT_GT(info.shared_libraries_after.size(), shared_library_index);
431*795d594fSAndroid Build Coastguard Worker 
432*795d594fSAndroid Build Coastguard Worker     const ClassLoaderContext::ClassLoaderInfo& sl =
433*795d594fSAndroid Build Coastguard Worker         *info.shared_libraries_after[shared_library_index].get();
434*795d594fSAndroid Build Coastguard Worker     ASSERT_EQ(type, sl.type);
435*795d594fSAndroid Build Coastguard Worker     std::vector<std::string> expected_classpath;
436*795d594fSAndroid Build Coastguard Worker     Split(classpath, ':', &expected_classpath);
437*795d594fSAndroid Build Coastguard Worker     ASSERT_EQ(expected_classpath, sl.classpath);
438*795d594fSAndroid Build Coastguard Worker   }
439*795d594fSAndroid Build Coastguard Worker 
VerifyClassLoaderFromTestDex(ClassLoaderContext * context,size_t index,ClassLoaderContext::ClassLoaderType type,const std::string & test_name,const std::string & classpath="")440*795d594fSAndroid Build Coastguard Worker   void VerifyClassLoaderFromTestDex(ClassLoaderContext* context,
441*795d594fSAndroid Build Coastguard Worker                                     size_t index,
442*795d594fSAndroid Build Coastguard Worker                                     ClassLoaderContext::ClassLoaderType type,
443*795d594fSAndroid Build Coastguard Worker                                     const std::string& test_name,
444*795d594fSAndroid Build Coastguard Worker                                     const std::string& classpath = "") {
445*795d594fSAndroid Build Coastguard Worker     std::vector<std::unique_ptr<const DexFile>> dex_files = OpenTestDexFiles(test_name.c_str());
446*795d594fSAndroid Build Coastguard Worker 
447*795d594fSAndroid Build Coastguard Worker     // If `classpath` is set, override the expected value of ClassLoaderInfo::classpath.
448*795d594fSAndroid Build Coastguard Worker     // Otherwise assume it is equal to dex location (here test dex file name).
449*795d594fSAndroid Build Coastguard Worker     VerifyClassLoaderInfo(context,
450*795d594fSAndroid Build Coastguard Worker                           index,
451*795d594fSAndroid Build Coastguard Worker                           type,
452*795d594fSAndroid Build Coastguard Worker                           classpath.empty() ? GetTestDexFileName(test_name.c_str()) : classpath);
453*795d594fSAndroid Build Coastguard Worker     VerifyOpenDexFiles(context,
454*795d594fSAndroid Build Coastguard Worker                        index,
455*795d594fSAndroid Build Coastguard Worker                        &dex_files,
456*795d594fSAndroid Build Coastguard Worker                        /* classpath_matches_dex_location= */ classpath.empty());
457*795d594fSAndroid Build Coastguard Worker   }
458*795d594fSAndroid Build Coastguard Worker };
459*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,ParseValidEmptyContext)460*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, ParseValidEmptyContext) {
461*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = ClassLoaderContext::Create("");
462*795d594fSAndroid Build Coastguard Worker   // An empty context should create a single empty PathClassLoader.
463*795d594fSAndroid Build Coastguard Worker   VerifyContextSize(context.get(), 1);
464*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderPCL(context.get(), 0, "");
465*795d594fSAndroid Build Coastguard Worker }
466*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,ParseInvalidSharedLibraryContext)467*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, ParseInvalidSharedLibraryContext) {
468*795d594fSAndroid Build Coastguard Worker   // '&' used to be a special context.
469*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = ClassLoaderContext::Create("&");
470*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(context == nullptr);
471*795d594fSAndroid Build Coastguard Worker }
472*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,ParseValidContextPCL)473*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, ParseValidContextPCL) {
474*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = ClassLoaderContext::Create("PCL[a.dex]");
475*795d594fSAndroid Build Coastguard Worker   VerifyContextSize(context.get(), 1);
476*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderPCL(context.get(), 0, "a.dex");
477*795d594fSAndroid Build Coastguard Worker }
478*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,ParseValidContextDLC)479*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, ParseValidContextDLC) {
480*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = ClassLoaderContext::Create("DLC[a.dex]");
481*795d594fSAndroid Build Coastguard Worker   VerifyContextSize(context.get(), 1);
482*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDLC(context.get(), 0, "a.dex");
483*795d594fSAndroid Build Coastguard Worker }
484*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,ParseValidContextIMC)485*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, ParseValidContextIMC) {
486*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = ParseContextWithChecksums("IMC[<unknown>*111]");
487*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(context == nullptr);
488*795d594fSAndroid Build Coastguard Worker }
489*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,ParseInvalidContextIMCNoChecksum)490*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, ParseInvalidContextIMCNoChecksum) {
491*795d594fSAndroid Build Coastguard Worker   // IMC is treated as an unknown class loader unless a checksum is provided.
492*795d594fSAndroid Build Coastguard Worker   // This is because the dex location is always bogus.
493*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = ClassLoaderContext::Create("IMC[<unknown>]");
494*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(context == nullptr);
495*795d594fSAndroid Build Coastguard Worker }
496*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,ParseInvalidContextIMCWrongClasspathMagic)497*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, ParseInvalidContextIMCWrongClasspathMagic) {
498*795d594fSAndroid Build Coastguard Worker   // IMC does not support arbitrary dex location. A magic marker must be used
499*795d594fSAndroid Build Coastguard Worker   // otherwise the spec should be rejected.
500*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = ClassLoaderContext::Create("IMC[a.dex*111]");
501*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(context == nullptr);
502*795d594fSAndroid Build Coastguard Worker }
503*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,ParseValidContextChain)504*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, ParseValidContextChain) {
505*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context =
506*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext::Create("PCL[a.dex:b.dex];DLC[c.dex:d.dex];PCL[e.dex]");
507*795d594fSAndroid Build Coastguard Worker   VerifyContextSize(context.get(), 3);
508*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderPCL(context.get(), 0, "a.dex:b.dex");
509*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDLC(context.get(), 1, "c.dex:d.dex");
510*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderPCL(context.get(), 2, "e.dex");
511*795d594fSAndroid Build Coastguard Worker }
512*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,ParseSharedLibraries)513*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, ParseSharedLibraries) {
514*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = ClassLoaderContext::Create(
515*795d594fSAndroid Build Coastguard Worker       "PCL[a.dex:b.dex]{PCL[s1.dex]#PCL[s2.dex:s3.dex]#~PCL[s5.dex]#~PCL[s6.dex:s7.dex]};"
516*795d594fSAndroid Build Coastguard Worker       "DLC[c.dex:d.dex]{DLC[s4.dex]}");
517*795d594fSAndroid Build Coastguard Worker   VerifyContextSize(context.get(), 2);
518*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderSharedLibraryPCL(context.get(), 0, 0, "s1.dex");
519*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderSharedLibraryPCL(context.get(), 0, 1, "s2.dex:s3.dex");
520*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderSharedLibraryPCLAfter(context.get(), 0, 0, "s5.dex");
521*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderSharedLibraryPCLAfter(context.get(), 0, 1, "s6.dex:s7.dex");
522*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDLC(context.get(), 1, "c.dex:d.dex");
523*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderSharedLibraryDLC(context.get(), 1, 0, "s4.dex");
524*795d594fSAndroid Build Coastguard Worker }
525*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,ParseEnclosingSharedLibraries)526*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, ParseEnclosingSharedLibraries) {
527*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = ClassLoaderContext::Create(
528*795d594fSAndroid Build Coastguard Worker       "PCL[a.dex:b.dex]{PCL[s1.dex]{PCL[s2.dex:s3.dex];PCL[s4.dex]}}");
529*795d594fSAndroid Build Coastguard Worker   VerifyContextSize(context.get(), 1);
530*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderSharedLibraryPCL(context.get(), 0, 0, "s1.dex");
531*795d594fSAndroid Build Coastguard Worker }
532*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,ParseComplexSharedLibraries1)533*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, ParseComplexSharedLibraries1) {
534*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = ClassLoaderContext::Create(
535*795d594fSAndroid Build Coastguard Worker       "PCL[]{PCL[s4.dex]{PCL[s5.dex]{PCL[s6.dex]}#PCL[s6.dex]}}");
536*795d594fSAndroid Build Coastguard Worker   VerifyContextSize(context.get(), 1);
537*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderSharedLibraryPCL(context.get(), 0, 0, "s4.dex");
538*795d594fSAndroid Build Coastguard Worker }
539*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,ParseComplexSharedLibraries2)540*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, ParseComplexSharedLibraries2) {
541*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = ClassLoaderContext::Create(
542*795d594fSAndroid Build Coastguard Worker       "PCL[]{PCL[s1.dex]{PCL[s2.dex]}#PCL[s2.dex]#"
543*795d594fSAndroid Build Coastguard Worker       "PCL[s3.dex]#PCL[s4.dex]{PCL[s5.dex]{PCL[s6.dex]}#PCL[s6.dex]}#PCL[s5.dex]{PCL[s6.dex]}}");
544*795d594fSAndroid Build Coastguard Worker   VerifyContextSize(context.get(), 1);
545*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderSharedLibraryPCL(context.get(), 0, 0, "s1.dex");
546*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderSharedLibraryPCL(context.get(), 0, 1, "s2.dex");
547*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderSharedLibraryPCL(context.get(), 0, 2, "s3.dex");
548*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderSharedLibraryPCL(context.get(), 0, 3, "s4.dex");
549*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderSharedLibraryPCL(context.get(), 0, 4, "s5.dex");
550*795d594fSAndroid Build Coastguard Worker }
551*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,ParseValidEmptyContextDLC)552*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, ParseValidEmptyContextDLC) {
553*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context =
554*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext::Create("DLC[]");
555*795d594fSAndroid Build Coastguard Worker   VerifyContextSize(context.get(), 1);
556*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDLC(context.get(), 0, "");
557*795d594fSAndroid Build Coastguard Worker }
558*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,ParseValidEmptyContextSharedLibrary)559*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, ParseValidEmptyContextSharedLibrary) {
560*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context =
561*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext::Create("DLC[]{}");
562*795d594fSAndroid Build Coastguard Worker   VerifyContextSize(context.get(), 1);
563*795d594fSAndroid Build Coastguard Worker   VerifySharedLibrariesSize(context.get(), 0, 0);
564*795d594fSAndroid Build Coastguard Worker }
565*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,ParseInvalidValidContexts)566*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, ParseInvalidValidContexts) {
567*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr == ClassLoaderContext::Create("ABC[a.dex]"));
568*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr == ClassLoaderContext::Create("PCL"));
569*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr == ClassLoaderContext::Create("PCL[a.dex"));
570*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr == ClassLoaderContext::Create("PCLa.dex]"));
571*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr == ClassLoaderContext::Create("PCL{a.dex}"));
572*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr == ClassLoaderContext::Create("PCL[a.dex];DLC[b.dex"));
573*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr == ClassLoaderContext::Create("PCL[a.dex]{ABC};DLC[b.dex"));
574*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr == ClassLoaderContext::Create("PCL[a.dex]{};DLC[b.dex"));
575*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr == ClassLoaderContext::Create("DLC[s4.dex]}"));
576*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr == ClassLoaderContext::Create("DLC[s4.dex]{"));
577*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr == ClassLoaderContext::Create("DLC{DLC[s4.dex]}"));
578*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr == ClassLoaderContext::Create("PCL{##}"));
579*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr == ClassLoaderContext::Create("PCL{PCL[s4.dex]#}"));
580*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr == ClassLoaderContext::Create("PCL{PCL[s4.dex]##}"));
581*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(nullptr == ClassLoaderContext::Create("PCL{PCL[s4.dex]{PCL[s3.dex]}#}"));
582*795d594fSAndroid Build Coastguard Worker }
583*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,OpenInvalidDexFiles)584*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, OpenInvalidDexFiles) {
585*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context =
586*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext::Create("PCL[does_not_exist.dex]");
587*795d594fSAndroid Build Coastguard Worker   VerifyContextSize(context.get(), 1);
588*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(context->OpenDexFiles("."));
589*795d594fSAndroid Build Coastguard Worker }
590*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,ReadChecksumsInvalidDexFiles)591*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, ReadChecksumsInvalidDexFiles) {
592*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context =
593*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext::Create("PCL[does_not_exist.dex]");
594*795d594fSAndroid Build Coastguard Worker   VerifyContextSize(context.get(), 1);
595*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(context->OpenDexFiles(
596*795d594fSAndroid Build Coastguard Worker         /*classpath_dir=*/ ".",
597*795d594fSAndroid Build Coastguard Worker         /*context_fds=*/ std::vector<int>(),
598*795d594fSAndroid Build Coastguard Worker         /*only_read_checksums=*/ true));
599*795d594fSAndroid Build Coastguard Worker }
600*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,OpenValidDexFiles)601*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, OpenValidDexFiles) {
602*795d594fSAndroid Build Coastguard Worker   TestOpenDexFiles(/*only_read_checksums=*/ false);
603*795d594fSAndroid Build Coastguard Worker }
604*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,ReadDexFileChecksums)605*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, ReadDexFileChecksums) {
606*795d594fSAndroid Build Coastguard Worker   TestOpenDexFiles(/*only_read_checksums=*/ true);
607*795d594fSAndroid Build Coastguard Worker }
608*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,OpenValidDexFilesRelative)609*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, OpenValidDexFilesRelative) {
610*795d594fSAndroid Build Coastguard Worker   TestOpenValidDexFilesRelative(/*use_classpath_dir=*/ false, /*only_read_checksums=*/ false);
611*795d594fSAndroid Build Coastguard Worker }
612*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,ReadChecksumsValidDexFilesRelative)613*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, ReadChecksumsValidDexFilesRelative) {
614*795d594fSAndroid Build Coastguard Worker   TestOpenValidDexFilesRelative(/*use_classpath_dir=*/ false, /*only_read_checksums=*/ true);
615*795d594fSAndroid Build Coastguard Worker }
616*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,OpenValidDexFilesClasspathDir)617*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, OpenValidDexFilesClasspathDir) {
618*795d594fSAndroid Build Coastguard Worker   TestOpenValidDexFilesRelative(/*use_classpath_dir=*/ true, /*only_read_checksums=*/ false);
619*795d594fSAndroid Build Coastguard Worker }
620*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,ReadChecksumsValidDexFilesClasspathDir)621*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, ReadChecksumsValidDexFilesClasspathDir) {
622*795d594fSAndroid Build Coastguard Worker   TestOpenValidDexFilesRelative(/*use_classpath_dir=*/ true, /*only_read_checksums=*/ true);
623*795d594fSAndroid Build Coastguard Worker }
624*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,OpenInvalidDexFilesMix)625*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, OpenInvalidDexFilesMix) {
626*795d594fSAndroid Build Coastguard Worker   std::string dex_name = GetTestDexFileName("Main");
627*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context =
628*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext::Create("PCL[does_not_exist.dex];DLC[" + dex_name + "]");
629*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(context->OpenDexFiles());
630*795d594fSAndroid Build Coastguard Worker }
631*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,ReadChecksumsInvalidDexFilesMix)632*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, ReadChecksumsInvalidDexFilesMix) {
633*795d594fSAndroid Build Coastguard Worker   std::string dex_name = GetTestDexFileName("Main");
634*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context =
635*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext::Create("PCL[does_not_exist.dex];DLC[" + dex_name + "]");
636*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(context->OpenDexFiles(
637*795d594fSAndroid Build Coastguard Worker       /*classpath_dir=*/ "",
638*795d594fSAndroid Build Coastguard Worker       /*context_fds=*/ std::vector<int>(),
639*795d594fSAndroid Build Coastguard Worker       /*only_read_checksums=*/ true));
640*795d594fSAndroid Build Coastguard Worker }
641*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,OpenDexFilesForIMCFails)642*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, OpenDexFilesForIMCFails) {
643*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context;
644*795d594fSAndroid Build Coastguard Worker   std::string dex_name = GetTestDexFileName("Main");
645*795d594fSAndroid Build Coastguard Worker 
646*795d594fSAndroid Build Coastguard Worker   context = ParseContextWithChecksums("IMC[<unknown>*111]");
647*795d594fSAndroid Build Coastguard Worker   VerifyContextSize(context.get(), 1);
648*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(context->OpenDexFiles("."));
649*795d594fSAndroid Build Coastguard Worker }
650*795d594fSAndroid Build Coastguard Worker 
651*795d594fSAndroid Build Coastguard Worker // Verify that we can fully open the dex files after only reading their checksums.
TEST_F(ClassLoaderContextTest,SubsequentOpenDexFilesOperations)652*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, SubsequentOpenDexFilesOperations) {
653*795d594fSAndroid Build Coastguard Worker   std::string dex_name = GetTestDexFileName("Main");
654*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context =
655*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext::Create("PCL[" + dex_name + "]");
656*795d594fSAndroid Build Coastguard Worker 
657*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> all_dex_files0 = OpenTestDexFiles("Main");
658*795d594fSAndroid Build Coastguard Worker 
659*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(context->OpenDexFiles(
660*795d594fSAndroid Build Coastguard Worker       /*classpath_dir=*/ "",
661*795d594fSAndroid Build Coastguard Worker       /*context_fds=*/ std::vector<int>(),
662*795d594fSAndroid Build Coastguard Worker       /*only_read_checksums=*/ true));
663*795d594fSAndroid Build Coastguard Worker 
664*795d594fSAndroid Build Coastguard Worker   VerifyOpenDexFiles(
665*795d594fSAndroid Build Coastguard Worker       context.get(),
666*795d594fSAndroid Build Coastguard Worker       /*index=*/ 0,
667*795d594fSAndroid Build Coastguard Worker       &all_dex_files0,
668*795d594fSAndroid Build Coastguard Worker       /*classpath_matches_dex_location=*/ false,
669*795d594fSAndroid Build Coastguard Worker       /*only_read_checksums=*/ true);
670*795d594fSAndroid Build Coastguard Worker 
671*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(context->OpenDexFiles(
672*795d594fSAndroid Build Coastguard Worker       /*classpath_dir=*/ "",
673*795d594fSAndroid Build Coastguard Worker       /*context_fds=*/ std::vector<int>(),
674*795d594fSAndroid Build Coastguard Worker       /*only_read_checksums=*/ false));
675*795d594fSAndroid Build Coastguard Worker 
676*795d594fSAndroid Build Coastguard Worker   VerifyOpenDexFiles(
677*795d594fSAndroid Build Coastguard Worker       context.get(),
678*795d594fSAndroid Build Coastguard Worker       /*index=*/ 0,
679*795d594fSAndroid Build Coastguard Worker       &all_dex_files0,
680*795d594fSAndroid Build Coastguard Worker       /*classpath_matches_dex_location=*/ false,
681*795d594fSAndroid Build Coastguard Worker       /*only_read_checksums=*/ false);
682*795d594fSAndroid Build Coastguard Worker }
683*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,CreateClassLoader)684*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, CreateClassLoader) {
685*795d594fSAndroid Build Coastguard Worker   std::string dex_name = GetTestDexFileName("Main");
686*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context =
687*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext::Create("PCL[" + dex_name + "]");
688*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(context->OpenDexFiles());
689*795d594fSAndroid Build Coastguard Worker 
690*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> classpath_dex = OpenTestDexFiles("Main");
691*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> compilation_sources = OpenTestDexFiles("MultiDex");
692*795d594fSAndroid Build Coastguard Worker 
693*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> compilation_sources_raw =
694*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(compilation_sources);
695*795d594fSAndroid Build Coastguard Worker   jobject jclass_loader = context->CreateClassLoader(compilation_sources_raw);
696*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(jclass_loader != nullptr);
697*795d594fSAndroid Build Coastguard Worker 
698*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(Thread::Current());
699*795d594fSAndroid Build Coastguard Worker 
700*795d594fSAndroid Build Coastguard Worker   StackHandleScope<1> hs(soa.Self());
701*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> class_loader = hs.NewHandle(
702*795d594fSAndroid Build Coastguard Worker       soa.Decode<mirror::ClassLoader>(jclass_loader));
703*795d594fSAndroid Build Coastguard Worker 
704*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(class_loader->GetClass() == WellKnownClasses::dalvik_system_PathClassLoader);
705*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(class_loader->GetParent()->GetClass() ==
706*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_BootClassLoader);
707*795d594fSAndroid Build Coastguard Worker 
708*795d594fSAndroid Build Coastguard Worker   // For the first class loader the class path dex files must come first and then the
709*795d594fSAndroid Build Coastguard Worker   // compilation sources.
710*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> expected_classpath = MakeNonOwningPointerVector(classpath_dex);
711*795d594fSAndroid Build Coastguard Worker   for (auto& dex : compilation_sources_raw) {
712*795d594fSAndroid Build Coastguard Worker     expected_classpath.push_back(dex);
713*795d594fSAndroid Build Coastguard Worker   }
714*795d594fSAndroid Build Coastguard Worker 
715*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDexFiles(soa.Self(),
716*795d594fSAndroid Build Coastguard Worker                             class_loader,
717*795d594fSAndroid Build Coastguard Worker                             WellKnownClasses::dalvik_system_PathClassLoader.Get(),
718*795d594fSAndroid Build Coastguard Worker                             expected_classpath);
719*795d594fSAndroid Build Coastguard Worker }
720*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,CreateClassLoaderWithEmptyContext)721*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, CreateClassLoaderWithEmptyContext) {
722*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context =
723*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext::Create("");
724*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(context->OpenDexFiles());
725*795d594fSAndroid Build Coastguard Worker 
726*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> compilation_sources = OpenTestDexFiles("MultiDex");
727*795d594fSAndroid Build Coastguard Worker 
728*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> compilation_sources_raw =
729*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(compilation_sources);
730*795d594fSAndroid Build Coastguard Worker   jobject jclass_loader = context->CreateClassLoader(compilation_sources_raw);
731*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(jclass_loader != nullptr);
732*795d594fSAndroid Build Coastguard Worker 
733*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(Thread::Current());
734*795d594fSAndroid Build Coastguard Worker 
735*795d594fSAndroid Build Coastguard Worker   StackHandleScope<1> hs(soa.Self());
736*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> class_loader = hs.NewHandle(
737*795d594fSAndroid Build Coastguard Worker       soa.Decode<mirror::ClassLoader>(jclass_loader));
738*795d594fSAndroid Build Coastguard Worker 
739*795d594fSAndroid Build Coastguard Worker   // An empty context should create a single PathClassLoader with only the compilation sources.
740*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDexFiles(soa.Self(),
741*795d594fSAndroid Build Coastguard Worker                             class_loader,
742*795d594fSAndroid Build Coastguard Worker                             WellKnownClasses::dalvik_system_PathClassLoader.Get(),
743*795d594fSAndroid Build Coastguard Worker                             compilation_sources_raw);
744*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(class_loader->GetParent()->GetClass() ==
745*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_BootClassLoader);
746*795d594fSAndroid Build Coastguard Worker }
747*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,CreateClassLoaderWithComplexChain)748*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, CreateClassLoaderWithComplexChain) {
749*795d594fSAndroid Build Coastguard Worker   // Setup the context.
750*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> classpath_dex_a = OpenTestDexFiles("ForClassLoaderA");
751*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> classpath_dex_b = OpenTestDexFiles("ForClassLoaderB");
752*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> classpath_dex_c = OpenTestDexFiles("ForClassLoaderC");
753*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> classpath_dex_d = OpenTestDexFiles("ForClassLoaderD");
754*795d594fSAndroid Build Coastguard Worker 
755*795d594fSAndroid Build Coastguard Worker   std::string context_spec =
756*795d594fSAndroid Build Coastguard Worker       "PCL[" + CreateClassPath(classpath_dex_a) + ":" + CreateClassPath(classpath_dex_b) + "];" +
757*795d594fSAndroid Build Coastguard Worker       "DLC[" + CreateClassPath(classpath_dex_c) + "];" +
758*795d594fSAndroid Build Coastguard Worker       "PCL[" + CreateClassPath(classpath_dex_d) + "]";
759*795d594fSAndroid Build Coastguard Worker 
760*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = ClassLoaderContext::Create(context_spec);
761*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(context->OpenDexFiles());
762*795d594fSAndroid Build Coastguard Worker 
763*795d594fSAndroid Build Coastguard Worker   // Setup the compilation sources.
764*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> compilation_sources = OpenTestDexFiles("MultiDex");
765*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> compilation_sources_raw =
766*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(compilation_sources);
767*795d594fSAndroid Build Coastguard Worker 
768*795d594fSAndroid Build Coastguard Worker   // Create the class loader.
769*795d594fSAndroid Build Coastguard Worker   jobject jclass_loader = context->CreateClassLoader(compilation_sources_raw);
770*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(jclass_loader != nullptr);
771*795d594fSAndroid Build Coastguard Worker 
772*795d594fSAndroid Build Coastguard Worker   // Verify the class loader.
773*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(Thread::Current());
774*795d594fSAndroid Build Coastguard Worker 
775*795d594fSAndroid Build Coastguard Worker   StackHandleScope<3> hs(soa.Self());
776*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> class_loader_1 = hs.NewHandle(
777*795d594fSAndroid Build Coastguard Worker       soa.Decode<mirror::ClassLoader>(jclass_loader));
778*795d594fSAndroid Build Coastguard Worker 
779*795d594fSAndroid Build Coastguard Worker   // Verify the first class loader
780*795d594fSAndroid Build Coastguard Worker 
781*795d594fSAndroid Build Coastguard Worker   // For the first class loader the class path dex files must come first and then the
782*795d594fSAndroid Build Coastguard Worker   // compilation sources.
783*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> class_loader_1_dex_files =
784*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(classpath_dex_a);
785*795d594fSAndroid Build Coastguard Worker   for (auto& dex : classpath_dex_b) {
786*795d594fSAndroid Build Coastguard Worker     class_loader_1_dex_files.push_back(dex.get());
787*795d594fSAndroid Build Coastguard Worker   }
788*795d594fSAndroid Build Coastguard Worker   for (auto& dex : compilation_sources_raw) {
789*795d594fSAndroid Build Coastguard Worker     class_loader_1_dex_files.push_back(dex);
790*795d594fSAndroid Build Coastguard Worker   }
791*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDexFiles(soa.Self(),
792*795d594fSAndroid Build Coastguard Worker                             class_loader_1,
793*795d594fSAndroid Build Coastguard Worker                             WellKnownClasses::dalvik_system_PathClassLoader.Get(),
794*795d594fSAndroid Build Coastguard Worker                             class_loader_1_dex_files);
795*795d594fSAndroid Build Coastguard Worker 
796*795d594fSAndroid Build Coastguard Worker   // Verify the second class loader
797*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> class_loader_2 = hs.NewHandle(class_loader_1->GetParent());
798*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> class_loader_2_dex_files =
799*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(classpath_dex_c);
800*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDexFiles(soa.Self(),
801*795d594fSAndroid Build Coastguard Worker                             class_loader_2,
802*795d594fSAndroid Build Coastguard Worker                             WellKnownClasses::dalvik_system_DelegateLastClassLoader.Get(),
803*795d594fSAndroid Build Coastguard Worker                             class_loader_2_dex_files);
804*795d594fSAndroid Build Coastguard Worker 
805*795d594fSAndroid Build Coastguard Worker   // Verify the third class loader
806*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> class_loader_3 = hs.NewHandle(class_loader_2->GetParent());
807*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> class_loader_3_dex_files =
808*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(classpath_dex_d);
809*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDexFiles(soa.Self(),
810*795d594fSAndroid Build Coastguard Worker                             class_loader_3,
811*795d594fSAndroid Build Coastguard Worker                             WellKnownClasses::dalvik_system_PathClassLoader.Get(),
812*795d594fSAndroid Build Coastguard Worker                             class_loader_3_dex_files);
813*795d594fSAndroid Build Coastguard Worker   // The last class loader should have the BootClassLoader as a parent.
814*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(class_loader_3->GetParent()->GetClass() ==
815*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_BootClassLoader);
816*795d594fSAndroid Build Coastguard Worker }
817*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,CreateClassLoaderWithSharedLibraries)818*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, CreateClassLoaderWithSharedLibraries) {
819*795d594fSAndroid Build Coastguard Worker   // Setup the context.
820*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> classpath_dex_a = OpenTestDexFiles("ForClassLoaderA");
821*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> classpath_dex_b = OpenTestDexFiles("ForClassLoaderB");
822*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> classpath_dex_c = OpenTestDexFiles("ForClassLoaderC");
823*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> classpath_dex_d = OpenTestDexFiles("ForClassLoaderD");
824*795d594fSAndroid Build Coastguard Worker 
825*795d594fSAndroid Build Coastguard Worker   std::string context_spec =
826*795d594fSAndroid Build Coastguard Worker       "PCL[" + CreateClassPath(classpath_dex_a) + ":" + CreateClassPath(classpath_dex_b) + "]{" +
827*795d594fSAndroid Build Coastguard Worker       "DLC[" + CreateClassPath(classpath_dex_c) + "]#" +
828*795d594fSAndroid Build Coastguard Worker       "PCL[" + CreateClassPath(classpath_dex_d) + "]}";
829*795d594fSAndroid Build Coastguard Worker 
830*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = ClassLoaderContext::Create(context_spec);
831*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(context->OpenDexFiles());
832*795d594fSAndroid Build Coastguard Worker 
833*795d594fSAndroid Build Coastguard Worker   // Setup the compilation sources.
834*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> compilation_sources = OpenTestDexFiles("MultiDex");
835*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> compilation_sources_raw =
836*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(compilation_sources);
837*795d594fSAndroid Build Coastguard Worker 
838*795d594fSAndroid Build Coastguard Worker   // Create the class loader.
839*795d594fSAndroid Build Coastguard Worker   jobject jclass_loader = context->CreateClassLoader(compilation_sources_raw);
840*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(jclass_loader != nullptr);
841*795d594fSAndroid Build Coastguard Worker 
842*795d594fSAndroid Build Coastguard Worker   // Verify the class loader.
843*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(Thread::Current());
844*795d594fSAndroid Build Coastguard Worker 
845*795d594fSAndroid Build Coastguard Worker   StackHandleScope<4> hs(soa.Self());
846*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> class_loader_1 = hs.NewHandle(
847*795d594fSAndroid Build Coastguard Worker       soa.Decode<mirror::ClassLoader>(jclass_loader));
848*795d594fSAndroid Build Coastguard Worker 
849*795d594fSAndroid Build Coastguard Worker   // For the first class loader the class path dex files must come first and then the
850*795d594fSAndroid Build Coastguard Worker   // compilation sources.
851*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> class_loader_1_dex_files =
852*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(classpath_dex_a);
853*795d594fSAndroid Build Coastguard Worker   for (auto& dex : classpath_dex_b) {
854*795d594fSAndroid Build Coastguard Worker     class_loader_1_dex_files.push_back(dex.get());
855*795d594fSAndroid Build Coastguard Worker   }
856*795d594fSAndroid Build Coastguard Worker   for (auto& dex : compilation_sources_raw) {
857*795d594fSAndroid Build Coastguard Worker     class_loader_1_dex_files.push_back(dex);
858*795d594fSAndroid Build Coastguard Worker   }
859*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDexFiles(soa.Self(),
860*795d594fSAndroid Build Coastguard Worker                             class_loader_1,
861*795d594fSAndroid Build Coastguard Worker                             WellKnownClasses::dalvik_system_PathClassLoader.Get(),
862*795d594fSAndroid Build Coastguard Worker                             class_loader_1_dex_files);
863*795d594fSAndroid Build Coastguard Worker 
864*795d594fSAndroid Build Coastguard Worker   // Verify the shared libraries.
865*795d594fSAndroid Build Coastguard Worker   ArtField* field = WellKnownClasses::dalvik_system_BaseDexClassLoader_sharedLibraryLoaders;
866*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Object> raw_shared_libraries = field->GetObject(class_loader_1.Get());
867*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(raw_shared_libraries != nullptr);
868*795d594fSAndroid Build Coastguard Worker 
869*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ObjectArray<mirror::ClassLoader>> shared_libraries(
870*795d594fSAndroid Build Coastguard Worker       hs.NewHandle(raw_shared_libraries->AsObjectArray<mirror::ClassLoader>()));
871*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(shared_libraries->GetLength(), 2);
872*795d594fSAndroid Build Coastguard Worker 
873*795d594fSAndroid Build Coastguard Worker   // Verify the first shared library.
874*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> class_loader_2 = hs.NewHandle(shared_libraries->Get(0));
875*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> class_loader_2_dex_files =
876*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(classpath_dex_c);
877*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDexFiles(soa.Self(),
878*795d594fSAndroid Build Coastguard Worker                             class_loader_2,
879*795d594fSAndroid Build Coastguard Worker                             WellKnownClasses::dalvik_system_DelegateLastClassLoader.Get(),
880*795d594fSAndroid Build Coastguard Worker                             class_loader_2_dex_files);
881*795d594fSAndroid Build Coastguard Worker   raw_shared_libraries = field->GetObject(class_loader_2.Get());
882*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(raw_shared_libraries == nullptr);
883*795d594fSAndroid Build Coastguard Worker 
884*795d594fSAndroid Build Coastguard Worker   // Verify the second shared library.
885*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> class_loader_3 = hs.NewHandle(shared_libraries->Get(1));
886*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> class_loader_3_dex_files =
887*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(classpath_dex_d);
888*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDexFiles(soa.Self(),
889*795d594fSAndroid Build Coastguard Worker                             class_loader_3,
890*795d594fSAndroid Build Coastguard Worker                             WellKnownClasses::dalvik_system_PathClassLoader.Get(),
891*795d594fSAndroid Build Coastguard Worker                             class_loader_3_dex_files);
892*795d594fSAndroid Build Coastguard Worker   raw_shared_libraries = field->GetObject(class_loader_3.Get());
893*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(raw_shared_libraries == nullptr);
894*795d594fSAndroid Build Coastguard Worker 
895*795d594fSAndroid Build Coastguard Worker   // All class loaders should have the BootClassLoader as a parent.
896*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(class_loader_1->GetParent()->GetClass() ==
897*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_BootClassLoader);
898*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(class_loader_2->GetParent()->GetClass() ==
899*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_BootClassLoader);
900*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(class_loader_3->GetParent()->GetClass() ==
901*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_BootClassLoader);
902*795d594fSAndroid Build Coastguard Worker }
903*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,CreateClassLoaderWithSharedLibrariesInParentToo)904*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, CreateClassLoaderWithSharedLibrariesInParentToo) {
905*795d594fSAndroid Build Coastguard Worker   // Setup the context.
906*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> classpath_dex_a = OpenTestDexFiles("ForClassLoaderA");
907*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> classpath_dex_b = OpenTestDexFiles("ForClassLoaderB");
908*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> classpath_dex_c = OpenTestDexFiles("ForClassLoaderC");
909*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> classpath_dex_d = OpenTestDexFiles("ForClassLoaderD");
910*795d594fSAndroid Build Coastguard Worker 
911*795d594fSAndroid Build Coastguard Worker   std::string context_spec =
912*795d594fSAndroid Build Coastguard Worker       "PCL[" + CreateClassPath(classpath_dex_a) + "]{" +
913*795d594fSAndroid Build Coastguard Worker       "PCL[" + CreateClassPath(classpath_dex_b) + "]};" +
914*795d594fSAndroid Build Coastguard Worker       "PCL[" + CreateClassPath(classpath_dex_c) + "]{" +
915*795d594fSAndroid Build Coastguard Worker       "PCL[" + CreateClassPath(classpath_dex_d) + "]}";
916*795d594fSAndroid Build Coastguard Worker 
917*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = ClassLoaderContext::Create(context_spec);
918*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(context->OpenDexFiles());
919*795d594fSAndroid Build Coastguard Worker 
920*795d594fSAndroid Build Coastguard Worker   // Setup the compilation sources.
921*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> compilation_sources = OpenTestDexFiles("MultiDex");
922*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> compilation_sources_raw =
923*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(compilation_sources);
924*795d594fSAndroid Build Coastguard Worker 
925*795d594fSAndroid Build Coastguard Worker   // Create the class loader.
926*795d594fSAndroid Build Coastguard Worker   jobject jclass_loader = context->CreateClassLoader(compilation_sources_raw);
927*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(jclass_loader != nullptr);
928*795d594fSAndroid Build Coastguard Worker 
929*795d594fSAndroid Build Coastguard Worker   // Verify the class loader.
930*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(Thread::Current());
931*795d594fSAndroid Build Coastguard Worker 
932*795d594fSAndroid Build Coastguard Worker   StackHandleScope<6> hs(soa.Self());
933*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> class_loader_1 = hs.NewHandle(
934*795d594fSAndroid Build Coastguard Worker       soa.Decode<mirror::ClassLoader>(jclass_loader));
935*795d594fSAndroid Build Coastguard Worker 
936*795d594fSAndroid Build Coastguard Worker   // For the first class loader the class path dex files must come first and then the
937*795d594fSAndroid Build Coastguard Worker   // compilation sources.
938*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> class_loader_1_dex_files =
939*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(classpath_dex_a);
940*795d594fSAndroid Build Coastguard Worker   for (auto& dex : compilation_sources_raw) {
941*795d594fSAndroid Build Coastguard Worker     class_loader_1_dex_files.push_back(dex);
942*795d594fSAndroid Build Coastguard Worker   }
943*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDexFiles(soa.Self(),
944*795d594fSAndroid Build Coastguard Worker                             class_loader_1,
945*795d594fSAndroid Build Coastguard Worker                             WellKnownClasses::dalvik_system_PathClassLoader.Get(),
946*795d594fSAndroid Build Coastguard Worker                             class_loader_1_dex_files);
947*795d594fSAndroid Build Coastguard Worker 
948*795d594fSAndroid Build Coastguard Worker   // Verify its shared library.
949*795d594fSAndroid Build Coastguard Worker   ArtField* field = WellKnownClasses::dalvik_system_BaseDexClassLoader_sharedLibraryLoaders;
950*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Object> raw_shared_libraries = field->GetObject(class_loader_1.Get());
951*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(raw_shared_libraries != nullptr);
952*795d594fSAndroid Build Coastguard Worker 
953*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ObjectArray<mirror::ClassLoader>> shared_libraries(
954*795d594fSAndroid Build Coastguard Worker       hs.NewHandle(raw_shared_libraries->AsObjectArray<mirror::ClassLoader>()));
955*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(shared_libraries->GetLength(), 1);
956*795d594fSAndroid Build Coastguard Worker 
957*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> class_loader_2 = hs.NewHandle(shared_libraries->Get(0));
958*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> class_loader_2_dex_files =
959*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(classpath_dex_b);
960*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDexFiles(soa.Self(),
961*795d594fSAndroid Build Coastguard Worker                             class_loader_2,
962*795d594fSAndroid Build Coastguard Worker                             WellKnownClasses::dalvik_system_PathClassLoader.Get(),
963*795d594fSAndroid Build Coastguard Worker                             class_loader_2_dex_files);
964*795d594fSAndroid Build Coastguard Worker   raw_shared_libraries = field->GetObject(class_loader_2.Get());
965*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(raw_shared_libraries == nullptr);
966*795d594fSAndroid Build Coastguard Worker 
967*795d594fSAndroid Build Coastguard Worker   // Verify the parent.
968*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> class_loader_3 = hs.NewHandle(class_loader_1->GetParent());
969*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> class_loader_3_dex_files =
970*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(classpath_dex_c);
971*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDexFiles(soa.Self(),
972*795d594fSAndroid Build Coastguard Worker                             class_loader_3,
973*795d594fSAndroid Build Coastguard Worker                             WellKnownClasses::dalvik_system_PathClassLoader.Get(),
974*795d594fSAndroid Build Coastguard Worker                             class_loader_3_dex_files);
975*795d594fSAndroid Build Coastguard Worker 
976*795d594fSAndroid Build Coastguard Worker   // Verify its shared library.
977*795d594fSAndroid Build Coastguard Worker   raw_shared_libraries = field->GetObject(class_loader_3.Get());
978*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(raw_shared_libraries != nullptr);
979*795d594fSAndroid Build Coastguard Worker 
980*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ObjectArray<mirror::ClassLoader>> shared_libraries_2(
981*795d594fSAndroid Build Coastguard Worker       hs.NewHandle(raw_shared_libraries->AsObjectArray<mirror::ClassLoader>()));
982*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(shared_libraries->GetLength(), 1);
983*795d594fSAndroid Build Coastguard Worker 
984*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> class_loader_4 = hs.NewHandle(shared_libraries_2->Get(0));
985*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> class_loader_4_dex_files =
986*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(classpath_dex_d);
987*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDexFiles(soa.Self(),
988*795d594fSAndroid Build Coastguard Worker                             class_loader_4,
989*795d594fSAndroid Build Coastguard Worker                             WellKnownClasses::dalvik_system_PathClassLoader.Get(),
990*795d594fSAndroid Build Coastguard Worker                             class_loader_4_dex_files);
991*795d594fSAndroid Build Coastguard Worker   raw_shared_libraries = field->GetObject(class_loader_4.Get());
992*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(raw_shared_libraries == nullptr);
993*795d594fSAndroid Build Coastguard Worker 
994*795d594fSAndroid Build Coastguard Worker   // Class loaders should have the BootClassLoader as a parent.
995*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(class_loader_2->GetParent()->GetClass() ==
996*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_BootClassLoader);
997*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(class_loader_3->GetParent()->GetClass() ==
998*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_BootClassLoader);
999*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(class_loader_4->GetParent()->GetClass() ==
1000*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_BootClassLoader);
1001*795d594fSAndroid Build Coastguard Worker }
1002*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,CreateClassLoaderWithSharedLibrariesDependencies)1003*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, CreateClassLoaderWithSharedLibrariesDependencies) {
1004*795d594fSAndroid Build Coastguard Worker   // Setup the context.
1005*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> classpath_dex_a = OpenTestDexFiles("ForClassLoaderA");
1006*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> classpath_dex_b = OpenTestDexFiles("ForClassLoaderB");
1007*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> classpath_dex_c = OpenTestDexFiles("ForClassLoaderC");
1008*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> classpath_dex_d = OpenTestDexFiles("ForClassLoaderD");
1009*795d594fSAndroid Build Coastguard Worker 
1010*795d594fSAndroid Build Coastguard Worker   std::string context_spec =
1011*795d594fSAndroid Build Coastguard Worker       "PCL[" + CreateClassPath(classpath_dex_a) + "]{" +
1012*795d594fSAndroid Build Coastguard Worker       "PCL[" + CreateClassPath(classpath_dex_b) + "]{" +
1013*795d594fSAndroid Build Coastguard Worker       "PCL[" + CreateClassPath(classpath_dex_c) + "]}};" +
1014*795d594fSAndroid Build Coastguard Worker       "PCL[" + CreateClassPath(classpath_dex_d) + "]";
1015*795d594fSAndroid Build Coastguard Worker 
1016*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = ClassLoaderContext::Create(context_spec);
1017*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(context->OpenDexFiles());
1018*795d594fSAndroid Build Coastguard Worker 
1019*795d594fSAndroid Build Coastguard Worker   // Setup the compilation sources.
1020*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> compilation_sources = OpenTestDexFiles("MultiDex");
1021*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> compilation_sources_raw =
1022*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(compilation_sources);
1023*795d594fSAndroid Build Coastguard Worker 
1024*795d594fSAndroid Build Coastguard Worker   // Create the class loader.
1025*795d594fSAndroid Build Coastguard Worker   jobject jclass_loader = context->CreateClassLoader(compilation_sources_raw);
1026*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(jclass_loader != nullptr);
1027*795d594fSAndroid Build Coastguard Worker 
1028*795d594fSAndroid Build Coastguard Worker   // Verify the class loader.
1029*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(Thread::Current());
1030*795d594fSAndroid Build Coastguard Worker 
1031*795d594fSAndroid Build Coastguard Worker   StackHandleScope<6> hs(soa.Self());
1032*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> class_loader_1 = hs.NewHandle(
1033*795d594fSAndroid Build Coastguard Worker       soa.Decode<mirror::ClassLoader>(jclass_loader));
1034*795d594fSAndroid Build Coastguard Worker 
1035*795d594fSAndroid Build Coastguard Worker   // For the first class loader the class path dex files must come first and then the
1036*795d594fSAndroid Build Coastguard Worker   // compilation sources.
1037*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> class_loader_1_dex_files =
1038*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(classpath_dex_a);
1039*795d594fSAndroid Build Coastguard Worker   for (auto& dex : compilation_sources_raw) {
1040*795d594fSAndroid Build Coastguard Worker     class_loader_1_dex_files.push_back(dex);
1041*795d594fSAndroid Build Coastguard Worker   }
1042*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDexFiles(soa.Self(),
1043*795d594fSAndroid Build Coastguard Worker                             class_loader_1,
1044*795d594fSAndroid Build Coastguard Worker                             WellKnownClasses::dalvik_system_PathClassLoader.Get(),
1045*795d594fSAndroid Build Coastguard Worker                             class_loader_1_dex_files);
1046*795d594fSAndroid Build Coastguard Worker 
1047*795d594fSAndroid Build Coastguard Worker   // Verify its shared library.
1048*795d594fSAndroid Build Coastguard Worker   ArtField* field = WellKnownClasses::dalvik_system_BaseDexClassLoader_sharedLibraryLoaders;
1049*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Object> raw_shared_libraries = field->GetObject(class_loader_1.Get());
1050*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(raw_shared_libraries != nullptr);
1051*795d594fSAndroid Build Coastguard Worker 
1052*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ObjectArray<mirror::ClassLoader>> shared_libraries(
1053*795d594fSAndroid Build Coastguard Worker       hs.NewHandle(raw_shared_libraries->AsObjectArray<mirror::ClassLoader>()));
1054*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(shared_libraries->GetLength(), 1);
1055*795d594fSAndroid Build Coastguard Worker 
1056*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> class_loader_2 = hs.NewHandle(shared_libraries->Get(0));
1057*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> class_loader_2_dex_files =
1058*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(classpath_dex_b);
1059*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDexFiles(soa.Self(),
1060*795d594fSAndroid Build Coastguard Worker                             class_loader_2,
1061*795d594fSAndroid Build Coastguard Worker                             WellKnownClasses::dalvik_system_PathClassLoader.Get(),
1062*795d594fSAndroid Build Coastguard Worker                             class_loader_2_dex_files);
1063*795d594fSAndroid Build Coastguard Worker 
1064*795d594fSAndroid Build Coastguard Worker   // Verify the shared library dependency of the shared library.
1065*795d594fSAndroid Build Coastguard Worker   raw_shared_libraries = field->GetObject(class_loader_2.Get());
1066*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(raw_shared_libraries != nullptr);
1067*795d594fSAndroid Build Coastguard Worker 
1068*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ObjectArray<mirror::ClassLoader>> shared_libraries_2(
1069*795d594fSAndroid Build Coastguard Worker       hs.NewHandle(raw_shared_libraries->AsObjectArray<mirror::ClassLoader>()));
1070*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(shared_libraries_2->GetLength(), 1);
1071*795d594fSAndroid Build Coastguard Worker 
1072*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> class_loader_3 = hs.NewHandle(shared_libraries_2->Get(0));
1073*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> class_loader_3_dex_files =
1074*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(classpath_dex_c);
1075*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDexFiles(soa.Self(),
1076*795d594fSAndroid Build Coastguard Worker                             class_loader_3,
1077*795d594fSAndroid Build Coastguard Worker                             WellKnownClasses::dalvik_system_PathClassLoader.Get(),
1078*795d594fSAndroid Build Coastguard Worker                             class_loader_3_dex_files);
1079*795d594fSAndroid Build Coastguard Worker   raw_shared_libraries = field->GetObject(class_loader_3.Get());
1080*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(raw_shared_libraries == nullptr);
1081*795d594fSAndroid Build Coastguard Worker 
1082*795d594fSAndroid Build Coastguard Worker   // Verify the parent.
1083*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> class_loader_4 = hs.NewHandle(class_loader_1->GetParent());
1084*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> class_loader_4_dex_files =
1085*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(classpath_dex_d);
1086*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDexFiles(soa.Self(),
1087*795d594fSAndroid Build Coastguard Worker                             class_loader_4,
1088*795d594fSAndroid Build Coastguard Worker                             WellKnownClasses::dalvik_system_PathClassLoader.Get(),
1089*795d594fSAndroid Build Coastguard Worker                             class_loader_4_dex_files);
1090*795d594fSAndroid Build Coastguard Worker   raw_shared_libraries = field->GetObject(class_loader_4.Get());
1091*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(raw_shared_libraries == nullptr);
1092*795d594fSAndroid Build Coastguard Worker 
1093*795d594fSAndroid Build Coastguard Worker   // Class loaders should have the BootClassLoader as a parent.
1094*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(class_loader_2->GetParent()->GetClass() ==
1095*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_BootClassLoader);
1096*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(class_loader_3->GetParent()->GetClass() ==
1097*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_BootClassLoader);
1098*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(class_loader_4->GetParent()->GetClass() ==
1099*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_BootClassLoader);
1100*795d594fSAndroid Build Coastguard Worker }
1101*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,RemoveSourceLocations)1102*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, RemoveSourceLocations) {
1103*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context =
1104*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext::Create("PCL[a.dex]");
1105*795d594fSAndroid Build Coastguard Worker   dchecked_vector<std::string> classpath_dex;
1106*795d594fSAndroid Build Coastguard Worker   classpath_dex.push_back("a.dex");
1107*795d594fSAndroid Build Coastguard Worker   dchecked_vector<std::string> compilation_sources;
1108*795d594fSAndroid Build Coastguard Worker   compilation_sources.push_back("src.dex");
1109*795d594fSAndroid Build Coastguard Worker 
1110*795d594fSAndroid Build Coastguard Worker   // Nothing should be removed.
1111*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(context->RemoveLocationsFromClassPaths(compilation_sources));
1112*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderPCL(context.get(), 0, "a.dex");
1113*795d594fSAndroid Build Coastguard Worker   // Classes should be removed.
1114*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(context->RemoveLocationsFromClassPaths(classpath_dex));
1115*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderPCL(context.get(), 0, "");
1116*795d594fSAndroid Build Coastguard Worker }
1117*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,CreateClassLoaderWithSameSharedLibraries)1118*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, CreateClassLoaderWithSameSharedLibraries) {
1119*795d594fSAndroid Build Coastguard Worker   // Setup the context.
1120*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> classpath_dex_a = OpenTestDexFiles("ForClassLoaderA");
1121*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> classpath_dex_b = OpenTestDexFiles("ForClassLoaderB");
1122*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> classpath_dex_c = OpenTestDexFiles("ForClassLoaderC");
1123*795d594fSAndroid Build Coastguard Worker 
1124*795d594fSAndroid Build Coastguard Worker   std::string context_spec =
1125*795d594fSAndroid Build Coastguard Worker       "PCL[" + CreateClassPath(classpath_dex_a) + "]{" +
1126*795d594fSAndroid Build Coastguard Worker       "PCL[" + CreateClassPath(classpath_dex_b) + "]};" +
1127*795d594fSAndroid Build Coastguard Worker       "PCL[" + CreateClassPath(classpath_dex_c) + "]{" +
1128*795d594fSAndroid Build Coastguard Worker       "PCL[" + CreateClassPath(classpath_dex_b) + "]}";
1129*795d594fSAndroid Build Coastguard Worker 
1130*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = ClassLoaderContext::Create(context_spec);
1131*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(context->OpenDexFiles());
1132*795d594fSAndroid Build Coastguard Worker 
1133*795d594fSAndroid Build Coastguard Worker   // Setup the compilation sources.
1134*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> compilation_sources = OpenTestDexFiles("MultiDex");
1135*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> compilation_sources_raw =
1136*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(compilation_sources);
1137*795d594fSAndroid Build Coastguard Worker 
1138*795d594fSAndroid Build Coastguard Worker   // Create the class loader.
1139*795d594fSAndroid Build Coastguard Worker   jobject jclass_loader = context->CreateClassLoader(compilation_sources_raw);
1140*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(jclass_loader != nullptr);
1141*795d594fSAndroid Build Coastguard Worker 
1142*795d594fSAndroid Build Coastguard Worker   // Verify the class loader.
1143*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(Thread::Current());
1144*795d594fSAndroid Build Coastguard Worker 
1145*795d594fSAndroid Build Coastguard Worker   StackHandleScope<6> hs(soa.Self());
1146*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> class_loader_1 = hs.NewHandle(
1147*795d594fSAndroid Build Coastguard Worker       soa.Decode<mirror::ClassLoader>(jclass_loader));
1148*795d594fSAndroid Build Coastguard Worker 
1149*795d594fSAndroid Build Coastguard Worker   // For the first class loader the class path dex files must come first and then the
1150*795d594fSAndroid Build Coastguard Worker   // compilation sources.
1151*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> class_loader_1_dex_files =
1152*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(classpath_dex_a);
1153*795d594fSAndroid Build Coastguard Worker   for (auto& dex : compilation_sources_raw) {
1154*795d594fSAndroid Build Coastguard Worker     class_loader_1_dex_files.push_back(dex);
1155*795d594fSAndroid Build Coastguard Worker   }
1156*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDexFiles(soa.Self(),
1157*795d594fSAndroid Build Coastguard Worker                             class_loader_1,
1158*795d594fSAndroid Build Coastguard Worker                             WellKnownClasses::dalvik_system_PathClassLoader.Get(),
1159*795d594fSAndroid Build Coastguard Worker                             class_loader_1_dex_files);
1160*795d594fSAndroid Build Coastguard Worker 
1161*795d594fSAndroid Build Coastguard Worker   // Verify its shared library.
1162*795d594fSAndroid Build Coastguard Worker   ArtField* field = WellKnownClasses::dalvik_system_BaseDexClassLoader_sharedLibraryLoaders;
1163*795d594fSAndroid Build Coastguard Worker   ObjPtr<mirror::Object> raw_shared_libraries = field->GetObject(class_loader_1.Get());
1164*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(raw_shared_libraries != nullptr);
1165*795d594fSAndroid Build Coastguard Worker 
1166*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ObjectArray<mirror::ClassLoader>> shared_libraries(
1167*795d594fSAndroid Build Coastguard Worker       hs.NewHandle(raw_shared_libraries->AsObjectArray<mirror::ClassLoader>()));
1168*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(shared_libraries->GetLength(), 1);
1169*795d594fSAndroid Build Coastguard Worker 
1170*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> class_loader_2 = hs.NewHandle(shared_libraries->Get(0));
1171*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> class_loader_2_dex_files =
1172*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(classpath_dex_b);
1173*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDexFiles(soa.Self(),
1174*795d594fSAndroid Build Coastguard Worker                             class_loader_2,
1175*795d594fSAndroid Build Coastguard Worker                             WellKnownClasses::dalvik_system_PathClassLoader.Get(),
1176*795d594fSAndroid Build Coastguard Worker                             class_loader_2_dex_files);
1177*795d594fSAndroid Build Coastguard Worker 
1178*795d594fSAndroid Build Coastguard Worker   // Verify the parent.
1179*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> class_loader_3 = hs.NewHandle(class_loader_1->GetParent());
1180*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> class_loader_3_dex_files =
1181*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(classpath_dex_c);
1182*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDexFiles(soa.Self(),
1183*795d594fSAndroid Build Coastguard Worker                             class_loader_3,
1184*795d594fSAndroid Build Coastguard Worker                             WellKnownClasses::dalvik_system_PathClassLoader.Get(),
1185*795d594fSAndroid Build Coastguard Worker                             class_loader_3_dex_files);
1186*795d594fSAndroid Build Coastguard Worker 
1187*795d594fSAndroid Build Coastguard Worker   // Verify its shared library is the same as the child.
1188*795d594fSAndroid Build Coastguard Worker   raw_shared_libraries = field->GetObject(class_loader_3.Get());
1189*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(raw_shared_libraries != nullptr);
1190*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ObjectArray<mirror::ClassLoader>> shared_libraries_2(
1191*795d594fSAndroid Build Coastguard Worker       hs.NewHandle(raw_shared_libraries->AsObjectArray<mirror::ClassLoader>()));
1192*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(shared_libraries_2->GetLength(), 1);
1193*795d594fSAndroid Build Coastguard Worker   ASSERT_OBJ_PTR_EQ(shared_libraries_2->Get(0), class_loader_2.Get());
1194*795d594fSAndroid Build Coastguard Worker 
1195*795d594fSAndroid Build Coastguard Worker   // Class loaders should have the BootClassLoader as a parent.
1196*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(class_loader_2->GetParent()->GetClass() ==
1197*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_BootClassLoader);
1198*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(class_loader_3->GetParent()->GetClass() ==
1199*795d594fSAndroid Build Coastguard Worker       WellKnownClasses::java_lang_BootClassLoader);
1200*795d594fSAndroid Build Coastguard Worker }
1201*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,EncodeInOatFile)1202*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, EncodeInOatFile) {
1203*795d594fSAndroid Build Coastguard Worker   std::string dex1_name = GetTestDexFileName("Main");
1204*795d594fSAndroid Build Coastguard Worker   std::string dex2_name = GetTestDexFileName("MyClass");
1205*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context =
1206*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext::Create("PCL[" + dex1_name + ":" + dex2_name + "]");
1207*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(context->OpenDexFiles());
1208*795d594fSAndroid Build Coastguard Worker 
1209*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> dex1 = OpenTestDexFiles("Main");
1210*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> dex2 = OpenTestDexFiles("MyClass");
1211*795d594fSAndroid Build Coastguard Worker   std::string encoding = context->EncodeContextForOatFile("");
1212*795d594fSAndroid Build Coastguard Worker   std::string expected_encoding = "PCL[" + CreateClassPathWithChecksums(dex1) + ":" +
1213*795d594fSAndroid Build Coastguard Worker       CreateClassPathWithChecksums(dex2) + "]";
1214*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_encoding, context->EncodeContextForOatFile(""));
1215*795d594fSAndroid Build Coastguard Worker }
1216*795d594fSAndroid Build Coastguard Worker 
1217*795d594fSAndroid Build Coastguard Worker // Same as above, but passes `only_read_checksums=true` to `OpenDexFiles`.
TEST_F(ClassLoaderContextTest,EncodeInOatFileOnlyReadChecksums)1218*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, EncodeInOatFileOnlyReadChecksums) {
1219*795d594fSAndroid Build Coastguard Worker   std::string dex1_name = GetTestDexFileName("Main");
1220*795d594fSAndroid Build Coastguard Worker   std::string dex2_name = GetTestDexFileName("MyClass");
1221*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context =
1222*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext::Create("PCL[" + dex1_name + ":" + dex2_name + "]");
1223*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(context->OpenDexFiles(
1224*795d594fSAndroid Build Coastguard Worker       /*classpath_dir=*/"", /*context_fds=*/{}, /*only_read_checksums=*/true));
1225*795d594fSAndroid Build Coastguard Worker 
1226*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> dex1 = OpenTestDexFiles("Main");
1227*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> dex2 = OpenTestDexFiles("MyClass");
1228*795d594fSAndroid Build Coastguard Worker   std::string encoding = context->EncodeContextForOatFile("");
1229*795d594fSAndroid Build Coastguard Worker   std::string expected_encoding =
1230*795d594fSAndroid Build Coastguard Worker       "PCL[" + CreateClassPathWithChecksums(dex1) + ":" + CreateClassPathWithChecksums(dex2) + "]";
1231*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_encoding, context->EncodeContextForOatFile(""));
1232*795d594fSAndroid Build Coastguard Worker }
1233*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,EncodeInOatFileIMC)1234*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, EncodeInOatFileIMC) {
1235*795d594fSAndroid Build Coastguard Worker   jobject class_loader_a = LoadDexInPathClassLoader("Main", nullptr);
1236*795d594fSAndroid Build Coastguard Worker   jobject class_loader_b = LoadDexInInMemoryDexClassLoader("MyClass", class_loader_a);
1237*795d594fSAndroid Build Coastguard Worker 
1238*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = CreateContextForClassLoader(class_loader_b);
1239*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(context->OpenDexFiles());
1240*795d594fSAndroid Build Coastguard Worker 
1241*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> dex1 = OpenTestDexFiles("Main");
1242*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> dex2 = OpenTestDexFiles("MyClass");
1243*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(dex2.size(), 1u);
1244*795d594fSAndroid Build Coastguard Worker 
1245*795d594fSAndroid Build Coastguard Worker   uint32_t expected_checksum = DexFileLoader::GetMultiDexChecksum(dex2);
1246*795d594fSAndroid Build Coastguard Worker 
1247*795d594fSAndroid Build Coastguard Worker   std::string encoding = context->EncodeContextForOatFile("");
1248*795d594fSAndroid Build Coastguard Worker   std::string expected_encoding = "IMC[<unknown>*" + std::to_string(expected_checksum) + "];PCL[" +
1249*795d594fSAndroid Build Coastguard Worker                                   CreateClassPathWithChecksums(dex1) + "]";
1250*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_encoding, context->EncodeContextForOatFile(""));
1251*795d594fSAndroid Build Coastguard Worker }
1252*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,EncodeForDex2oat)1253*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, EncodeForDex2oat) {
1254*795d594fSAndroid Build Coastguard Worker   std::string dex1_name = GetTestDexFileName("Main");
1255*795d594fSAndroid Build Coastguard Worker   std::string dex2_name = GetTestDexFileName("MultiDex");
1256*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context =
1257*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext::Create("PCL[" + dex1_name + ":" + dex2_name + "]");
1258*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(context->OpenDexFiles());
1259*795d594fSAndroid Build Coastguard Worker 
1260*795d594fSAndroid Build Coastguard Worker   std::string encoding = context->EncodeContextForDex2oat("");
1261*795d594fSAndroid Build Coastguard Worker   std::string expected_encoding = "PCL[" + dex1_name + ":" + dex2_name + "]";
1262*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_encoding, context->EncodeContextForDex2oat(""));
1263*795d594fSAndroid Build Coastguard Worker }
1264*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,EncodeForDex2oatIMC)1265*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, EncodeForDex2oatIMC) {
1266*795d594fSAndroid Build Coastguard Worker   jobject class_loader_a = LoadDexInPathClassLoader("Main", nullptr);
1267*795d594fSAndroid Build Coastguard Worker   jobject class_loader_b = LoadDexInInMemoryDexClassLoader("MyClass", class_loader_a);
1268*795d594fSAndroid Build Coastguard Worker 
1269*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = CreateContextForClassLoader(class_loader_b);
1270*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(context->OpenDexFiles());
1271*795d594fSAndroid Build Coastguard Worker 
1272*795d594fSAndroid Build Coastguard Worker   std::string encoding = context->EncodeContextForDex2oat("");
1273*795d594fSAndroid Build Coastguard Worker   std::string expected_encoding = "IMC[<unknown>];PCL[" + GetTestDexFileName("Main") + "]";
1274*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_encoding, context->EncodeContextForDex2oat(""));
1275*795d594fSAndroid Build Coastguard Worker }
1276*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,EncodeForDex2oatDuplicates)1277*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, EncodeForDex2oatDuplicates) {
1278*795d594fSAndroid Build Coastguard Worker   std::string dex_name = GetTestDexFileName("Main");
1279*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context =
1280*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext::Create("PCL[" + dex_name + ":" + dex_name + "]");
1281*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(context->OpenDexFiles());
1282*795d594fSAndroid Build Coastguard Worker 
1283*795d594fSAndroid Build Coastguard Worker   std::string encoding = context->EncodeContextForDex2oat("");
1284*795d594fSAndroid Build Coastguard Worker   std::string expected_encoding = "PCL[" + dex_name + "]";
1285*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(expected_encoding, context->EncodeContextForDex2oat(""));
1286*795d594fSAndroid Build Coastguard Worker }
1287*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,EncodeContextsSinglePath)1288*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, EncodeContextsSinglePath) {
1289*795d594fSAndroid Build Coastguard Worker   jobject class_loader = LoadDexInPathClassLoader("Main", nullptr);
1290*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context =
1291*795d594fSAndroid Build Coastguard Worker       CreateContextForClassLoader(class_loader);
1292*795d594fSAndroid Build Coastguard Worker 
1293*795d594fSAndroid Build Coastguard Worker   std::map<std::string, std::string> encodings = context->EncodeClassPathContexts("");
1294*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(1u, encodings.size());
1295*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ("PCL[]", encodings.at(GetTestDexFileName("Main")));
1296*795d594fSAndroid Build Coastguard Worker }
1297*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,EncodeContextsMultiDex)1298*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, EncodeContextsMultiDex) {
1299*795d594fSAndroid Build Coastguard Worker   jobject class_loader = LoadDexInPathClassLoader("MultiDex", nullptr);
1300*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context =
1301*795d594fSAndroid Build Coastguard Worker       CreateContextForClassLoader(class_loader);
1302*795d594fSAndroid Build Coastguard Worker 
1303*795d594fSAndroid Build Coastguard Worker   std::map<std::string, std::string> encodings = context->EncodeClassPathContexts("");
1304*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(1u, encodings.size());
1305*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ("PCL[]", encodings.at(GetTestDexFileName("MultiDex")));
1306*795d594fSAndroid Build Coastguard Worker }
1307*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,EncodeContextsRepeatedMultiDex)1308*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, EncodeContextsRepeatedMultiDex) {
1309*795d594fSAndroid Build Coastguard Worker   jobject top_class_loader = LoadDexInPathClassLoader("MultiDex", nullptr);
1310*795d594fSAndroid Build Coastguard Worker   jobject middle_class_loader =
1311*795d594fSAndroid Build Coastguard Worker       LoadDexInPathClassLoader("Main", top_class_loader);
1312*795d594fSAndroid Build Coastguard Worker   jobject bottom_class_loader =
1313*795d594fSAndroid Build Coastguard Worker       LoadDexInPathClassLoader("MultiDex", middle_class_loader);
1314*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context =
1315*795d594fSAndroid Build Coastguard Worker       CreateContextForClassLoader(bottom_class_loader);
1316*795d594fSAndroid Build Coastguard Worker 
1317*795d594fSAndroid Build Coastguard Worker   std::map<std::string, std::string> encodings = context->EncodeClassPathContexts("");
1318*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(1u, encodings.size());
1319*795d594fSAndroid Build Coastguard Worker 
1320*795d594fSAndroid Build Coastguard Worker   std::string main_dex_name = GetTestDexFileName("Main");
1321*795d594fSAndroid Build Coastguard Worker   std::string multidex_dex_name = GetTestDexFileName("MultiDex");
1322*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
1323*795d594fSAndroid Build Coastguard Worker       "PCL[];PCL[" + main_dex_name + "];PCL[" + multidex_dex_name + "]",
1324*795d594fSAndroid Build Coastguard Worker       encodings.at(multidex_dex_name));
1325*795d594fSAndroid Build Coastguard Worker }
1326*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,EncodeContextsSinglePathWithShared)1327*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, EncodeContextsSinglePathWithShared) {
1328*795d594fSAndroid Build Coastguard Worker   jobject class_loader_a = LoadDexInPathClassLoader("MyClass", nullptr);
1329*795d594fSAndroid Build Coastguard Worker 
1330*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(Thread::Current());
1331*795d594fSAndroid Build Coastguard Worker   StackHandleScope<1> hs(soa.Self());
1332*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ObjectArray<mirror::ClassLoader>> libraries = hs.NewHandle(
1333*795d594fSAndroid Build Coastguard Worker     mirror::ObjectArray<mirror::ClassLoader>::Alloc(
1334*795d594fSAndroid Build Coastguard Worker         soa.Self(),
1335*795d594fSAndroid Build Coastguard Worker         GetClassRoot<mirror::ObjectArray<mirror::ClassLoader>>(),
1336*795d594fSAndroid Build Coastguard Worker         1));
1337*795d594fSAndroid Build Coastguard Worker   libraries->Set(0, soa.Decode<mirror::ClassLoader>(class_loader_a));
1338*795d594fSAndroid Build Coastguard Worker 
1339*795d594fSAndroid Build Coastguard Worker   jobject class_loader_b = LoadDexInPathClassLoader(
1340*795d594fSAndroid Build Coastguard Worker       "Main", nullptr, soa.AddLocalReference<jobject>(libraries.Get()));
1341*795d594fSAndroid Build Coastguard Worker 
1342*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = CreateContextForClassLoader(class_loader_b);
1343*795d594fSAndroid Build Coastguard Worker 
1344*795d594fSAndroid Build Coastguard Worker   std::map<std::string, std::string> encodings = context->EncodeClassPathContexts("");
1345*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(1u, encodings.size());
1346*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
1347*795d594fSAndroid Build Coastguard Worker       "PCL[]{PCL[" + GetTestDexFileName("MyClass") + "]}",
1348*795d594fSAndroid Build Coastguard Worker       encodings.at(GetTestDexFileName("Main")));
1349*795d594fSAndroid Build Coastguard Worker }
1350*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,EncodeContextsMultiplePaths)1351*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, EncodeContextsMultiplePaths) {
1352*795d594fSAndroid Build Coastguard Worker   jobject class_loader = LoadDexInPathClassLoader(
1353*795d594fSAndroid Build Coastguard Worker       std::vector<std::string>{ "Main", "MultiDex"}, nullptr);
1354*795d594fSAndroid Build Coastguard Worker 
1355*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context =
1356*795d594fSAndroid Build Coastguard Worker       CreateContextForClassLoader(class_loader);
1357*795d594fSAndroid Build Coastguard Worker 
1358*795d594fSAndroid Build Coastguard Worker   std::map<std::string, std::string> encodings = context->EncodeClassPathContexts("");
1359*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(2u, encodings.size());
1360*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ("PCL[]", encodings.at(GetTestDexFileName("Main")));
1361*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
1362*795d594fSAndroid Build Coastguard Worker       "PCL[" + GetTestDexFileName("Main") + "]", encodings.at(GetTestDexFileName("MultiDex")));
1363*795d594fSAndroid Build Coastguard Worker }
1364*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,EncodeContextsMultiplePathsWithShared)1365*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, EncodeContextsMultiplePathsWithShared) {
1366*795d594fSAndroid Build Coastguard Worker   jobject class_loader_a = LoadDexInPathClassLoader("MyClass", nullptr);
1367*795d594fSAndroid Build Coastguard Worker 
1368*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(Thread::Current());
1369*795d594fSAndroid Build Coastguard Worker   StackHandleScope<1> hs(soa.Self());
1370*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ObjectArray<mirror::ClassLoader>> libraries = hs.NewHandle(
1371*795d594fSAndroid Build Coastguard Worker     mirror::ObjectArray<mirror::ClassLoader>::Alloc(
1372*795d594fSAndroid Build Coastguard Worker         soa.Self(),
1373*795d594fSAndroid Build Coastguard Worker         GetClassRoot<mirror::ObjectArray<mirror::ClassLoader>>(),
1374*795d594fSAndroid Build Coastguard Worker         1));
1375*795d594fSAndroid Build Coastguard Worker   libraries->Set(0, soa.Decode<mirror::ClassLoader>(class_loader_a));
1376*795d594fSAndroid Build Coastguard Worker 
1377*795d594fSAndroid Build Coastguard Worker   jobject class_loader_b = LoadDexInPathClassLoader(
1378*795d594fSAndroid Build Coastguard Worker       std::vector<std::string> { "Main", "MultiDex" },
1379*795d594fSAndroid Build Coastguard Worker       nullptr, soa.AddLocalReference<jobject>(libraries.Get()));
1380*795d594fSAndroid Build Coastguard Worker 
1381*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context =
1382*795d594fSAndroid Build Coastguard Worker       CreateContextForClassLoader(class_loader_b);
1383*795d594fSAndroid Build Coastguard Worker 
1384*795d594fSAndroid Build Coastguard Worker   std::map<std::string, std::string> encodings = context->EncodeClassPathContexts("");
1385*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(2u, encodings.size());
1386*795d594fSAndroid Build Coastguard Worker   const std::string context_suffix =
1387*795d594fSAndroid Build Coastguard Worker       "{PCL[" + GetTestDexFileName("MyClass") + "]}";
1388*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ("PCL[]" + context_suffix, encodings.at(GetTestDexFileName("Main")));
1389*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
1390*795d594fSAndroid Build Coastguard Worker       "PCL[" + GetTestDexFileName("Main") + "]" + context_suffix,
1391*795d594fSAndroid Build Coastguard Worker       encodings.at(GetTestDexFileName("MultiDex")));
1392*795d594fSAndroid Build Coastguard Worker }
1393*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,EncodeContextsIMC)1394*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, EncodeContextsIMC) {
1395*795d594fSAndroid Build Coastguard Worker   jobject class_loader_a = LoadDexInPathClassLoader("Main", nullptr);
1396*795d594fSAndroid Build Coastguard Worker   jobject class_loader_b =
1397*795d594fSAndroid Build Coastguard Worker       LoadDexInInMemoryDexClassLoader("MyClass", class_loader_a);
1398*795d594fSAndroid Build Coastguard Worker 
1399*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context =
1400*795d594fSAndroid Build Coastguard Worker       CreateContextForClassLoader(class_loader_b);
1401*795d594fSAndroid Build Coastguard Worker 
1402*795d594fSAndroid Build Coastguard Worker   std::map<std::string, std::string> encodings = context->EncodeClassPathContexts("");
1403*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(1u, encodings.size());
1404*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
1405*795d594fSAndroid Build Coastguard Worker       "IMC[];PCL[" + GetTestDexFileName("Main") + "]",
1406*795d594fSAndroid Build Coastguard Worker       encodings.at("<unknown>"));
1407*795d594fSAndroid Build Coastguard Worker }
1408*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,EncodeContextsForSingleDex)1409*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, EncodeContextsForSingleDex) {
1410*795d594fSAndroid Build Coastguard Worker   jobject class_loader = LoadDexInPathClassLoader("Main", nullptr);
1411*795d594fSAndroid Build Coastguard Worker   std::map<std::string, std::string> encodings =
1412*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext::EncodeClassPathContextsForClassLoader(class_loader);
1413*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(1u, encodings.size());
1414*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ("PCL[]", encodings.at(GetTestDexFileName("Main")));
1415*795d594fSAndroid Build Coastguard Worker }
1416*795d594fSAndroid Build Coastguard Worker 
CreateForeignClassLoader()1417*795d594fSAndroid Build Coastguard Worker static jobject CreateForeignClassLoader() {
1418*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(Thread::Current());
1419*795d594fSAndroid Build Coastguard Worker 
1420*795d594fSAndroid Build Coastguard Worker   // We cannot instantiate a ClassLoader directly, so instead we allocate an Object to represent
1421*795d594fSAndroid Build Coastguard Worker   // our foreign ClassLoader (this works because the runtime does proper instanceof checks before
1422*795d594fSAndroid Build Coastguard Worker   // operating on this object.
1423*795d594fSAndroid Build Coastguard Worker   ArtMethod* ctor =
1424*795d594fSAndroid Build Coastguard Worker       GetClassRoot<mirror::Object>()->FindClassMethod("<init>", "()V", kRuntimePointerSize);
1425*795d594fSAndroid Build Coastguard Worker   CHECK(ctor != nullptr);
1426*795d594fSAndroid Build Coastguard Worker   return soa.AddLocalReference<jobject>(ctor->NewObject<>(soa.Self()));
1427*795d594fSAndroid Build Coastguard Worker }
1428*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,EncodeContextsForUnsupportedBase)1429*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, EncodeContextsForUnsupportedBase) {
1430*795d594fSAndroid Build Coastguard Worker   std::map<std::string, std::string> empty;
1431*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
1432*795d594fSAndroid Build Coastguard Worker       empty, ClassLoaderContext::EncodeClassPathContextsForClassLoader(CreateForeignClassLoader()));
1433*795d594fSAndroid Build Coastguard Worker }
1434*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,EncodeContextsForUnsupportedChain)1435*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, EncodeContextsForUnsupportedChain) {
1436*795d594fSAndroid Build Coastguard Worker   jobject class_loader = LoadDexInPathClassLoader("Main", CreateForeignClassLoader());
1437*795d594fSAndroid Build Coastguard Worker   std::map<std::string, std::string> encodings =
1438*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext::EncodeClassPathContextsForClassLoader(class_loader);
1439*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(1u, encodings.size());
1440*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
1441*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext::kUnsupportedClassLoaderContextEncoding,
1442*795d594fSAndroid Build Coastguard Worker       encodings.at(GetTestDexFileName("Main")));
1443*795d594fSAndroid Build Coastguard Worker }
1444*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,EncodeContextsForUnsupportedChainMultiPath)1445*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, EncodeContextsForUnsupportedChainMultiPath) {
1446*795d594fSAndroid Build Coastguard Worker   jobject class_loader = LoadDexInPathClassLoader(std::vector<std::string> { "Main", "MyClass" },
1447*795d594fSAndroid Build Coastguard Worker                                                   CreateForeignClassLoader());
1448*795d594fSAndroid Build Coastguard Worker   std::map<std::string, std::string> encodings =
1449*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext::EncodeClassPathContextsForClassLoader(class_loader);
1450*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(2u, encodings.size());
1451*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
1452*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext::kUnsupportedClassLoaderContextEncoding,
1453*795d594fSAndroid Build Coastguard Worker       encodings.at(GetTestDexFileName("Main")));
1454*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
1455*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext::kUnsupportedClassLoaderContextEncoding,
1456*795d594fSAndroid Build Coastguard Worker       encodings.at(GetTestDexFileName("MyClass")));
1457*795d594fSAndroid Build Coastguard Worker }
1458*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,EncodeContextsForUnsupportedChainMultiDex)1459*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, EncodeContextsForUnsupportedChainMultiDex) {
1460*795d594fSAndroid Build Coastguard Worker   jobject class_loader = LoadDexInPathClassLoader("MultiDex", CreateForeignClassLoader());
1461*795d594fSAndroid Build Coastguard Worker   std::map<std::string, std::string> encodings =
1462*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext::EncodeClassPathContextsForClassLoader(class_loader);
1463*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(1u, encodings.size());
1464*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
1465*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext::kUnsupportedClassLoaderContextEncoding,
1466*795d594fSAndroid Build Coastguard Worker       encodings.at(GetTestDexFileName("MultiDex")));
1467*795d594fSAndroid Build Coastguard Worker }
1468*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,IsValidEncoding)1469*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, IsValidEncoding) {
1470*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(ClassLoaderContext::IsValidEncoding("PCL[]"));
1471*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(ClassLoaderContext::IsValidEncoding("PCL[foo.dex]"));
1472*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(ClassLoaderContext::IsValidEncoding("PCL[foo.dex];PCL[bar.dex]"));
1473*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(ClassLoaderContext::IsValidEncoding("DLC[];PCL[bar.dex]"));
1474*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(
1475*795d594fSAndroid Build Coastguard Worker       ClassLoaderContext::IsValidEncoding(
1476*795d594fSAndroid Build Coastguard Worker         ClassLoaderContext::kUnsupportedClassLoaderContextEncoding));
1477*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(ClassLoaderContext::IsValidEncoding("not_valid"));
1478*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(ClassLoaderContext::IsValidEncoding("[]"));
1479*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(ClassLoaderContext::IsValidEncoding("FCL[]"));
1480*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(ClassLoaderContext::IsValidEncoding("foo.dex:bar.dex"));
1481*795d594fSAndroid Build Coastguard Worker }
1482*795d594fSAndroid Build Coastguard Worker 
1483*795d594fSAndroid Build Coastguard Worker // TODO(calin) add a test which creates the context for a class loader together with dex_elements.
TEST_F(ClassLoaderContextTest,CreateContextForClassLoader)1484*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, CreateContextForClassLoader) {
1485*795d594fSAndroid Build Coastguard Worker   // The chain is
1486*795d594fSAndroid Build Coastguard Worker   //    ClassLoaderA (PathClassLoader)
1487*795d594fSAndroid Build Coastguard Worker   //       ^
1488*795d594fSAndroid Build Coastguard Worker   //       |
1489*795d594fSAndroid Build Coastguard Worker   //    ClassLoaderB (DelegateLastClassLoader)
1490*795d594fSAndroid Build Coastguard Worker   //       ^
1491*795d594fSAndroid Build Coastguard Worker   //       |
1492*795d594fSAndroid Build Coastguard Worker   //    ClassLoaderC (PathClassLoader)
1493*795d594fSAndroid Build Coastguard Worker   //       ^
1494*795d594fSAndroid Build Coastguard Worker   //       |
1495*795d594fSAndroid Build Coastguard Worker   //    ClassLoaderD (DelegateLastClassLoader)
1496*795d594fSAndroid Build Coastguard Worker 
1497*795d594fSAndroid Build Coastguard Worker   jobject class_loader_a = LoadDexInPathClassLoader("ForClassLoaderA", nullptr);
1498*795d594fSAndroid Build Coastguard Worker   jobject class_loader_b = LoadDexInDelegateLastClassLoader("ForClassLoaderB", class_loader_a);
1499*795d594fSAndroid Build Coastguard Worker   jobject class_loader_c = LoadDexInPathClassLoader("ForClassLoaderC", class_loader_b);
1500*795d594fSAndroid Build Coastguard Worker   jobject class_loader_d = LoadDexInDelegateLastClassLoader("ForClassLoaderD", class_loader_c);
1501*795d594fSAndroid Build Coastguard Worker 
1502*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = CreateContextForClassLoader(class_loader_d);
1503*795d594fSAndroid Build Coastguard Worker 
1504*795d594fSAndroid Build Coastguard Worker   VerifyContextForClassLoader(context.get());
1505*795d594fSAndroid Build Coastguard Worker   VerifyContextSize(context.get(), 4);
1506*795d594fSAndroid Build Coastguard Worker 
1507*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDLCFromTestDex(context.get(), 0, "ForClassLoaderD");
1508*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderPCLFromTestDex(context.get(), 1, "ForClassLoaderC");
1509*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDLCFromTestDex(context.get(), 2, "ForClassLoaderB");
1510*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderPCLFromTestDex(context.get(), 3, "ForClassLoaderA");
1511*795d594fSAndroid Build Coastguard Worker }
1512*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,CreateContextForClassLoaderIMC)1513*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, CreateContextForClassLoaderIMC) {
1514*795d594fSAndroid Build Coastguard Worker   // The chain is
1515*795d594fSAndroid Build Coastguard Worker   //    ClassLoaderA (PathClassLoader)
1516*795d594fSAndroid Build Coastguard Worker   //       ^
1517*795d594fSAndroid Build Coastguard Worker   //       |
1518*795d594fSAndroid Build Coastguard Worker   //    ClassLoaderB (InMemoryDexClassLoader)
1519*795d594fSAndroid Build Coastguard Worker   //       ^
1520*795d594fSAndroid Build Coastguard Worker   //       |
1521*795d594fSAndroid Build Coastguard Worker   //    ClassLoaderC (InMemoryDexClassLoader)
1522*795d594fSAndroid Build Coastguard Worker   //       ^
1523*795d594fSAndroid Build Coastguard Worker   //       |
1524*795d594fSAndroid Build Coastguard Worker   //    ClassLoaderD (DelegateLastClassLoader)
1525*795d594fSAndroid Build Coastguard Worker 
1526*795d594fSAndroid Build Coastguard Worker   jobject class_loader_a = LoadDexInPathClassLoader("ForClassLoaderA", nullptr);
1527*795d594fSAndroid Build Coastguard Worker   jobject class_loader_b = LoadDexInInMemoryDexClassLoader("ForClassLoaderB", class_loader_a);
1528*795d594fSAndroid Build Coastguard Worker   jobject class_loader_c = LoadDexInInMemoryDexClassLoader("ForClassLoaderC", class_loader_b);
1529*795d594fSAndroid Build Coastguard Worker   jobject class_loader_d = LoadDexInDelegateLastClassLoader("ForClassLoaderD", class_loader_c);
1530*795d594fSAndroid Build Coastguard Worker 
1531*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = CreateContextForClassLoader(class_loader_d);
1532*795d594fSAndroid Build Coastguard Worker 
1533*795d594fSAndroid Build Coastguard Worker   VerifyContextForClassLoader(context.get());
1534*795d594fSAndroid Build Coastguard Worker   VerifyContextSize(context.get(), 4);
1535*795d594fSAndroid Build Coastguard Worker 
1536*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDLCFromTestDex(context.get(), 0, "ForClassLoaderD");
1537*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderIMCFromTestDex(context.get(), 1, "ForClassLoaderC");
1538*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderIMCFromTestDex(context.get(), 2, "ForClassLoaderB");
1539*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderPCLFromTestDex(context.get(), 3, "ForClassLoaderA");
1540*795d594fSAndroid Build Coastguard Worker }
1541*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,VerifyClassLoaderContextMatch)1542*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, VerifyClassLoaderContextMatch) {
1543*795d594fSAndroid Build Coastguard Worker   std::string context_spec = "PCL[a.dex*123:b.dex*456];DLC[c.dex*890]";
1544*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = ParseContextWithChecksums(context_spec);
1545*795d594fSAndroid Build Coastguard Worker   // Pretend that we successfully open the dex files to pass the DCHECKS.
1546*795d594fSAndroid Build Coastguard Worker   // (as it's much easier to test all the corner cases without relying on actual dex files).
1547*795d594fSAndroid Build Coastguard Worker   PretendContextOpenedDexFilesForChecksums(context.get());
1548*795d594fSAndroid Build Coastguard Worker 
1549*795d594fSAndroid Build Coastguard Worker   VerifyContextSize(context.get(), 2);
1550*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderPCL(context.get(), 0, "a.dex:b.dex");
1551*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDLC(context.get(), 1, "c.dex");
1552*795d594fSAndroid Build Coastguard Worker 
1553*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(context_spec),
1554*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kVerifies);
1555*795d594fSAndroid Build Coastguard Worker 
1556*795d594fSAndroid Build Coastguard Worker   std::string wrong_class_loader_type = "PCL[a.dex*123:b.dex*456];PCL[c.dex*890]";
1557*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(wrong_class_loader_type),
1558*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kMismatch);
1559*795d594fSAndroid Build Coastguard Worker 
1560*795d594fSAndroid Build Coastguard Worker   std::string wrong_class_loader_order = "DLC[c.dex*890];PCL[a.dex*123:b.dex*456]";
1561*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(wrong_class_loader_order),
1562*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kMismatch);
1563*795d594fSAndroid Build Coastguard Worker 
1564*795d594fSAndroid Build Coastguard Worker   std::string wrong_classpath_order = "PCL[b.dex*456:a.dex*123];DLC[c.dex*890]";
1565*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(wrong_classpath_order),
1566*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kMismatch);
1567*795d594fSAndroid Build Coastguard Worker 
1568*795d594fSAndroid Build Coastguard Worker   std::string wrong_checksum = "PCL[a.dex*999:b.dex*456];DLC[c.dex*890]";
1569*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(wrong_checksum),
1570*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kMismatch);
1571*795d594fSAndroid Build Coastguard Worker 
1572*795d594fSAndroid Build Coastguard Worker   std::string wrong_extra_class_loader = "PCL[a.dex*123:b.dex*456];DLC[c.dex*890];PCL[d.dex*321]";
1573*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(wrong_extra_class_loader),
1574*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kMismatch);
1575*795d594fSAndroid Build Coastguard Worker 
1576*795d594fSAndroid Build Coastguard Worker   std::string wrong_extra_classpath = "PCL[a.dex*123:b.dex*456];DLC[c.dex*890:d.dex*321]";
1577*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(wrong_extra_classpath),
1578*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kMismatch);
1579*795d594fSAndroid Build Coastguard Worker 
1580*795d594fSAndroid Build Coastguard Worker   std::string wrong_spec = "PCL[a.dex*999:b.dex*456];DLC[";
1581*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(wrong_spec),
1582*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kMismatch);
1583*795d594fSAndroid Build Coastguard Worker }
1584*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,VerifyClassLoaderContextWithIMCMatch)1585*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, VerifyClassLoaderContextWithIMCMatch) {
1586*795d594fSAndroid Build Coastguard Worker   std::string context_spec = "PCL[a.dex*123:b.dex*456];DLC[c.dex*890];IMC[<unknown>*111]";
1587*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = ParseContextWithChecksums(context_spec);
1588*795d594fSAndroid Build Coastguard Worker   // Pretend that we successfully open the dex files to pass the DCHECKS.
1589*795d594fSAndroid Build Coastguard Worker   // (as it's much easier to test all the corner cases without relying on actual dex files).
1590*795d594fSAndroid Build Coastguard Worker   PretendContextOpenedDexFiles(context.get());
1591*795d594fSAndroid Build Coastguard Worker 
1592*795d594fSAndroid Build Coastguard Worker   VerifyContextSize(context.get(), 3);
1593*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderPCL(context.get(), 0, "a.dex:b.dex");
1594*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDLC(context.get(), 1, "c.dex");
1595*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderIMC(context.get(), 2, "<unknown>");
1596*795d594fSAndroid Build Coastguard Worker 
1597*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(context_spec),
1598*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kVerifies);
1599*795d594fSAndroid Build Coastguard Worker }
1600*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,VerifyClassLoaderContextMatchWithSL)1601*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, VerifyClassLoaderContextMatchWithSL) {
1602*795d594fSAndroid Build Coastguard Worker   std::string context_spec =
1603*795d594fSAndroid Build Coastguard Worker       "PCL[a.dex*123:b.dex*456]{PCL[d.dex*321];PCL[e.dex*654]#PCL[f.dex*098:g.dex*999]}"
1604*795d594fSAndroid Build Coastguard Worker       ";DLC[c.dex*890]";
1605*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = ParseContextWithChecksums(context_spec);
1606*795d594fSAndroid Build Coastguard Worker   // Pretend that we successfully open the dex files to pass the DCHECKS.
1607*795d594fSAndroid Build Coastguard Worker   // (as it's much easier to test all the corner cases without relying on actual dex files).
1608*795d594fSAndroid Build Coastguard Worker   PretendContextOpenedDexFiles(context.get());
1609*795d594fSAndroid Build Coastguard Worker 
1610*795d594fSAndroid Build Coastguard Worker   VerifyContextSize(context.get(), 2);
1611*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderPCL(context.get(), 0, "a.dex:b.dex");
1612*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDLC(context.get(), 1, "c.dex");
1613*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderSharedLibraryPCL(context.get(), 0, 0, "d.dex");
1614*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderSharedLibraryPCL(context.get(), 0, 1, "f.dex:g.dex");
1615*795d594fSAndroid Build Coastguard Worker 
1616*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(context_spec),
1617*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kVerifies);
1618*795d594fSAndroid Build Coastguard Worker 
1619*795d594fSAndroid Build Coastguard Worker   std::string wrong_class_loader_type =
1620*795d594fSAndroid Build Coastguard Worker       "PCL[a.dex*123:b.dex*456]{DLC[d.dex*321];PCL[e.dex*654]#PCL[f.dex*098:g.dex*999]}"
1621*795d594fSAndroid Build Coastguard Worker       ";DLC[c.dex*890]";
1622*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(wrong_class_loader_type),
1623*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kMismatch);
1624*795d594fSAndroid Build Coastguard Worker 
1625*795d594fSAndroid Build Coastguard Worker   std::string wrong_class_loader_order =
1626*795d594fSAndroid Build Coastguard Worker       "PCL[a.dex*123:b.dex*456]{PCL[f.dex#098:g.dex#999}#PCL[d.dex*321];PCL[e.dex*654]}"
1627*795d594fSAndroid Build Coastguard Worker       ";DLC[c.dex*890]";
1628*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(wrong_class_loader_order),
1629*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kMismatch);
1630*795d594fSAndroid Build Coastguard Worker 
1631*795d594fSAndroid Build Coastguard Worker   std::string wrong_classpath_order =
1632*795d594fSAndroid Build Coastguard Worker       "PCL[a.dex*123:b.dex*456]{PCL[d.dex*321];PCL[e.dex*654]#PCL[g.dex*999:f.dex*098]}"
1633*795d594fSAndroid Build Coastguard Worker       ";DLC[c.dex*890]";
1634*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(wrong_classpath_order),
1635*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kMismatch);
1636*795d594fSAndroid Build Coastguard Worker 
1637*795d594fSAndroid Build Coastguard Worker   std::string wrong_checksum =
1638*795d594fSAndroid Build Coastguard Worker       "PCL[a.dex*123:b.dex*456]{PCL[d.dex*333];PCL[e.dex*654]#PCL[g.dex*999:f.dex*098]}"
1639*795d594fSAndroid Build Coastguard Worker       ";DLC[c.dex*890]";
1640*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(wrong_checksum),
1641*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kMismatch);
1642*795d594fSAndroid Build Coastguard Worker 
1643*795d594fSAndroid Build Coastguard Worker   std::string wrong_extra_class_loader =
1644*795d594fSAndroid Build Coastguard Worker       "PCL[a.dex*123:b.dex*456]"
1645*795d594fSAndroid Build Coastguard Worker       "{PCL[d.dex*321];PCL[e.dex*654]#PCL[f.dex*098:g.dex*999];PCL[i.dex#444]}"
1646*795d594fSAndroid Build Coastguard Worker       ";DLC[c.dex*890]";
1647*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(wrong_extra_class_loader),
1648*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kMismatch);
1649*795d594fSAndroid Build Coastguard Worker 
1650*795d594fSAndroid Build Coastguard Worker   std::string wrong_extra_classpath =
1651*795d594fSAndroid Build Coastguard Worker       "PCL[a.dex*123:b.dex*456]{PCL[d.dex*321:i.dex#444];PCL[e.dex*654]#PCL[f.dex*098:g.dex*999]}"
1652*795d594fSAndroid Build Coastguard Worker       ";DLC[c.dex*890]";
1653*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(wrong_extra_classpath),
1654*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kMismatch);
1655*795d594fSAndroid Build Coastguard Worker }
1656*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,VerifyClassLoaderContextMatchWithIMCSL)1657*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, VerifyClassLoaderContextMatchWithIMCSL) {
1658*795d594fSAndroid Build Coastguard Worker   std::string context_spec =
1659*795d594fSAndroid Build Coastguard Worker       "IMC[<unknown>*123:<unknown>*456]"
1660*795d594fSAndroid Build Coastguard Worker       "{IMC[<unknown>*321];IMC[<unknown>*654]#IMC[<unknown>*098:<unknown>*999]};"
1661*795d594fSAndroid Build Coastguard Worker       "DLC[c.dex*890]";
1662*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = ParseContextWithChecksums(context_spec);
1663*795d594fSAndroid Build Coastguard Worker   // Pretend that we successfully open the dex files to pass the DCHECKS.
1664*795d594fSAndroid Build Coastguard Worker   // (as it's much easier to test all the corner cases without relying on actual dex files).
1665*795d594fSAndroid Build Coastguard Worker   PretendContextOpenedDexFiles(context.get());
1666*795d594fSAndroid Build Coastguard Worker 
1667*795d594fSAndroid Build Coastguard Worker   VerifyContextSize(context.get(), 2);
1668*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderIMC(context.get(), 0, "<unknown>:<unknown>");
1669*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderDLC(context.get(), 1, "c.dex");
1670*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderSharedLibraryIMC(context.get(), 0, 0, "<unknown>");
1671*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderSharedLibraryIMC(context.get(), 0, 1, "<unknown>:<unknown>");
1672*795d594fSAndroid Build Coastguard Worker 
1673*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(context_spec),
1674*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kVerifies);
1675*795d594fSAndroid Build Coastguard Worker }
1676*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,VerifyClassLoaderContextMatchAfterResolvingSymlinks)1677*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, VerifyClassLoaderContextMatchAfterResolvingSymlinks) {
1678*795d594fSAndroid Build Coastguard Worker   {
1679*795d594fSAndroid Build Coastguard Worker     std::ofstream ofs(scratch_path_ + "/foo.jar");
1680*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(ofs);
1681*795d594fSAndroid Build Coastguard Worker   }
1682*795d594fSAndroid Build Coastguard Worker   std::filesystem::create_directory_symlink(scratch_path_, scratch_path_ + "/bar");
1683*795d594fSAndroid Build Coastguard Worker 
1684*795d594fSAndroid Build Coastguard Worker   std::string context_spec =
1685*795d594fSAndroid Build Coastguard Worker       android::base::StringPrintf("PCL[%s/foo.jar*123:%s/foo.jar!classes2.dex*456]",
1686*795d594fSAndroid Build Coastguard Worker                                   scratch_path_.c_str(),
1687*795d594fSAndroid Build Coastguard Worker                                   scratch_path_.c_str());
1688*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = ParseContextWithChecksums(context_spec);
1689*795d594fSAndroid Build Coastguard Worker   PretendContextOpenedDexFilesForChecksums(context.get());
1690*795d594fSAndroid Build Coastguard Worker 
1691*795d594fSAndroid Build Coastguard Worker   std::string context_spec_with_symlinks =
1692*795d594fSAndroid Build Coastguard Worker       android::base::StringPrintf("PCL[%s/bar/foo.jar*123:%s/bar/foo.jar!classes2.dex*456]",
1693*795d594fSAndroid Build Coastguard Worker                                   scratch_path_.c_str(),
1694*795d594fSAndroid Build Coastguard Worker                                   scratch_path_.c_str());
1695*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(context_spec_with_symlinks),
1696*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kVerifies);
1697*795d594fSAndroid Build Coastguard Worker }
1698*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,VerifyClassLoaderContextMatchAfterEncoding)1699*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, VerifyClassLoaderContextMatchAfterEncoding) {
1700*795d594fSAndroid Build Coastguard Worker   jobject class_loader_a = LoadDexInPathClassLoader("ForClassLoaderA", nullptr);
1701*795d594fSAndroid Build Coastguard Worker   jobject class_loader_b = LoadDexInDelegateLastClassLoader("ForClassLoaderB", class_loader_a);
1702*795d594fSAndroid Build Coastguard Worker   jobject class_loader_c = LoadDexInPathClassLoader("ForClassLoaderC", class_loader_b);
1703*795d594fSAndroid Build Coastguard Worker   jobject class_loader_d = LoadDexInDelegateLastClassLoader("ForClassLoaderD", class_loader_c);
1704*795d594fSAndroid Build Coastguard Worker 
1705*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = CreateContextForClassLoader(class_loader_d);
1706*795d594fSAndroid Build Coastguard Worker 
1707*795d594fSAndroid Build Coastguard Worker   std::string context_with_no_base_dir = context->EncodeContextForOatFile("");
1708*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(context_with_no_base_dir),
1709*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kVerifies);
1710*795d594fSAndroid Build Coastguard Worker 
1711*795d594fSAndroid Build Coastguard Worker   std::string dex_location = GetTestDexFileName("ForClassLoaderA");
1712*795d594fSAndroid Build Coastguard Worker   size_t pos = dex_location.rfind('/');
1713*795d594fSAndroid Build Coastguard Worker   ASSERT_NE(std::string::npos, pos);
1714*795d594fSAndroid Build Coastguard Worker   std::string parent = dex_location.substr(0, pos);
1715*795d594fSAndroid Build Coastguard Worker 
1716*795d594fSAndroid Build Coastguard Worker   std::string context_with_base_dir = context->EncodeContextForOatFile(parent);
1717*795d594fSAndroid Build Coastguard Worker   ASSERT_NE(context_with_base_dir, context_with_no_base_dir);
1718*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(context_with_base_dir),
1719*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kVerifies);
1720*795d594fSAndroid Build Coastguard Worker }
1721*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,VerifyClassLoaderContextMatchAfterEncodingIMC)1722*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, VerifyClassLoaderContextMatchAfterEncodingIMC) {
1723*795d594fSAndroid Build Coastguard Worker   jobject class_loader_a = LoadDexInPathClassLoader("ForClassLoaderA", nullptr);
1724*795d594fSAndroid Build Coastguard Worker   jobject class_loader_b = LoadDexInInMemoryDexClassLoader("ForClassLoaderB", class_loader_a);
1725*795d594fSAndroid Build Coastguard Worker   jobject class_loader_c = LoadDexInInMemoryDexClassLoader("ForClassLoaderC", class_loader_b);
1726*795d594fSAndroid Build Coastguard Worker   jobject class_loader_d = LoadDexInDelegateLastClassLoader("ForClassLoaderD", class_loader_c);
1727*795d594fSAndroid Build Coastguard Worker 
1728*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = CreateContextForClassLoader(class_loader_d);
1729*795d594fSAndroid Build Coastguard Worker 
1730*795d594fSAndroid Build Coastguard Worker   std::string context_with_no_base_dir = context->EncodeContextForOatFile("");
1731*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(context_with_no_base_dir),
1732*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kVerifies);
1733*795d594fSAndroid Build Coastguard Worker 
1734*795d594fSAndroid Build Coastguard Worker   std::string dex_location = GetTestDexFileName("ForClassLoaderA");
1735*795d594fSAndroid Build Coastguard Worker   size_t pos = dex_location.rfind('/');
1736*795d594fSAndroid Build Coastguard Worker   ASSERT_NE(std::string::npos, pos);
1737*795d594fSAndroid Build Coastguard Worker   std::string parent = dex_location.substr(0, pos);
1738*795d594fSAndroid Build Coastguard Worker 
1739*795d594fSAndroid Build Coastguard Worker   std::string context_with_base_dir = context->EncodeContextForOatFile(parent);
1740*795d594fSAndroid Build Coastguard Worker   ASSERT_NE(context_with_base_dir, context_with_no_base_dir);
1741*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(context_with_base_dir),
1742*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kVerifies);
1743*795d594fSAndroid Build Coastguard Worker }
1744*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,VerifyClassLoaderContextMatchAfterEncodingMultidex)1745*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, VerifyClassLoaderContextMatchAfterEncodingMultidex) {
1746*795d594fSAndroid Build Coastguard Worker   jobject class_loader = LoadDexInPathClassLoader("MultiDex", nullptr);
1747*795d594fSAndroid Build Coastguard Worker 
1748*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = CreateContextForClassLoader(class_loader);
1749*795d594fSAndroid Build Coastguard Worker 
1750*795d594fSAndroid Build Coastguard Worker   std::string context_with_no_base_dir = context->EncodeContextForOatFile("");
1751*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(context_with_no_base_dir),
1752*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kVerifies);
1753*795d594fSAndroid Build Coastguard Worker 
1754*795d594fSAndroid Build Coastguard Worker   std::string dex_location = GetTestDexFileName("MultiDex");
1755*795d594fSAndroid Build Coastguard Worker   size_t pos = dex_location.rfind('/');
1756*795d594fSAndroid Build Coastguard Worker   ASSERT_NE(std::string::npos, pos);
1757*795d594fSAndroid Build Coastguard Worker   std::string parent = dex_location.substr(0, pos);
1758*795d594fSAndroid Build Coastguard Worker 
1759*795d594fSAndroid Build Coastguard Worker   std::string context_with_base_dir = context->EncodeContextForOatFile(parent);
1760*795d594fSAndroid Build Coastguard Worker   ASSERT_NE(context_with_base_dir, context_with_no_base_dir);
1761*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(context_with_base_dir),
1762*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kVerifies);
1763*795d594fSAndroid Build Coastguard Worker }
1764*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,CreateContextForClassLoaderWithSharedLibraries)1765*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, CreateContextForClassLoaderWithSharedLibraries) {
1766*795d594fSAndroid Build Coastguard Worker   jobject class_loader_a = LoadDexInPathClassLoader("ForClassLoaderA", nullptr);
1767*795d594fSAndroid Build Coastguard Worker 
1768*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(Thread::Current());
1769*795d594fSAndroid Build Coastguard Worker   StackHandleScope<1> hs(soa.Self());
1770*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ObjectArray<mirror::ClassLoader>> libraries = hs.NewHandle(
1771*795d594fSAndroid Build Coastguard Worker     mirror::ObjectArray<mirror::ClassLoader>::Alloc(
1772*795d594fSAndroid Build Coastguard Worker         soa.Self(),
1773*795d594fSAndroid Build Coastguard Worker         GetClassRoot<mirror::ObjectArray<mirror::ClassLoader>>(),
1774*795d594fSAndroid Build Coastguard Worker         1));
1775*795d594fSAndroid Build Coastguard Worker   libraries->Set(0, soa.Decode<mirror::ClassLoader>(class_loader_a));
1776*795d594fSAndroid Build Coastguard Worker 
1777*795d594fSAndroid Build Coastguard Worker   jobject class_loader_b = LoadDexInPathClassLoader(
1778*795d594fSAndroid Build Coastguard Worker       "ForClassLoaderB", nullptr, soa.AddLocalReference<jobject>(libraries.Get()));
1779*795d594fSAndroid Build Coastguard Worker 
1780*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = CreateContextForClassLoader(class_loader_b);
1781*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(context != nullptr);
1782*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> dex_files = OpenTestDexFiles("ForClassLoaderB");
1783*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderPCL(context.get(), 0, dex_files[0]->GetLocation());
1784*795d594fSAndroid Build Coastguard Worker   dex_files = OpenTestDexFiles("ForClassLoaderA");
1785*795d594fSAndroid Build Coastguard Worker   VerifyClassLoaderSharedLibraryPCL(context.get(), 0, 0, dex_files[0]->GetLocation());
1786*795d594fSAndroid Build Coastguard Worker 
1787*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(context->VerifyClassLoaderContextMatch(context->EncodeContextForOatFile("")),
1788*795d594fSAndroid Build Coastguard Worker             ClassLoaderContext::VerificationResult::kVerifies);
1789*795d594fSAndroid Build Coastguard Worker }
1790*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,CheckForDuplicateDexFilesNotFoundSingleCL)1791*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, CheckForDuplicateDexFilesNotFoundSingleCL) {
1792*795d594fSAndroid Build Coastguard Worker   jobject class_loader = LoadDexInPathClassLoader("Main", nullptr);
1793*795d594fSAndroid Build Coastguard Worker 
1794*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = CreateContextForClassLoader(class_loader);
1795*795d594fSAndroid Build Coastguard Worker 
1796*795d594fSAndroid Build Coastguard Worker   std::set<const DexFile*> result = context->CheckForDuplicateDexFiles(
1797*795d594fSAndroid Build Coastguard Worker       std::vector<const DexFile*>());
1798*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(0u, result.size());
1799*795d594fSAndroid Build Coastguard Worker 
1800*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> dex1 = OpenTestDexFiles("ForClassLoaderA");
1801*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> dex1_raw = MakeNonOwningPointerVector(dex1);
1802*795d594fSAndroid Build Coastguard Worker   result = context->CheckForDuplicateDexFiles(dex1_raw);
1803*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(0u, result.size());
1804*795d594fSAndroid Build Coastguard Worker }
1805*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,CheckForDuplicateDexFilesFound)1806*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, CheckForDuplicateDexFilesFound) {
1807*795d594fSAndroid Build Coastguard Worker   jobject class_loader = LoadDexInPathClassLoader(std::vector<std::string> { "Main", "Main" }, nullptr);
1808*795d594fSAndroid Build Coastguard Worker 
1809*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = CreateContextForClassLoader(class_loader);
1810*795d594fSAndroid Build Coastguard Worker 
1811*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> dex1 = OpenTestDexFiles("Main");
1812*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> dex1_raw = MakeNonOwningPointerVector(dex1);
1813*795d594fSAndroid Build Coastguard Worker   std::set<const DexFile*> result = context->CheckForDuplicateDexFiles(dex1_raw);
1814*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(1u, result.size()) << context->EncodeContextForOatFile("");
1815*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(dex1_raw[0], *(result.begin()));
1816*795d594fSAndroid Build Coastguard Worker }
1817*795d594fSAndroid Build Coastguard Worker 
1818*795d594fSAndroid Build Coastguard Worker 
TEST_F(ClassLoaderContextTest,CheckForDuplicateCrossCLNotFound)1819*795d594fSAndroid Build Coastguard Worker TEST_F(ClassLoaderContextTest, CheckForDuplicateCrossCLNotFound) {
1820*795d594fSAndroid Build Coastguard Worker   jobject class_loader_a = LoadDexInPathClassLoader("ForClassLoaderA", nullptr);
1821*795d594fSAndroid Build Coastguard Worker   jobject class_loader_b = LoadDexInInMemoryDexClassLoader("ForClassLoaderB", class_loader_a);
1822*795d594fSAndroid Build Coastguard Worker 
1823*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<ClassLoaderContext> context = CreateContextForClassLoader(class_loader_b);
1824*795d594fSAndroid Build Coastguard Worker 
1825*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> dex1 = OpenTestDexFiles("ForClassLoaderA");
1826*795d594fSAndroid Build Coastguard Worker   std::vector<const DexFile*> dex1_raw = MakeNonOwningPointerVector(dex1);
1827*795d594fSAndroid Build Coastguard Worker   std::set<const DexFile*> result = context->CheckForDuplicateDexFiles(dex1_raw);
1828*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(0u, result.size());
1829*795d594fSAndroid Build Coastguard Worker }
1830*795d594fSAndroid Build Coastguard Worker 
1831*795d594fSAndroid Build Coastguard Worker }  // namespace art
1832