blob: e933c01433491698af38a5eecd270c2ceeb11cd1 [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
22#include "base/file_utils.h"
David Brazdil2bb2fbd2018-11-13 18:24:26 +000023#include "base/sdk_version.h"
David Brazdila5c3a802019-03-08 14:59:41 +000024#include "base/stl_util.h"
Mathew Inwood7d74ef52018-03-16 14:18:33 +000025#include "common_runtime_test.h"
Vladimir Markoa3ad0cd2018-05-04 10:06:38 +010026#include "jni/jni_internal.h"
David Brazdil1f9d3c32018-05-02 16:53:06 +010027#include "proxy_test.h"
David Brazdila5c3a802019-03-08 14:59:41 +000028#include "well_known_classes.h"
Mathew Inwood7d74ef52018-03-16 14:18:33 +000029
30namespace art {
31
Andreas Gampeaa120012018-03-28 16:23:24 -070032using hiddenapi::detail::MemberSignature;
David Brazdilf50ac102018-10-17 18:00:06 +010033using hiddenapi::detail::ShouldDenyAccessToMemberImpl;
Andreas Gampeaa120012018-03-28 16:23:24 -070034
atrost2dea0792020-02-25 20:11:47 +000035// Should be the same as dalvik.system.VMRuntime.HIDE_MAXTARGETSDK_P_HIDDEN_APIS and
36// dalvik.system.VMRuntime.HIDE_MAXTARGETSDK_Q_HIDDEN_APIS.
37static constexpr uint64_t kHideMaxtargetsdkPHiddenApis = 149997251;
38static constexpr uint64_t kHideMaxtargetsdkQHiddenApis = 149994052;
39
Mathew Inwood7d74ef52018-03-16 14:18:33 +000040class HiddenApiTest : public CommonRuntimeTest {
41 protected:
Roland Levillainbbc6e7e2018-08-24 16:58:47 +010042 void SetUp() override {
Mathew Inwood7d74ef52018-03-16 14:18:33 +000043 // Do the normal setup.
44 CommonRuntimeTest::SetUp();
45 self_ = Thread::Current();
46 self_->TransitionFromSuspendedToRunnable();
David Brazdil1f9d3c32018-05-02 16:53:06 +010047 jclass_loader_ = LoadDex("HiddenApiSignatures");
Mathew Inwood7d74ef52018-03-16 14:18:33 +000048 bool started = runtime_->Start();
49 CHECK(started);
50
51 class1_field1_ = getArtField("mypackage/packagea/Class1", "field1", "I");
52 class1_field12_ = getArtField("mypackage/packagea/Class1", "field12", "I");
53 class1_init_ = getArtMethod("mypackage/packagea/Class1", "<init>", "()V");
54 class1_method1_ = getArtMethod("mypackage/packagea/Class1", "method1", "()V");
55 class1_method1_i_ = getArtMethod("mypackage/packagea/Class1", "method1", "(I)V");
56 class1_method12_ = getArtMethod("mypackage/packagea/Class1", "method12", "()V");
57 class12_field1_ = getArtField("mypackage/packagea/Class12", "field1", "I");
58 class12_method1_ = getArtMethod("mypackage/packagea/Class12", "method1", "()V");
59 class2_field1_ = getArtField("mypackage/packagea/Class2", "field1", "I");
60 class2_method1_ = getArtMethod("mypackage/packagea/Class2", "method1", "()V");
61 class2_method1_i_ = getArtMethod("mypackage/packagea/Class2", "method1", "(I)V");
62 class3_field1_ = getArtField("mypackage/packageb/Class3", "field1", "I");
63 class3_method1_ = getArtMethod("mypackage/packageb/Class3", "method1", "()V");
64 class3_method1_i_ = getArtMethod("mypackage/packageb/Class3", "method1", "(I)V");
65 }
66
67 ArtMethod* getArtMethod(const char* class_name, const char* name, const char* signature) {
68 JNIEnv* env = Thread::Current()->GetJniEnv();
69 jclass klass = env->FindClass(class_name);
70 jmethodID method_id = env->GetMethodID(klass, name, signature);
71 ArtMethod* art_method = jni::DecodeArtMethod(method_id);
72 return art_method;
73 }
74
75 ArtField* getArtField(const char* class_name, const char* name, const char* signature) {
76 JNIEnv* env = Thread::Current()->GetJniEnv();
77 jclass klass = env->FindClass(class_name);
78 jfieldID field_id = env->GetFieldID(klass, name, signature);
79 ArtField* art_field = jni::DecodeArtField(field_id);
80 return art_field;
81 }
82
atrost2dea0792020-02-25 20:11:47 +000083 void setChangeIdState(uint64_t change, bool enabled) {
84 std::set<uint64_t> disabled_changes = runtime_->GetDisabledCompatChanges();
85 if (enabled) {
86 disabled_changes.erase(change);
87 } else {
88 disabled_changes.insert(change);
89 }
90 runtime_->SetDisabledCompatChanges(disabled_changes);
91 }
92
David Brazdilf50ac102018-10-17 18:00:06 +010093 bool ShouldDenyAccess(hiddenapi::ApiList list) REQUIRES_SHARED(Locks::mutator_lock_) {
94 // Choose parameters such that there are no side effects (AccessMethod::kNone)
95 // and that the member is not on the exemptions list (here we choose one which
96 // is not even in boot class path).
97 return ShouldDenyAccessToMemberImpl(/* member= */ class1_field1_,
98 list,
99 /* access_method= */ hiddenapi::AccessMethod::kNone);
100 }
101
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000102 protected:
103 Thread* self_;
David Brazdil1f9d3c32018-05-02 16:53:06 +0100104 jobject jclass_loader_;
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000105 ArtField* class1_field1_;
106 ArtField* class1_field12_;
107 ArtMethod* class1_init_;
108 ArtMethod* class1_method1_;
109 ArtMethod* class1_method1_i_;
110 ArtMethod* class1_method12_;
111 ArtField* class12_field1_;
112 ArtMethod* class12_method1_;
113 ArtField* class2_field1_;
114 ArtMethod* class2_method1_;
115 ArtMethod* class2_method1_i_;
116 ArtField* class3_field1_;
117 ArtMethod* class3_method1_;
118 ArtMethod* class3_method1_i_;
119};
120
Mathew Inwooda8503d92018-04-05 16:10:25 +0100121TEST_F(HiddenApiTest, CheckGetActionFromRuntimeFlags) {
David Brazdilf50ac102018-10-17 18:00:06 +0100122 ScopedObjectAccess soa(self_);
123
Mathew Inwooda8503d92018-04-05 16:10:25 +0100124 runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kJustWarn);
David Brazdildcfa89b2018-10-31 11:04:10 +0000125 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Whitelist()), false);
126 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Greylist()), false);
Artur Satayevb708fc12020-05-20 17:48:19 +0100127 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxR()), false);
Artur Satayev201ffea2019-10-31 14:58:03 +0000128 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxQ()), false);
David Brazdil80d16282018-11-01 09:55:09 +0000129 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxP()), false);
David Brazdildcfa89b2018-10-31 11:04:10 +0000130 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxO()), false);
131 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Blacklist()), false);
Mathew Inwooda8503d92018-04-05 16:10:25 +0100132
David Brazdilf50ac102018-10-17 18:00:06 +0100133 runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
David Brazdildcfa89b2018-10-31 11:04:10 +0000134 runtime_->SetTargetSdkVersion(
135 static_cast<uint32_t>(hiddenapi::ApiList::GreylistMaxO().GetMaxAllowedSdkVersion()));
atrost2dea0792020-02-25 20:11:47 +0000136 setChangeIdState(kHideMaxtargetsdkPHiddenApis, false);
137 setChangeIdState(kHideMaxtargetsdkQHiddenApis, false);
David Brazdildcfa89b2018-10-31 11:04:10 +0000138 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Whitelist()), false);
139 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Greylist()), false);
Artur Satayevb708fc12020-05-20 17:48:19 +0100140 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxR()), false);
Artur Satayev201ffea2019-10-31 14:58:03 +0000141 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxQ()), false);
David Brazdil80d16282018-11-01 09:55:09 +0000142 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxP()), false);
David Brazdildcfa89b2018-10-31 11:04:10 +0000143 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxO()), false);
144 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Blacklist()), true);
Mathew Inwooda8503d92018-04-05 16:10:25 +0100145
David Brazdilf50ac102018-10-17 18:00:06 +0100146 runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
David Brazdildcfa89b2018-10-31 11:04:10 +0000147 runtime_->SetTargetSdkVersion(
148 static_cast<uint32_t>(hiddenapi::ApiList::GreylistMaxO().GetMaxAllowedSdkVersion()) + 1);
atrost2dea0792020-02-25 20:11:47 +0000149 setChangeIdState(kHideMaxtargetsdkPHiddenApis, false);
150 setChangeIdState(kHideMaxtargetsdkQHiddenApis, false);
David Brazdildcfa89b2018-10-31 11:04:10 +0000151 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Whitelist()), false);
152 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Greylist()), false);
Artur Satayevb708fc12020-05-20 17:48:19 +0100153 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxR()), false);
Artur Satayev201ffea2019-10-31 14:58:03 +0000154 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxQ()), false);
David Brazdil80d16282018-11-01 09:55:09 +0000155 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxP()), false);
156 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxO()), true);
157 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Blacklist()), true);
atrost2dea0792020-02-25 20:11:47 +0000158 setChangeIdState(kHideMaxtargetsdkQHiddenApis, true);
159 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Whitelist()), false);
160 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Greylist()), false);
161 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxQ()), true);
162 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxP()), false);
163 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxO()), true);
164 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Blacklist()), true);
David Brazdil80d16282018-11-01 09:55:09 +0000165
166 runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
167 runtime_->SetTargetSdkVersion(
168 static_cast<uint32_t>(hiddenapi::ApiList::GreylistMaxP().GetMaxAllowedSdkVersion()) + 1);
atrost2dea0792020-02-25 20:11:47 +0000169 setChangeIdState(kHideMaxtargetsdkPHiddenApis, true);
170 setChangeIdState(kHideMaxtargetsdkQHiddenApis, false);
David Brazdil80d16282018-11-01 09:55:09 +0000171 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Whitelist()), false);
172 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Greylist()), false);
Artur Satayevb708fc12020-05-20 17:48:19 +0100173 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxR()), false);
Artur Satayev201ffea2019-10-31 14:58:03 +0000174 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxQ()), false);
175 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxP()), true);
176 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxO()), true);
177 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Blacklist()), true);
178
179 runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
180 runtime_->SetTargetSdkVersion(
181 static_cast<uint32_t>(hiddenapi::ApiList::GreylistMaxQ().GetMaxAllowedSdkVersion()) + 1);
atrost2dea0792020-02-25 20:11:47 +0000182 setChangeIdState(kHideMaxtargetsdkPHiddenApis, true);
183 setChangeIdState(kHideMaxtargetsdkQHiddenApis, true);
Artur Satayev201ffea2019-10-31 14:58:03 +0000184 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Whitelist()), false);
185 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Greylist()), false);
Artur Satayevb708fc12020-05-20 17:48:19 +0100186 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxR()), false);
187 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxQ()), true);
188 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxP()), true);
189 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxO()), true);
190 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Blacklist()), true);
191
192 runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
193 runtime_->SetTargetSdkVersion(
194 static_cast<uint32_t>(hiddenapi::ApiList::GreylistMaxR().GetMaxAllowedSdkVersion()) + 1);
195 setChangeIdState(kHideMaxtargetsdkPHiddenApis, true);
196 setChangeIdState(kHideMaxtargetsdkQHiddenApis, true);
197 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Whitelist()), false);
198 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Greylist()), false);
199 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxR()), true);
Artur Satayev201ffea2019-10-31 14:58:03 +0000200 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxQ()), true);
David Brazdil80d16282018-11-01 09:55:09 +0000201 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxP()), true);
David Brazdildcfa89b2018-10-31 11:04:10 +0000202 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::GreylistMaxO()), true);
203 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::Blacklist()), true);
Mathew Inwooda8503d92018-04-05 16:10:25 +0100204}
205
Artur Satayev267366c2019-10-31 14:59:26 +0000206TEST_F(HiddenApiTest, CheckTestApiEnforcement) {
207 ScopedObjectAccess soa(self_);
208
209 runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
210 runtime_->SetTargetSdkVersion(
Artur Satayevb708fc12020-05-20 17:48:19 +0100211 static_cast<uint32_t>(hiddenapi::ApiList::GreylistMaxR().GetMaxAllowedSdkVersion()) + 1);
Artur Satayev267366c2019-10-31 14:59:26 +0000212
213 // Default case where all TestApis are treated like non-TestApi.
214 runtime_->SetTestApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
215 ASSERT_EQ(
216 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::Whitelist()), false);
217 ASSERT_EQ(
218 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::Greylist()), false);
219 ASSERT_EQ(
Artur Satayevb708fc12020-05-20 17:48:19 +0100220 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::GreylistMaxR()), true);
221 ASSERT_EQ(
Artur Satayev267366c2019-10-31 14:59:26 +0000222 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::GreylistMaxQ()), true);
223 ASSERT_EQ(
224 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::GreylistMaxP()), true);
225 ASSERT_EQ(
226 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::GreylistMaxO()), true);
227 ASSERT_EQ(
228 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::Blacklist()), true);
229
230 // A case where we want to allow access to TestApis.
231 runtime_->SetTestApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kDisabled);
232 ASSERT_EQ(
233 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::Whitelist()), false);
234 ASSERT_EQ(
235 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::Greylist()), false);
236 ASSERT_EQ(
Artur Satayevb708fc12020-05-20 17:48:19 +0100237 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::GreylistMaxR()), false);
238 ASSERT_EQ(
Artur Satayev267366c2019-10-31 14:59:26 +0000239 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::GreylistMaxQ()), false);
240 ASSERT_EQ(
241 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::GreylistMaxP()), false);
242 ASSERT_EQ(
243 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::GreylistMaxO()), false);
244 ASSERT_EQ(
245 ShouldDenyAccess(hiddenapi::ApiList::TestApi() | hiddenapi::ApiList::Blacklist()), false);
246}
247
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000248TEST_F(HiddenApiTest, CheckMembersRead) {
249 ASSERT_NE(nullptr, class1_field1_);
250 ASSERT_NE(nullptr, class1_field12_);
251 ASSERT_NE(nullptr, class1_init_);
252 ASSERT_NE(nullptr, class1_method1_);
253 ASSERT_NE(nullptr, class1_method1_i_);
254 ASSERT_NE(nullptr, class1_method12_);
255 ASSERT_NE(nullptr, class12_field1_);
256 ASSERT_NE(nullptr, class12_method1_);
257 ASSERT_NE(nullptr, class2_field1_);
258 ASSERT_NE(nullptr, class2_method1_);
259 ASSERT_NE(nullptr, class2_method1_i_);
260 ASSERT_NE(nullptr, class3_field1_);
261 ASSERT_NE(nullptr, class3_method1_);
262 ASSERT_NE(nullptr, class3_method1_i_);
263}
264
265TEST_F(HiddenApiTest, CheckEverythingMatchesL) {
266 ScopedObjectAccess soa(self_);
267 std::string prefix("L");
Andreas Gampeaa120012018-03-28 16:23:24 -0700268 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
269 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
270 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
271 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
272 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
273 ASSERT_TRUE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
274 ASSERT_TRUE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
275 ASSERT_TRUE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
276 ASSERT_TRUE(MemberSignature(class2_field1_).DoesPrefixMatch(prefix));
277 ASSERT_TRUE(MemberSignature(class2_method1_).DoesPrefixMatch(prefix));
278 ASSERT_TRUE(MemberSignature(class2_method1_i_).DoesPrefixMatch(prefix));
279 ASSERT_TRUE(MemberSignature(class3_field1_).DoesPrefixMatch(prefix));
280 ASSERT_TRUE(MemberSignature(class3_method1_).DoesPrefixMatch(prefix));
281 ASSERT_TRUE(MemberSignature(class3_method1_i_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000282}
283
284TEST_F(HiddenApiTest, CheckPackageMatch) {
285 ScopedObjectAccess soa(self_);
286 std::string prefix("Lmypackage/packagea/");
Andreas Gampeaa120012018-03-28 16:23:24 -0700287 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
288 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
289 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
290 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
291 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
292 ASSERT_TRUE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
293 ASSERT_TRUE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
294 ASSERT_TRUE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
295 ASSERT_TRUE(MemberSignature(class2_field1_).DoesPrefixMatch(prefix));
296 ASSERT_TRUE(MemberSignature(class2_method1_).DoesPrefixMatch(prefix));
297 ASSERT_TRUE(MemberSignature(class2_method1_i_).DoesPrefixMatch(prefix));
298 ASSERT_FALSE(MemberSignature(class3_field1_).DoesPrefixMatch(prefix));
299 ASSERT_FALSE(MemberSignature(class3_method1_).DoesPrefixMatch(prefix));
300 ASSERT_FALSE(MemberSignature(class3_method1_i_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000301}
302
303TEST_F(HiddenApiTest, CheckClassMatch) {
304 ScopedObjectAccess soa(self_);
305 std::string prefix("Lmypackage/packagea/Class1");
Andreas Gampeaa120012018-03-28 16:23:24 -0700306 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
307 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
308 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
309 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
310 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
311 ASSERT_TRUE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
312 ASSERT_TRUE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
313 ASSERT_TRUE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
314 ASSERT_FALSE(MemberSignature(class2_field1_).DoesPrefixMatch(prefix));
315 ASSERT_FALSE(MemberSignature(class2_method1_).DoesPrefixMatch(prefix));
316 ASSERT_FALSE(MemberSignature(class2_method1_i_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000317}
318
319TEST_F(HiddenApiTest, CheckClassExactMatch) {
320 ScopedObjectAccess soa(self_);
321 std::string prefix("Lmypackage/packagea/Class1;");
Andreas Gampeaa120012018-03-28 16:23:24 -0700322 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
323 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
324 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
325 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
326 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
327 ASSERT_FALSE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
328 ASSERT_FALSE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
329 ASSERT_FALSE(MemberSignature(class2_field1_).DoesPrefixMatch(prefix));
330 ASSERT_FALSE(MemberSignature(class2_method1_).DoesPrefixMatch(prefix));
331 ASSERT_FALSE(MemberSignature(class2_method1_i_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000332}
333
334TEST_F(HiddenApiTest, CheckMethodMatch) {
335 ScopedObjectAccess soa(self_);
336 std::string prefix("Lmypackage/packagea/Class1;->method1");
Andreas Gampeaa120012018-03-28 16:23:24 -0700337 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
338 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
339 ASSERT_FALSE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
340 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
341 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
342 ASSERT_TRUE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
343 ASSERT_FALSE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
344 ASSERT_FALSE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000345}
346
347TEST_F(HiddenApiTest, CheckMethodExactMatch) {
348 ScopedObjectAccess soa(self_);
349 std::string prefix("Lmypackage/packagea/Class1;->method1(");
Andreas Gampeaa120012018-03-28 16:23:24 -0700350 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
351 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
352 ASSERT_FALSE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
353 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
354 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
355 ASSERT_FALSE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000356}
357
358TEST_F(HiddenApiTest, CheckMethodSignatureMatch) {
359 ScopedObjectAccess soa(self_);
360 std::string prefix("Lmypackage/packagea/Class1;->method1(I)");
Andreas Gampeaa120012018-03-28 16:23:24 -0700361 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
362 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
363 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
364 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
365 ASSERT_FALSE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000366}
367
368TEST_F(HiddenApiTest, CheckMethodSignatureAndReturnMatch) {
369 ScopedObjectAccess soa(self_);
370 std::string prefix("Lmypackage/packagea/Class1;->method1()V");
Andreas Gampeaa120012018-03-28 16:23:24 -0700371 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
372 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
373 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
374 ASSERT_FALSE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
375 ASSERT_FALSE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000376}
377
378TEST_F(HiddenApiTest, CheckFieldMatch) {
379 ScopedObjectAccess soa(self_);
380 std::string prefix("Lmypackage/packagea/Class1;->field1");
Andreas Gampeaa120012018-03-28 16:23:24 -0700381 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
382 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
383 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
384 ASSERT_FALSE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
385 ASSERT_FALSE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000386}
387
388TEST_F(HiddenApiTest, CheckFieldExactMatch) {
389 ScopedObjectAccess soa(self_);
390 std::string prefix("Lmypackage/packagea/Class1;->field1:");
Andreas Gampeaa120012018-03-28 16:23:24 -0700391 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
392 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
393 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000394}
395
396TEST_F(HiddenApiTest, CheckFieldTypeMatch) {
397 ScopedObjectAccess soa(self_);
398 std::string prefix("Lmypackage/packagea/Class1;->field1:I");
Andreas Gampeaa120012018-03-28 16:23:24 -0700399 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
400 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
401 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000402}
403
404TEST_F(HiddenApiTest, CheckConstructorMatch) {
405 ScopedObjectAccess soa(self_);
406 std::string prefix("Lmypackage/packagea/Class1;-><init>");
Andreas Gampeaa120012018-03-28 16:23:24 -0700407 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
408 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000409}
410
411TEST_F(HiddenApiTest, CheckConstructorExactMatch) {
412 ScopedObjectAccess soa(self_);
413 std::string prefix("Lmypackage/packagea/Class1;-><init>()V");
Andreas Gampeaa120012018-03-28 16:23:24 -0700414 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
415 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000416}
417
418TEST_F(HiddenApiTest, CheckMethodSignatureTrailingCharsNoMatch) {
419 ScopedObjectAccess soa(self_);
420 std::string prefix("Lmypackage/packagea/Class1;->method1()Vfoo");
Andreas Gampeaa120012018-03-28 16:23:24 -0700421 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000422}
423
424TEST_F(HiddenApiTest, CheckConstructorTrailingCharsNoMatch) {
425 ScopedObjectAccess soa(self_);
426 std::string prefix("Lmypackage/packagea/Class1;-><init>()Vfoo");
Andreas Gampeaa120012018-03-28 16:23:24 -0700427 ASSERT_FALSE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000428}
429
430TEST_F(HiddenApiTest, CheckFieldTrailingCharsNoMatch) {
431 ScopedObjectAccess soa(self_);
432 std::string prefix("Lmypackage/packagea/Class1;->field1:Ifoo");
Andreas Gampeaa120012018-03-28 16:23:24 -0700433 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000434}
435
David Brazdil1f9d3c32018-05-02 16:53:06 +0100436TEST_F(HiddenApiTest, CheckMemberSignatureForProxyClass) {
437 ScopedObjectAccess soa(self_);
438 StackHandleScope<4> hs(soa.Self());
439 Handle<mirror::ClassLoader> class_loader(
440 hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader_)));
441
442 // Find interface we will create a proxy for.
443 Handle<mirror::Class> h_iface(hs.NewHandle(
444 class_linker_->FindClass(soa.Self(), "Lmypackage/packagea/Interface;", class_loader)));
445 ASSERT_TRUE(h_iface != nullptr);
446
447 // Create the proxy class.
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100448 std::vector<Handle<mirror::Class>> interfaces;
449 interfaces.push_back(h_iface);
David Brazdil1f9d3c32018-05-02 16:53:06 +0100450 Handle<mirror::Class> proxyClass = hs.NewHandle(proxy_test::GenerateProxyClass(
451 soa, jclass_loader_, runtime_->GetClassLinker(), "$Proxy1234", interfaces));
452 ASSERT_TRUE(proxyClass != nullptr);
453 ASSERT_TRUE(proxyClass->IsProxyClass());
454 ASSERT_TRUE(proxyClass->IsInitialized());
455
456 // Find the "method" virtual method.
457 ArtMethod* method = nullptr;
458 for (auto& m : proxyClass->GetDeclaredVirtualMethods(kRuntimePointerSize)) {
459 if (strcmp("method", m.GetInterfaceMethodIfProxy(kRuntimePointerSize)->GetName()) == 0) {
460 method = &m;
461 break;
462 }
463 }
464 ASSERT_TRUE(method != nullptr);
465
466 // Find the "interfaces" static field. This is generated for all proxies.
467 ArtField* field = nullptr;
468 for (size_t i = 0; i < proxyClass->NumStaticFields(); ++i) {
469 ArtField* f = proxyClass->GetStaticField(i);
470 if (strcmp("interfaces", f->GetName()) == 0) {
471 field = f;
472 break;
473 }
474 }
475 ASSERT_TRUE(field != nullptr);
476
477 // Test the signature. We expect the signature from the interface class.
478 std::ostringstream ss_method;
David Brazdil6a1dab42019-02-28 18:45:15 +0000479 MemberSignature(method->GetInterfaceMethodIfProxy(kRuntimePointerSize)).Dump(ss_method);
David Brazdil1f9d3c32018-05-02 16:53:06 +0100480 ASSERT_EQ("Lmypackage/packagea/Interface;->method()V", ss_method.str());
481
482 // Test the signature. We expect the signature of the proxy class.
483 std::ostringstream ss_field;
484 MemberSignature(field).Dump(ss_field);
485 ASSERT_EQ("L$Proxy1234;->interfaces:[Ljava/lang/Class;", ss_field.str());
486}
487
David Brazdila5c3a802019-03-08 14:59:41 +0000488static bool Copy(const std::string& src, const std::string& dst, /*out*/ std::string* error_msg) {
489 std::ifstream src_stream(src, std::ios::binary);
490 std::ofstream dst_stream(dst, std::ios::binary);
491 dst_stream << src_stream.rdbuf();
492 src_stream.close();
493 dst_stream.close();
494 if (src_stream.good() && dst_stream.good()) {
495 return true;
496 } else {
497 *error_msg = "Copy " + src + " => " + dst + " (src_good="
498 + (src_stream.good() ? "true" : "false") + ", dst_good="
499 + (dst_stream.good() ? "true" : "false") + ")";
500 return false;
501 }
502}
503
504static bool LoadDexFiles(const std::string& path,
505 ScopedObjectAccess& soa,
506 /* out */ std::vector<std::unique_ptr<const DexFile>>* dex_files,
507 /* out */ ObjPtr<mirror::ClassLoader>* class_loader,
508 /* out */ std::string* error_msg) REQUIRES_SHARED(Locks::mutator_lock_) {
509 if (!ArtDexFileLoader().Open(path.c_str(),
510 path,
511 /* verify= */ true,
512 /* verify_checksum= */ true,
513 error_msg,
514 dex_files)) {
515 return false;
516 }
517
518 ClassLinker* const linker = Runtime::Current()->GetClassLinker();
519
520 StackHandleScope<2> hs(soa.Self());
521 Handle<mirror::Class> h_class = hs.NewHandle(soa.Decode<mirror::Class>(
522 WellKnownClasses::dalvik_system_PathClassLoader));
523 Handle<mirror::ClassLoader> h_loader = hs.NewHandle(linker->CreateWellKnownClassLoader(
524 soa.Self(),
525 MakeNonOwningPointerVector(*dex_files),
526 h_class,
527 /* parent_loader= */ ScopedNullHandle<mirror::ClassLoader>(),
528 /* shared_libraries= */ ScopedNullHandle<mirror::ObjectArray<mirror::ClassLoader>>()));
529 for (const auto& dex_file : *dex_files) {
530 linker->RegisterDexFile(*dex_file.get(), h_loader.Get());
531 }
532
533 *class_loader = h_loader.Get();
534 return true;
535}
536
537static bool CheckAllDexFilesInDomain(ObjPtr<mirror::ClassLoader> loader,
538 const std::vector<std::unique_ptr<const DexFile>>& dex_files,
David Brazdilbfaba282019-03-15 11:35:51 +0000539 hiddenapi::Domain expected_domain,
540 /* out */ std::string* error_msg)
David Brazdila5c3a802019-03-08 14:59:41 +0000541 REQUIRES_SHARED(Locks::mutator_lock_) {
542 for (const auto& dex_file : dex_files) {
543 hiddenapi::AccessContext context(loader, dex_file.get());
544 if (context.GetDomain() != expected_domain) {
David Brazdilbfaba282019-03-15 11:35:51 +0000545 std::stringstream ss;
546 ss << dex_file->GetLocation() << ": access context domain does not match "
David Brazdila5c3a802019-03-08 14:59:41 +0000547 << "(expected=" << static_cast<uint32_t>(expected_domain)
548 << ", actual=" << static_cast<uint32_t>(context.GetDomain()) << ")";
David Brazdilbfaba282019-03-15 11:35:51 +0000549 *error_msg = ss.str();
David Brazdila5c3a802019-03-08 14:59:41 +0000550 return false;
551 }
552 if (dex_file->GetHiddenapiDomain() != expected_domain) {
David Brazdilbfaba282019-03-15 11:35:51 +0000553 std::stringstream ss;
554 ss << dex_file->GetLocation() << ": dex file domain does not match "
David Brazdila5c3a802019-03-08 14:59:41 +0000555 << "(expected=" << static_cast<uint32_t>(expected_domain)
556 << ", actual=" << static_cast<uint32_t>(dex_file->GetHiddenapiDomain()) << ")";
David Brazdilbfaba282019-03-15 11:35:51 +0000557 *error_msg = ss.str();
David Brazdila5c3a802019-03-08 14:59:41 +0000558 return false;
559 }
560 }
561
562 return true;
563}
564
565TEST_F(HiddenApiTest, DexDomain_DataDir) {
566 // Load file from a non-system directory and check that it is not flagged as framework.
567 std::string data_location_path = android_data_ + "/foo.jar";
568 ASSERT_FALSE(LocationIsOnSystemFramework(data_location_path.c_str()));
569
570 ScopedObjectAccess soa(Thread::Current());
571 std::vector<std::unique_ptr<const DexFile>> dex_files;
572 std::string error_msg;
573 ObjPtr<mirror::ClassLoader> class_loader;
574
575 ASSERT_TRUE(Copy(GetTestDexFileName("Main"), data_location_path, &error_msg)) << error_msg;
576 ASSERT_TRUE(LoadDexFiles(data_location_path, soa, &dex_files, &class_loader, &error_msg))
577 << error_msg;
578 ASSERT_GE(dex_files.size(), 1u);
David Brazdilbfaba282019-03-15 11:35:51 +0000579 ASSERT_TRUE(CheckAllDexFilesInDomain(class_loader,
580 dex_files,
581 hiddenapi::Domain::kApplication,
582 &error_msg)) << error_msg;
David Brazdila5c3a802019-03-08 14:59:41 +0000583
584 dex_files.clear();
585 ASSERT_EQ(0, remove(data_location_path.c_str()));
586}
587
588TEST_F(HiddenApiTest, DexDomain_SystemDir) {
589 // Load file from a system, non-framework directory and check that it is not flagged as framework.
590 std::string system_location_path = GetAndroidRoot() + "/foo.jar";
591 ASSERT_FALSE(LocationIsOnSystemFramework(system_location_path.c_str()));
592
593 ScopedObjectAccess soa(Thread::Current());
594 std::vector<std::unique_ptr<const DexFile>> dex_files;
595 std::string error_msg;
596 ObjPtr<mirror::ClassLoader> class_loader;
597
598 ASSERT_TRUE(Copy(GetTestDexFileName("Main"), system_location_path, &error_msg)) << error_msg;
599 ASSERT_TRUE(LoadDexFiles(system_location_path, soa, &dex_files, &class_loader, &error_msg))
600 << error_msg;
601 ASSERT_GE(dex_files.size(), 1u);
David Brazdilbfaba282019-03-15 11:35:51 +0000602 ASSERT_TRUE(CheckAllDexFilesInDomain(class_loader,
603 dex_files,
604 hiddenapi::Domain::kApplication,
605 &error_msg)) << error_msg;
David Brazdila5c3a802019-03-08 14:59:41 +0000606
607 dex_files.clear();
608 ASSERT_EQ(0, remove(system_location_path.c_str()));
609}
610
Chris Gross5477b8e2020-04-24 09:36:45 -0700611TEST_F(HiddenApiTest, DexDomain_SystemExtDir) {
612 // Load file from a system_ext, non-framework directory and check that it is not flagged as framework.
613 std::string system_ext_location_path = android_system_ext_ + "/foo.jar";
614 ASSERT_FALSE(LocationIsOnSystemExtFramework(system_ext_location_path.c_str()));
615
616 ScopedObjectAccess soa(Thread::Current());
617 std::vector<std::unique_ptr<const DexFile>> dex_files;
618 std::string error_msg;
619 ObjPtr<mirror::ClassLoader> class_loader;
620
621 ASSERT_TRUE(Copy(GetTestDexFileName("Main"), system_ext_location_path, &error_msg)) << error_msg;
622 ASSERT_TRUE(LoadDexFiles(system_ext_location_path, soa, &dex_files, &class_loader, &error_msg))
623 << error_msg;
624 ASSERT_GE(dex_files.size(), 1u);
625 ASSERT_TRUE(CheckAllDexFilesInDomain(class_loader,
626 dex_files,
627 hiddenapi::Domain::kApplication,
628 &error_msg)) << error_msg;
629
630 dex_files.clear();
631 ASSERT_EQ(0, remove(system_ext_location_path.c_str()));
632}
633
David Brazdila5c3a802019-03-08 14:59:41 +0000634TEST_F(HiddenApiTest, DexDomain_SystemFrameworkDir) {
635 // Load file from a system/framework directory and check that it is flagged as a framework dex.
David Srbecky7400a542020-07-09 13:40:57 +0100636 std::filesystem::create_directory(GetAndroidRoot() + "/framework");
David Brazdila5c3a802019-03-08 14:59:41 +0000637 std::string system_framework_location_path = GetAndroidRoot() + "/framework/foo.jar";
638 ASSERT_TRUE(LocationIsOnSystemFramework(system_framework_location_path.c_str()));
639
640 ScopedObjectAccess soa(Thread::Current());
641 std::vector<std::unique_ptr<const DexFile>> dex_files;
642 std::string error_msg;
643 ObjPtr<mirror::ClassLoader> class_loader;
644
645 ASSERT_TRUE(Copy(GetTestDexFileName("Main"), system_framework_location_path, &error_msg))
646 << error_msg;
647 ASSERT_TRUE(LoadDexFiles(system_framework_location_path,
648 soa,
649 &dex_files,
650 &class_loader,
651 &error_msg)) << error_msg;
652 ASSERT_GE(dex_files.size(), 1u);
David Brazdilbfaba282019-03-15 11:35:51 +0000653 ASSERT_TRUE(CheckAllDexFilesInDomain(class_loader,
654 dex_files,
655 hiddenapi::Domain::kPlatform,
656 &error_msg)) << error_msg;
David Brazdila5c3a802019-03-08 14:59:41 +0000657
658 dex_files.clear();
659 ASSERT_EQ(0, remove(system_framework_location_path.c_str()));
660}
661
Chris Gross5477b8e2020-04-24 09:36:45 -0700662TEST_F(HiddenApiTest, DexDomain_SystemExtFrameworkDir) {
663 // Load file from a system_ext/framework directory and check that it is flagged as a framework dex.
664 std::string system_ext_framework_location_path = android_system_ext_ + "/framework/foo.jar";
665 ASSERT_TRUE(LocationIsOnSystemExtFramework(system_ext_framework_location_path.c_str()));
666
667 ScopedObjectAccess soa(Thread::Current());
668 std::vector<std::unique_ptr<const DexFile>> dex_files;
669 std::string error_msg;
670 ObjPtr<mirror::ClassLoader> class_loader;
671
672 ASSERT_TRUE(Copy(GetTestDexFileName("Main"), system_ext_framework_location_path, &error_msg))
673 << error_msg;
674 ASSERT_TRUE(LoadDexFiles(system_ext_framework_location_path,
675 soa,
676 &dex_files,
677 &class_loader,
678 &error_msg)) << error_msg;
679 ASSERT_GE(dex_files.size(), 1u);
680 ASSERT_TRUE(CheckAllDexFilesInDomain(class_loader,
681 dex_files,
682 hiddenapi::Domain::kPlatform,
683 &error_msg)) << error_msg;
684
685 dex_files.clear();
686 ASSERT_EQ(0, remove(system_ext_framework_location_path.c_str()));
687}
688
David Brazdila5c3a802019-03-08 14:59:41 +0000689TEST_F(HiddenApiTest, DexDomain_DataDir_MultiDex) {
690 // Load multidex file from a non-system directory and check that it is not flagged as framework.
691 std::string data_multi_location_path = android_data_ + "/multifoo.jar";
692 ASSERT_FALSE(LocationIsOnSystemFramework(data_multi_location_path.c_str()));
693
694 ScopedObjectAccess soa(Thread::Current());
695 std::vector<std::unique_ptr<const DexFile>> dex_files;
696 std::string error_msg;
697 ObjPtr<mirror::ClassLoader> class_loader;
698
699 ASSERT_TRUE(Copy(GetTestDexFileName("MultiDex"), data_multi_location_path, &error_msg))
700 << error_msg;
701 ASSERT_TRUE(LoadDexFiles(data_multi_location_path, soa, &dex_files, &class_loader, &error_msg))
702 << error_msg;
703 ASSERT_GE(dex_files.size(), 1u);
David Brazdilbfaba282019-03-15 11:35:51 +0000704 ASSERT_TRUE(CheckAllDexFilesInDomain(class_loader,
705 dex_files,
706 hiddenapi::Domain::kApplication,
707 &error_msg)) << error_msg;
David Brazdila5c3a802019-03-08 14:59:41 +0000708
709 dex_files.clear();
710 ASSERT_EQ(0, remove(data_multi_location_path.c_str()));
711}
712
713TEST_F(HiddenApiTest, DexDomain_SystemDir_MultiDex) {
714 // Load multidex file from a system, non-framework directory and check that it is not flagged
715 // as framework.
716 std::string system_multi_location_path = GetAndroidRoot() + "/multifoo.jar";
717 ASSERT_FALSE(LocationIsOnSystemFramework(system_multi_location_path.c_str()));
718
719 ScopedObjectAccess soa(Thread::Current());
720 std::vector<std::unique_ptr<const DexFile>> dex_files;
721 std::string error_msg;
722 ObjPtr<mirror::ClassLoader> class_loader;
723
724 ASSERT_TRUE(Copy(GetTestDexFileName("MultiDex"), system_multi_location_path, &error_msg))
725 << error_msg;
726 ASSERT_TRUE(LoadDexFiles(system_multi_location_path, soa, &dex_files, &class_loader, &error_msg))
727 << error_msg;
728 ASSERT_GT(dex_files.size(), 1u);
David Brazdilbfaba282019-03-15 11:35:51 +0000729 ASSERT_TRUE(CheckAllDexFilesInDomain(class_loader,
730 dex_files,
731 hiddenapi::Domain::kApplication,
732 &error_msg)) << error_msg;
David Brazdila5c3a802019-03-08 14:59:41 +0000733
734 dex_files.clear();
735 ASSERT_EQ(0, remove(system_multi_location_path.c_str()));
736}
737
Chris Gross5477b8e2020-04-24 09:36:45 -0700738TEST_F(HiddenApiTest, DexDomain_SystemExtDir_MultiDex) {
739 // Load multidex file from a system_ext, non-framework directory and check that it is not flagged
740 // as framework.
741 std::string system_ext_multi_location_path = android_system_ext_ + "/multifoo.jar";
742 ASSERT_FALSE(LocationIsOnSystemExtFramework(system_ext_multi_location_path.c_str()));
743
744 ScopedObjectAccess soa(Thread::Current());
745 std::vector<std::unique_ptr<const DexFile>> dex_files;
746 std::string error_msg;
747 ObjPtr<mirror::ClassLoader> class_loader;
748
749 ASSERT_TRUE(Copy(GetTestDexFileName("MultiDex"), system_ext_multi_location_path, &error_msg))
750 << error_msg;
751 ASSERT_TRUE(LoadDexFiles(system_ext_multi_location_path, soa, &dex_files, &class_loader, &error_msg))
752 << error_msg;
753 ASSERT_GT(dex_files.size(), 1u);
754 ASSERT_TRUE(CheckAllDexFilesInDomain(class_loader,
755 dex_files,
756 hiddenapi::Domain::kApplication,
757 &error_msg)) << error_msg;
758
759 dex_files.clear();
760 ASSERT_EQ(0, remove(system_ext_multi_location_path.c_str()));
761}
762
David Brazdila5c3a802019-03-08 14:59:41 +0000763TEST_F(HiddenApiTest, DexDomain_SystemFrameworkDir_MultiDex) {
764 // Load multidex file from a system/framework directory and check that it is flagged as a
765 // framework dex.
766 std::string system_framework_multi_location_path = GetAndroidRoot() + "/framework/multifoo.jar";
767 ASSERT_TRUE(LocationIsOnSystemFramework(system_framework_multi_location_path.c_str()));
768
769 ScopedObjectAccess soa(Thread::Current());
770 std::vector<std::unique_ptr<const DexFile>> dex_files;
771 std::string error_msg;
772 ObjPtr<mirror::ClassLoader> class_loader;
773
774 ASSERT_TRUE(Copy(GetTestDexFileName("MultiDex"),
775 system_framework_multi_location_path,
776 &error_msg)) << error_msg;
777 ASSERT_TRUE(LoadDexFiles(system_framework_multi_location_path,
778 soa,
779 &dex_files,
780 &class_loader,
781 &error_msg)) << error_msg;
782 ASSERT_GT(dex_files.size(), 1u);
David Brazdilbfaba282019-03-15 11:35:51 +0000783 ASSERT_TRUE(CheckAllDexFilesInDomain(class_loader,
784 dex_files,
785 hiddenapi::Domain::kPlatform,
786 &error_msg)) << error_msg;
David Brazdila5c3a802019-03-08 14:59:41 +0000787
788 dex_files.clear();
789 ASSERT_EQ(0, remove(system_framework_multi_location_path.c_str()));
790}
791
Chris Gross5477b8e2020-04-24 09:36:45 -0700792TEST_F(HiddenApiTest, DexDomain_SystemExtFrameworkDir_MultiDex) {
793 // Load multidex file from a system_ext/framework directory and check that it is flagged as a
794 // framework dex.
795 std::string system_ext_framework_multi_location_path = android_system_ext_ + "/framework/multifoo.jar";
796 ASSERT_TRUE(LocationIsOnSystemExtFramework(system_ext_framework_multi_location_path.c_str()));
797
798 ScopedObjectAccess soa(Thread::Current());
799 std::vector<std::unique_ptr<const DexFile>> dex_files;
800 std::string error_msg;
801 ObjPtr<mirror::ClassLoader> class_loader;
802
803 ASSERT_TRUE(Copy(GetTestDexFileName("MultiDex"),
804 system_ext_framework_multi_location_path,
805 &error_msg)) << error_msg;
806 ASSERT_TRUE(LoadDexFiles(system_ext_framework_multi_location_path,
807 soa,
808 &dex_files,
809 &class_loader,
810 &error_msg)) << error_msg;
811 ASSERT_GT(dex_files.size(), 1u);
812 ASSERT_TRUE(CheckAllDexFilesInDomain(class_loader,
813 dex_files,
814 hiddenapi::Domain::kPlatform,
815 &error_msg)) << error_msg;
816
817 dex_files.clear();
818 ASSERT_EQ(0, remove(system_ext_framework_multi_location_path.c_str()));
819}
820
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000821} // namespace art