xref: /aosp_15_r20/art/runtime/hidden_api_test.cc (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2018 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 "hidden_api.h"
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker #include <fstream>
20*795d594fSAndroid Build Coastguard Worker #include <sstream>
21*795d594fSAndroid Build Coastguard Worker 
22*795d594fSAndroid Build Coastguard Worker #include "android-base/stringprintf.h"
23*795d594fSAndroid Build Coastguard Worker #include "base/file_utils.h"
24*795d594fSAndroid Build Coastguard Worker #include "base/sdk_version.h"
25*795d594fSAndroid Build Coastguard Worker #include "base/stl_util.h"
26*795d594fSAndroid Build Coastguard Worker #include "common_runtime_test.h"
27*795d594fSAndroid Build Coastguard Worker #include "jni/jni_internal.h"
28*795d594fSAndroid Build Coastguard Worker #include "proxy_test.h"
29*795d594fSAndroid Build Coastguard Worker #include "well_known_classes-inl.h"
30*795d594fSAndroid Build Coastguard Worker 
31*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
32*795d594fSAndroid Build Coastguard Worker 
33*795d594fSAndroid Build Coastguard Worker using android::base::StringPrintf;
34*795d594fSAndroid Build Coastguard Worker using hiddenapi::detail::MemberSignature;
35*795d594fSAndroid Build Coastguard Worker using hiddenapi::detail::ShouldDenyAccessToMemberImpl;
36*795d594fSAndroid Build Coastguard Worker 
37*795d594fSAndroid Build Coastguard Worker // Should be the same as dalvik.system.VMRuntime.HIDE_MAXTARGETSDK_P_HIDDEN_APIS,
38*795d594fSAndroid Build Coastguard Worker // dalvik.system.VMRuntime.HIDE_MAXTARGETSDK_Q_HIDDEN_APIS, and
39*795d594fSAndroid Build Coastguard Worker // dalvik.system.VMRuntime.EXEMPT_TEST_API_ACCESS_VERIFICATION.
40*795d594fSAndroid Build Coastguard Worker static constexpr uint64_t kHideMaxtargetsdkPHiddenApis = 149997251;
41*795d594fSAndroid Build Coastguard Worker static constexpr uint64_t kHideMaxtargetsdkQHiddenApis = 149994052;
42*795d594fSAndroid Build Coastguard Worker static constexpr uint64_t kAllowTestApiAccess = 166236554;
43*795d594fSAndroid Build Coastguard Worker 
44*795d594fSAndroid Build Coastguard Worker 
Copy(const char * src_filename,File * dst,std::string * error_msg)45*795d594fSAndroid Build Coastguard Worker static bool Copy(const char* src_filename, File* dst, /*out*/ std::string* error_msg) {
46*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<File> src(OS::OpenFileForReading(src_filename));
47*795d594fSAndroid Build Coastguard Worker   if (src == nullptr) {
48*795d594fSAndroid Build Coastguard Worker     *error_msg = StringPrintf("Failed to open for reading: %s", src_filename);
49*795d594fSAndroid Build Coastguard Worker     return false;
50*795d594fSAndroid Build Coastguard Worker   }
51*795d594fSAndroid Build Coastguard Worker   int64_t length = src->GetLength();
52*795d594fSAndroid Build Coastguard Worker   if (length < 0) {
53*795d594fSAndroid Build Coastguard Worker     *error_msg = "Failed to get file length.";
54*795d594fSAndroid Build Coastguard Worker     return false;
55*795d594fSAndroid Build Coastguard Worker   }
56*795d594fSAndroid Build Coastguard Worker   if (!dst->Copy(src.get(), /*offset=*/ 0, length)) {
57*795d594fSAndroid Build Coastguard Worker     *error_msg = "Failed to copy file contents.";
58*795d594fSAndroid Build Coastguard Worker     return false;
59*795d594fSAndroid Build Coastguard Worker   }
60*795d594fSAndroid Build Coastguard Worker   if (dst->Flush() != 0) {
61*795d594fSAndroid Build Coastguard Worker     *error_msg = "Failed to flush.";
62*795d594fSAndroid Build Coastguard Worker     return false;
63*795d594fSAndroid Build Coastguard Worker   }
64*795d594fSAndroid Build Coastguard Worker   return true;
65*795d594fSAndroid Build Coastguard Worker }
66*795d594fSAndroid Build Coastguard Worker 
LoadDexFiles(const std::string & path,Thread * self,std::vector<std::unique_ptr<const DexFile>> * dex_files,ObjPtr<mirror::ClassLoader> * class_loader,std::string * error_msg)67*795d594fSAndroid Build Coastguard Worker static bool LoadDexFiles(const std::string& path,
68*795d594fSAndroid Build Coastguard Worker                          Thread* self,
69*795d594fSAndroid Build Coastguard Worker                          /* out */ std::vector<std::unique_ptr<const DexFile>>* dex_files,
70*795d594fSAndroid Build Coastguard Worker                          /* out */ ObjPtr<mirror::ClassLoader>* class_loader,
71*795d594fSAndroid Build Coastguard Worker                          /* out */ std::string* error_msg) REQUIRES_SHARED(Locks::mutator_lock_) {
72*795d594fSAndroid Build Coastguard Worker   ArtDexFileLoader dex_file_loader(path);
73*795d594fSAndroid Build Coastguard Worker   if (!dex_file_loader.Open(/* verify= */ true,
74*795d594fSAndroid Build Coastguard Worker                             /* verify_checksum= */ true,
75*795d594fSAndroid Build Coastguard Worker                             error_msg,
76*795d594fSAndroid Build Coastguard Worker                             dex_files)) {
77*795d594fSAndroid Build Coastguard Worker     return false;
78*795d594fSAndroid Build Coastguard Worker   }
79*795d594fSAndroid Build Coastguard Worker 
80*795d594fSAndroid Build Coastguard Worker   ClassLinker* const linker = Runtime::Current()->GetClassLinker();
81*795d594fSAndroid Build Coastguard Worker 
82*795d594fSAndroid Build Coastguard Worker   StackHandleScope<2> hs(self);
83*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Class> h_class =
84*795d594fSAndroid Build Coastguard Worker       hs.NewHandle(WellKnownClasses::dalvik_system_PathClassLoader.Get());
85*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> h_loader = hs.NewHandle(linker->CreateWellKnownClassLoader(
86*795d594fSAndroid Build Coastguard Worker       self,
87*795d594fSAndroid Build Coastguard Worker       MakeNonOwningPointerVector(*dex_files),
88*795d594fSAndroid Build Coastguard Worker       h_class,
89*795d594fSAndroid Build Coastguard Worker       /* parent_loader= */ ScopedNullHandle<mirror::ClassLoader>(),
90*795d594fSAndroid Build Coastguard Worker       /* shared_libraries= */ ScopedNullHandle<mirror::ObjectArray<mirror::ClassLoader>>(),
91*795d594fSAndroid Build Coastguard Worker       /* shared_libraries_after= */ ScopedNullHandle<mirror::ObjectArray<mirror::ClassLoader>>()));
92*795d594fSAndroid Build Coastguard Worker   for (const auto& dex_file : *dex_files) {
93*795d594fSAndroid Build Coastguard Worker     linker->RegisterDexFile(*dex_file.get(), h_loader.Get());
94*795d594fSAndroid Build Coastguard Worker   }
95*795d594fSAndroid Build Coastguard Worker 
96*795d594fSAndroid Build Coastguard Worker   *class_loader = h_loader.Get();
97*795d594fSAndroid Build Coastguard Worker   return true;
98*795d594fSAndroid Build Coastguard Worker }
99*795d594fSAndroid Build Coastguard Worker 
Remove(const char * path,std::string * error_msg)100*795d594fSAndroid Build Coastguard Worker static bool Remove(const char* path, /*out*/ std::string* error_msg) {
101*795d594fSAndroid Build Coastguard Worker   if (TEMP_FAILURE_RETRY(remove(path)) == 0) {
102*795d594fSAndroid Build Coastguard Worker     return true;
103*795d594fSAndroid Build Coastguard Worker   }
104*795d594fSAndroid Build Coastguard Worker   *error_msg = StringPrintf("Unable to remove(\"%s\"): %s", path, strerror(errno));
105*795d594fSAndroid Build Coastguard Worker   return false;
106*795d594fSAndroid Build Coastguard Worker }
107*795d594fSAndroid Build Coastguard Worker 
CheckAllDexFilesInDomain(ObjPtr<mirror::ClassLoader> loader,const std::vector<std::unique_ptr<const DexFile>> & dex_files,hiddenapi::Domain expected_domain,std::string * error_msg)108*795d594fSAndroid Build Coastguard Worker static bool CheckAllDexFilesInDomain(ObjPtr<mirror::ClassLoader> loader,
109*795d594fSAndroid Build Coastguard Worker                                      const std::vector<std::unique_ptr<const DexFile>>& dex_files,
110*795d594fSAndroid Build Coastguard Worker                                      hiddenapi::Domain expected_domain,
111*795d594fSAndroid Build Coastguard Worker                                      /* out */ std::string* error_msg)
112*795d594fSAndroid Build Coastguard Worker     REQUIRES_SHARED(Locks::mutator_lock_) {
113*795d594fSAndroid Build Coastguard Worker   for (const auto& dex_file : dex_files) {
114*795d594fSAndroid Build Coastguard Worker     hiddenapi::AccessContext context(loader, dex_file.get());
115*795d594fSAndroid Build Coastguard Worker     if (context.GetDomain() != expected_domain) {
116*795d594fSAndroid Build Coastguard Worker       std::stringstream ss;
117*795d594fSAndroid Build Coastguard Worker       ss << dex_file->GetLocation() << ": access context domain does not match "
118*795d594fSAndroid Build Coastguard Worker           << "(expected=" << static_cast<uint32_t>(expected_domain)
119*795d594fSAndroid Build Coastguard Worker           << ", actual=" << static_cast<uint32_t>(context.GetDomain()) << ")";
120*795d594fSAndroid Build Coastguard Worker       *error_msg = ss.str();
121*795d594fSAndroid Build Coastguard Worker       return false;
122*795d594fSAndroid Build Coastguard Worker     }
123*795d594fSAndroid Build Coastguard Worker     if (dex_file->GetHiddenapiDomain() != expected_domain) {
124*795d594fSAndroid Build Coastguard Worker       std::stringstream ss;
125*795d594fSAndroid Build Coastguard Worker       ss << dex_file->GetLocation() << ": dex file domain does not match "
126*795d594fSAndroid Build Coastguard Worker           << "(expected=" << static_cast<uint32_t>(expected_domain)
127*795d594fSAndroid Build Coastguard Worker           << ", actual=" << static_cast<uint32_t>(dex_file->GetHiddenapiDomain()) << ")";
128*795d594fSAndroid Build Coastguard Worker       *error_msg = ss.str();
129*795d594fSAndroid Build Coastguard Worker       return false;
130*795d594fSAndroid Build Coastguard Worker     }
131*795d594fSAndroid Build Coastguard Worker   }
132*795d594fSAndroid Build Coastguard Worker 
133*795d594fSAndroid Build Coastguard Worker   return true;
134*795d594fSAndroid Build Coastguard Worker }
135*795d594fSAndroid Build Coastguard Worker 
136*795d594fSAndroid Build Coastguard Worker class HiddenApiTest : public CommonRuntimeTest {
137*795d594fSAndroid Build Coastguard Worker  protected:
SetUp()138*795d594fSAndroid Build Coastguard Worker   void SetUp() override {
139*795d594fSAndroid Build Coastguard Worker     // Do the normal setup.
140*795d594fSAndroid Build Coastguard Worker     CommonRuntimeTest::SetUp();
141*795d594fSAndroid Build Coastguard Worker     self_ = Thread::Current();
142*795d594fSAndroid Build Coastguard Worker     self_->TransitionFromSuspendedToRunnable();
143*795d594fSAndroid Build Coastguard Worker     jclass_loader_ = LoadDex("HiddenApiSignatures");
144*795d594fSAndroid Build Coastguard Worker     bool started = runtime_->Start();
145*795d594fSAndroid Build Coastguard Worker     CHECK(started);
146*795d594fSAndroid Build Coastguard Worker 
147*795d594fSAndroid Build Coastguard Worker     class1_field1_ = GetArtField("mypackage/packagea/Class1", "field1", "I");
148*795d594fSAndroid Build Coastguard Worker     class1_field12_ = GetArtField("mypackage/packagea/Class1", "field12", "I");
149*795d594fSAndroid Build Coastguard Worker     class1_init_ = GetArtMethod("mypackage/packagea/Class1", "<init>", "()V");
150*795d594fSAndroid Build Coastguard Worker     class1_method1_ = GetArtMethod("mypackage/packagea/Class1", "method1", "()V");
151*795d594fSAndroid Build Coastguard Worker     class1_method1_i_ = GetArtMethod("mypackage/packagea/Class1", "method1", "(I)V");
152*795d594fSAndroid Build Coastguard Worker     class1_method12_ = GetArtMethod("mypackage/packagea/Class1", "method12", "()V");
153*795d594fSAndroid Build Coastguard Worker     class12_field1_ = GetArtField("mypackage/packagea/Class12", "field1", "I");
154*795d594fSAndroid Build Coastguard Worker     class12_method1_ = GetArtMethod("mypackage/packagea/Class12", "method1", "()V");
155*795d594fSAndroid Build Coastguard Worker     class2_field1_ = GetArtField("mypackage/packagea/Class2", "field1", "I");
156*795d594fSAndroid Build Coastguard Worker     class2_method1_ = GetArtMethod("mypackage/packagea/Class2", "method1", "()V");
157*795d594fSAndroid Build Coastguard Worker     class2_method1_i_ = GetArtMethod("mypackage/packagea/Class2", "method1", "(I)V");
158*795d594fSAndroid Build Coastguard Worker     class3_field1_ = GetArtField("mypackage/packageb/Class3", "field1", "I");
159*795d594fSAndroid Build Coastguard Worker     class3_method1_ = GetArtMethod("mypackage/packageb/Class3", "method1", "()V");
160*795d594fSAndroid Build Coastguard Worker     class3_method1_i_ = GetArtMethod("mypackage/packageb/Class3", "method1", "(I)V");
161*795d594fSAndroid Build Coastguard Worker   }
162*795d594fSAndroid Build Coastguard Worker 
GetArtMethod(const char * class_name,const char * name,const char * signature)163*795d594fSAndroid Build Coastguard Worker   ArtMethod* GetArtMethod(const char* class_name, const char* name, const char* signature) {
164*795d594fSAndroid Build Coastguard Worker     JNIEnv* env = Thread::Current()->GetJniEnv();
165*795d594fSAndroid Build Coastguard Worker     jclass klass = env->FindClass(class_name);
166*795d594fSAndroid Build Coastguard Worker     jmethodID method_id = env->GetMethodID(klass, name, signature);
167*795d594fSAndroid Build Coastguard Worker     ArtMethod* art_method = jni::DecodeArtMethod(method_id);
168*795d594fSAndroid Build Coastguard Worker     return art_method;
169*795d594fSAndroid Build Coastguard Worker   }
170*795d594fSAndroid Build Coastguard Worker 
GetArtField(const char * class_name,const char * name,const char * signature)171*795d594fSAndroid Build Coastguard Worker   ArtField* GetArtField(const char* class_name, const char* name, const char* signature) {
172*795d594fSAndroid Build Coastguard Worker     JNIEnv* env = Thread::Current()->GetJniEnv();
173*795d594fSAndroid Build Coastguard Worker     jclass klass = env->FindClass(class_name);
174*795d594fSAndroid Build Coastguard Worker     jfieldID field_id = env->GetFieldID(klass, name, signature);
175*795d594fSAndroid Build Coastguard Worker     ArtField* art_field = jni::DecodeArtField(field_id);
176*795d594fSAndroid Build Coastguard Worker     return art_field;
177*795d594fSAndroid Build Coastguard Worker   }
178*795d594fSAndroid Build Coastguard Worker 
SetChangeIdState(uint64_t change,bool enabled)179*795d594fSAndroid Build Coastguard Worker   void SetChangeIdState(uint64_t change, bool enabled) {
180*795d594fSAndroid Build Coastguard Worker     CompatFramework& compat_framework = runtime_->GetCompatFramework();
181*795d594fSAndroid Build Coastguard Worker     std::set<uint64_t> disabled_changes = compat_framework.GetDisabledCompatChanges();
182*795d594fSAndroid Build Coastguard Worker     if (enabled) {
183*795d594fSAndroid Build Coastguard Worker       disabled_changes.erase(change);
184*795d594fSAndroid Build Coastguard Worker     } else {
185*795d594fSAndroid Build Coastguard Worker       disabled_changes.insert(change);
186*795d594fSAndroid Build Coastguard Worker     }
187*795d594fSAndroid Build Coastguard Worker     compat_framework.SetDisabledCompatChanges(disabled_changes);
188*795d594fSAndroid Build Coastguard Worker   }
189*795d594fSAndroid Build Coastguard Worker 
ShouldDenyAccess(hiddenapi::ApiList list)190*795d594fSAndroid Build Coastguard Worker   bool ShouldDenyAccess(hiddenapi::ApiList list) REQUIRES_SHARED(Locks::mutator_lock_) {
191*795d594fSAndroid Build Coastguard Worker     // Choose parameters such that there are no side effects (AccessMethod::kNone)
192*795d594fSAndroid Build Coastguard Worker     // and that the member is not on the exemptions list (here we choose one which
193*795d594fSAndroid Build Coastguard Worker     // is not even in boot class path).
194*795d594fSAndroid Build Coastguard Worker     return ShouldDenyAccessToMemberImpl(/* member= */ class1_field1_,
195*795d594fSAndroid Build Coastguard Worker                                         list,
196*795d594fSAndroid Build Coastguard Worker                                         /* access_method= */ hiddenapi::AccessMethod::kNone);
197*795d594fSAndroid Build Coastguard Worker   }
198*795d594fSAndroid Build Coastguard Worker 
TestLocation(const std::string & location,hiddenapi::Domain expected_domain)199*795d594fSAndroid Build Coastguard Worker   void TestLocation(const std::string& location, hiddenapi::Domain expected_domain) {
200*795d594fSAndroid Build Coastguard Worker     // Create a temp file with a unique name based on `location` to isolate tests
201*795d594fSAndroid Build Coastguard Worker     // that may run in parallel. b/238730923
202*795d594fSAndroid Build Coastguard Worker     const std::string_view suffix = ".jar";
203*795d594fSAndroid Build Coastguard Worker     const std::string_view placeholder = "XXXXXX";  // See `mkstemps()`.
204*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(location.ends_with(suffix));
205*795d594fSAndroid Build Coastguard Worker     std::unique_ptr<char[]> unique_location(new char[location.length() + placeholder.length() + 1]);
206*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(unique_location != nullptr);
207*795d594fSAndroid Build Coastguard Worker     size_t stem_length = location.length() - suffix.length();
208*795d594fSAndroid Build Coastguard Worker     memcpy(unique_location.get(), location.data(), stem_length);
209*795d594fSAndroid Build Coastguard Worker     memcpy(unique_location.get() + stem_length, placeholder.data(), placeholder.length());
210*795d594fSAndroid Build Coastguard Worker     memcpy(unique_location.get() + stem_length + placeholder.length(),
211*795d594fSAndroid Build Coastguard Worker            location.data() + stem_length,
212*795d594fSAndroid Build Coastguard Worker            suffix.length());
213*795d594fSAndroid Build Coastguard Worker     unique_location[location.length() + placeholder.length()] = 0;
214*795d594fSAndroid Build Coastguard Worker     int fd = mkstemps(unique_location.get(), suffix.length());
215*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(fd != -1) << strerror(errno);
216*795d594fSAndroid Build Coastguard Worker 
217*795d594fSAndroid Build Coastguard Worker     // Copy "Main" to the temp file.
218*795d594fSAndroid Build Coastguard Worker     std::string error_msg;
219*795d594fSAndroid Build Coastguard Worker     {
220*795d594fSAndroid Build Coastguard Worker       File file(fd, /*check_usage=*/ true);
221*795d594fSAndroid Build Coastguard Worker       bool copied = Copy(GetTestDexFileName("Main").c_str(), &file, &error_msg);
222*795d594fSAndroid Build Coastguard Worker       int flush_close_result = file.FlushCloseOrErase();
223*795d594fSAndroid Build Coastguard Worker       if (!copied && flush_close_result == 0) {
224*795d594fSAndroid Build Coastguard Worker         // Silently remove the temp file before reporting the `Copy()` failure.
225*795d594fSAndroid Build Coastguard Worker         std::string ignored_error_msg;
226*795d594fSAndroid Build Coastguard Worker         Remove(unique_location.get(), &ignored_error_msg);
227*795d594fSAndroid Build Coastguard Worker       }
228*795d594fSAndroid Build Coastguard Worker       ASSERT_TRUE(copied) << error_msg;
229*795d594fSAndroid Build Coastguard Worker       ASSERT_EQ(flush_close_result, 0);
230*795d594fSAndroid Build Coastguard Worker     }
231*795d594fSAndroid Build Coastguard Worker 
232*795d594fSAndroid Build Coastguard Worker     ScopedObjectAccess soa(Thread::Current());
233*795d594fSAndroid Build Coastguard Worker     std::vector<std::unique_ptr<const DexFile>> dex_files;
234*795d594fSAndroid Build Coastguard Worker     ObjPtr<mirror::ClassLoader> class_loader;
235*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(
236*795d594fSAndroid Build Coastguard Worker         LoadDexFiles(unique_location.get(), soa.Self(), &dex_files, &class_loader, &error_msg))
237*795d594fSAndroid Build Coastguard Worker         << error_msg;
238*795d594fSAndroid Build Coastguard Worker     ASSERT_GE(dex_files.size(), 1u);
239*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(CheckAllDexFilesInDomain(class_loader,
240*795d594fSAndroid Build Coastguard Worker                                          dex_files,
241*795d594fSAndroid Build Coastguard Worker                                          expected_domain,
242*795d594fSAndroid Build Coastguard Worker                                          &error_msg)) << error_msg;
243*795d594fSAndroid Build Coastguard Worker 
244*795d594fSAndroid Build Coastguard Worker     dex_files.clear();
245*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(Remove(unique_location.get(), &error_msg)) << error_msg;
246*795d594fSAndroid Build Coastguard Worker   }
247*795d594fSAndroid Build Coastguard Worker 
248*795d594fSAndroid Build Coastguard Worker  protected:
249*795d594fSAndroid Build Coastguard Worker   Thread* self_;
250*795d594fSAndroid Build Coastguard Worker   jobject jclass_loader_;
251*795d594fSAndroid Build Coastguard Worker   ArtField* class1_field1_;
252*795d594fSAndroid Build Coastguard Worker   ArtField* class1_field12_;
253*795d594fSAndroid Build Coastguard Worker   ArtMethod* class1_init_;
254*795d594fSAndroid Build Coastguard Worker   ArtMethod* class1_method1_;
255*795d594fSAndroid Build Coastguard Worker   ArtMethod* class1_method1_i_;
256*795d594fSAndroid Build Coastguard Worker   ArtMethod* class1_method12_;
257*795d594fSAndroid Build Coastguard Worker   ArtField* class12_field1_;
258*795d594fSAndroid Build Coastguard Worker   ArtMethod* class12_method1_;
259*795d594fSAndroid Build Coastguard Worker   ArtField* class2_field1_;
260*795d594fSAndroid Build Coastguard Worker   ArtMethod* class2_method1_;
261*795d594fSAndroid Build Coastguard Worker   ArtMethod* class2_method1_i_;
262*795d594fSAndroid Build Coastguard Worker   ArtField* class3_field1_;
263*795d594fSAndroid Build Coastguard Worker   ArtMethod* class3_method1_;
264*795d594fSAndroid Build Coastguard Worker   ArtMethod* class3_method1_i_;
265*795d594fSAndroid Build Coastguard Worker };
266*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,CheckGetActionFromRuntimeFlags)267*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, CheckGetActionFromRuntimeFlags) {
268*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(self_);
269*795d594fSAndroid Build Coastguard Worker 
270*795d594fSAndroid Build Coastguard Worker   runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kJustWarn);
271*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Sdk()), false);
272*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Unsupported()), false);
273*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetS()), false);
274*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetR()), false);
275*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetQ()), false);
276*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetP()), false);
277*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetO()), false);
278*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Blocked()), false);
279*795d594fSAndroid Build Coastguard Worker 
280*795d594fSAndroid Build Coastguard Worker   runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
281*795d594fSAndroid Build Coastguard Worker   runtime_->SetTargetSdkVersion(
282*795d594fSAndroid Build Coastguard Worker       static_cast<uint32_t>(hiddenapi::ApiList::MaxTargetO().GetMaxAllowedSdkVersion()));
283*795d594fSAndroid Build Coastguard Worker   SetChangeIdState(kHideMaxtargetsdkPHiddenApis, false);
284*795d594fSAndroid Build Coastguard Worker   SetChangeIdState(kHideMaxtargetsdkQHiddenApis, false);
285*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Sdk()), false);
286*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Unsupported()), false);
287*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetS()), false);
288*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetR()), false);
289*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetQ()), false);
290*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetP()), false);
291*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetO()), false);
292*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Blocked()), true);
293*795d594fSAndroid Build Coastguard Worker 
294*795d594fSAndroid Build Coastguard Worker   runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
295*795d594fSAndroid Build Coastguard Worker   runtime_->SetTargetSdkVersion(
296*795d594fSAndroid Build Coastguard Worker       static_cast<uint32_t>(hiddenapi::ApiList::MaxTargetO().GetMaxAllowedSdkVersion()) + 1);
297*795d594fSAndroid Build Coastguard Worker   SetChangeIdState(kHideMaxtargetsdkPHiddenApis, false);
298*795d594fSAndroid Build Coastguard Worker   SetChangeIdState(kHideMaxtargetsdkQHiddenApis, false);
299*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Sdk()), false);
300*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Unsupported()), false);
301*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetS()), false);
302*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetR()), false);
303*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetQ()), false);
304*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetP()), false);
305*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetO()), true);
306*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Blocked()), true);
307*795d594fSAndroid Build Coastguard Worker   SetChangeIdState(kHideMaxtargetsdkQHiddenApis, true);
308*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Sdk()), false);
309*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Unsupported()), false);
310*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetS()), false);
311*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetR()), false);
312*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetQ()), true);
313*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetP()), false);
314*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetO()), true);
315*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Blocked()), true);
316*795d594fSAndroid Build Coastguard Worker 
317*795d594fSAndroid Build Coastguard Worker   runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
318*795d594fSAndroid Build Coastguard Worker   runtime_->SetTargetSdkVersion(
319*795d594fSAndroid Build Coastguard Worker       static_cast<uint32_t>(hiddenapi::ApiList::MaxTargetP().GetMaxAllowedSdkVersion()) + 1);
320*795d594fSAndroid Build Coastguard Worker   SetChangeIdState(kHideMaxtargetsdkPHiddenApis, true);
321*795d594fSAndroid Build Coastguard Worker   SetChangeIdState(kHideMaxtargetsdkQHiddenApis, false);
322*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Sdk()), false);
323*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Unsupported()), false);
324*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetS()), false);
325*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetR()), false);
326*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetQ()), false);
327*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetP()), true);
328*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetO()), true);
329*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Blocked()), true);
330*795d594fSAndroid Build Coastguard Worker 
331*795d594fSAndroid Build Coastguard Worker   runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
332*795d594fSAndroid Build Coastguard Worker   runtime_->SetTargetSdkVersion(
333*795d594fSAndroid Build Coastguard Worker       static_cast<uint32_t>(hiddenapi::ApiList::MaxTargetQ().GetMaxAllowedSdkVersion()) + 1);
334*795d594fSAndroid Build Coastguard Worker   SetChangeIdState(kHideMaxtargetsdkPHiddenApis, true);
335*795d594fSAndroid Build Coastguard Worker   SetChangeIdState(kHideMaxtargetsdkQHiddenApis, true);
336*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Sdk()), false);
337*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Unsupported()), false);
338*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetS()), false);
339*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetR()), false);
340*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetQ()), true);
341*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetP()), true);
342*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetO()), true);
343*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Blocked()), true);
344*795d594fSAndroid Build Coastguard Worker 
345*795d594fSAndroid Build Coastguard Worker   runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
346*795d594fSAndroid Build Coastguard Worker   runtime_->SetTargetSdkVersion(
347*795d594fSAndroid Build Coastguard Worker       static_cast<uint32_t>(hiddenapi::ApiList::MaxTargetR().GetMaxAllowedSdkVersion()) + 1);
348*795d594fSAndroid Build Coastguard Worker   SetChangeIdState(kHideMaxtargetsdkPHiddenApis, true);
349*795d594fSAndroid Build Coastguard Worker   SetChangeIdState(kHideMaxtargetsdkQHiddenApis, true);
350*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Sdk()), false);
351*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Unsupported()), false);
352*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetS()), false);
353*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetR()), true);
354*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetQ()), true);
355*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetP()), true);
356*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetO()), true);
357*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Blocked()), true);
358*795d594fSAndroid Build Coastguard Worker 
359*795d594fSAndroid Build Coastguard Worker   runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
360*795d594fSAndroid Build Coastguard Worker   runtime_->SetTargetSdkVersion(
361*795d594fSAndroid Build Coastguard Worker       static_cast<uint32_t>(hiddenapi::ApiList::MaxTargetS().GetMaxAllowedSdkVersion()) + 1);
362*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Sdk()), false);
363*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Unsupported()), false);
364*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetS()), true);
365*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetR()), true);
366*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetQ()), true);
367*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetP()), true);
368*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetO()), true);
369*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Blocked()), true);
370*795d594fSAndroid Build Coastguard Worker }
371*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,CheckTestApiEnforcement)372*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, CheckTestApiEnforcement) {
373*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(self_);
374*795d594fSAndroid Build Coastguard Worker 
375*795d594fSAndroid Build Coastguard Worker   runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
376*795d594fSAndroid Build Coastguard Worker   runtime_->SetTargetSdkVersion(
377*795d594fSAndroid Build Coastguard Worker       static_cast<uint32_t>(hiddenapi::ApiList::MaxTargetR().GetMaxAllowedSdkVersion()) + 1);
378*795d594fSAndroid Build Coastguard Worker 
379*795d594fSAndroid Build Coastguard Worker   // Default case where all TestApis are treated like non-TestApi.
380*795d594fSAndroid Build Coastguard Worker   runtime_->SetTestApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
381*795d594fSAndroid Build Coastguard Worker   SetChangeIdState(kAllowTestApiAccess, false);
382*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
383*795d594fSAndroid Build Coastguard Worker       ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::Sdk()), false);
384*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
385*795d594fSAndroid Build Coastguard Worker       ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::Unsupported()), false);
386*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
387*795d594fSAndroid Build Coastguard Worker       ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::MaxTargetR()), true);
388*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
389*795d594fSAndroid Build Coastguard Worker       ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::MaxTargetQ()), true);
390*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
391*795d594fSAndroid Build Coastguard Worker       ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::MaxTargetP()), true);
392*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
393*795d594fSAndroid Build Coastguard Worker       ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::MaxTargetO()), true);
394*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
395*795d594fSAndroid Build Coastguard Worker       ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::Blocked()), true);
396*795d594fSAndroid Build Coastguard Worker 
397*795d594fSAndroid Build Coastguard Worker   // A case where we want to allow access to TestApis.
398*795d594fSAndroid Build Coastguard Worker   runtime_->SetTestApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kDisabled);
399*795d594fSAndroid Build Coastguard Worker   SetChangeIdState(kAllowTestApiAccess, false);
400*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
401*795d594fSAndroid Build Coastguard Worker       ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::Sdk()), false);
402*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
403*795d594fSAndroid Build Coastguard Worker       ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::Unsupported()), false);
404*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
405*795d594fSAndroid Build Coastguard Worker       ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::MaxTargetR()), false);
406*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
407*795d594fSAndroid Build Coastguard Worker       ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::MaxTargetQ()), false);
408*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
409*795d594fSAndroid Build Coastguard Worker       ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::MaxTargetP()), false);
410*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
411*795d594fSAndroid Build Coastguard Worker       ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::MaxTargetO()), false);
412*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
413*795d594fSAndroid Build Coastguard Worker       ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::Blocked()), false);
414*795d594fSAndroid Build Coastguard Worker 
415*795d594fSAndroid Build Coastguard Worker   // A second case where we want to allow access to TestApis.
416*795d594fSAndroid Build Coastguard Worker   runtime_->SetTestApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
417*795d594fSAndroid Build Coastguard Worker   SetChangeIdState(kAllowTestApiAccess, true);
418*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
419*795d594fSAndroid Build Coastguard Worker       ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::Sdk()), false);
420*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
421*795d594fSAndroid Build Coastguard Worker       ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::Unsupported()), false);
422*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
423*795d594fSAndroid Build Coastguard Worker       ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::MaxTargetR()), false);
424*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
425*795d594fSAndroid Build Coastguard Worker       ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::MaxTargetQ()), false);
426*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
427*795d594fSAndroid Build Coastguard Worker       ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::MaxTargetP()), false);
428*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
429*795d594fSAndroid Build Coastguard Worker       ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::MaxTargetO()), false);
430*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ(
431*795d594fSAndroid Build Coastguard Worker       ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::Blocked()), false);
432*795d594fSAndroid Build Coastguard Worker }
433*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,CheckMembersRead)434*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, CheckMembersRead) {
435*795d594fSAndroid Build Coastguard Worker   ASSERT_NE(nullptr, class1_field1_);
436*795d594fSAndroid Build Coastguard Worker   ASSERT_NE(nullptr, class1_field12_);
437*795d594fSAndroid Build Coastguard Worker   ASSERT_NE(nullptr, class1_init_);
438*795d594fSAndroid Build Coastguard Worker   ASSERT_NE(nullptr, class1_method1_);
439*795d594fSAndroid Build Coastguard Worker   ASSERT_NE(nullptr, class1_method1_i_);
440*795d594fSAndroid Build Coastguard Worker   ASSERT_NE(nullptr, class1_method12_);
441*795d594fSAndroid Build Coastguard Worker   ASSERT_NE(nullptr, class12_field1_);
442*795d594fSAndroid Build Coastguard Worker   ASSERT_NE(nullptr, class12_method1_);
443*795d594fSAndroid Build Coastguard Worker   ASSERT_NE(nullptr, class2_field1_);
444*795d594fSAndroid Build Coastguard Worker   ASSERT_NE(nullptr, class2_method1_);
445*795d594fSAndroid Build Coastguard Worker   ASSERT_NE(nullptr, class2_method1_i_);
446*795d594fSAndroid Build Coastguard Worker   ASSERT_NE(nullptr, class3_field1_);
447*795d594fSAndroid Build Coastguard Worker   ASSERT_NE(nullptr, class3_method1_);
448*795d594fSAndroid Build Coastguard Worker   ASSERT_NE(nullptr, class3_method1_i_);
449*795d594fSAndroid Build Coastguard Worker }
450*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,CheckEverythingMatchesL)451*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, CheckEverythingMatchesL) {
452*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(self_);
453*795d594fSAndroid Build Coastguard Worker   std::string prefix("L");
454*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
455*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
456*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
457*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
458*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
459*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
460*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
461*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
462*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class2_field1_).DoesPrefixMatch(prefix));
463*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class2_method1_).DoesPrefixMatch(prefix));
464*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class2_method1_i_).DoesPrefixMatch(prefix));
465*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class3_field1_).DoesPrefixMatch(prefix));
466*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class3_method1_).DoesPrefixMatch(prefix));
467*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class3_method1_i_).DoesPrefixMatch(prefix));
468*795d594fSAndroid Build Coastguard Worker }
469*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,CheckPackageMatch)470*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, CheckPackageMatch) {
471*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(self_);
472*795d594fSAndroid Build Coastguard Worker   std::string prefix("Lmypackage/packagea/");
473*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
474*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
475*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
476*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
477*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
478*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
479*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
480*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
481*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class2_field1_).DoesPrefixMatch(prefix));
482*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class2_method1_).DoesPrefixMatch(prefix));
483*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class2_method1_i_).DoesPrefixMatch(prefix));
484*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class3_field1_).DoesPrefixMatch(prefix));
485*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class3_method1_).DoesPrefixMatch(prefix));
486*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class3_method1_i_).DoesPrefixMatch(prefix));
487*795d594fSAndroid Build Coastguard Worker }
488*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,CheckClassMatch)489*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, CheckClassMatch) {
490*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(self_);
491*795d594fSAndroid Build Coastguard Worker   std::string prefix("Lmypackage/packagea/Class1");
492*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
493*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
494*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
495*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
496*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
497*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
498*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
499*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
500*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class2_field1_).DoesPrefixMatch(prefix));
501*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class2_method1_).DoesPrefixMatch(prefix));
502*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class2_method1_i_).DoesPrefixMatch(prefix));
503*795d594fSAndroid Build Coastguard Worker }
504*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,CheckClassExactMatch)505*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, CheckClassExactMatch) {
506*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(self_);
507*795d594fSAndroid Build Coastguard Worker   std::string prefix("Lmypackage/packagea/Class1;");
508*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
509*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
510*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
511*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
512*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
513*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
514*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
515*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class2_field1_).DoesPrefixMatch(prefix));
516*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class2_method1_).DoesPrefixMatch(prefix));
517*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class2_method1_i_).DoesPrefixMatch(prefix));
518*795d594fSAndroid Build Coastguard Worker }
519*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,CheckMethodMatch)520*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, CheckMethodMatch) {
521*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(self_);
522*795d594fSAndroid Build Coastguard Worker   std::string prefix("Lmypackage/packagea/Class1;->method1");
523*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
524*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
525*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
526*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
527*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
528*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
529*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
530*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
531*795d594fSAndroid Build Coastguard Worker }
532*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,CheckMethodExactMatch)533*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, CheckMethodExactMatch) {
534*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(self_);
535*795d594fSAndroid Build Coastguard Worker   std::string prefix("Lmypackage/packagea/Class1;->method1(");
536*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
537*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
538*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
539*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
540*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
541*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
542*795d594fSAndroid Build Coastguard Worker }
543*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,CheckMethodSignatureMatch)544*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, CheckMethodSignatureMatch) {
545*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(self_);
546*795d594fSAndroid Build Coastguard Worker   std::string prefix("Lmypackage/packagea/Class1;->method1(I)");
547*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
548*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
549*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
550*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
551*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
552*795d594fSAndroid Build Coastguard Worker }
553*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,CheckMethodSignatureAndReturnMatch)554*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, CheckMethodSignatureAndReturnMatch) {
555*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(self_);
556*795d594fSAndroid Build Coastguard Worker   std::string prefix("Lmypackage/packagea/Class1;->method1()V");
557*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
558*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
559*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
560*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
561*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
562*795d594fSAndroid Build Coastguard Worker }
563*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,CheckFieldMatch)564*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, CheckFieldMatch) {
565*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(self_);
566*795d594fSAndroid Build Coastguard Worker   std::string prefix("Lmypackage/packagea/Class1;->field1");
567*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
568*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
569*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
570*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
571*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
572*795d594fSAndroid Build Coastguard Worker }
573*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,CheckFieldExactMatch)574*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, CheckFieldExactMatch) {
575*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(self_);
576*795d594fSAndroid Build Coastguard Worker   std::string prefix("Lmypackage/packagea/Class1;->field1:");
577*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
578*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
579*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
580*795d594fSAndroid Build Coastguard Worker }
581*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,CheckFieldTypeMatch)582*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, CheckFieldTypeMatch) {
583*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(self_);
584*795d594fSAndroid Build Coastguard Worker   std::string prefix("Lmypackage/packagea/Class1;->field1:I");
585*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
586*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
587*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
588*795d594fSAndroid Build Coastguard Worker }
589*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,CheckConstructorMatch)590*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, CheckConstructorMatch) {
591*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(self_);
592*795d594fSAndroid Build Coastguard Worker   std::string prefix("Lmypackage/packagea/Class1;-><init>");
593*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
594*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
595*795d594fSAndroid Build Coastguard Worker }
596*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,CheckConstructorExactMatch)597*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, CheckConstructorExactMatch) {
598*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(self_);
599*795d594fSAndroid Build Coastguard Worker   std::string prefix("Lmypackage/packagea/Class1;-><init>()V");
600*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
601*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
602*795d594fSAndroid Build Coastguard Worker }
603*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,CheckMethodSignatureTrailingCharsNoMatch)604*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, CheckMethodSignatureTrailingCharsNoMatch) {
605*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(self_);
606*795d594fSAndroid Build Coastguard Worker   std::string prefix("Lmypackage/packagea/Class1;->method1()Vfoo");
607*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
608*795d594fSAndroid Build Coastguard Worker }
609*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,CheckConstructorTrailingCharsNoMatch)610*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, CheckConstructorTrailingCharsNoMatch) {
611*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(self_);
612*795d594fSAndroid Build Coastguard Worker   std::string prefix("Lmypackage/packagea/Class1;-><init>()Vfoo");
613*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
614*795d594fSAndroid Build Coastguard Worker }
615*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,CheckFieldTrailingCharsNoMatch)616*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, CheckFieldTrailingCharsNoMatch) {
617*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(self_);
618*795d594fSAndroid Build Coastguard Worker   std::string prefix("Lmypackage/packagea/Class1;->field1:Ifoo");
619*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
620*795d594fSAndroid Build Coastguard Worker }
621*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,CheckMemberSignatureForProxyClass)622*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, CheckMemberSignatureForProxyClass) {
623*795d594fSAndroid Build Coastguard Worker   ScopedObjectAccess soa(self_);
624*795d594fSAndroid Build Coastguard Worker   StackHandleScope<4> hs(soa.Self());
625*795d594fSAndroid Build Coastguard Worker   Handle<mirror::ClassLoader> class_loader(
626*795d594fSAndroid Build Coastguard Worker       hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader_)));
627*795d594fSAndroid Build Coastguard Worker 
628*795d594fSAndroid Build Coastguard Worker   // Find interface we will create a proxy for.
629*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Class> h_iface =
630*795d594fSAndroid Build Coastguard Worker       hs.NewHandle(FindClass("Lmypackage/packagea/Interface;", class_loader));
631*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(h_iface != nullptr);
632*795d594fSAndroid Build Coastguard Worker 
633*795d594fSAndroid Build Coastguard Worker   // Create the proxy class.
634*795d594fSAndroid Build Coastguard Worker   std::vector<Handle<mirror::Class>> interfaces;
635*795d594fSAndroid Build Coastguard Worker   interfaces.push_back(h_iface);
636*795d594fSAndroid Build Coastguard Worker   Handle<mirror::Class> proxyClass = hs.NewHandle(proxy_test::GenerateProxyClass(
637*795d594fSAndroid Build Coastguard Worker       soa, jclass_loader_, runtime_->GetClassLinker(), "$Proxy1234", interfaces));
638*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(proxyClass != nullptr);
639*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(proxyClass->IsProxyClass());
640*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(proxyClass->IsInitialized());
641*795d594fSAndroid Build Coastguard Worker 
642*795d594fSAndroid Build Coastguard Worker   // Find the "method" virtual method.
643*795d594fSAndroid Build Coastguard Worker   ArtMethod* method = nullptr;
644*795d594fSAndroid Build Coastguard Worker   for (auto& m : proxyClass->GetDeclaredVirtualMethods(kRuntimePointerSize)) {
645*795d594fSAndroid Build Coastguard Worker     if (strcmp("method", m.GetInterfaceMethodIfProxy(kRuntimePointerSize)->GetName()) == 0) {
646*795d594fSAndroid Build Coastguard Worker       method = &m;
647*795d594fSAndroid Build Coastguard Worker       break;
648*795d594fSAndroid Build Coastguard Worker     }
649*795d594fSAndroid Build Coastguard Worker   }
650*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(method != nullptr);
651*795d594fSAndroid Build Coastguard Worker 
652*795d594fSAndroid Build Coastguard Worker   // Find the "interfaces" static field. This is generated for all proxies.
653*795d594fSAndroid Build Coastguard Worker   ArtField* field = nullptr;
654*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < proxyClass->NumStaticFields(); ++i) {
655*795d594fSAndroid Build Coastguard Worker     ArtField* f = proxyClass->GetStaticField(i);
656*795d594fSAndroid Build Coastguard Worker     if (strcmp("interfaces", f->GetName()) == 0) {
657*795d594fSAndroid Build Coastguard Worker       field = f;
658*795d594fSAndroid Build Coastguard Worker       break;
659*795d594fSAndroid Build Coastguard Worker     }
660*795d594fSAndroid Build Coastguard Worker   }
661*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(field != nullptr);
662*795d594fSAndroid Build Coastguard Worker 
663*795d594fSAndroid Build Coastguard Worker   // Test the signature. We expect the signature from the interface class.
664*795d594fSAndroid Build Coastguard Worker   std::ostringstream ss_method;
665*795d594fSAndroid Build Coastguard Worker   MemberSignature(method->GetInterfaceMethodIfProxy(kRuntimePointerSize)).Dump(ss_method);
666*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ("Lmypackage/packagea/Interface;->method()V", ss_method.str());
667*795d594fSAndroid Build Coastguard Worker 
668*795d594fSAndroid Build Coastguard Worker   // Test the signature. We expect the signature of the proxy class.
669*795d594fSAndroid Build Coastguard Worker   std::ostringstream ss_field;
670*795d594fSAndroid Build Coastguard Worker   MemberSignature(field).Dump(ss_field);
671*795d594fSAndroid Build Coastguard Worker   ASSERT_EQ("L$Proxy1234;->interfaces:[Ljava/lang/Class;", ss_field.str());
672*795d594fSAndroid Build Coastguard Worker }
673*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,DexDomain_DataDir)674*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, DexDomain_DataDir) {
675*795d594fSAndroid Build Coastguard Worker   // Load file from a non-system directory and check that it is not flagged as framework.
676*795d594fSAndroid Build Coastguard Worker   std::string data_location_path = android_data_ + "/foo.jar";
677*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(LocationIsOnSystemFramework(data_location_path));
678*795d594fSAndroid Build Coastguard Worker   TestLocation(data_location_path, hiddenapi::Domain::kApplication);
679*795d594fSAndroid Build Coastguard Worker }
680*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,DexDomain_SystemDir)681*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, DexDomain_SystemDir) {
682*795d594fSAndroid Build Coastguard Worker   // Load file from a system, non-framework directory and check that it is not flagged as framework.
683*795d594fSAndroid Build Coastguard Worker   std::string system_location_path = GetAndroidRoot() + "/foo.jar";
684*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(LocationIsOnSystemFramework(system_location_path));
685*795d594fSAndroid Build Coastguard Worker   TestLocation(system_location_path, hiddenapi::Domain::kApplication);
686*795d594fSAndroid Build Coastguard Worker }
687*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,DexDomain_SystemExtDir)688*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, DexDomain_SystemExtDir) {
689*795d594fSAndroid Build Coastguard Worker   // Load file from a system_ext, non-framework directory and check that it is not flagged as
690*795d594fSAndroid Build Coastguard Worker   // framework.
691*795d594fSAndroid Build Coastguard Worker   std::string system_ext_location_path = android_system_ext_ + "/foo.jar";
692*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(LocationIsOnSystemExtFramework(system_ext_location_path));
693*795d594fSAndroid Build Coastguard Worker   TestLocation(system_ext_location_path, hiddenapi::Domain::kApplication);
694*795d594fSAndroid Build Coastguard Worker }
695*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,DexDomain_SystemSystemExtDir)696*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, DexDomain_SystemSystemExtDir) {
697*795d594fSAndroid Build Coastguard Worker   // Load file from a system/system_ext, non-framework directory and check that it is not flagged as
698*795d594fSAndroid Build Coastguard Worker   // framework.
699*795d594fSAndroid Build Coastguard Worker   std::filesystem::create_directory(GetAndroidRoot() + "/system_ext");
700*795d594fSAndroid Build Coastguard Worker   std::string system_ext_location_path =  GetAndroidRoot() + "/system_ext/foo.jar";
701*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(LocationIsOnSystemExtFramework(system_ext_location_path));
702*795d594fSAndroid Build Coastguard Worker   TestLocation(system_ext_location_path, hiddenapi::Domain::kApplication);
703*795d594fSAndroid Build Coastguard Worker }
704*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,DexDomain_SystemFrameworkDir)705*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, DexDomain_SystemFrameworkDir) {
706*795d594fSAndroid Build Coastguard Worker   // Load file from a system/framework directory and check that it is flagged as a framework dex.
707*795d594fSAndroid Build Coastguard Worker   std::filesystem::create_directory(GetAndroidRoot() + "/framework");
708*795d594fSAndroid Build Coastguard Worker   std::string system_framework_location_path = GetAndroidRoot() + "/framework/foo.jar";
709*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(LocationIsOnSystemFramework(system_framework_location_path));
710*795d594fSAndroid Build Coastguard Worker   TestLocation(system_framework_location_path, hiddenapi::Domain::kPlatform);
711*795d594fSAndroid Build Coastguard Worker }
712*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,DexDomain_SystemExtFrameworkDir)713*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, DexDomain_SystemExtFrameworkDir) {
714*795d594fSAndroid Build Coastguard Worker   // Load file from a system_ext/framework directory and check that it is flagged as a framework dex.
715*795d594fSAndroid Build Coastguard Worker   std::filesystem::create_directory(android_system_ext_ + "/framework");
716*795d594fSAndroid Build Coastguard Worker   std::string system_ext_framework_location_path = android_system_ext_ + "/framework/foo.jar";
717*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(LocationIsOnSystemExtFramework(system_ext_framework_location_path));
718*795d594fSAndroid Build Coastguard Worker   TestLocation(system_ext_framework_location_path, hiddenapi::Domain::kPlatform);
719*795d594fSAndroid Build Coastguard Worker }
720*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,DexDomain_SystemSystemExtFrameworkDir)721*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, DexDomain_SystemSystemExtFrameworkDir) {
722*795d594fSAndroid Build Coastguard Worker   // Load file from a system/system_ext/framework directory and check that it is flagged as a
723*795d594fSAndroid Build Coastguard Worker   // framework dex.
724*795d594fSAndroid Build Coastguard Worker   std::filesystem::create_directory(GetAndroidRoot() + "/system_ext");
725*795d594fSAndroid Build Coastguard Worker   std::filesystem::create_directory(GetAndroidRoot() + "/system_ext/framework");
726*795d594fSAndroid Build Coastguard Worker   std::string system_ext_framework_location_path =
727*795d594fSAndroid Build Coastguard Worker        GetAndroidRoot() + "/system_ext/framework/foo.jar";
728*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(LocationIsOnSystemExtFramework(system_ext_framework_location_path));
729*795d594fSAndroid Build Coastguard Worker   TestLocation(system_ext_framework_location_path, hiddenapi::Domain::kPlatform);
730*795d594fSAndroid Build Coastguard Worker }
731*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,DexDomain_DataDir_MultiDex)732*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, DexDomain_DataDir_MultiDex) {
733*795d594fSAndroid Build Coastguard Worker   // Load multidex file from a non-system directory and check that it is not flagged as framework.
734*795d594fSAndroid Build Coastguard Worker   std::string data_multi_location_path = android_data_ + "/multifoo.jar";
735*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(LocationIsOnSystemFramework(data_multi_location_path));
736*795d594fSAndroid Build Coastguard Worker   TestLocation(data_multi_location_path, hiddenapi::Domain::kApplication);
737*795d594fSAndroid Build Coastguard Worker }
738*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,DexDomain_SystemDir_MultiDex)739*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, DexDomain_SystemDir_MultiDex) {
740*795d594fSAndroid Build Coastguard Worker   // Load multidex file from a system, non-framework directory and check that it is not flagged
741*795d594fSAndroid Build Coastguard Worker   // as framework.
742*795d594fSAndroid Build Coastguard Worker   std::string system_multi_location_path = GetAndroidRoot() + "/multifoo.jar";
743*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(LocationIsOnSystemFramework(system_multi_location_path));
744*795d594fSAndroid Build Coastguard Worker   TestLocation(system_multi_location_path, hiddenapi::Domain::kApplication);
745*795d594fSAndroid Build Coastguard Worker }
746*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,DexDomain_SystemExtDir_MultiDex)747*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, DexDomain_SystemExtDir_MultiDex) {
748*795d594fSAndroid Build Coastguard Worker   // Load multidex file from a system_ext, non-framework directory and check that it is not flagged
749*795d594fSAndroid Build Coastguard Worker   // as framework.
750*795d594fSAndroid Build Coastguard Worker   std::string system_ext_multi_location_path = android_system_ext_ + "/multifoo.jar";
751*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(LocationIsOnSystemExtFramework(system_ext_multi_location_path));
752*795d594fSAndroid Build Coastguard Worker   TestLocation(system_ext_multi_location_path, hiddenapi::Domain::kApplication);
753*795d594fSAndroid Build Coastguard Worker }
754*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,DexDomain_SystemSystemExtDir_MultiDex)755*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, DexDomain_SystemSystemExtDir_MultiDex) {
756*795d594fSAndroid Build Coastguard Worker   // Load multidex file from a system/system_ext, non-framework directory and check that it is not
757*795d594fSAndroid Build Coastguard Worker   // flagged as framework.
758*795d594fSAndroid Build Coastguard Worker   std::filesystem::create_directory(GetAndroidRoot() + "/system_ext");
759*795d594fSAndroid Build Coastguard Worker   std::string system_ext_multi_location_path =
760*795d594fSAndroid Build Coastguard Worker       GetAndroidRoot() + "/system_ext/multifoo.jar";
761*795d594fSAndroid Build Coastguard Worker   ASSERT_FALSE(LocationIsOnSystemExtFramework(system_ext_multi_location_path));
762*795d594fSAndroid Build Coastguard Worker   TestLocation(system_ext_multi_location_path, hiddenapi::Domain::kApplication);
763*795d594fSAndroid Build Coastguard Worker }
764*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,DexDomain_SystemFrameworkDir_MultiDex)765*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, DexDomain_SystemFrameworkDir_MultiDex) {
766*795d594fSAndroid Build Coastguard Worker   // Load multidex file from a system/framework directory and check that it is flagged as a
767*795d594fSAndroid Build Coastguard Worker   // framework dex.
768*795d594fSAndroid Build Coastguard Worker   std::filesystem::create_directory(GetAndroidRoot() + "/framework");
769*795d594fSAndroid Build Coastguard Worker   std::string system_framework_multi_location_path = GetAndroidRoot() + "/framework/multifoo.jar";
770*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(LocationIsOnSystemFramework(system_framework_multi_location_path));
771*795d594fSAndroid Build Coastguard Worker   TestLocation(system_framework_multi_location_path, hiddenapi::Domain::kPlatform);
772*795d594fSAndroid Build Coastguard Worker }
773*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,DexDomain_SystemExtFrameworkDir_MultiDex)774*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, DexDomain_SystemExtFrameworkDir_MultiDex) {
775*795d594fSAndroid Build Coastguard Worker   // Load multidex file from a system_ext/framework directory and check that it is flagged as a
776*795d594fSAndroid Build Coastguard Worker   // framework dex.
777*795d594fSAndroid Build Coastguard Worker   std::filesystem::create_directory(android_system_ext_ + "/framework");
778*795d594fSAndroid Build Coastguard Worker   std::string system_ext_framework_multi_location_path =
779*795d594fSAndroid Build Coastguard Worker       android_system_ext_ + "/framework/multifoo.jar";
780*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(LocationIsOnSystemExtFramework(system_ext_framework_multi_location_path));
781*795d594fSAndroid Build Coastguard Worker   TestLocation(system_ext_framework_multi_location_path, hiddenapi::Domain::kPlatform);
782*795d594fSAndroid Build Coastguard Worker }
783*795d594fSAndroid Build Coastguard Worker 
TEST_F(HiddenApiTest,DexDomain_SystemSystemExtFrameworkDir_MultiDex)784*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, DexDomain_SystemSystemExtFrameworkDir_MultiDex) {
785*795d594fSAndroid Build Coastguard Worker   // Load multidex file from a system/system_ext/framework directory and check that it is flagged
786*795d594fSAndroid Build Coastguard Worker   // as a framework dex.
787*795d594fSAndroid Build Coastguard Worker   std::filesystem::create_directory(GetAndroidRoot() + "/system_ext");
788*795d594fSAndroid Build Coastguard Worker   std::filesystem::create_directory(GetAndroidRoot() + "/system_ext/framework");
789*795d594fSAndroid Build Coastguard Worker   std::string system_ext_framework_multi_location_path =
790*795d594fSAndroid Build Coastguard Worker        GetAndroidRoot() + "/system_ext/framework/multifoo.jar";
791*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(LocationIsOnSystemExtFramework(system_ext_framework_multi_location_path));
792*795d594fSAndroid Build Coastguard Worker   TestLocation(system_ext_framework_multi_location_path, hiddenapi::Domain::kPlatform);
793*795d594fSAndroid Build Coastguard Worker }
794*795d594fSAndroid Build Coastguard Worker 
795*795d594fSAndroid Build Coastguard Worker }  // namespace art
796