Skip to content

Commit f5ed21c

Browse files
zhfenggastaldi
authored andcommitted
add a test for lambda capturing (#16)
1 parent bb857ae commit f5ed21c

File tree

7 files changed

+100
-0
lines changed

7 files changed

+100
-0
lines changed

integration-tests/main/src/main/java/io/quarkus/it/rest/ReflectionResource.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,17 @@ public String getSimpleClassName(@QueryParam("className") String className) {
1717
return "FAILED";
1818
}
1919
}
20+
21+
@GET
22+
@Path("/lambda")
23+
public String getLambdaClassName() {
24+
try {
25+
ResourceLambda lambda = new ResourceLambda();
26+
Class<?> clazz = lambda.getLambdaFuncClass(5);
27+
return clazz.getSimpleName();
28+
} catch (Exception e) {
29+
return e.toString();
30+
}
31+
}
32+
2033
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package io.quarkus.it.rest;
2+
3+
import java.io.FileInputStream;
4+
import java.io.FileOutputStream;
5+
import java.io.IOException;
6+
import java.io.ObjectInputStream;
7+
import java.io.ObjectOutputStream;
8+
import java.lang.invoke.SerializedLambda;
9+
import java.util.Comparator;
10+
11+
import io.quarkus.runtime.annotations.RegisterForReflection;
12+
13+
/**
14+
* This class is registering itself for lambda capturing
15+
*/
16+
@RegisterForReflection(lambdaCapturingTypes = "java.util.Comparator", targets = {
17+
SerializedLambda.class, SerializableDoubleFunction.class }, serialization = true)
18+
public class ResourceLambda {
19+
private static final String file = "target/serialized.txt";
20+
21+
public Class<?> getLambdaFuncClass(Integer n) throws IOException, ClassNotFoundException {
22+
SerializableDoubleFunction func = new SerializableDoubleFunction(n);
23+
Comparator<Integer> comp = Comparator.comparingDouble(func);
24+
serializeObject(comp);
25+
return deserializeObject().getClass();
26+
}
27+
28+
private void serializeObject(Object o) throws IOException {
29+
FileOutputStream out = new FileOutputStream(file);
30+
ObjectOutputStream objectOutputStream = new ObjectOutputStream(out);
31+
objectOutputStream.writeObject(o);
32+
objectOutputStream.close();
33+
}
34+
35+
private Object deserializeObject() throws IOException, ClassNotFoundException {
36+
FileInputStream in = new FileInputStream(file);
37+
ObjectInputStream objectInputStream = new ObjectInputStream(in);
38+
return objectInputStream.readObject();
39+
}
40+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package io.quarkus.it.rest;
2+
3+
import java.io.Serializable;
4+
import java.util.function.ToDoubleFunction;
5+
6+
class SerializableDoubleFunction implements Serializable, ToDoubleFunction<Integer> {
7+
private final double value;
8+
9+
public SerializableDoubleFunction(double inputValue) {
10+
value = inputValue;
11+
}
12+
13+
@Override
14+
public double applyAsDouble(Integer o) {
15+
return value;
16+
}
17+
}

integration-tests/main/src/main/resources/application.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ quarkus.native.resources.excludes = **/unwanted.*
5252

5353
quarkus.log.metrics.enabled=true
5454

55+
#quarkus.native.additional-build-args =-H:ReflectionConfigurationFiles=reflection-config.json,-H:SerializationConfigurationResources=serialization-config.json
5556
quarkus.native.additional-build-args =-H:ReflectionConfigurationFiles=reflection-config.json
5657
quarkus.class-loading.removed-resources."io.quarkus\:quarkus-integration-test-shared-library"=io/quarkus/it/shared/RemovedResource.class
5758
quarkus.class-loading.removed-resources."io.quarkus\:quarkus-integration-test-main"=io/quarkus/it/rest/RemovedJaxRsApplication.class
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"types":[
3+
{"name":"io.quarkus.it.rest.SerializableDoubleFunction"},
4+
{"name":"java.lang.invoke.SerializedLambda"}
5+
],
6+
"lambdaCapturingTypes":[
7+
{"name":"java.util.Comparator"}
8+
]
9+
}

integration-tests/main/src/test/java/io/quarkus/it/main/RegisterForReflectionITCase.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.quarkus.it.main;
22

33
import static org.hamcrest.Matchers.is;
4+
import static org.hamcrest.Matchers.startsWith;
45

56
import org.junit.jupiter.api.Test;
67

@@ -68,6 +69,16 @@ public void testTargetWithoutNested() {
6869
assertRegistration("FAILED", resourceD + "$StaticClassOfD$OtherAccessibleClassOfD");
6970
}
7071

72+
@Test
73+
@DisableIfBuiltWithGraalVMOlderThan(GraalVMVersion.GRAALVM_22_1)
74+
public void testLambdaCapturing() {
75+
final String resourceLambda = BASE_PKG + ".ResourceLambda";
76+
77+
// Starting with GraalVM 22.1 support Lambda functions serialization
78+
// (see https://github.com/oracle/graal/issues/3756)
79+
RestAssured.given().when().get("/reflection/lambda").then().body(startsWith("Comparator$$Lambda$"));
80+
}
81+
7182
private void assertRegistration(String expected, String queryParam) {
7283
RestAssured.given().queryParam("className", queryParam).when().get(ENDPOINT).then().body(is(expected));
7384
}

integration-tests/main/src/test/java/io/quarkus/it/main/RegisterForReflectionTestCase.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.quarkus.it.main;
22

33
import static org.hamcrest.Matchers.is;
4+
import static org.hamcrest.Matchers.startsWith;
45

56
import org.junit.jupiter.api.Test;
67

@@ -51,6 +52,14 @@ public void testTargetWithoutNested() {
5152
assertRegistration("OtherAccessibleClassOfD", resourceD + "$StaticClassOfD$OtherAccessibleClassOfD");
5253
}
5354

55+
@Test
56+
public void testLambdaCapturing() {
57+
final String resourceLambda = BASE_PKG + ".ResourceLambda";
58+
59+
assertRegistration("ResourceLambda", resourceLambda);
60+
RestAssured.given().when().get("/reflection/lambda").then().body(startsWith("Comparator$$Lambda$"));
61+
}
62+
5463
private void assertRegistration(String expected, String queryParam) {
5564
RestAssured.given().queryParam("className", queryParam).when().get(ENDPOINT).then().body(is(expected));
5665
}

0 commit comments

Comments
 (0)