Skip to content

Commit ba2ba71

Browse files
authored
Merge pull request #51628 from reaver585/gradle-test-jvm-sys-props
For test task, set system and JVM properties in Gradle plugin code
2 parents 93e053e + aa5a1ec commit ba2ba71

File tree

10 files changed

+163
-18
lines changed

10 files changed

+163
-18
lines changed

devtools/gradle/gradle-application-plugin/src/main/java/io/quarkus/gradle/QuarkusPlugin.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,11 @@ public boolean isSatisfiedBy(Task t) {
448448

449449
tasks.withType(Test.class).configureEach(t -> {
450450
t.setSystemProperties(extractQuarkusTestSystemProperties(project));
451+
t.systemProperty("java.util.logging.manager", "org.jboss.logmanager.LogManager");
452+
t.jvmArgs(
453+
"--add-opens=java.base/java.lang.invoke=ALL-UNNAMED",
454+
"--add-opens=java.base/java.lang=ALL-UNNAMED",
455+
"--add-exports=java.base/jdk.internal.module=ALL-UNNAMED");
451456

452457
t.getInputs().files(quarkusGenerateTestAppModelTask);
453458
// Register matching compose files from project root as inputs
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package io.quarkus.gradle.tasks;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.gradle.testkit.runner.TaskOutcome.SUCCESS;
5+
6+
import java.io.File;
7+
import java.io.IOException;
8+
import java.net.URISyntaxException;
9+
import java.net.URL;
10+
import java.nio.file.Files;
11+
import java.nio.file.Path;
12+
import java.util.List;
13+
14+
import org.apache.commons.io.FileUtils;
15+
import org.gradle.testkit.runner.BuildResult;
16+
import org.gradle.testkit.runner.BuildTask;
17+
import org.gradle.testkit.runner.GradleRunner;
18+
import org.junit.jupiter.api.Test;
19+
import org.junit.jupiter.api.io.TempDir;
20+
21+
/**
22+
* Test that verifies the Quarkus Gradle plugin properly configures JVM arguments and system property
23+
* for test execution, specifically:
24+
* - systemProperty("java.util.logging.manager", "org.jboss.logmanager.LogManager")
25+
* - jvmArgs("--add-opens=java.base/java.lang.invoke=ALL-UNNAMED")
26+
* - jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED")
27+
* - jvmArgs("--add-exports=java.base/jdk.internal.module=ALL-UNNAMED")
28+
*/
29+
public class JvmArgsConfigTest {
30+
31+
private static final String LOGGING_MANAGER_PROP_NAME = "java.util.logging.manager";
32+
private static final String LOGGING_MANAGER_PROP_VALUE = "org.jboss.logmanager.LogManager";
33+
private static final String OPENS_LANG_INVOKE = "--add-opens=java.base/java.lang.invoke=ALL-UNNAMED";
34+
private static final String OPENS_LANG = "--add-opens=java.base/java.lang=ALL-UNNAMED";
35+
private static final String EXPORTS_INTERNAL_MODULE = "--add-exports=java.base/jdk.internal.module=ALL-UNNAMED";
36+
37+
@TempDir
38+
Path testProjectDir;
39+
40+
@Test
41+
void testJvmArgsAndSystemPropsAreConfigured() throws IOException, URISyntaxException {
42+
URL url = getClass().getClassLoader().getResource("io/quarkus/gradle/tasks/jvmargs/main");
43+
assertThat(url).isNotNull();
44+
FileUtils.copyDirectory(new File(url.toURI()), testProjectDir.toFile());
45+
FileUtils.copyFile(new File("../gradle.properties"), testProjectDir.resolve("gradle.properties").toFile());
46+
47+
BuildResult result = GradleRunner.create()
48+
.withPluginClasspath()
49+
.withProjectDir(testProjectDir.toFile())
50+
.withArguments("test", "--info", "--stacktrace")
51+
.build();
52+
53+
BuildTask testResult = result.task(":test");
54+
assertThat(testResult).isNotNull();
55+
assertThat(testResult.getOutcome()).isEqualTo(SUCCESS);
56+
57+
Path jvmConfigFile = testProjectDir.resolve("build/test-results/jvm-config.txt");
58+
assertThat(jvmConfigFile).exists();
59+
60+
List<String> configLines = Files.readAllLines(jvmConfigFile);
61+
62+
assertThat(configLines)
63+
.contains("%s=%s".formatted(LOGGING_MANAGER_PROP_NAME, LOGGING_MANAGER_PROP_VALUE));
64+
65+
assertThat(configLines)
66+
.contains(OPENS_LANG_INVOKE)
67+
.contains(OPENS_LANG)
68+
.contains(EXPORTS_INTERNAL_MODULE);
69+
}
70+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
plugins {
2+
java
3+
id("io.quarkus")
4+
}
5+
6+
buildscript {
7+
repositories {
8+
mavenLocal()
9+
mavenCentral()
10+
}
11+
}
12+
13+
repositories {
14+
mavenLocal()
15+
mavenCentral()
16+
}
17+
18+
dependencies {
19+
implementation(enforcedPlatform("io.quarkus:quarkus-bom:${project.property("version")}"))
20+
implementation("io.quarkus:quarkus-arc")
21+
testImplementation("io.quarkus:quarkus-junit5")
22+
}
23+
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
rootProject.name = "gradle-jvm-args-test"
2+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package org.acme;
2+
3+
public class Foo {
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package org.acme;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertTrue;
5+
6+
import java.io.File;
7+
import java.io.FileWriter;
8+
import java.io.IOException;
9+
import java.lang.management.ManagementFactory;
10+
import java.lang.management.RuntimeMXBean;
11+
import java.util.List;
12+
13+
import org.junit.jupiter.api.Test;
14+
15+
/**
16+
* Verifies that the Quarkus Gradle plugin properly configures JVM args and]
17+
* system property (logging manager) for test execution.
18+
*/
19+
public class JvmArgsTest {
20+
21+
private static final String LOGGING_MANAGER_PROP_NAME = "java.util.logging.manager";
22+
private static final String LOGGING_MANAGER_PROP_VALUE = "org.jboss.logmanager.LogManager";
23+
private static final String OPENS_LANG_INVOKE = "--add-opens=java.base/java.lang.invoke=ALL-UNNAMED";
24+
private static final String OPENS_LANG = "--add-opens=java.base/java.lang=ALL-UNNAMED";
25+
private static final String EXPORTS_INTERNAL_MODULE = "--add-exports=java.base/jdk.internal.module=ALL-UNNAMED";
26+
27+
@Test
28+
public void testJvmArgsAndSystemProperties() throws IOException {
29+
RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
30+
List<String> jvmArgs = runtimeMxBean.getInputArguments();
31+
32+
File outputFile = new File("build/test-results/jvm-config.txt");
33+
outputFile.getParentFile().mkdirs();
34+
35+
try (FileWriter writer = new FileWriter(outputFile)) {
36+
writer.write("=== JVM Arguments ===\n");
37+
for (String arg : jvmArgs) {
38+
writer.write(arg + "\n");
39+
}
40+
41+
writer.write("\n=== System Properties ===\n");
42+
String loggingManager = System.getProperty(LOGGING_MANAGER_PROP_NAME);
43+
writer.write("%s=".formatted(LOGGING_MANAGER_PROP_NAME) + loggingManager + "\n");
44+
}
45+
46+
assertEquals(LOGGING_MANAGER_PROP_VALUE,
47+
System.getProperty(LOGGING_MANAGER_PROP_NAME),
48+
"%s should be set to %s".formatted(LOGGING_MANAGER_PROP_NAME, LOGGING_MANAGER_PROP_VALUE));
49+
50+
assertTrue(jvmArgs.stream().anyMatch(arg -> arg.contains(OPENS_LANG_INVOKE)),
51+
"JVM args should contain %s".formatted(OPENS_LANG_INVOKE));
52+
53+
assertTrue(jvmArgs.stream().anyMatch(arg -> arg.contains(OPENS_LANG)),
54+
"JVM args should contain %s".formatted(OPENS_LANG));
55+
56+
assertTrue(jvmArgs.stream().anyMatch(arg -> arg.contains(EXPORTS_INTERNAL_MODULE)),
57+
"JVM args should contain %s".formatted(EXPORTS_INTERNAL_MODULE));
58+
}
59+
}

independent-projects/tools/base-codestarts/src/main/resources/codestarts/quarkus/buildtool/gradle-kotlin-dsl/base/build-layout.include.qute

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,3 @@ java {
5454
targetCompatibility = JavaVersion.VERSION_{java.version}
5555
}
5656
{/}
57-
58-
tasks.withType<Test> {
59-
systemProperty("java.util.logging.manager", "org.jboss.logmanager.LogManager")
60-
jvmArgs("--add-opens", "java.base/java.lang=ALL-UNNAMED")
61-
}

independent-projects/tools/base-codestarts/src/main/resources/codestarts/quarkus/buildtool/gradle/base/build-layout.include.qute

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,3 @@ java {
5050
targetCompatibility = JavaVersion.VERSION_{java.version}
5151
}
5252
{/}
53-
54-
test {
55-
systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager"
56-
jvmArgs "--add-opens", "java.base/java.lang=ALL-UNNAMED"
57-
}

integration-tests/devtools/src/test/resources/__snapshots__/KotlinSerializationCodestartTest/testGradleContent/build.gradle

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,6 @@ java {
2929
targetCompatibility = JavaVersion.VERSION_17
3030
}
3131

32-
test {
33-
systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager"
34-
jvmArgs "--add-opens", "java.base/java.lang=ALL-UNNAMED"
35-
}
3632
allOpen {
3733
annotation("jakarta.ws.rs.Path")
3834
annotation("jakarta.enterprise.context.ApplicationScoped")

integration-tests/devtools/src/test/resources/__snapshots__/KotlinSerializationCodestartTest/testGradleKotlinContent/build.gradle.kts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,6 @@ java {
3333
targetCompatibility = JavaVersion.VERSION_17
3434
}
3535

36-
tasks.withType<Test> {
37-
systemProperty("java.util.logging.manager", "org.jboss.logmanager.LogManager")
38-
jvmArgs("--add-opens", "java.base/java.lang=ALL-UNNAMED")
39-
}
4036
allOpen {
4137
annotation("jakarta.ws.rs.Path")
4238
annotation("jakarta.enterprise.context.ApplicationScoped")

0 commit comments

Comments
 (0)