blob: 7cec10c173b3b14e15160a4f5a162640517b7682 [file] [log] [blame]
Mathew Inwood7d74ef52018-03-16 14:18:33 +00001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "hidden_api.h"
18
David Brazdila5c3a802019-03-08 14:59:41 +000019#include <fstream>
David Brazdilbfaba282019-03-15 11:35:51 +000020#include <sstream>
David Brazdila5c3a802019-03-08 14:59:41 +000021
Orion Hodson9735ccc2020-07-20 13:05:04 +010022#include "android-base/stringprintf.h"
David Brazdila5c3a802019-03-08 14:59:41 +000023#include "base/file_utils.h"
David Brazdil2bb2fbd2018-11-13 18:24:26 +000024#include "base/sdk_version.h"
David Brazdila5c3a802019-03-08 14:59:41 +000025#include "base/stl_util.h"
Mathew Inwood7d74ef52018-03-16 14:18:33 +000026#include "common_runtime_test.h"
Vladimir Markoa3ad0cd2018-05-04 10:06:38 +010027#include "jni/jni_internal.h"
David Brazdil1f9d3c32018-05-02 16:53:06 +010028#include "proxy_test.h"
David Brazdila5c3a802019-03-08 14:59:41 +000029#include "well_known_classes.h"
Mathew Inwood7d74ef52018-03-16 14:18:33 +000030
31namespace art {
32
Orion Hodson9735ccc2020-07-20 13:05:04 +010033using android::base::StringPrintf;
Andreas Gampeaa120012018-03-28 16:23:24 -070034using hiddenapi::detail::MemberSignature;
David Brazdilf50ac102018-10-17 18:00:06 +010035using hiddenapi::detail::ShouldDenyAccessToMemberImpl;
Andreas Gampeaa120012018-03-28 16:23:24 -070036
Pedro Loureirof7fcb982020-11-24 16:44:12 +000037// Should be the same as dalvik.system.VMRuntime.HIDE_MAXTARGETSDK_P_HIDDEN_APIS,
38// dalvik.system.VMRuntime.HIDE_MAXTARGETSDK_Q_HIDDEN_APIS, and
39// dalvik.system.VMRuntime.EXEMPT_TEST_API_ACCESS_VERIFICATION.
atrost2dea0792020-02-25 20:11:47 +000040static constexpr uint64_t kHideMaxtargetsdkPHiddenApis = 149997251;
41static constexpr uint64_t kHideMaxtargetsdkQHiddenApis = 149994052;
Pedro Loureirof7fcb982020-11-24 16:44:12 +000042static constexpr uint64_t kAllowTestApiAccess = 166236554;
atrost2dea0792020-02-25 20:11:47 +000043
Nicolas Geoffray59c21032021-03-02 13:05:03 +000044
45static bool Copy(const std::string& src, const std::string& dst, /*out*/ std::string* error_msg) {
46 std::ifstream src_stream(src, std::ios::binary);
47 std::ofstream dst_stream(dst, std::ios::binary);
48 dst_stream << src_stream.rdbuf();
49 src_stream.close();
50 dst_stream.close();
51 if (src_stream.good() && dst_stream.good()) {
52 return true;
53 } else {
54 *error_msg = "Copy " + src + " => " + dst + " (src_good="
55 + (src_stream.good() ? "true" : "false") + ", dst_good="
56 + (dst_stream.good() ? "true" : "false") + ")";
57 return false;
58 }
59}
60
61static bool LoadDexFiles(const std::string& path,
62 ScopedObjectAccess& soa,
63 /* out */ std::vector<std::unique_ptr<const DexFile>>* dex_files,
64 /* out */ ObjPtr<mirror::ClassLoader>* class_loader,
65 /* out */ std::string* error_msg) REQUIRES_SHARED(Locks::mutator_lock_) {
66 if (!ArtDexFileLoader().Open(path.c_str(),
67 path,
68 /* verify= */ true,
69 /* verify_checksum= */ true,
70 error_msg,
71 dex_files)) {
72 return false;
73 }
74
75 ClassLinker* const linker = Runtime::Current()->GetClassLinker();
76
77 StackHandleScope<2> hs(soa.Self());
78 Handle<mirror::Class> h_class = hs.NewHandle(soa.Decode<mirror::Class>(
79 WellKnownClasses::dalvik_system_PathClassLoader));
80 Handle<mirror::ClassLoader> h_loader = hs.NewHandle(linker->CreateWellKnownClassLoader(
81 soa.Self(),
82 MakeNonOwningPointerVector(*dex_files),
83 h_class,
84 /* parent_loader= */ ScopedNullHandle<mirror::ClassLoader>(),
85 /* shared_libraries= */ ScopedNullHandle<mirror::ObjectArray<mirror::ClassLoader>>()));
86 for (const auto& dex_file : *dex_files) {
87 linker->RegisterDexFile(*dex_file.get(), h_loader.Get());
88 }
89
90 *class_loader = h_loader.Get();
91 return true;
92}
93
94static bool Remove(const std::string& path, /*out*/ std::string* error_msg) {
95 if (TEMP_FAILURE_RETRY(remove(path.c_str())) == 0) {
96 return true;
97 }
98 *error_msg = StringPrintf("Unable to remove(\"%s\"): %s", path.c_str(), strerror(errno));
99 return false;
100}
101
102static bool CheckAllDexFilesInDomain(ObjPtr<mirror::ClassLoader> loader,
103 const std::vector<std::unique_ptr<const DexFile>>& dex_files,
104 hiddenapi::Domain expected_domain,
105 /* out */ std::string* error_msg)
106 REQUIRES_SHARED(Locks::mutator_lock_) {
107 for (const auto& dex_file : dex_files) {
108 hiddenapi::AccessContext context(loader, dex_file.get());
109 if (context.GetDomain() != expected_domain) {
110 std::stringstream ss;
111 ss << dex_file->GetLocation() << ": access context domain does not match "
112 << "(expected=" << static_cast<uint32_t>(expected_domain)
113 << ", actual=" << static_cast<uint32_t>(context.GetDomain()) << ")";
114 *error_msg = ss.str();
115 return false;
116 }
117 if (dex_file->GetHiddenapiDomain() != expected_domain) {
118 std::stringstream ss;
119 ss << dex_file->GetLocation() << ": dex file domain does not match "
120 << "(expected=" << static_cast<uint32_t>(expected_domain)
121 << ", actual=" << static_cast<uint32_t>(dex_file->GetHiddenapiDomain()) << ")";
122 *error_msg = ss.str();
123 return false;
124 }
125 }
126
127 return true;
128}
129
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000130class HiddenApiTest : public CommonRuntimeTest {
131 protected:
Roland Levillainbbc6e7e2018-08-24 16:58:47 +0100132 void SetUp() override {
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000133 // Do the normal setup.
134 CommonRuntimeTest::SetUp();
135 self_ = Thread::Current();
136 self_->TransitionFromSuspendedToRunnable();
David Brazdil1f9d3c32018-05-02 16:53:06 +0100137 jclass_loader_ = LoadDex("HiddenApiSignatures");
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000138 bool started = runtime_->Start();
139 CHECK(started);
140
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000141 class1_field1_ = GetArtField("mypackage/packagea/Class1", "field1", "I");
142 class1_field12_ = GetArtField("mypackage/packagea/Class1", "field12", "I");
143 class1_init_ = GetArtMethod("mypackage/packagea/Class1", "<init>", "()V");
144 class1_method1_ = GetArtMethod("mypackage/packagea/Class1", "method1", "()V");
145 class1_method1_i_ = GetArtMethod("mypackage/packagea/Class1", "method1", "(I)V");
146 class1_method12_ = GetArtMethod("mypackage/packagea/Class1", "method12", "()V");
147 class12_field1_ = GetArtField("mypackage/packagea/Class12", "field1", "I");
148 class12_method1_ = GetArtMethod("mypackage/packagea/Class12", "method1", "()V");
149 class2_field1_ = GetArtField("mypackage/packagea/Class2", "field1", "I");
150 class2_method1_ = GetArtMethod("mypackage/packagea/Class2", "method1", "()V");
151 class2_method1_i_ = GetArtMethod("mypackage/packagea/Class2", "method1", "(I)V");
152 class3_field1_ = GetArtField("mypackage/packageb/Class3", "field1", "I");
153 class3_method1_ = GetArtMethod("mypackage/packageb/Class3", "method1", "()V");
154 class3_method1_i_ = GetArtMethod("mypackage/packageb/Class3", "method1", "(I)V");
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000155 }
156
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000157 ArtMethod* GetArtMethod(const char* class_name, const char* name, const char* signature) {
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000158 JNIEnv* env = Thread::Current()->GetJniEnv();
159 jclass klass = env->FindClass(class_name);
160 jmethodID method_id = env->GetMethodID(klass, name, signature);
161 ArtMethod* art_method = jni::DecodeArtMethod(method_id);
162 return art_method;
163 }
164
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000165 ArtField* GetArtField(const char* class_name, const char* name, const char* signature) {
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000166 JNIEnv* env = Thread::Current()->GetJniEnv();
167 jclass klass = env->FindClass(class_name);
168 jfieldID field_id = env->GetFieldID(klass, name, signature);
169 ArtField* art_field = jni::DecodeArtField(field_id);
170 return art_field;
171 }
172
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000173 void SetChangeIdState(uint64_t change, bool enabled) {
Andrei Onea037d2822020-11-19 00:20:04 +0000174 CompatFramework& compat_framework = runtime_->GetCompatFramework();
175 std::set<uint64_t> disabled_changes = compat_framework.GetDisabledCompatChanges();
atrost2dea0792020-02-25 20:11:47 +0000176 if (enabled) {
177 disabled_changes.erase(change);
178 } else {
179 disabled_changes.insert(change);
180 }
Andrei Onea037d2822020-11-19 00:20:04 +0000181 compat_framework.SetDisabledCompatChanges(disabled_changes);
atrost2dea0792020-02-25 20:11:47 +0000182 }
183
David Brazdilf50ac102018-10-17 18:00:06 +0100184 bool ShouldDenyAccess(hiddenapi::ApiList list) REQUIRES_SHARED(Locks::mutator_lock_) {
185 // Choose parameters such that there are no side effects (AccessMethod::kNone)
186 // and that the member is not on the exemptions list (here we choose one which
187 // is not even in boot class path).
188 return ShouldDenyAccessToMemberImpl(/* member= */ class1_field1_,
189 list,
190 /* access_method= */ hiddenapi::AccessMethod::kNone);
191 }
192
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000193 void TestLocation(const std::string& location, hiddenapi::Domain expected_domain) {
194 ScopedObjectAccess soa(Thread::Current());
195 std::vector<std::unique_ptr<const DexFile>> dex_files;
196 std::string error_msg;
197 ObjPtr<mirror::ClassLoader> class_loader;
198
199 ASSERT_TRUE(Copy(GetTestDexFileName("Main"), location, &error_msg)) << error_msg;
200 ASSERT_TRUE(LoadDexFiles(location, soa, &dex_files, &class_loader, &error_msg))
201 << error_msg;
202 ASSERT_GE(dex_files.size(), 1u);
203 ASSERT_TRUE(CheckAllDexFilesInDomain(class_loader,
204 dex_files,
205 expected_domain,
206 &error_msg)) << error_msg;
207
208 dex_files.clear();
209 ASSERT_TRUE(Remove(location, &error_msg)) << error_msg;
210 }
211
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000212 protected:
213 Thread* self_;
David Brazdil1f9d3c32018-05-02 16:53:06 +0100214 jobject jclass_loader_;
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000215 ArtField* class1_field1_;
216 ArtField* class1_field12_;
217 ArtMethod* class1_init_;
218 ArtMethod* class1_method1_;
219 ArtMethod* class1_method1_i_;
220 ArtMethod* class1_method12_;
221 ArtField* class12_field1_;
222 ArtMethod* class12_method1_;
223 ArtField* class2_field1_;
224 ArtMethod* class2_method1_;
225 ArtMethod* class2_method1_i_;
226 ArtField* class3_field1_;
227 ArtMethod* class3_method1_;
228 ArtMethod* class3_method1_i_;
229};
230
Mathew Inwooda8503d92018-04-05 16:10:25 +0100231TEST_F(HiddenApiTest, CheckGetActionFromRuntimeFlags) {
David Brazdilf50ac102018-10-17 18:00:06 +0100232 ScopedObjectAccess soa(self_);
233
Mathew Inwooda8503d92018-04-05 16:10:25 +0100234 runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kJustWarn);
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100235 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Sdk()), false);
236 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Unsupported()), false);
237 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetR()), false);
238 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetQ()), false);
239 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetP()), false);
240 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetO()), false);
241 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Blocked()), false);
Mathew Inwooda8503d92018-04-05 16:10:25 +0100242
David Brazdilf50ac102018-10-17 18:00:06 +0100243 runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
David Brazdildcfa89b2018-10-31 11:04:10 +0000244 runtime_->SetTargetSdkVersion(
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100245 static_cast<uint32_t>(hiddenapi::ApiList::MaxTargetO().GetMaxAllowedSdkVersion()));
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000246 SetChangeIdState(kHideMaxtargetsdkPHiddenApis, false);
247 SetChangeIdState(kHideMaxtargetsdkQHiddenApis, false);
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100248 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Sdk()), false);
249 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Unsupported()), false);
250 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetR()), false);
251 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetQ()), false);
252 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetP()), false);
253 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetO()), false);
254 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Blocked()), true);
Mathew Inwooda8503d92018-04-05 16:10:25 +0100255
David Brazdilf50ac102018-10-17 18:00:06 +0100256 runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
David Brazdildcfa89b2018-10-31 11:04:10 +0000257 runtime_->SetTargetSdkVersion(
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100258 static_cast<uint32_t>(hiddenapi::ApiList::MaxTargetO().GetMaxAllowedSdkVersion()) + 1);
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000259 SetChangeIdState(kHideMaxtargetsdkPHiddenApis, false);
260 SetChangeIdState(kHideMaxtargetsdkQHiddenApis, false);
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100261 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Sdk()), false);
262 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Unsupported()), false);
263 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetR()), false);
264 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetQ()), false);
265 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetP()), false);
266 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetO()), true);
267 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Blocked()), true);
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000268 SetChangeIdState(kHideMaxtargetsdkQHiddenApis, true);
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100269 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Sdk()), false);
270 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Unsupported()), false);
271 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetQ()), true);
272 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetP()), false);
273 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetO()), true);
274 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Blocked()), true);
David Brazdil80d16282018-11-01 09:55:09 +0000275
276 runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
277 runtime_->SetTargetSdkVersion(
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100278 static_cast<uint32_t>(hiddenapi::ApiList::MaxTargetP().GetMaxAllowedSdkVersion()) + 1);
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000279 SetChangeIdState(kHideMaxtargetsdkPHiddenApis, true);
280 SetChangeIdState(kHideMaxtargetsdkQHiddenApis, false);
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100281 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Sdk()), false);
282 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Unsupported()), false);
283 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetR()), false);
284 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetQ()), false);
285 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetP()), true);
286 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetO()), true);
287 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Blocked()), true);
Artur Satayev201ffea2019-10-31 14:58:03 +0000288
289 runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
290 runtime_->SetTargetSdkVersion(
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100291 static_cast<uint32_t>(hiddenapi::ApiList::MaxTargetQ().GetMaxAllowedSdkVersion()) + 1);
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000292 SetChangeIdState(kHideMaxtargetsdkPHiddenApis, true);
293 SetChangeIdState(kHideMaxtargetsdkQHiddenApis, true);
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100294 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Sdk()), false);
295 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Unsupported()), false);
296 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetR()), false);
297 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetQ()), true);
298 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetP()), true);
299 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetO()), true);
300 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Blocked()), true);
Artur Satayevb708fc12020-05-20 17:48:19 +0100301
302 runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
303 runtime_->SetTargetSdkVersion(
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100304 static_cast<uint32_t>(hiddenapi::ApiList::MaxTargetR().GetMaxAllowedSdkVersion()) + 1);
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000305 SetChangeIdState(kHideMaxtargetsdkPHiddenApis, true);
306 SetChangeIdState(kHideMaxtargetsdkQHiddenApis, true);
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100307 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Sdk()), false);
308 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Unsupported()), false);
309 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetR()), true);
310 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetQ()), true);
311 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetP()), true);
312 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::MaxTargetO()), true);
313 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Blocked()), true);
Mathew Inwooda8503d92018-04-05 16:10:25 +0100314}
315
Artur Satayev267366c2019-10-31 14:59:26 +0000316TEST_F(HiddenApiTest, CheckTestApiEnforcement) {
317 ScopedObjectAccess soa(self_);
318
319 runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
320 runtime_->SetTargetSdkVersion(
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100321 static_cast<uint32_t>(hiddenapi::ApiList::MaxTargetR().GetMaxAllowedSdkVersion()) + 1);
Artur Satayev267366c2019-10-31 14:59:26 +0000322
323 // Default case where all TestApis are treated like non-TestApi.
satayev09efc162021-02-22 17:24:57 +0000324 runtime_->SetTestApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000325 SetChangeIdState(kAllowTestApiAccess, false);
Artur Satayev267366c2019-10-31 14:59:26 +0000326 ASSERT_EQ(
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100327 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::Sdk()), false);
Artur Satayev267366c2019-10-31 14:59:26 +0000328 ASSERT_EQ(
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100329 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::Unsupported()), false);
Artur Satayev267366c2019-10-31 14:59:26 +0000330 ASSERT_EQ(
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100331 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::MaxTargetR()), true);
Artur Satayevb708fc12020-05-20 17:48:19 +0100332 ASSERT_EQ(
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100333 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::MaxTargetQ()), true);
Artur Satayev267366c2019-10-31 14:59:26 +0000334 ASSERT_EQ(
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100335 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::MaxTargetP()), true);
Artur Satayev267366c2019-10-31 14:59:26 +0000336 ASSERT_EQ(
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100337 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::MaxTargetO()), true);
Artur Satayev267366c2019-10-31 14:59:26 +0000338 ASSERT_EQ(
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100339 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::Blocked()), true);
Artur Satayev267366c2019-10-31 14:59:26 +0000340
341 // A case where we want to allow access to TestApis.
satayev09efc162021-02-22 17:24:57 +0000342 runtime_->SetTestApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kDisabled);
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000343 SetChangeIdState(kAllowTestApiAccess, false);
satayev09efc162021-02-22 17:24:57 +0000344 ASSERT_EQ(
345 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::Sdk()), false);
346 ASSERT_EQ(
347 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::Unsupported()), false);
348 ASSERT_EQ(
349 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::MaxTargetR()), false);
350 ASSERT_EQ(
351 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::MaxTargetQ()), false);
352 ASSERT_EQ(
353 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::MaxTargetP()), false);
354 ASSERT_EQ(
355 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::MaxTargetO()), false);
356 ASSERT_EQ(
357 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::Blocked()), false);
358
359 // A second case where we want to allow access to TestApis.
360 runtime_->SetTestApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000361 SetChangeIdState(kAllowTestApiAccess, true);
Artur Satayev267366c2019-10-31 14:59:26 +0000362 ASSERT_EQ(
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100363 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::Sdk()), false);
Artur Satayev267366c2019-10-31 14:59:26 +0000364 ASSERT_EQ(
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100365 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::Unsupported()), false);
Artur Satayev267366c2019-10-31 14:59:26 +0000366 ASSERT_EQ(
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100367 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::MaxTargetR()), false);
Artur Satayevb708fc12020-05-20 17:48:19 +0100368 ASSERT_EQ(
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100369 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::MaxTargetQ()), false);
Artur Satayev267366c2019-10-31 14:59:26 +0000370 ASSERT_EQ(
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100371 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::MaxTargetP()), false);
Artur Satayev267366c2019-10-31 14:59:26 +0000372 ASSERT_EQ(
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100373 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::MaxTargetO()), false);
Artur Satayev267366c2019-10-31 14:59:26 +0000374 ASSERT_EQ(
Andrei Oneafc12a6c2020-07-29 19:52:34 +0100375 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::Blocked()), false);
Artur Satayev267366c2019-10-31 14:59:26 +0000376}
377
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000378TEST_F(HiddenApiTest, CheckMembersRead) {
379 ASSERT_NE(nullptr, class1_field1_);
380 ASSERT_NE(nullptr, class1_field12_);
381 ASSERT_NE(nullptr, class1_init_);
382 ASSERT_NE(nullptr, class1_method1_);
383 ASSERT_NE(nullptr, class1_method1_i_);
384 ASSERT_NE(nullptr, class1_method12_);
385 ASSERT_NE(nullptr, class12_field1_);
386 ASSERT_NE(nullptr, class12_method1_);
387 ASSERT_NE(nullptr, class2_field1_);
388 ASSERT_NE(nullptr, class2_method1_);
389 ASSERT_NE(nullptr, class2_method1_i_);
390 ASSERT_NE(nullptr, class3_field1_);
391 ASSERT_NE(nullptr, class3_method1_);
392 ASSERT_NE(nullptr, class3_method1_i_);
393}
394
395TEST_F(HiddenApiTest, CheckEverythingMatchesL) {
396 ScopedObjectAccess soa(self_);
397 std::string prefix("L");
Andreas Gampeaa120012018-03-28 16:23:24 -0700398 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
399 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
400 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
401 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
402 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
403 ASSERT_TRUE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
404 ASSERT_TRUE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
405 ASSERT_TRUE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
406 ASSERT_TRUE(MemberSignature(class2_field1_).DoesPrefixMatch(prefix));
407 ASSERT_TRUE(MemberSignature(class2_method1_).DoesPrefixMatch(prefix));
408 ASSERT_TRUE(MemberSignature(class2_method1_i_).DoesPrefixMatch(prefix));
409 ASSERT_TRUE(MemberSignature(class3_field1_).DoesPrefixMatch(prefix));
410 ASSERT_TRUE(MemberSignature(class3_method1_).DoesPrefixMatch(prefix));
411 ASSERT_TRUE(MemberSignature(class3_method1_i_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000412}
413
414TEST_F(HiddenApiTest, CheckPackageMatch) {
415 ScopedObjectAccess soa(self_);
416 std::string prefix("Lmypackage/packagea/");
Andreas Gampeaa120012018-03-28 16:23:24 -0700417 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
418 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
419 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
420 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
421 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
422 ASSERT_TRUE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
423 ASSERT_TRUE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
424 ASSERT_TRUE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
425 ASSERT_TRUE(MemberSignature(class2_field1_).DoesPrefixMatch(prefix));
426 ASSERT_TRUE(MemberSignature(class2_method1_).DoesPrefixMatch(prefix));
427 ASSERT_TRUE(MemberSignature(class2_method1_i_).DoesPrefixMatch(prefix));
428 ASSERT_FALSE(MemberSignature(class3_field1_).DoesPrefixMatch(prefix));
429 ASSERT_FALSE(MemberSignature(class3_method1_).DoesPrefixMatch(prefix));
430 ASSERT_FALSE(MemberSignature(class3_method1_i_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000431}
432
433TEST_F(HiddenApiTest, CheckClassMatch) {
434 ScopedObjectAccess soa(self_);
435 std::string prefix("Lmypackage/packagea/Class1");
Andreas Gampeaa120012018-03-28 16:23:24 -0700436 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
437 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
438 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
439 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
440 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
441 ASSERT_TRUE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
442 ASSERT_TRUE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
443 ASSERT_TRUE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
444 ASSERT_FALSE(MemberSignature(class2_field1_).DoesPrefixMatch(prefix));
445 ASSERT_FALSE(MemberSignature(class2_method1_).DoesPrefixMatch(prefix));
446 ASSERT_FALSE(MemberSignature(class2_method1_i_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000447}
448
449TEST_F(HiddenApiTest, CheckClassExactMatch) {
450 ScopedObjectAccess soa(self_);
451 std::string prefix("Lmypackage/packagea/Class1;");
Andreas Gampeaa120012018-03-28 16:23:24 -0700452 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
453 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
454 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
455 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
456 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
457 ASSERT_FALSE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
458 ASSERT_FALSE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
459 ASSERT_FALSE(MemberSignature(class2_field1_).DoesPrefixMatch(prefix));
460 ASSERT_FALSE(MemberSignature(class2_method1_).DoesPrefixMatch(prefix));
461 ASSERT_FALSE(MemberSignature(class2_method1_i_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000462}
463
464TEST_F(HiddenApiTest, CheckMethodMatch) {
465 ScopedObjectAccess soa(self_);
466 std::string prefix("Lmypackage/packagea/Class1;->method1");
Andreas Gampeaa120012018-03-28 16:23:24 -0700467 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
468 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
469 ASSERT_FALSE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
470 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
471 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
472 ASSERT_TRUE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
473 ASSERT_FALSE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
474 ASSERT_FALSE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000475}
476
477TEST_F(HiddenApiTest, CheckMethodExactMatch) {
478 ScopedObjectAccess soa(self_);
479 std::string prefix("Lmypackage/packagea/Class1;->method1(");
Andreas Gampeaa120012018-03-28 16:23:24 -0700480 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
481 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
482 ASSERT_FALSE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
483 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
484 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
485 ASSERT_FALSE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000486}
487
488TEST_F(HiddenApiTest, CheckMethodSignatureMatch) {
489 ScopedObjectAccess soa(self_);
490 std::string prefix("Lmypackage/packagea/Class1;->method1(I)");
Andreas Gampeaa120012018-03-28 16:23:24 -0700491 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
492 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
493 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
494 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
495 ASSERT_FALSE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000496}
497
498TEST_F(HiddenApiTest, CheckMethodSignatureAndReturnMatch) {
499 ScopedObjectAccess soa(self_);
500 std::string prefix("Lmypackage/packagea/Class1;->method1()V");
Andreas Gampeaa120012018-03-28 16:23:24 -0700501 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
502 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
503 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
504 ASSERT_FALSE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
505 ASSERT_FALSE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000506}
507
508TEST_F(HiddenApiTest, CheckFieldMatch) {
509 ScopedObjectAccess soa(self_);
510 std::string prefix("Lmypackage/packagea/Class1;->field1");
Andreas Gampeaa120012018-03-28 16:23:24 -0700511 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
512 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
513 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
514 ASSERT_FALSE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
515 ASSERT_FALSE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000516}
517
518TEST_F(HiddenApiTest, CheckFieldExactMatch) {
519 ScopedObjectAccess soa(self_);
520 std::string prefix("Lmypackage/packagea/Class1;->field1:");
Andreas Gampeaa120012018-03-28 16:23:24 -0700521 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
522 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
523 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000524}
525
526TEST_F(HiddenApiTest, CheckFieldTypeMatch) {
527 ScopedObjectAccess soa(self_);
528 std::string prefix("Lmypackage/packagea/Class1;->field1:I");
Andreas Gampeaa120012018-03-28 16:23:24 -0700529 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
530 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
531 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000532}
533
534TEST_F(HiddenApiTest, CheckConstructorMatch) {
535 ScopedObjectAccess soa(self_);
536 std::string prefix("Lmypackage/packagea/Class1;-><init>");
Andreas Gampeaa120012018-03-28 16:23:24 -0700537 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
538 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000539}
540
541TEST_F(HiddenApiTest, CheckConstructorExactMatch) {
542 ScopedObjectAccess soa(self_);
543 std::string prefix("Lmypackage/packagea/Class1;-><init>()V");
Andreas Gampeaa120012018-03-28 16:23:24 -0700544 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
545 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000546}
547
548TEST_F(HiddenApiTest, CheckMethodSignatureTrailingCharsNoMatch) {
549 ScopedObjectAccess soa(self_);
550 std::string prefix("Lmypackage/packagea/Class1;->method1()Vfoo");
Andreas Gampeaa120012018-03-28 16:23:24 -0700551 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000552}
553
554TEST_F(HiddenApiTest, CheckConstructorTrailingCharsNoMatch) {
555 ScopedObjectAccess soa(self_);
556 std::string prefix("Lmypackage/packagea/Class1;-><init>()Vfoo");
Andreas Gampeaa120012018-03-28 16:23:24 -0700557 ASSERT_FALSE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000558}
559
560TEST_F(HiddenApiTest, CheckFieldTrailingCharsNoMatch) {
561 ScopedObjectAccess soa(self_);
562 std::string prefix("Lmypackage/packagea/Class1;->field1:Ifoo");
Andreas Gampeaa120012018-03-28 16:23:24 -0700563 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000564}
565
David Brazdil1f9d3c32018-05-02 16:53:06 +0100566TEST_F(HiddenApiTest, CheckMemberSignatureForProxyClass) {
567 ScopedObjectAccess soa(self_);
568 StackHandleScope<4> hs(soa.Self());
569 Handle<mirror::ClassLoader> class_loader(
570 hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader_)));
571
572 // Find interface we will create a proxy for.
573 Handle<mirror::Class> h_iface(hs.NewHandle(
574 class_linker_->FindClass(soa.Self(), "Lmypackage/packagea/Interface;", class_loader)));
575 ASSERT_TRUE(h_iface != nullptr);
576
577 // Create the proxy class.
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100578 std::vector<Handle<mirror::Class>> interfaces;
579 interfaces.push_back(h_iface);
David Brazdil1f9d3c32018-05-02 16:53:06 +0100580 Handle<mirror::Class> proxyClass = hs.NewHandle(proxy_test::GenerateProxyClass(
581 soa, jclass_loader_, runtime_->GetClassLinker(), "$Proxy1234", interfaces));
582 ASSERT_TRUE(proxyClass != nullptr);
583 ASSERT_TRUE(proxyClass->IsProxyClass());
584 ASSERT_TRUE(proxyClass->IsInitialized());
585
586 // Find the "method" virtual method.
587 ArtMethod* method = nullptr;
588 for (auto& m : proxyClass->GetDeclaredVirtualMethods(kRuntimePointerSize)) {
589 if (strcmp("method", m.GetInterfaceMethodIfProxy(kRuntimePointerSize)->GetName()) == 0) {
590 method = &m;
591 break;
592 }
593 }
594 ASSERT_TRUE(method != nullptr);
595
596 // Find the "interfaces" static field. This is generated for all proxies.
597 ArtField* field = nullptr;
598 for (size_t i = 0; i < proxyClass->NumStaticFields(); ++i) {
599 ArtField* f = proxyClass->GetStaticField(i);
600 if (strcmp("interfaces", f->GetName()) == 0) {
601 field = f;
602 break;
603 }
604 }
605 ASSERT_TRUE(field != nullptr);
606
607 // Test the signature. We expect the signature from the interface class.
608 std::ostringstream ss_method;
David Brazdil6a1dab42019-02-28 18:45:15 +0000609 MemberSignature(method->GetInterfaceMethodIfProxy(kRuntimePointerSize)).Dump(ss_method);
David Brazdil1f9d3c32018-05-02 16:53:06 +0100610 ASSERT_EQ("Lmypackage/packagea/Interface;->method()V", ss_method.str());
611
612 // Test the signature. We expect the signature of the proxy class.
613 std::ostringstream ss_field;
614 MemberSignature(field).Dump(ss_field);
615 ASSERT_EQ("L$Proxy1234;->interfaces:[Ljava/lang/Class;", ss_field.str());
616}
617
David Brazdila5c3a802019-03-08 14:59:41 +0000618TEST_F(HiddenApiTest, DexDomain_DataDir) {
619 // Load file from a non-system directory and check that it is not flagged as framework.
620 std::string data_location_path = android_data_ + "/foo.jar";
621 ASSERT_FALSE(LocationIsOnSystemFramework(data_location_path.c_str()));
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000622 TestLocation(data_location_path, hiddenapi::Domain::kApplication);
David Brazdila5c3a802019-03-08 14:59:41 +0000623}
624
625TEST_F(HiddenApiTest, DexDomain_SystemDir) {
626 // Load file from a system, non-framework directory and check that it is not flagged as framework.
627 std::string system_location_path = GetAndroidRoot() + "/foo.jar";
628 ASSERT_FALSE(LocationIsOnSystemFramework(system_location_path.c_str()));
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000629 TestLocation(system_location_path, hiddenapi::Domain::kApplication);
David Brazdila5c3a802019-03-08 14:59:41 +0000630}
631
Chris Gross5477b8e2020-04-24 09:36:45 -0700632TEST_F(HiddenApiTest, DexDomain_SystemExtDir) {
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000633 // Load file from a system_ext, non-framework directory and check that it is not flagged as
634 // framework.
Chris Gross5477b8e2020-04-24 09:36:45 -0700635 std::string system_ext_location_path = android_system_ext_ + "/foo.jar";
636 ASSERT_FALSE(LocationIsOnSystemExtFramework(system_ext_location_path.c_str()));
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000637 TestLocation(system_ext_location_path, hiddenapi::Domain::kApplication);
638}
Chris Gross5477b8e2020-04-24 09:36:45 -0700639
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000640TEST_F(HiddenApiTest, DexDomain_SystemSystemExtDir) {
641 // Load file from a system/system_ext, non-framework directory and check that it is not flagged as
642 // framework.
643 std::filesystem::create_directory(GetAndroidRoot() + "/system_ext");
644 std::string system_ext_location_path = GetAndroidRoot() + "/system_ext/foo.jar";
645 ASSERT_FALSE(LocationIsOnSystemExtFramework(system_ext_location_path.c_str()));
646 TestLocation(system_ext_location_path, hiddenapi::Domain::kApplication);
Chris Gross5477b8e2020-04-24 09:36:45 -0700647}
648
David Brazdila5c3a802019-03-08 14:59:41 +0000649TEST_F(HiddenApiTest, DexDomain_SystemFrameworkDir) {
650 // Load file from a system/framework directory and check that it is flagged as a framework dex.
David Srbecky7400a542020-07-09 13:40:57 +0100651 std::filesystem::create_directory(GetAndroidRoot() + "/framework");
David Brazdila5c3a802019-03-08 14:59:41 +0000652 std::string system_framework_location_path = GetAndroidRoot() + "/framework/foo.jar";
653 ASSERT_TRUE(LocationIsOnSystemFramework(system_framework_location_path.c_str()));
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000654 TestLocation(system_framework_location_path, hiddenapi::Domain::kPlatform);
David Brazdila5c3a802019-03-08 14:59:41 +0000655}
656
Chris Gross5477b8e2020-04-24 09:36:45 -0700657TEST_F(HiddenApiTest, DexDomain_SystemExtFrameworkDir) {
658 // Load file from a system_ext/framework directory and check that it is flagged as a framework dex.
Nicolas Geoffray987a8ea2021-03-07 15:19:18 +0000659 std::filesystem::create_directory(android_system_ext_ + "/framework");
Chris Gross5477b8e2020-04-24 09:36:45 -0700660 std::string system_ext_framework_location_path = android_system_ext_ + "/framework/foo.jar";
661 ASSERT_TRUE(LocationIsOnSystemExtFramework(system_ext_framework_location_path.c_str()));
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000662 TestLocation(system_ext_framework_location_path, hiddenapi::Domain::kPlatform);
663}
Chris Gross5477b8e2020-04-24 09:36:45 -0700664
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000665TEST_F(HiddenApiTest, DexDomain_SystemSystemExtFrameworkDir) {
666 // Load file from a system/system_ext/framework directory and check that it is flagged as a
667 // framework dex.
668 std::filesystem::create_directory(GetAndroidRoot() + "/system_ext");
669 std::filesystem::create_directory(GetAndroidRoot() + "/system_ext/framework");
670 std::string system_ext_framework_location_path =
671 GetAndroidRoot() + "/system_ext/framework/foo.jar";
672 ASSERT_TRUE(LocationIsOnSystemExtFramework(system_ext_framework_location_path.c_str()));
673 TestLocation(system_ext_framework_location_path, hiddenapi::Domain::kPlatform);
Chris Gross5477b8e2020-04-24 09:36:45 -0700674}
675
David Brazdila5c3a802019-03-08 14:59:41 +0000676TEST_F(HiddenApiTest, DexDomain_DataDir_MultiDex) {
677 // Load multidex file from a non-system directory and check that it is not flagged as framework.
678 std::string data_multi_location_path = android_data_ + "/multifoo.jar";
679 ASSERT_FALSE(LocationIsOnSystemFramework(data_multi_location_path.c_str()));
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000680 TestLocation(data_multi_location_path, hiddenapi::Domain::kApplication);
David Brazdila5c3a802019-03-08 14:59:41 +0000681}
682
683TEST_F(HiddenApiTest, DexDomain_SystemDir_MultiDex) {
684 // Load multidex file from a system, non-framework directory and check that it is not flagged
685 // as framework.
686 std::string system_multi_location_path = GetAndroidRoot() + "/multifoo.jar";
687 ASSERT_FALSE(LocationIsOnSystemFramework(system_multi_location_path.c_str()));
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000688 TestLocation(system_multi_location_path, hiddenapi::Domain::kApplication);
David Brazdila5c3a802019-03-08 14:59:41 +0000689}
690
Chris Gross5477b8e2020-04-24 09:36:45 -0700691TEST_F(HiddenApiTest, DexDomain_SystemExtDir_MultiDex) {
692 // Load multidex file from a system_ext, non-framework directory and check that it is not flagged
693 // as framework.
694 std::string system_ext_multi_location_path = android_system_ext_ + "/multifoo.jar";
695 ASSERT_FALSE(LocationIsOnSystemExtFramework(system_ext_multi_location_path.c_str()));
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000696 TestLocation(system_ext_multi_location_path, hiddenapi::Domain::kApplication);
697}
Chris Gross5477b8e2020-04-24 09:36:45 -0700698
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000699TEST_F(HiddenApiTest, DexDomain_SystemSystemExtDir_MultiDex) {
700 // Load multidex file from a system/system_ext, non-framework directory and check that it is not
701 // flagged as framework.
Nicolas Geoffray987a8ea2021-03-07 15:19:18 +0000702 std::filesystem::create_directory(GetAndroidRoot() + "/system_ext");
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000703 std::string system_ext_multi_location_path =
704 GetAndroidRoot() + "/system_ext/multifoo.jar";
705 ASSERT_FALSE(LocationIsOnSystemExtFramework(system_ext_multi_location_path.c_str()));
706 TestLocation(system_ext_multi_location_path, hiddenapi::Domain::kApplication);
Chris Gross5477b8e2020-04-24 09:36:45 -0700707}
708
David Brazdila5c3a802019-03-08 14:59:41 +0000709TEST_F(HiddenApiTest, DexDomain_SystemFrameworkDir_MultiDex) {
710 // Load multidex file from a system/framework directory and check that it is flagged as a
711 // framework dex.
Nicolas Geoffray987a8ea2021-03-07 15:19:18 +0000712 std::filesystem::create_directory(GetAndroidRoot() + "/framework");
David Brazdila5c3a802019-03-08 14:59:41 +0000713 std::string system_framework_multi_location_path = GetAndroidRoot() + "/framework/multifoo.jar";
714 ASSERT_TRUE(LocationIsOnSystemFramework(system_framework_multi_location_path.c_str()));
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000715 TestLocation(system_framework_multi_location_path, hiddenapi::Domain::kPlatform);
David Brazdila5c3a802019-03-08 14:59:41 +0000716}
717
Chris Gross5477b8e2020-04-24 09:36:45 -0700718TEST_F(HiddenApiTest, DexDomain_SystemExtFrameworkDir_MultiDex) {
719 // Load multidex file from a system_ext/framework directory and check that it is flagged as a
720 // framework dex.
Nicolas Geoffray987a8ea2021-03-07 15:19:18 +0000721 std::filesystem::create_directory(android_system_ext_ + "/framework");
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000722 std::string system_ext_framework_multi_location_path =
723 android_system_ext_ + "/framework/multifoo.jar";
Chris Gross5477b8e2020-04-24 09:36:45 -0700724 ASSERT_TRUE(LocationIsOnSystemExtFramework(system_ext_framework_multi_location_path.c_str()));
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000725 TestLocation(system_ext_framework_multi_location_path, hiddenapi::Domain::kPlatform);
726}
Chris Gross5477b8e2020-04-24 09:36:45 -0700727
Nicolas Geoffray59c21032021-03-02 13:05:03 +0000728TEST_F(HiddenApiTest, DexDomain_SystemSystemExtFrameworkDir_MultiDex) {
729 // Load multidex file from a system/system_ext/framework directory and check that it is flagged
730 // as a framework dex.
731 std::filesystem::create_directory(GetAndroidRoot() + "/system_ext");
732 std::filesystem::create_directory(GetAndroidRoot() + "/system_ext/framework");
733 std::string system_ext_framework_multi_location_path =
734 GetAndroidRoot() + "/system_ext/framework/multifoo.jar";
735 ASSERT_TRUE(LocationIsOnSystemExtFramework(system_ext_framework_multi_location_path.c_str()));
736 TestLocation(system_ext_framework_multi_location_path, hiddenapi::Domain::kPlatform);
Chris Gross5477b8e2020-04-24 09:36:45 -0700737}
738
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000739} // namespace art