From 6bbe67a4085b957e2705bfdceade5ec403fbeb69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20J=C4=99drzejewski?= Date: Wed, 14 Mar 2018 18:39:09 +0100 Subject: [PATCH] Fixing #19: custom JVM flags can be now added to run and test tasks --- .../chainsaw/exec/RunTaskConfigurator.java | 7 ++- .../chainsaw/tests/TestTaskConfigurator.java | 7 ++- .../builder/JigsawProjectBuilder.java | 30 +++++++++++ .../integration/CustomFlagsSpec.groovy | 51 +++++++++++++++++++ 4 files changed, 93 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/zyxist/chainsaw/exec/RunTaskConfigurator.java b/src/main/java/com/zyxist/chainsaw/exec/RunTaskConfigurator.java index f129870b..f16a7505 100644 --- a/src/main/java/com/zyxist/chainsaw/exec/RunTaskConfigurator.java +++ b/src/main/java/com/zyxist/chainsaw/exec/RunTaskConfigurator.java @@ -28,6 +28,8 @@ import org.gradle.api.tasks.SourceSetContainer; import java.io.File; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; import static com.zyxist.chainsaw.ChainsawPlugin.PATCH_CONFIGURATION_NAME; @@ -60,7 +62,10 @@ public Optional> doFirst(Project project, final JavaExec run) { cli.patchList().patch(new PatchItem(moduleConfig.getName()).with(resourceOutDir.getAbsolutePath())); moduleConfig.getHacks().applyHacks(cli); - run.setJvmArgs(cli.generateArgs()); + List jvmArgs = new ArrayList<>(); + jvmArgs.addAll(run.getJvmArgs()); + jvmArgs.addAll(cli.generateArgs()); + run.setJvmArgs(jvmArgs); run.setClasspath(project.files()); }); } diff --git a/src/main/java/com/zyxist/chainsaw/tests/TestTaskConfigurator.java b/src/main/java/com/zyxist/chainsaw/tests/TestTaskConfigurator.java index 10f9571b..17a4826b 100644 --- a/src/main/java/com/zyxist/chainsaw/tests/TestTaskConfigurator.java +++ b/src/main/java/com/zyxist/chainsaw/tests/TestTaskConfigurator.java @@ -28,6 +28,8 @@ import org.gradle.api.tasks.SourceSetContainer; import org.gradle.api.tasks.testing.Test; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; import java.util.Optional; @@ -69,7 +71,10 @@ public Optional> doFirst(Project project, final Test testTask) { .with(test.getJava().getOutputDir().getAbsolutePath()) ); - testTask.setJvmArgs(cli.generateArgs()); + List jvmArgs = new ArrayList<>(); + jvmArgs.addAll(testTask.getJvmArgs()); + jvmArgs.addAll(cli.generateArgs()); + testTask.setJvmArgs(jvmArgs); testTask.setClasspath(project.files()); }); } diff --git a/src/test/groovy/com/zyxist/chainsaw/builder/JigsawProjectBuilder.java b/src/test/groovy/com/zyxist/chainsaw/builder/JigsawProjectBuilder.java index fc3d15c9..05014b8e 100644 --- a/src/test/groovy/com/zyxist/chainsaw/builder/JigsawProjectBuilder.java +++ b/src/test/groovy/com/zyxist/chainsaw/builder/JigsawProjectBuilder.java @@ -53,6 +53,8 @@ public class JigsawProjectBuilder { private final List patchConfig = new ArrayList<>(); private final List compilerArgs = new ArrayList<>(); + private final List jvmArgs = new ArrayList<>(); + private final List testJvmArgs = new ArrayList<>(); private final List patchDependencies = new ArrayList<>(); private final List compileDependencies = new ArrayList<>(); @@ -113,6 +115,16 @@ public JigsawProjectBuilder withCompilerArgs(String arg) { return this; } + public JigsawProjectBuilder withJvmArgs(String arg) { + this.jvmArgs.add(arg); + return this; + } + + public JigsawProjectBuilder withTestJvmArgs(String arg) { + this.testJvmArgs.add(arg); + return this; + } + public JigsawProjectBuilder dontUseExplicitModuleName() { this.useExplicitModuleName = false; return this; @@ -259,6 +271,7 @@ public JigsawProjectBuilder createGradleBuild() throws IOException { generateRepositories(build); generateDependencies(build); generateApplicationConfig(build); + generateTestConfig(build); generateJavaModuleConfig(build); generateCompilerArgs(build); if (useJavadoc) { @@ -291,6 +304,23 @@ private void generateApplicationConfig(StringBuilder build) { if (null != mainClassName) { build.append("mainClassName = '"+mainClassName+"'\n"); } + if (!jvmArgs.isEmpty()) { + build.append("run {\n"); + for (String arg: jvmArgs) { + build.append(" jvmArgs << '" + arg + "';\n"); + } + build.append("}\n"); + } + } + + private void generateTestConfig(StringBuilder build) { + if (!testJvmArgs.isEmpty()) { + build.append("test {\n"); + for (String arg: testJvmArgs) { + build.append(" jvmArgs '" + arg + "'\n"); + } + build.append("}\n"); + } } private void generateJavaModuleConfig(StringBuilder build) { diff --git a/src/test/groovy/com/zyxist/chainsaw/integration/CustomFlagsSpec.groovy b/src/test/groovy/com/zyxist/chainsaw/integration/CustomFlagsSpec.groovy index 0802880b..eb503aba 100644 --- a/src/test/groovy/com/zyxist/chainsaw/integration/CustomFlagsSpec.groovy +++ b/src/test/groovy/com/zyxist/chainsaw/integration/CustomFlagsSpec.groovy @@ -15,6 +15,7 @@ */ package com.zyxist.chainsaw.integration +import com.zyxist.chainsaw.builder.Dependencies import com.zyxist.chainsaw.builder.JigsawProjectBuilder import org.gradle.testkit.runner.GradleRunner import org.junit.Rule @@ -95,4 +96,54 @@ class CustomFlagsSpec extends Specification { result.output.contains("-proc:none") new File(tmpDir.root, "build/libs/modular.jar").exists() } + + @IgnoreIf({NOT_JAVA_9}) + def "it is possible to apply custom JVM arguments"() { + given: + project + .mainClass("com.example.AClass") + .createJavaFile(runnableJavaClass()) + .withJvmArgs("-XX:NewSize=64M") + .createModuleDescriptor() + .createGradleBuild() + + when: + def result = GradleRunner.create() + .withProjectDir(project.root) + .withDebug(true) + .forwardOutput() + .withArguments("run", "--debug") + .withPluginClasspath().build() + + then: + result.task(":run").outcome == SUCCESS + result.output.contains("--module-path") + result.output.contains("-XX:NewSize=64M") + } + + @IgnoreIf({NOT_JAVA_9}) + def "it is possible to apply custom JVM arguments for tests"() { + given: + project + .testCompileDependency(Dependencies.JUNIT4_DEPENDENCY) + .mainClass("com.example.AClass") + .createJavaFile(runnableJavaClass()) + .createJavaTestFile(junit4Test()) + .withTestJvmArgs("-XX:NewSize=128M") + .createModuleDescriptor() + .createGradleBuild() + + when: + def result = GradleRunner.create() + .withProjectDir(project.root) + .withDebug(true) + .forwardOutput() + .withArguments("check", "--debug") + .withPluginClasspath().build() + + then: + result.task(":test").outcome == SUCCESS + result.output.contains("--module-path") + result.output.contains("-XX:NewSize=128M") + } }