blob: 5a31dd4972acb5c4d5d6fefbbe44beeab41ab1bd [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;
25
Mathew Inwood7d74ef52018-03-16 14:18:33 +000026class HiddenApiTest : public CommonRuntimeTest {
27 protected:
28 void SetUp() OVERRIDE {
29 // Do the normal setup.
30 CommonRuntimeTest::SetUp();
31 self_ = Thread::Current();
32 self_->TransitionFromSuspendedToRunnable();
33 LoadDex("HiddenApiSignatures");
34 bool started = runtime_->Start();
35 CHECK(started);
36
37 class1_field1_ = getArtField("mypackage/packagea/Class1", "field1", "I");
38 class1_field12_ = getArtField("mypackage/packagea/Class1", "field12", "I");
39 class1_init_ = getArtMethod("mypackage/packagea/Class1", "<init>", "()V");
40 class1_method1_ = getArtMethod("mypackage/packagea/Class1", "method1", "()V");
41 class1_method1_i_ = getArtMethod("mypackage/packagea/Class1", "method1", "(I)V");
42 class1_method12_ = getArtMethod("mypackage/packagea/Class1", "method12", "()V");
43 class12_field1_ = getArtField("mypackage/packagea/Class12", "field1", "I");
44 class12_method1_ = getArtMethod("mypackage/packagea/Class12", "method1", "()V");
45 class2_field1_ = getArtField("mypackage/packagea/Class2", "field1", "I");
46 class2_method1_ = getArtMethod("mypackage/packagea/Class2", "method1", "()V");
47 class2_method1_i_ = getArtMethod("mypackage/packagea/Class2", "method1", "(I)V");
48 class3_field1_ = getArtField("mypackage/packageb/Class3", "field1", "I");
49 class3_method1_ = getArtMethod("mypackage/packageb/Class3", "method1", "()V");
50 class3_method1_i_ = getArtMethod("mypackage/packageb/Class3", "method1", "(I)V");
51 }
52
53 ArtMethod* getArtMethod(const char* class_name, const char* name, const char* signature) {
54 JNIEnv* env = Thread::Current()->GetJniEnv();
55 jclass klass = env->FindClass(class_name);
56 jmethodID method_id = env->GetMethodID(klass, name, signature);
57 ArtMethod* art_method = jni::DecodeArtMethod(method_id);
58 return art_method;
59 }
60
61 ArtField* getArtField(const char* class_name, const char* name, const char* signature) {
62 JNIEnv* env = Thread::Current()->GetJniEnv();
63 jclass klass = env->FindClass(class_name);
64 jfieldID field_id = env->GetFieldID(klass, name, signature);
65 ArtField* art_field = jni::DecodeArtField(field_id);
66 return art_field;
67 }
68
69 protected:
70 Thread* self_;
71 ArtField* class1_field1_;
72 ArtField* class1_field12_;
73 ArtMethod* class1_init_;
74 ArtMethod* class1_method1_;
75 ArtMethod* class1_method1_i_;
76 ArtMethod* class1_method12_;
77 ArtField* class12_field1_;
78 ArtMethod* class12_method1_;
79 ArtField* class2_field1_;
80 ArtMethod* class2_method1_;
81 ArtMethod* class2_method1_i_;
82 ArtField* class3_field1_;
83 ArtMethod* class3_method1_;
84 ArtMethod* class3_method1_i_;
85};
86
87TEST_F(HiddenApiTest, CheckMembersRead) {
88 ASSERT_NE(nullptr, class1_field1_);
89 ASSERT_NE(nullptr, class1_field12_);
90 ASSERT_NE(nullptr, class1_init_);
91 ASSERT_NE(nullptr, class1_method1_);
92 ASSERT_NE(nullptr, class1_method1_i_);
93 ASSERT_NE(nullptr, class1_method12_);
94 ASSERT_NE(nullptr, class12_field1_);
95 ASSERT_NE(nullptr, class12_method1_);
96 ASSERT_NE(nullptr, class2_field1_);
97 ASSERT_NE(nullptr, class2_method1_);
98 ASSERT_NE(nullptr, class2_method1_i_);
99 ASSERT_NE(nullptr, class3_field1_);
100 ASSERT_NE(nullptr, class3_method1_);
101 ASSERT_NE(nullptr, class3_method1_i_);
102}
103
104TEST_F(HiddenApiTest, CheckEverythingMatchesL) {
105 ScopedObjectAccess soa(self_);
106 std::string prefix("L");
Andreas Gampeaa120012018-03-28 16:23:24 -0700107 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
108 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
109 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
110 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
111 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
112 ASSERT_TRUE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
113 ASSERT_TRUE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
114 ASSERT_TRUE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
115 ASSERT_TRUE(MemberSignature(class2_field1_).DoesPrefixMatch(prefix));
116 ASSERT_TRUE(MemberSignature(class2_method1_).DoesPrefixMatch(prefix));
117 ASSERT_TRUE(MemberSignature(class2_method1_i_).DoesPrefixMatch(prefix));
118 ASSERT_TRUE(MemberSignature(class3_field1_).DoesPrefixMatch(prefix));
119 ASSERT_TRUE(MemberSignature(class3_method1_).DoesPrefixMatch(prefix));
120 ASSERT_TRUE(MemberSignature(class3_method1_i_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000121}
122
123TEST_F(HiddenApiTest, CheckPackageMatch) {
124 ScopedObjectAccess soa(self_);
125 std::string prefix("Lmypackage/packagea/");
Andreas Gampeaa120012018-03-28 16:23:24 -0700126 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
127 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
128 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
129 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
130 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
131 ASSERT_TRUE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
132 ASSERT_TRUE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
133 ASSERT_TRUE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
134 ASSERT_TRUE(MemberSignature(class2_field1_).DoesPrefixMatch(prefix));
135 ASSERT_TRUE(MemberSignature(class2_method1_).DoesPrefixMatch(prefix));
136 ASSERT_TRUE(MemberSignature(class2_method1_i_).DoesPrefixMatch(prefix));
137 ASSERT_FALSE(MemberSignature(class3_field1_).DoesPrefixMatch(prefix));
138 ASSERT_FALSE(MemberSignature(class3_method1_).DoesPrefixMatch(prefix));
139 ASSERT_FALSE(MemberSignature(class3_method1_i_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000140}
141
142TEST_F(HiddenApiTest, CheckClassMatch) {
143 ScopedObjectAccess soa(self_);
144 std::string prefix("Lmypackage/packagea/Class1");
Andreas Gampeaa120012018-03-28 16:23:24 -0700145 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
146 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
147 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
148 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
149 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
150 ASSERT_TRUE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
151 ASSERT_TRUE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
152 ASSERT_TRUE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
153 ASSERT_FALSE(MemberSignature(class2_field1_).DoesPrefixMatch(prefix));
154 ASSERT_FALSE(MemberSignature(class2_method1_).DoesPrefixMatch(prefix));
155 ASSERT_FALSE(MemberSignature(class2_method1_i_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000156}
157
158TEST_F(HiddenApiTest, CheckClassExactMatch) {
159 ScopedObjectAccess soa(self_);
160 std::string prefix("Lmypackage/packagea/Class1;");
Andreas Gampeaa120012018-03-28 16:23:24 -0700161 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
162 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
163 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
164 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
165 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
166 ASSERT_FALSE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
167 ASSERT_FALSE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
168 ASSERT_FALSE(MemberSignature(class2_field1_).DoesPrefixMatch(prefix));
169 ASSERT_FALSE(MemberSignature(class2_method1_).DoesPrefixMatch(prefix));
170 ASSERT_FALSE(MemberSignature(class2_method1_i_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000171}
172
173TEST_F(HiddenApiTest, CheckMethodMatch) {
174 ScopedObjectAccess soa(self_);
175 std::string prefix("Lmypackage/packagea/Class1;->method1");
Andreas Gampeaa120012018-03-28 16:23:24 -0700176 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
177 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
178 ASSERT_FALSE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
179 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
180 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
181 ASSERT_TRUE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
182 ASSERT_FALSE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
183 ASSERT_FALSE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000184}
185
186TEST_F(HiddenApiTest, CheckMethodExactMatch) {
187 ScopedObjectAccess soa(self_);
188 std::string prefix("Lmypackage/packagea/Class1;->method1(");
Andreas Gampeaa120012018-03-28 16:23:24 -0700189 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
190 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
191 ASSERT_FALSE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
192 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
193 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
194 ASSERT_FALSE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000195}
196
197TEST_F(HiddenApiTest, CheckMethodSignatureMatch) {
198 ScopedObjectAccess soa(self_);
199 std::string prefix("Lmypackage/packagea/Class1;->method1(I)");
Andreas Gampeaa120012018-03-28 16:23:24 -0700200 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
201 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
202 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
203 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
204 ASSERT_FALSE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000205}
206
207TEST_F(HiddenApiTest, CheckMethodSignatureAndReturnMatch) {
208 ScopedObjectAccess soa(self_);
209 std::string prefix("Lmypackage/packagea/Class1;->method1()V");
Andreas Gampeaa120012018-03-28 16:23:24 -0700210 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
211 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
212 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
213 ASSERT_FALSE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
214 ASSERT_FALSE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000215}
216
217TEST_F(HiddenApiTest, CheckFieldMatch) {
218 ScopedObjectAccess soa(self_);
219 std::string prefix("Lmypackage/packagea/Class1;->field1");
Andreas Gampeaa120012018-03-28 16:23:24 -0700220 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
221 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
222 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
223 ASSERT_FALSE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
224 ASSERT_FALSE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000225}
226
227TEST_F(HiddenApiTest, CheckFieldExactMatch) {
228 ScopedObjectAccess soa(self_);
229 std::string prefix("Lmypackage/packagea/Class1;->field1:");
Andreas Gampeaa120012018-03-28 16:23:24 -0700230 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
231 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
232 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000233}
234
235TEST_F(HiddenApiTest, CheckFieldTypeMatch) {
236 ScopedObjectAccess soa(self_);
237 std::string prefix("Lmypackage/packagea/Class1;->field1:I");
Andreas Gampeaa120012018-03-28 16:23:24 -0700238 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
239 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
240 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000241}
242
243TEST_F(HiddenApiTest, CheckConstructorMatch) {
244 ScopedObjectAccess soa(self_);
245 std::string prefix("Lmypackage/packagea/Class1;-><init>");
Andreas Gampeaa120012018-03-28 16:23:24 -0700246 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
247 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000248}
249
250TEST_F(HiddenApiTest, CheckConstructorExactMatch) {
251 ScopedObjectAccess soa(self_);
252 std::string prefix("Lmypackage/packagea/Class1;-><init>()V");
Andreas Gampeaa120012018-03-28 16:23:24 -0700253 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
254 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000255}
256
257TEST_F(HiddenApiTest, CheckMethodSignatureTrailingCharsNoMatch) {
258 ScopedObjectAccess soa(self_);
259 std::string prefix("Lmypackage/packagea/Class1;->method1()Vfoo");
Andreas Gampeaa120012018-03-28 16:23:24 -0700260 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000261}
262
263TEST_F(HiddenApiTest, CheckConstructorTrailingCharsNoMatch) {
264 ScopedObjectAccess soa(self_);
265 std::string prefix("Lmypackage/packagea/Class1;-><init>()Vfoo");
Andreas Gampeaa120012018-03-28 16:23:24 -0700266 ASSERT_FALSE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000267}
268
269TEST_F(HiddenApiTest, CheckFieldTrailingCharsNoMatch) {
270 ScopedObjectAccess soa(self_);
271 std::string prefix("Lmypackage/packagea/Class1;->field1:Ifoo");
Andreas Gampeaa120012018-03-28 16:23:24 -0700272 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000273}
274
275} // namespace art