blob: 1985c6bb19e52adf28d9a6d2688559b73b901684 [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
19#include "common_runtime_test.h"
20#include "jni_internal.h"
21
22namespace art {
23
Andreas Gampeaa120012018-03-28 16:23:24 -070024using hiddenapi::detail::MemberSignature;
Mathew Inwooda8503d92018-04-05 16:10:25 +010025using hiddenapi::GetActionFromAccessFlags;
Andreas Gampeaa120012018-03-28 16:23:24 -070026
Mathew Inwood7d74ef52018-03-16 14:18:33 +000027class HiddenApiTest : public CommonRuntimeTest {
28 protected:
29 void SetUp() OVERRIDE {
30 // Do the normal setup.
31 CommonRuntimeTest::SetUp();
32 self_ = Thread::Current();
33 self_->TransitionFromSuspendedToRunnable();
34 LoadDex("HiddenApiSignatures");
35 bool started = runtime_->Start();
36 CHECK(started);
37
38 class1_field1_ = getArtField("mypackage/packagea/Class1", "field1", "I");
39 class1_field12_ = getArtField("mypackage/packagea/Class1", "field12", "I");
40 class1_init_ = getArtMethod("mypackage/packagea/Class1", "<init>", "()V");
41 class1_method1_ = getArtMethod("mypackage/packagea/Class1", "method1", "()V");
42 class1_method1_i_ = getArtMethod("mypackage/packagea/Class1", "method1", "(I)V");
43 class1_method12_ = getArtMethod("mypackage/packagea/Class1", "method12", "()V");
44 class12_field1_ = getArtField("mypackage/packagea/Class12", "field1", "I");
45 class12_method1_ = getArtMethod("mypackage/packagea/Class12", "method1", "()V");
46 class2_field1_ = getArtField("mypackage/packagea/Class2", "field1", "I");
47 class2_method1_ = getArtMethod("mypackage/packagea/Class2", "method1", "()V");
48 class2_method1_i_ = getArtMethod("mypackage/packagea/Class2", "method1", "(I)V");
49 class3_field1_ = getArtField("mypackage/packageb/Class3", "field1", "I");
50 class3_method1_ = getArtMethod("mypackage/packageb/Class3", "method1", "()V");
51 class3_method1_i_ = getArtMethod("mypackage/packageb/Class3", "method1", "(I)V");
52 }
53
54 ArtMethod* getArtMethod(const char* class_name, const char* name, const char* signature) {
55 JNIEnv* env = Thread::Current()->GetJniEnv();
56 jclass klass = env->FindClass(class_name);
57 jmethodID method_id = env->GetMethodID(klass, name, signature);
58 ArtMethod* art_method = jni::DecodeArtMethod(method_id);
59 return art_method;
60 }
61
62 ArtField* getArtField(const char* class_name, const char* name, const char* signature) {
63 JNIEnv* env = Thread::Current()->GetJniEnv();
64 jclass klass = env->FindClass(class_name);
65 jfieldID field_id = env->GetFieldID(klass, name, signature);
66 ArtField* art_field = jni::DecodeArtField(field_id);
67 return art_field;
68 }
69
70 protected:
71 Thread* self_;
72 ArtField* class1_field1_;
73 ArtField* class1_field12_;
74 ArtMethod* class1_init_;
75 ArtMethod* class1_method1_;
76 ArtMethod* class1_method1_i_;
77 ArtMethod* class1_method12_;
78 ArtField* class12_field1_;
79 ArtMethod* class12_method1_;
80 ArtField* class2_field1_;
81 ArtMethod* class2_method1_;
82 ArtMethod* class2_method1_i_;
83 ArtField* class3_field1_;
84 ArtMethod* class3_method1_;
85 ArtMethod* class3_method1_i_;
86};
87
Mathew Inwooda8503d92018-04-05 16:10:25 +010088TEST_F(HiddenApiTest, CheckGetActionFromRuntimeFlags) {
Mathew Inwooda8503d92018-04-05 16:10:25 +010089 runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kNoChecks);
David Brazdil166546c2018-04-23 13:50:38 +010090 ASSERT_EQ(GetActionFromAccessFlags(HiddenApiAccessFlags::kWhitelist), hiddenapi::kAllow);
91 ASSERT_EQ(GetActionFromAccessFlags(HiddenApiAccessFlags::kLightGreylist), hiddenapi::kAllow);
92 ASSERT_EQ(GetActionFromAccessFlags(HiddenApiAccessFlags::kDarkGreylist), hiddenapi::kAllow);
93 ASSERT_EQ(GetActionFromAccessFlags(HiddenApiAccessFlags::kBlacklist), hiddenapi::kAllow);
Mathew Inwooda8503d92018-04-05 16:10:25 +010094
95 runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kJustWarn);
David Brazdil166546c2018-04-23 13:50:38 +010096 ASSERT_EQ(GetActionFromAccessFlags(HiddenApiAccessFlags::kWhitelist),
97 hiddenapi::kAllow);
98 ASSERT_EQ(GetActionFromAccessFlags(HiddenApiAccessFlags::kLightGreylist),
99 hiddenapi::kAllowButWarn);
100 ASSERT_EQ(GetActionFromAccessFlags(HiddenApiAccessFlags::kDarkGreylist),
101 hiddenapi::kAllowButWarn);
102 ASSERT_EQ(GetActionFromAccessFlags(HiddenApiAccessFlags::kBlacklist),
103 hiddenapi::kAllowButWarn);
Mathew Inwooda8503d92018-04-05 16:10:25 +0100104
105 runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kDarkGreyAndBlackList);
David Brazdil166546c2018-04-23 13:50:38 +0100106 ASSERT_EQ(GetActionFromAccessFlags(HiddenApiAccessFlags::kWhitelist),
107 hiddenapi::kAllow);
108 ASSERT_EQ(GetActionFromAccessFlags(HiddenApiAccessFlags::kLightGreylist),
109 hiddenapi::kAllowButWarn);
110 ASSERT_EQ(GetActionFromAccessFlags(HiddenApiAccessFlags::kDarkGreylist),
111 hiddenapi::kDeny);
112 ASSERT_EQ(GetActionFromAccessFlags(HiddenApiAccessFlags::kBlacklist),
113 hiddenapi::kDeny);
Mathew Inwooda8503d92018-04-05 16:10:25 +0100114
115 runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kBlacklistOnly);
David Brazdil166546c2018-04-23 13:50:38 +0100116 ASSERT_EQ(GetActionFromAccessFlags(HiddenApiAccessFlags::kWhitelist),
117 hiddenapi::kAllow);
118 ASSERT_EQ(GetActionFromAccessFlags(HiddenApiAccessFlags::kLightGreylist),
119 hiddenapi::kAllowButWarn);
120 ASSERT_EQ(GetActionFromAccessFlags(HiddenApiAccessFlags::kDarkGreylist),
121 hiddenapi::kAllowButWarnAndToast);
122 ASSERT_EQ(GetActionFromAccessFlags(HiddenApiAccessFlags::kBlacklist),
123 hiddenapi::kDeny);
Mathew Inwooda8503d92018-04-05 16:10:25 +0100124}
125
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000126TEST_F(HiddenApiTest, CheckMembersRead) {
127 ASSERT_NE(nullptr, class1_field1_);
128 ASSERT_NE(nullptr, class1_field12_);
129 ASSERT_NE(nullptr, class1_init_);
130 ASSERT_NE(nullptr, class1_method1_);
131 ASSERT_NE(nullptr, class1_method1_i_);
132 ASSERT_NE(nullptr, class1_method12_);
133 ASSERT_NE(nullptr, class12_field1_);
134 ASSERT_NE(nullptr, class12_method1_);
135 ASSERT_NE(nullptr, class2_field1_);
136 ASSERT_NE(nullptr, class2_method1_);
137 ASSERT_NE(nullptr, class2_method1_i_);
138 ASSERT_NE(nullptr, class3_field1_);
139 ASSERT_NE(nullptr, class3_method1_);
140 ASSERT_NE(nullptr, class3_method1_i_);
141}
142
143TEST_F(HiddenApiTest, CheckEverythingMatchesL) {
144 ScopedObjectAccess soa(self_);
145 std::string prefix("L");
Andreas Gampeaa120012018-03-28 16:23:24 -0700146 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
147 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
148 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
149 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
150 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
151 ASSERT_TRUE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
152 ASSERT_TRUE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
153 ASSERT_TRUE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
154 ASSERT_TRUE(MemberSignature(class2_field1_).DoesPrefixMatch(prefix));
155 ASSERT_TRUE(MemberSignature(class2_method1_).DoesPrefixMatch(prefix));
156 ASSERT_TRUE(MemberSignature(class2_method1_i_).DoesPrefixMatch(prefix));
157 ASSERT_TRUE(MemberSignature(class3_field1_).DoesPrefixMatch(prefix));
158 ASSERT_TRUE(MemberSignature(class3_method1_).DoesPrefixMatch(prefix));
159 ASSERT_TRUE(MemberSignature(class3_method1_i_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000160}
161
162TEST_F(HiddenApiTest, CheckPackageMatch) {
163 ScopedObjectAccess soa(self_);
164 std::string prefix("Lmypackage/packagea/");
Andreas Gampeaa120012018-03-28 16:23:24 -0700165 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
166 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
167 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
168 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
169 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
170 ASSERT_TRUE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
171 ASSERT_TRUE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
172 ASSERT_TRUE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
173 ASSERT_TRUE(MemberSignature(class2_field1_).DoesPrefixMatch(prefix));
174 ASSERT_TRUE(MemberSignature(class2_method1_).DoesPrefixMatch(prefix));
175 ASSERT_TRUE(MemberSignature(class2_method1_i_).DoesPrefixMatch(prefix));
176 ASSERT_FALSE(MemberSignature(class3_field1_).DoesPrefixMatch(prefix));
177 ASSERT_FALSE(MemberSignature(class3_method1_).DoesPrefixMatch(prefix));
178 ASSERT_FALSE(MemberSignature(class3_method1_i_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000179}
180
181TEST_F(HiddenApiTest, CheckClassMatch) {
182 ScopedObjectAccess soa(self_);
183 std::string prefix("Lmypackage/packagea/Class1");
Andreas Gampeaa120012018-03-28 16:23:24 -0700184 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
185 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
186 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
187 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
188 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
189 ASSERT_TRUE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
190 ASSERT_TRUE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
191 ASSERT_TRUE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
192 ASSERT_FALSE(MemberSignature(class2_field1_).DoesPrefixMatch(prefix));
193 ASSERT_FALSE(MemberSignature(class2_method1_).DoesPrefixMatch(prefix));
194 ASSERT_FALSE(MemberSignature(class2_method1_i_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000195}
196
197TEST_F(HiddenApiTest, CheckClassExactMatch) {
198 ScopedObjectAccess soa(self_);
199 std::string prefix("Lmypackage/packagea/Class1;");
Andreas Gampeaa120012018-03-28 16:23:24 -0700200 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
201 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
202 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
203 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
204 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
205 ASSERT_FALSE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
206 ASSERT_FALSE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
207 ASSERT_FALSE(MemberSignature(class2_field1_).DoesPrefixMatch(prefix));
208 ASSERT_FALSE(MemberSignature(class2_method1_).DoesPrefixMatch(prefix));
209 ASSERT_FALSE(MemberSignature(class2_method1_i_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000210}
211
212TEST_F(HiddenApiTest, CheckMethodMatch) {
213 ScopedObjectAccess soa(self_);
214 std::string prefix("Lmypackage/packagea/Class1;->method1");
Andreas Gampeaa120012018-03-28 16:23:24 -0700215 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
216 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
217 ASSERT_FALSE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
218 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
219 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
220 ASSERT_TRUE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
221 ASSERT_FALSE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
222 ASSERT_FALSE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000223}
224
225TEST_F(HiddenApiTest, CheckMethodExactMatch) {
226 ScopedObjectAccess soa(self_);
227 std::string prefix("Lmypackage/packagea/Class1;->method1(");
Andreas Gampeaa120012018-03-28 16:23:24 -0700228 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
229 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
230 ASSERT_FALSE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
231 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
232 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
233 ASSERT_FALSE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000234}
235
236TEST_F(HiddenApiTest, CheckMethodSignatureMatch) {
237 ScopedObjectAccess soa(self_);
238 std::string prefix("Lmypackage/packagea/Class1;->method1(I)");
Andreas Gampeaa120012018-03-28 16:23:24 -0700239 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
240 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
241 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
242 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
243 ASSERT_FALSE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000244}
245
246TEST_F(HiddenApiTest, CheckMethodSignatureAndReturnMatch) {
247 ScopedObjectAccess soa(self_);
248 std::string prefix("Lmypackage/packagea/Class1;->method1()V");
Andreas Gampeaa120012018-03-28 16:23:24 -0700249 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
250 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
251 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
252 ASSERT_FALSE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
253 ASSERT_FALSE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000254}
255
256TEST_F(HiddenApiTest, CheckFieldMatch) {
257 ScopedObjectAccess soa(self_);
258 std::string prefix("Lmypackage/packagea/Class1;->field1");
Andreas Gampeaa120012018-03-28 16:23:24 -0700259 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
260 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
261 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
262 ASSERT_FALSE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
263 ASSERT_FALSE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000264}
265
266TEST_F(HiddenApiTest, CheckFieldExactMatch) {
267 ScopedObjectAccess soa(self_);
268 std::string prefix("Lmypackage/packagea/Class1;->field1:");
Andreas Gampeaa120012018-03-28 16:23:24 -0700269 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
270 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
271 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000272}
273
274TEST_F(HiddenApiTest, CheckFieldTypeMatch) {
275 ScopedObjectAccess soa(self_);
276 std::string prefix("Lmypackage/packagea/Class1;->field1:I");
Andreas Gampeaa120012018-03-28 16:23:24 -0700277 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
278 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
279 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000280}
281
282TEST_F(HiddenApiTest, CheckConstructorMatch) {
283 ScopedObjectAccess soa(self_);
284 std::string prefix("Lmypackage/packagea/Class1;-><init>");
Andreas Gampeaa120012018-03-28 16:23:24 -0700285 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
286 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000287}
288
289TEST_F(HiddenApiTest, CheckConstructorExactMatch) {
290 ScopedObjectAccess soa(self_);
291 std::string prefix("Lmypackage/packagea/Class1;-><init>()V");
Andreas Gampeaa120012018-03-28 16:23:24 -0700292 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
293 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000294}
295
296TEST_F(HiddenApiTest, CheckMethodSignatureTrailingCharsNoMatch) {
297 ScopedObjectAccess soa(self_);
298 std::string prefix("Lmypackage/packagea/Class1;->method1()Vfoo");
Andreas Gampeaa120012018-03-28 16:23:24 -0700299 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000300}
301
302TEST_F(HiddenApiTest, CheckConstructorTrailingCharsNoMatch) {
303 ScopedObjectAccess soa(self_);
304 std::string prefix("Lmypackage/packagea/Class1;-><init>()Vfoo");
Andreas Gampeaa120012018-03-28 16:23:24 -0700305 ASSERT_FALSE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000306}
307
308TEST_F(HiddenApiTest, CheckFieldTrailingCharsNoMatch) {
309 ScopedObjectAccess soa(self_);
310 std::string prefix("Lmypackage/packagea/Class1;->field1:Ifoo");
Andreas Gampeaa120012018-03-28 16:23:24 -0700311 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000312}
313
314} // namespace art