Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/test/functional/Jsr292/src/com/ibm/j9/jsr292/MethodHandleProxiesTest.java
6007 views
1
/*******************************************************************************
2
* Copyright (c) 2001, 2019 IBM Corp. and others
3
*
4
* This program and the accompanying materials are made available under
5
* the terms of the Eclipse Public License 2.0 which accompanies this
6
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
7
* or the Apache License, Version 2.0 which accompanies this distribution and
8
* is available at https://www.apache.org/licenses/LICENSE-2.0.
9
*
10
* This Source Code may also be made available under the following
11
* Secondary Licenses when the conditions for such availability set
12
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
13
* General Public License, version 2 with the GNU Classpath
14
* Exception [1] and GNU General Public License, version 2 with the
15
* OpenJDK Assembly Exception [2].
16
*
17
* [1] https://www.gnu.org/software/classpath/license.html
18
* [2] http://openjdk.java.net/legal/assembly-exception.html
19
*
20
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception
21
*******************************************************************************/
22
package com.ibm.j9.jsr292;
23
24
import org.testng.annotations.Test;
25
import org.testng.AssertJUnit;
26
import java.lang.invoke.MethodHandle;
27
import java.lang.invoke.MethodHandleProxies;
28
import java.lang.invoke.MethodHandles;
29
import java.lang.invoke.MethodType;
30
import examples.CrossPackageSingleMethodInterfaceExample;
31
import examples.PackageExamples;
32
33
/**
34
* @author mesbah
35
* This class contains tests for the MethodHandleProxies API.
36
*/
37
public class MethodHandleProxiesTest {
38
39
/********************************
40
* Tests for asInterfaceInstance
41
********************************/
42
43
/**
44
* Tests asInterfaceInstance using a public single method interface from the same package and followed by one from a different package.
45
* Wrapper is a public virtual method from same package and cross-package respectively.
46
* @throws Throwable
47
*/
48
@Test(groups = { "level.extended" })
49
public void test_asInterfaceInstance_VirtualMethod() throws Throwable {
50
//same package test
51
MethodHandle mh = MethodHandles.lookup().findVirtual( SamePackageExample.class, "addPublic", MethodType.methodType( int.class, int.class, int.class ) );
52
mh = mh.bindTo( new SamePackageExample() );
53
SamePackageSingleMethodInterfaceExample interfaceInstance = MethodHandleProxies.asInterfaceInstance( SamePackageSingleMethodInterfaceExample.class, mh );
54
AssertJUnit.assertEquals( 3, interfaceInstance.singleMethodAdd( 1, 2 ) );
55
56
//cross package test
57
MethodHandle mh2 = MethodHandles.lookup().findVirtual( PackageExamples.class, "addPublic", MethodType.methodType( int.class, int.class, int.class ) );
58
mh2 = mh2.bindTo( new PackageExamples() );
59
CrossPackageSingleMethodInterfaceExample interfaceInstanceCrossPackage = MethodHandleProxies.asInterfaceInstance( CrossPackageSingleMethodInterfaceExample.class, mh2 );
60
AssertJUnit.assertEquals( 3, interfaceInstanceCrossPackage.singleMethodAdd( 1, 2 ) );
61
}
62
63
/**
64
* Tests asInterfaceInstance using a public single method interface from the same package and followed by one from a different package.
65
* Wrapper is a public static method from same package and cross-package respectively.
66
* @throws Throwable
67
*/
68
@Test(groups = { "level.extended" })
69
public void test_asInterfaceInstance_StaticMethod() throws Throwable {
70
//same package test
71
MethodHandle mh = MethodHandles.lookup().findStatic( SamePackageExample.class, "addPublicStatic", MethodType.methodType( int.class, int.class, int.class ) );
72
SamePackageSingleMethodInterfaceExample interfaceInstance = MethodHandleProxies.asInterfaceInstance( SamePackageSingleMethodInterfaceExample.class, mh );
73
AssertJUnit.assertEquals( 3, interfaceInstance.singleMethodAdd( 1, 2 ) );
74
75
//cross package test
76
MethodHandle mh2 = MethodHandles.lookup().findStatic( PackageExamples.class, "addPublicStatic", MethodType.methodType( int.class, int.class, int.class ) );
77
CrossPackageSingleMethodInterfaceExample interfaceInstanceCrossPackage = MethodHandleProxies.asInterfaceInstance( CrossPackageSingleMethodInterfaceExample.class, mh2 );
78
AssertJUnit.assertEquals( 3, interfaceInstanceCrossPackage.singleMethodAdd( 1, 2 ) );
79
}
80
81
/**
82
* Tests asInterfaceInstance using a public single method interface from the same package and followed by one from a different package.
83
* Wrapper is a public virtual method defined in an inner class from same package and cross-package respectively.
84
* @throws Throwable
85
*/
86
@Test(groups = { "level.extended" })
87
public void test_asInterfaceInstance_InnerClass() throws Throwable {
88
//same package test
89
MethodHandle mh = MethodHandles.lookup().findVirtual( SamePackageExample.SamePackageInnerClass.class, "addPublicInner", MethodType.methodType( int.class, int.class, int.class ) );
90
SamePackageExample x = new SamePackageExample();
91
SamePackageExample.SamePackageInnerClass i = x.new SamePackageInnerClass();
92
mh = mh.bindTo( i );
93
SamePackageSingleMethodInterfaceExample interfaceInstance = MethodHandleProxies.asInterfaceInstance( SamePackageSingleMethodInterfaceExample.class, mh );
94
AssertJUnit.assertEquals( 3, interfaceInstance.singleMethodAdd( 1, 2 ) );
95
96
//cross package test
97
MethodHandle mh2 = MethodHandles.lookup().findVirtual( PackageExamples.CrossPackageInnerClass.class, "addPublicInner", MethodType.methodType( int.class, int.class, int.class ) );
98
PackageExamples y = new PackageExamples();
99
mh2 = mh2.bindTo( y.new CrossPackageInnerClass() );
100
CrossPackageSingleMethodInterfaceExample interfaceInstanceCrossPackage = MethodHandleProxies.asInterfaceInstance( CrossPackageSingleMethodInterfaceExample.class, mh2 );
101
AssertJUnit.assertEquals( 3, interfaceInstanceCrossPackage.singleMethodAdd( 1, 2 ) );
102
}
103
104
105
/******************************
106
*Tests for isWrapperInstance
107
******************************/
108
109
/**
110
* Tests isWrapperInstance using a public single method interface from the same package and followed by one from a different package.
111
* Wrapper is a public virtual method defined in an inner class from same package and cross-package respectively.
112
* @throws Throwable
113
*/
114
@Test(groups = { "level.extended" })
115
public void test_isWrapperInstance_VirtualMethod() throws Throwable {
116
//same package test
117
MethodHandle mh = MethodHandles.lookup().findVirtual( SamePackageExample.class, "addPublic", MethodType.methodType( int.class, int.class, int.class ) );
118
mh = mh.bindTo( new SamePackageExample() );
119
SamePackageSingleMethodInterfaceExample interfaceInstance = MethodHandleProxies.asInterfaceInstance( SamePackageSingleMethodInterfaceExample.class, mh );
120
AssertJUnit.assertTrue( MethodHandleProxies.isWrapperInstance( interfaceInstance ) );
121
122
//cross package test
123
MethodHandle mh2 = MethodHandles.lookup().findVirtual( PackageExamples.class, "addPublic", MethodType.methodType( int.class, int.class, int.class ) );
124
mh2 = mh2.bindTo( new PackageExamples() );
125
CrossPackageSingleMethodInterfaceExample interfaceInstanceCrossPackage = MethodHandleProxies.asInterfaceInstance( CrossPackageSingleMethodInterfaceExample.class, mh2 );
126
AssertJUnit.assertTrue( MethodHandleProxies.isWrapperInstance( interfaceInstanceCrossPackage ) );
127
}
128
129
/**
130
* Tests isWrapperInstance using a public single method interface from the same package and followed by one from a different package.
131
* Wrapper is a public static method from same package and cross-package respectively.
132
* @throws Throwable
133
*/
134
@Test(groups = { "level.extended" })
135
public void test_isWrapperInstance_StaticMethod() throws Throwable {
136
//same package test
137
MethodHandle mh = MethodHandles.lookup().findStatic( SamePackageExample.class, "addPublicStatic", MethodType.methodType( int.class, int.class, int.class ) );
138
SamePackageSingleMethodInterfaceExample interfaceInstance = MethodHandleProxies.asInterfaceInstance( SamePackageSingleMethodInterfaceExample.class, mh );
139
AssertJUnit.assertTrue( MethodHandleProxies.isWrapperInstance( interfaceInstance ) );
140
141
//cross package test
142
MethodHandle mh2 = MethodHandles.lookup().findStatic( PackageExamples.class, "addPublicStatic", MethodType.methodType( int.class, int.class, int.class ) );
143
CrossPackageSingleMethodInterfaceExample interfaceInstanceCrossPackage = MethodHandleProxies.asInterfaceInstance( CrossPackageSingleMethodInterfaceExample.class, mh2 );
144
AssertJUnit.assertTrue( MethodHandleProxies.isWrapperInstance( interfaceInstanceCrossPackage ) );
145
}
146
147
/**
148
* Tests isWrapperInstance using a public single method interface from the same package and followed by one from a different package.
149
* Wrapper is a public virtual method defined in an inner class from same package and cross-package respectively.
150
* @throws Throwable
151
*/
152
@Test(groups = { "level.extended" })
153
public void test_isWrapperInstance_InnerClass() throws Throwable {
154
//same package test
155
MethodHandle mh = MethodHandles.lookup().findVirtual( SamePackageExample.SamePackageInnerClass.class, "addPublicInner", MethodType.methodType( int.class, int.class, int.class ) );
156
SamePackageExample x = new SamePackageExample();
157
SamePackageExample.SamePackageInnerClass i = x.new SamePackageInnerClass();
158
mh = mh.bindTo( i );
159
SamePackageSingleMethodInterfaceExample interfaceInstance = MethodHandleProxies.asInterfaceInstance( SamePackageSingleMethodInterfaceExample.class, mh );
160
AssertJUnit.assertTrue( MethodHandleProxies.isWrapperInstance( interfaceInstance ) );
161
162
//cross package test
163
MethodHandle mh2 = MethodHandles.lookup().findVirtual( PackageExamples.CrossPackageInnerClass.class, "addPublicInner", MethodType.methodType( int.class, int.class, int.class ) );
164
PackageExamples y = new PackageExamples();
165
mh2 = mh2.bindTo( y.new CrossPackageInnerClass() );
166
CrossPackageSingleMethodInterfaceExample interfaceInstanceCrossPackage = MethodHandleProxies.asInterfaceInstance( CrossPackageSingleMethodInterfaceExample.class, mh2 );
167
AssertJUnit.assertTrue( MethodHandleProxies.isWrapperInstance( interfaceInstanceCrossPackage ) );
168
}
169
170
/**
171
* Negative test : verify isWrapperInstance returns false for non-wrapper objects.
172
* @throws Throwable
173
*/
174
@Test(groups = { "level.extended" })
175
public void test_isWrapperInstance_NegativeTest() throws Throwable {
176
//same package test
177
AssertJUnit.assertFalse( MethodHandleProxies.isWrapperInstance( new SamePackageSingleMethodInterfaceExample() {
178
179
@Override
180
public int singleMethodAdd( int a, int b ) {
181
return 0;
182
}
183
} ) );
184
185
//cross package test
186
AssertJUnit.assertFalse( MethodHandleProxies.isWrapperInstance( new PackageExamples() ) );
187
}
188
189
/****************************************
190
* Tests for wrapperInstanceTarget
191
* *************************************/
192
193
/**
194
* Tests wrapperInstanceTarget using single method interface and wrapper types from same package and cross-package
195
* @throws Throwable
196
*/
197
@Test(groups = { "level.extended" })
198
public void test_wrapperInstanceTarget_VirtualMethod() throws Throwable {
199
//same package test
200
MethodHandle mh = MethodHandles.lookup().findVirtual( SamePackageExample.class, "addPublic", MethodType.methodType( int.class, int.class, int.class ) );
201
mh = mh.bindTo( new SamePackageExample() );
202
SamePackageSingleMethodInterfaceExample interfaceInstance = MethodHandleProxies.asInterfaceInstance( SamePackageSingleMethodInterfaceExample.class, mh );
203
MethodHandle retrievedTarget = MethodHandleProxies.wrapperInstanceTarget( interfaceInstance );
204
AssertJUnit.assertEquals( 4, ( int )retrievedTarget.invokeExact( 1, 3 ) );
205
206
//cross package test
207
MethodHandle mh2 = MethodHandles.lookup().findVirtual( PackageExamples.class, "addPublic", MethodType.methodType( int.class, int.class, int.class ) );
208
mh2 = mh2.bindTo( new PackageExamples() );
209
CrossPackageSingleMethodInterfaceExample interfaceInstanceCrossPackage = MethodHandleProxies.asInterfaceInstance( CrossPackageSingleMethodInterfaceExample.class, mh2 );
210
MethodHandle retrievedTarget2 = MethodHandleProxies.wrapperInstanceTarget( interfaceInstanceCrossPackage );
211
AssertJUnit.assertEquals( 4, retrievedTarget2.invoke( 1, 3 ) );
212
}
213
214
/**
215
* Tests wrapperInstanceTarget using single method interface and static wrapper methods from same package and cross-package
216
* @throws Throwable
217
*/
218
@Test(groups = { "level.extended" })
219
public void test_wrapperInstanceTarget_StaticMethod() throws Throwable {
220
//same package test
221
MethodHandle mh = MethodHandles.lookup().findStatic( SamePackageExample.class, "addPublicStatic", MethodType.methodType( int.class, int.class, int.class ) );
222
SamePackageSingleMethodInterfaceExample interfaceInstance = MethodHandleProxies.asInterfaceInstance( SamePackageSingleMethodInterfaceExample.class, mh );
223
MethodHandle retrievedTarget = MethodHandleProxies.wrapperInstanceTarget( interfaceInstance );
224
AssertJUnit.assertEquals( 4, retrievedTarget.invoke( 1, 3 ) );
225
226
//cross package test
227
MethodHandle mh2 = MethodHandles.lookup().findStatic( PackageExamples.class, "addPublicStatic", MethodType.methodType( int.class, int.class, int.class ) );
228
CrossPackageSingleMethodInterfaceExample interfaceInstanceCrossPackage = MethodHandleProxies.asInterfaceInstance( CrossPackageSingleMethodInterfaceExample.class, mh2 );
229
MethodHandle retrievedTarget2 = MethodHandleProxies.wrapperInstanceTarget( interfaceInstanceCrossPackage );
230
AssertJUnit.assertEquals( 4, ( int )retrievedTarget2.invokeExact( 1, 3 ) );
231
}
232
233
/**
234
* Tests wrapperInstanceTarget using single method interface and inner-class wrapper types from same package and cross-package
235
* @throws Throwable
236
*/
237
@Test(groups = { "level.extended" })
238
public void test_wrapperInstanceTarget_InnerClass() throws Throwable {
239
//same package test
240
MethodHandle mh = MethodHandles.lookup().findVirtual( SamePackageExample.SamePackageInnerClass.class, "addPublicInner", MethodType.methodType( int.class, int.class, int.class ) );
241
SamePackageExample x = new SamePackageExample();
242
SamePackageExample.SamePackageInnerClass i = x.new SamePackageInnerClass();
243
mh = mh.bindTo( i );
244
SamePackageSingleMethodInterfaceExample interfaceInstance = MethodHandleProxies.asInterfaceInstance( SamePackageSingleMethodInterfaceExample.class, mh );
245
MethodHandle retrievedTarget = MethodHandleProxies.wrapperInstanceTarget( interfaceInstance );
246
AssertJUnit.assertEquals( 4, ( int )retrievedTarget.invokeExact( 1, 3 ) );
247
248
//cross package test
249
MethodHandle mh2 = MethodHandles.lookup().findVirtual( PackageExamples.CrossPackageInnerClass.class, "addPublicInner", MethodType.methodType( int.class, int.class, int.class ) );
250
PackageExamples y = new PackageExamples();
251
mh2 = mh2.bindTo( y.new CrossPackageInnerClass() );
252
CrossPackageSingleMethodInterfaceExample interfaceInstanceCrossPackage = MethodHandleProxies.asInterfaceInstance( CrossPackageSingleMethodInterfaceExample.class, mh2 );
253
MethodHandle retrievedTarget2 = MethodHandleProxies.wrapperInstanceTarget( interfaceInstanceCrossPackage );
254
AssertJUnit.assertEquals( 4, retrievedTarget2.invoke( 1, 3 ) );
255
}
256
257
/**
258
* Negative test for verifying target retrieval failure for wrapperInstanceTarget method in case of non-wrapper instances.
259
* @throws Throwable
260
*/
261
@Test(groups = { "level.extended" })
262
public void test_wrapperInstanceTarget_NegativeTest() throws Throwable {
263
boolean notAWrapperInstance = false;
264
try {
265
MethodHandle retrievedTarget = MethodHandleProxies.wrapperInstanceTarget( new SamePackageExample() );
266
AssertJUnit.assertEquals( 4, ( int )retrievedTarget.invokeExact( 1, 3 ) );
267
}
268
catch( IllegalArgumentException e ) {
269
notAWrapperInstance = true;
270
}
271
272
AssertJUnit.assertTrue( notAWrapperInstance );
273
}
274
275
/**********************************
276
* Tests for wrapperInstanceType
277
* *******************************/
278
279
/**
280
* Tests wrapperInstanceType using public virtual wrappers and single method interfaces from same package and cross-package.
281
* @throws Throwable
282
*/
283
@Test(groups = { "level.extended" })
284
public void test_wrapperInstanceType_VirtualMethod() throws Throwable {
285
//same package test
286
MethodHandle mh = MethodHandles.lookup().findVirtual( SamePackageExample.class, "addPublic", MethodType.methodType( int.class, int.class, int.class ) );
287
mh = mh.bindTo( new SamePackageExample() );
288
SamePackageSingleMethodInterfaceExample interfaceInstance = MethodHandleProxies.asInterfaceInstance( SamePackageSingleMethodInterfaceExample.class, mh );
289
Class<?> retrievedTargetType = MethodHandleProxies.wrapperInstanceType( interfaceInstance );
290
AssertJUnit.assertEquals( SamePackageSingleMethodInterfaceExample.class, retrievedTargetType );
291
292
//cross package test
293
MethodHandle mh2 = MethodHandles.lookup().findVirtual( PackageExamples.class, "addPublic", MethodType.methodType( int.class, int.class, int.class ) );
294
mh2 = mh2.bindTo( new PackageExamples() );
295
CrossPackageSingleMethodInterfaceExample interfaceInstanceCrossPackage = MethodHandleProxies.asInterfaceInstance( CrossPackageSingleMethodInterfaceExample.class, mh2 );
296
Class<?> retrievedTargetType2 = MethodHandleProxies.wrapperInstanceType( interfaceInstanceCrossPackage );
297
AssertJUnit.assertEquals( CrossPackageSingleMethodInterfaceExample.class, retrievedTargetType2 );
298
}
299
300
/**
301
* Tests wrapperInstanceType using public static wrappers and single method interfaces from same package and cross-package.
302
* @throws Throwable
303
*/
304
@Test(groups = { "level.extended" })
305
public void test_wrapperInstanceType_StaticMethod() throws Throwable {
306
//same package test
307
MethodHandle mh = MethodHandles.lookup().findStatic( SamePackageExample.class, "addPublicStatic", MethodType.methodType( int.class, int.class, int.class ) );
308
SamePackageSingleMethodInterfaceExample interfaceInstance = MethodHandleProxies.asInterfaceInstance( SamePackageSingleMethodInterfaceExample.class, mh );
309
Class<?> retrievedTargetType = MethodHandleProxies.wrapperInstanceType( interfaceInstance );
310
AssertJUnit.assertEquals( SamePackageSingleMethodInterfaceExample.class, retrievedTargetType );
311
312
//cross package test
313
MethodHandle mh2 = MethodHandles.lookup().findStatic( PackageExamples.class, "addPublicStatic", MethodType.methodType( int.class, int.class, int.class ) );
314
CrossPackageSingleMethodInterfaceExample interfaceInstanceCrossPackage = MethodHandleProxies.asInterfaceInstance( CrossPackageSingleMethodInterfaceExample.class, mh2 );
315
Class<?> retrievedTargetType2 = MethodHandleProxies.wrapperInstanceType( interfaceInstanceCrossPackage );
316
AssertJUnit.assertEquals( CrossPackageSingleMethodInterfaceExample.class, retrievedTargetType2 );
317
}
318
319
/**
320
* Tests wrapperInstanceType using inner-class wrappers and single method interfaces from same package and cross-package.
321
* @throws Throwable
322
*/
323
@Test(groups = { "level.extended" })
324
public void test_wrapperInstanceType_InnerClass() throws Throwable {
325
//same package test
326
MethodHandle mh = MethodHandles.lookup().findVirtual( SamePackageExample.SamePackageInnerClass.class, "addPublicInner", MethodType.methodType( int.class, int.class, int.class ) );
327
SamePackageExample x = new SamePackageExample();
328
SamePackageExample.SamePackageInnerClass i = x.new SamePackageInnerClass();
329
mh = mh.bindTo( i );
330
SamePackageSingleMethodInterfaceExample interfaceInstance = MethodHandleProxies.asInterfaceInstance( SamePackageSingleMethodInterfaceExample.class, mh );
331
Class<?> retrievedTargetType = MethodHandleProxies.wrapperInstanceType( interfaceInstance );
332
AssertJUnit.assertEquals( SamePackageSingleMethodInterfaceExample.class, retrievedTargetType );
333
334
//cross package test
335
MethodHandle mh2 = MethodHandles.lookup().findVirtual( PackageExamples.CrossPackageInnerClass.class, "addPublicInner", MethodType.methodType( int.class, int.class, int.class ) );
336
PackageExamples y = new PackageExamples();
337
mh2 = mh2.bindTo( y.new CrossPackageInnerClass() );
338
CrossPackageSingleMethodInterfaceExample interfaceInstanceCrossPackage = MethodHandleProxies.asInterfaceInstance( CrossPackageSingleMethodInterfaceExample.class, mh2 );
339
Class<?> retrievedTargetType2 = MethodHandleProxies.wrapperInstanceType( interfaceInstanceCrossPackage );
340
AssertJUnit.assertEquals( CrossPackageSingleMethodInterfaceExample.class, retrievedTargetType2 );
341
}
342
343
/**
344
* Negative test for wrapperInstanceType using non-wrapper types
345
* @throws Throwable
346
*/
347
@Test(groups = { "level.extended" })
348
public void test_wrapperInstanceType_NegativeTest() throws Throwable {
349
boolean notAWrapperInstance = false;
350
try {
351
Class<?> retrievedTargetType = MethodHandleProxies.wrapperInstanceType( new PackageExamples() );
352
AssertJUnit.assertEquals( SamePackageSingleMethodInterfaceExample.class, retrievedTargetType );
353
}
354
catch( IllegalArgumentException e ) {
355
notAWrapperInstance = true;
356
}
357
AssertJUnit.assertTrue( notAWrapperInstance );
358
}
359
}
360
361