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