blob: 627d9a7e1c759181862ce79cc2fc0db42a3f8d53 [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"
Vladimir Markoa3ad0cd2018-05-04 10:06:38 +010020#include "jni/jni_internal.h"
David Brazdil1f9d3c32018-05-02 16:53:06 +010021#include "proxy_test.h"
Mathew Inwood7d74ef52018-03-16 14:18:33 +000022
23namespace art {
24
Andreas Gampeaa120012018-03-28 16:23:24 -070025using hiddenapi::detail::MemberSignature;
David Brazdilf50ac102018-10-17 18:00:06 +010026using hiddenapi::detail::ShouldDenyAccessToMemberImpl;
Andreas Gampeaa120012018-03-28 16:23:24 -070027
Mathew Inwood7d74ef52018-03-16 14:18:33 +000028class HiddenApiTest : public CommonRuntimeTest {
29 protected:
Roland Levillainbbc6e7e2018-08-24 16:58:47 +010030 void SetUp() override {
Mathew Inwood7d74ef52018-03-16 14:18:33 +000031 // Do the normal setup.
32 CommonRuntimeTest::SetUp();
33 self_ = Thread::Current();
34 self_->TransitionFromSuspendedToRunnable();
David Brazdil1f9d3c32018-05-02 16:53:06 +010035 jclass_loader_ = LoadDex("HiddenApiSignatures");
Mathew Inwood7d74ef52018-03-16 14:18:33 +000036 bool started = runtime_->Start();
37 CHECK(started);
38
39 class1_field1_ = getArtField("mypackage/packagea/Class1", "field1", "I");
40 class1_field12_ = getArtField("mypackage/packagea/Class1", "field12", "I");
41 class1_init_ = getArtMethod("mypackage/packagea/Class1", "<init>", "()V");
42 class1_method1_ = getArtMethod("mypackage/packagea/Class1", "method1", "()V");
43 class1_method1_i_ = getArtMethod("mypackage/packagea/Class1", "method1", "(I)V");
44 class1_method12_ = getArtMethod("mypackage/packagea/Class1", "method12", "()V");
45 class12_field1_ = getArtField("mypackage/packagea/Class12", "field1", "I");
46 class12_method1_ = getArtMethod("mypackage/packagea/Class12", "method1", "()V");
47 class2_field1_ = getArtField("mypackage/packagea/Class2", "field1", "I");
48 class2_method1_ = getArtMethod("mypackage/packagea/Class2", "method1", "()V");
49 class2_method1_i_ = getArtMethod("mypackage/packagea/Class2", "method1", "(I)V");
50 class3_field1_ = getArtField("mypackage/packageb/Class3", "field1", "I");
51 class3_method1_ = getArtMethod("mypackage/packageb/Class3", "method1", "()V");
52 class3_method1_i_ = getArtMethod("mypackage/packageb/Class3", "method1", "(I)V");
53 }
54
55 ArtMethod* getArtMethod(const char* class_name, const char* name, const char* signature) {
56 JNIEnv* env = Thread::Current()->GetJniEnv();
57 jclass klass = env->FindClass(class_name);
58 jmethodID method_id = env->GetMethodID(klass, name, signature);
59 ArtMethod* art_method = jni::DecodeArtMethod(method_id);
60 return art_method;
61 }
62
63 ArtField* getArtField(const char* class_name, const char* name, const char* signature) {
64 JNIEnv* env = Thread::Current()->GetJniEnv();
65 jclass klass = env->FindClass(class_name);
66 jfieldID field_id = env->GetFieldID(klass, name, signature);
67 ArtField* art_field = jni::DecodeArtField(field_id);
68 return art_field;
69 }
70
David Brazdilf50ac102018-10-17 18:00:06 +010071 bool ShouldDenyAccess(hiddenapi::ApiList list) REQUIRES_SHARED(Locks::mutator_lock_) {
72 // Choose parameters such that there are no side effects (AccessMethod::kNone)
73 // and that the member is not on the exemptions list (here we choose one which
74 // is not even in boot class path).
75 return ShouldDenyAccessToMemberImpl(/* member= */ class1_field1_,
76 list,
77 /* access_method= */ hiddenapi::AccessMethod::kNone);
78 }
79
Mathew Inwood7d74ef52018-03-16 14:18:33 +000080 protected:
81 Thread* self_;
David Brazdil1f9d3c32018-05-02 16:53:06 +010082 jobject jclass_loader_;
Mathew Inwood7d74ef52018-03-16 14:18:33 +000083 ArtField* class1_field1_;
84 ArtField* class1_field12_;
85 ArtMethod* class1_init_;
86 ArtMethod* class1_method1_;
87 ArtMethod* class1_method1_i_;
88 ArtMethod* class1_method12_;
89 ArtField* class12_field1_;
90 ArtMethod* class12_method1_;
91 ArtField* class2_field1_;
92 ArtMethod* class2_method1_;
93 ArtMethod* class2_method1_i_;
94 ArtField* class3_field1_;
95 ArtMethod* class3_method1_;
96 ArtMethod* class3_method1_i_;
97};
98
Mathew Inwooda8503d92018-04-05 16:10:25 +010099TEST_F(HiddenApiTest, CheckGetActionFromRuntimeFlags) {
David Brazdilf50ac102018-10-17 18:00:06 +0100100 ScopedObjectAccess soa(self_);
101
102 runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kDisabled);
103 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::kWhitelist), false);
104 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::kLightGreylist), false);
105 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::kDarkGreylist), false);
106 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::kBlacklist), false);
Mathew Inwooda8503d92018-04-05 16:10:25 +0100107
108 runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kJustWarn);
David Brazdilf50ac102018-10-17 18:00:06 +0100109 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::kWhitelist), false);
110 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::kLightGreylist), false);
111 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::kDarkGreylist), false);
112 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::kBlacklist), false);
Mathew Inwooda8503d92018-04-05 16:10:25 +0100113
David Brazdilf50ac102018-10-17 18:00:06 +0100114 runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
115 runtime_->SetTargetSdkVersion(static_cast<int32_t>(hiddenapi::detail::SdkCodes::kVersionO_MR1));
116 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::kWhitelist), false);
117 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::kLightGreylist), false);
118 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::kDarkGreylist), false);
119 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::kBlacklist), true);
Mathew Inwooda8503d92018-04-05 16:10:25 +0100120
David Brazdilf50ac102018-10-17 18:00:06 +0100121 runtime_->SetHiddenApiEnforcementPolicy(hiddenapi::EnforcementPolicy::kEnabled);
122 runtime_->SetTargetSdkVersion(static_cast<int32_t>(hiddenapi::detail::SdkCodes::kVersionP));
123 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::kWhitelist), false);
124 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::kLightGreylist), false);
125 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::kDarkGreylist), true);
126 ASSERT_EQ(ShouldDenyAccess(hiddenapi::ApiList::kBlacklist), true);
Mathew Inwooda8503d92018-04-05 16:10:25 +0100127}
128
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000129TEST_F(HiddenApiTest, CheckMembersRead) {
130 ASSERT_NE(nullptr, class1_field1_);
131 ASSERT_NE(nullptr, class1_field12_);
132 ASSERT_NE(nullptr, class1_init_);
133 ASSERT_NE(nullptr, class1_method1_);
134 ASSERT_NE(nullptr, class1_method1_i_);
135 ASSERT_NE(nullptr, class1_method12_);
136 ASSERT_NE(nullptr, class12_field1_);
137 ASSERT_NE(nullptr, class12_method1_);
138 ASSERT_NE(nullptr, class2_field1_);
139 ASSERT_NE(nullptr, class2_method1_);
140 ASSERT_NE(nullptr, class2_method1_i_);
141 ASSERT_NE(nullptr, class3_field1_);
142 ASSERT_NE(nullptr, class3_method1_);
143 ASSERT_NE(nullptr, class3_method1_i_);
144}
145
146TEST_F(HiddenApiTest, CheckEverythingMatchesL) {
147 ScopedObjectAccess soa(self_);
148 std::string prefix("L");
Andreas Gampeaa120012018-03-28 16:23:24 -0700149 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
150 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
151 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
152 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
153 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
154 ASSERT_TRUE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
155 ASSERT_TRUE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
156 ASSERT_TRUE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
157 ASSERT_TRUE(MemberSignature(class2_field1_).DoesPrefixMatch(prefix));
158 ASSERT_TRUE(MemberSignature(class2_method1_).DoesPrefixMatch(prefix));
159 ASSERT_TRUE(MemberSignature(class2_method1_i_).DoesPrefixMatch(prefix));
160 ASSERT_TRUE(MemberSignature(class3_field1_).DoesPrefixMatch(prefix));
161 ASSERT_TRUE(MemberSignature(class3_method1_).DoesPrefixMatch(prefix));
162 ASSERT_TRUE(MemberSignature(class3_method1_i_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000163}
164
165TEST_F(HiddenApiTest, CheckPackageMatch) {
166 ScopedObjectAccess soa(self_);
167 std::string prefix("Lmypackage/packagea/");
Andreas Gampeaa120012018-03-28 16:23:24 -0700168 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
169 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
170 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
171 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
172 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
173 ASSERT_TRUE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
174 ASSERT_TRUE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
175 ASSERT_TRUE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
176 ASSERT_TRUE(MemberSignature(class2_field1_).DoesPrefixMatch(prefix));
177 ASSERT_TRUE(MemberSignature(class2_method1_).DoesPrefixMatch(prefix));
178 ASSERT_TRUE(MemberSignature(class2_method1_i_).DoesPrefixMatch(prefix));
179 ASSERT_FALSE(MemberSignature(class3_field1_).DoesPrefixMatch(prefix));
180 ASSERT_FALSE(MemberSignature(class3_method1_).DoesPrefixMatch(prefix));
181 ASSERT_FALSE(MemberSignature(class3_method1_i_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000182}
183
184TEST_F(HiddenApiTest, CheckClassMatch) {
185 ScopedObjectAccess soa(self_);
186 std::string prefix("Lmypackage/packagea/Class1");
Andreas Gampeaa120012018-03-28 16:23:24 -0700187 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
188 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
189 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
190 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
191 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
192 ASSERT_TRUE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
193 ASSERT_TRUE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
194 ASSERT_TRUE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
195 ASSERT_FALSE(MemberSignature(class2_field1_).DoesPrefixMatch(prefix));
196 ASSERT_FALSE(MemberSignature(class2_method1_).DoesPrefixMatch(prefix));
197 ASSERT_FALSE(MemberSignature(class2_method1_i_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000198}
199
200TEST_F(HiddenApiTest, CheckClassExactMatch) {
201 ScopedObjectAccess soa(self_);
202 std::string prefix("Lmypackage/packagea/Class1;");
Andreas Gampeaa120012018-03-28 16:23:24 -0700203 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
204 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
205 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
206 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
207 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
208 ASSERT_FALSE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
209 ASSERT_FALSE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
210 ASSERT_FALSE(MemberSignature(class2_field1_).DoesPrefixMatch(prefix));
211 ASSERT_FALSE(MemberSignature(class2_method1_).DoesPrefixMatch(prefix));
212 ASSERT_FALSE(MemberSignature(class2_method1_i_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000213}
214
215TEST_F(HiddenApiTest, CheckMethodMatch) {
216 ScopedObjectAccess soa(self_);
217 std::string prefix("Lmypackage/packagea/Class1;->method1");
Andreas Gampeaa120012018-03-28 16:23:24 -0700218 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
219 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
220 ASSERT_FALSE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
221 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
222 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
223 ASSERT_TRUE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
224 ASSERT_FALSE(MemberSignature(class12_field1_).DoesPrefixMatch(prefix));
225 ASSERT_FALSE(MemberSignature(class12_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000226}
227
228TEST_F(HiddenApiTest, CheckMethodExactMatch) {
229 ScopedObjectAccess soa(self_);
230 std::string prefix("Lmypackage/packagea/Class1;->method1(");
Andreas Gampeaa120012018-03-28 16:23:24 -0700231 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
232 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
233 ASSERT_FALSE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
234 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
235 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
236 ASSERT_FALSE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000237}
238
239TEST_F(HiddenApiTest, CheckMethodSignatureMatch) {
240 ScopedObjectAccess soa(self_);
241 std::string prefix("Lmypackage/packagea/Class1;->method1(I)");
Andreas Gampeaa120012018-03-28 16:23:24 -0700242 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
243 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
244 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
245 ASSERT_TRUE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
246 ASSERT_FALSE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000247}
248
249TEST_F(HiddenApiTest, CheckMethodSignatureAndReturnMatch) {
250 ScopedObjectAccess soa(self_);
251 std::string prefix("Lmypackage/packagea/Class1;->method1()V");
Andreas Gampeaa120012018-03-28 16:23:24 -0700252 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
253 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
254 ASSERT_TRUE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
255 ASSERT_FALSE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
256 ASSERT_FALSE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000257}
258
259TEST_F(HiddenApiTest, CheckFieldMatch) {
260 ScopedObjectAccess soa(self_);
261 std::string prefix("Lmypackage/packagea/Class1;->field1");
Andreas Gampeaa120012018-03-28 16:23:24 -0700262 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
263 ASSERT_TRUE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
264 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
265 ASSERT_FALSE(MemberSignature(class1_method1_i_).DoesPrefixMatch(prefix));
266 ASSERT_FALSE(MemberSignature(class1_method12_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000267}
268
269TEST_F(HiddenApiTest, CheckFieldExactMatch) {
270 ScopedObjectAccess soa(self_);
271 std::string prefix("Lmypackage/packagea/Class1;->field1:");
Andreas Gampeaa120012018-03-28 16:23:24 -0700272 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
273 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
274 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000275}
276
277TEST_F(HiddenApiTest, CheckFieldTypeMatch) {
278 ScopedObjectAccess soa(self_);
279 std::string prefix("Lmypackage/packagea/Class1;->field1:I");
Andreas Gampeaa120012018-03-28 16:23:24 -0700280 ASSERT_TRUE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
281 ASSERT_FALSE(MemberSignature(class1_field12_).DoesPrefixMatch(prefix));
282 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000283}
284
285TEST_F(HiddenApiTest, CheckConstructorMatch) {
286 ScopedObjectAccess soa(self_);
287 std::string prefix("Lmypackage/packagea/Class1;-><init>");
Andreas Gampeaa120012018-03-28 16:23:24 -0700288 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
289 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000290}
291
292TEST_F(HiddenApiTest, CheckConstructorExactMatch) {
293 ScopedObjectAccess soa(self_);
294 std::string prefix("Lmypackage/packagea/Class1;-><init>()V");
Andreas Gampeaa120012018-03-28 16:23:24 -0700295 ASSERT_TRUE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
296 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000297}
298
299TEST_F(HiddenApiTest, CheckMethodSignatureTrailingCharsNoMatch) {
300 ScopedObjectAccess soa(self_);
301 std::string prefix("Lmypackage/packagea/Class1;->method1()Vfoo");
Andreas Gampeaa120012018-03-28 16:23:24 -0700302 ASSERT_FALSE(MemberSignature(class1_method1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000303}
304
305TEST_F(HiddenApiTest, CheckConstructorTrailingCharsNoMatch) {
306 ScopedObjectAccess soa(self_);
307 std::string prefix("Lmypackage/packagea/Class1;-><init>()Vfoo");
Andreas Gampeaa120012018-03-28 16:23:24 -0700308 ASSERT_FALSE(MemberSignature(class1_init_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000309}
310
311TEST_F(HiddenApiTest, CheckFieldTrailingCharsNoMatch) {
312 ScopedObjectAccess soa(self_);
313 std::string prefix("Lmypackage/packagea/Class1;->field1:Ifoo");
Andreas Gampeaa120012018-03-28 16:23:24 -0700314 ASSERT_FALSE(MemberSignature(class1_field1_).DoesPrefixMatch(prefix));
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000315}
316
David Brazdil1f9d3c32018-05-02 16:53:06 +0100317TEST_F(HiddenApiTest, CheckMemberSignatureForProxyClass) {
318 ScopedObjectAccess soa(self_);
319 StackHandleScope<4> hs(soa.Self());
320 Handle<mirror::ClassLoader> class_loader(
321 hs.NewHandle(soa.Decode<mirror::ClassLoader>(jclass_loader_)));
322
323 // Find interface we will create a proxy for.
324 Handle<mirror::Class> h_iface(hs.NewHandle(
325 class_linker_->FindClass(soa.Self(), "Lmypackage/packagea/Interface;", class_loader)));
326 ASSERT_TRUE(h_iface != nullptr);
327
328 // Create the proxy class.
Vladimir Markoa8bba7d2018-05-30 15:18:48 +0100329 std::vector<Handle<mirror::Class>> interfaces;
330 interfaces.push_back(h_iface);
David Brazdil1f9d3c32018-05-02 16:53:06 +0100331 Handle<mirror::Class> proxyClass = hs.NewHandle(proxy_test::GenerateProxyClass(
332 soa, jclass_loader_, runtime_->GetClassLinker(), "$Proxy1234", interfaces));
333 ASSERT_TRUE(proxyClass != nullptr);
334 ASSERT_TRUE(proxyClass->IsProxyClass());
335 ASSERT_TRUE(proxyClass->IsInitialized());
336
337 // Find the "method" virtual method.
338 ArtMethod* method = nullptr;
339 for (auto& m : proxyClass->GetDeclaredVirtualMethods(kRuntimePointerSize)) {
340 if (strcmp("method", m.GetInterfaceMethodIfProxy(kRuntimePointerSize)->GetName()) == 0) {
341 method = &m;
342 break;
343 }
344 }
345 ASSERT_TRUE(method != nullptr);
346
347 // Find the "interfaces" static field. This is generated for all proxies.
348 ArtField* field = nullptr;
349 for (size_t i = 0; i < proxyClass->NumStaticFields(); ++i) {
350 ArtField* f = proxyClass->GetStaticField(i);
351 if (strcmp("interfaces", f->GetName()) == 0) {
352 field = f;
353 break;
354 }
355 }
356 ASSERT_TRUE(field != nullptr);
357
358 // Test the signature. We expect the signature from the interface class.
359 std::ostringstream ss_method;
360 MemberSignature(method).Dump(ss_method);
361 ASSERT_EQ("Lmypackage/packagea/Interface;->method()V", ss_method.str());
362
363 // Test the signature. We expect the signature of the proxy class.
364 std::ostringstream ss_field;
365 MemberSignature(field).Dump(ss_field);
366 ASSERT_EQ("L$Proxy1234;->interfaces:[Ljava/lang/Class;", ss_field.str());
367}
368
Mathew Inwood7d74ef52018-03-16 14:18:33 +0000369} // namespace art