summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/etc/testcases/taskdefs/optional/junitlauncher.xml46
-rw-r--r--src/main/org/apache/tools/ant/taskdefs/optional/junitlauncher/ForkDefinition.java18
-rw-r--r--src/main/org/apache/tools/ant/taskdefs/optional/junitlauncher/StandaloneLauncher.java3
-rw-r--r--src/tests/junit/org/apache/tools/ant/taskdefs/optional/junitlauncher/JUnitLauncherTaskTest.java71
-rw-r--r--src/tests/junit/org/example/junitlauncher/Tracker.java17
5 files changed, 144 insertions, 11 deletions
diff --git a/src/etc/testcases/taskdefs/optional/junitlauncher.xml b/src/etc/testcases/taskdefs/optional/junitlauncher.xml
index 35b2c3f36..d24421371 100644
--- a/src/etc/testcases/taskdefs/optional/junitlauncher.xml
+++ b/src/etc/testcases/taskdefs/optional/junitlauncher.xml
@@ -43,7 +43,6 @@
<path id="test.classpath">
<pathelement location="${build.classes.dir}"/>
- <path refid="junit.platform.classpath"/>
<path refid="junit.engine.vintage.classpath"/>
<path refid="junit.engine.jupiter.classpath"/>
</path>
@@ -166,5 +165,50 @@
</test>
</junitlauncher>
</target>
+
+ <target name="test-junit-platform-lib-excluded" depends="init">
+ <junitlauncher>
+ <classpath refid="junit.engine.jupiter.classpath"/>
+ <classpath>
+ <pathelement location="${build.classes.dir}"/>
+ </classpath>
+ <test name="org.example.junitlauncher.jupiter.JupiterSampleTest" outputdir="${output.dir}">
+ <!-- expect the test to not be launched due to CNFE on JUnit platform classes -->
+ <fork dir="${basedir}" includeJUnitPlatformLibraries="false"/>
+ </test>
+ </junitlauncher>
+ </target>
+
+ <target name="test-junit-ant-runtime-lib-excluded" depends="init">
+ <junitlauncher>
+ <classpath refid="junit.engine.jupiter.classpath"/>
+ <classpath>
+ <pathelement location="${build.classes.dir}"/>
+ </classpath>
+ <test name="org.example.junitlauncher.jupiter.JupiterSampleTest" outputdir="${output.dir}">
+ <!-- expect the test to not be launched due to CNFE on Ant runtime classes -->
+ <fork dir="${basedir}" includeAntRuntimeLibraries="false"/>
+ </test>
+ </junitlauncher>
+ </target>
+
+ <target name="test-junit-platform-lib-custom-location" depends="init">
+ <junitlauncher>
+ <classpath refid="junit.engine.jupiter.classpath"/>
+ <classpath>
+ <pathelement location="${build.classes.dir}"/>
+ </classpath>
+ <!-- we set includeJUnitPlatformLibraries=false on the fork element
+ and then explicitly specify a location of the JUnit platform libraries -->
+ <classpath refid="junit.platform.classpath"/>
+ <test name="org.example.junitlauncher.jupiter.JupiterSampleTest" outputdir="${output.dir}">
+ <listener classname="org.example.junitlauncher.Tracker"
+ outputDir="${output.dir}"
+ resultFile="${test-junit-platform-lib-custom-location.tracker}"
+ if="test-junit-platform-lib-custom-location.tracker"/>
+ <fork dir="${basedir}" includeJUnitPlatformLibraries="false"/>
+ </test>
+ </junitlauncher>
+ </target>
</project>
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junitlauncher/ForkDefinition.java b/src/main/org/apache/tools/ant/taskdefs/optional/junitlauncher/ForkDefinition.java
index bda3381db..c5c95cc0d 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/junitlauncher/ForkDefinition.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/junitlauncher/ForkDefinition.java
@@ -41,7 +41,7 @@ import java.io.File;
public class ForkDefinition {
private boolean includeAntRuntimeLibraries = true;
- private boolean includeJunitPlatformLibraries = true;
+ private boolean includeJUnitPlatformLibraries = true;
private final CommandlineJava commandLineJava;
private final Environment env = new Environment();
@@ -69,6 +69,14 @@ public class ForkDefinition {
return this.timeout;
}
+ public void setIncludeJUnitPlatformLibraries(final boolean include) {
+ this.includeJUnitPlatformLibraries = include;
+ }
+
+ public void setIncludeAntRuntimeLibraries(final boolean include) {
+ this.includeAntRuntimeLibraries = include;
+ }
+
public Commandline.Argument createJvmArg() {
return this.commandLineJava.createVmArgument();
}
@@ -121,19 +129,23 @@ public class ForkDefinition {
addAntRuntimeResourceSource(antRuntimeResourceSources, task, toResourceName(AntMain.class));
addAntRuntimeResourceSource(antRuntimeResourceSources, task, toResourceName(Task.class));
addAntRuntimeResourceSource(antRuntimeResourceSources, task, toResourceName(JUnitLauncherTask.class));
+ } else {
+ task.log("Excluding Ant runtime libraries from forked JVM classpath", Project.MSG_DEBUG);
}
-
- if (this.includeJunitPlatformLibraries) {
+ if (this.includeJUnitPlatformLibraries) {
// platform-engine
addAntRuntimeResourceSource(antRuntimeResourceSources, task, toResourceName(TestEngine.class));
// platform-launcher
addAntRuntimeResourceSource(antRuntimeResourceSources, task, toResourceName(LauncherFactory.class));
// platform-commons
addAntRuntimeResourceSource(antRuntimeResourceSources, task, toResourceName(Testable.class));
+ } else {
+ task.log("Excluding JUnit platform libraries from forked JVM classpath", Project.MSG_DEBUG);
}
final Path classPath = cmdLine.createClasspath(project);
classPath.createPath().append(antRuntimeResourceSources);
+
return cmdLine;
}
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junitlauncher/StandaloneLauncher.java b/src/main/org/apache/tools/ant/taskdefs/optional/junitlauncher/StandaloneLauncher.java
index 8f43da373..69a1556c8 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/junitlauncher/StandaloneLauncher.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/junitlauncher/StandaloneLauncher.java
@@ -98,7 +98,6 @@ public class StandaloneLauncher {
i = i + numArgsConsumed;
}
-
launchDefinition.setTestExecutionContext(forkedExecution);
final LauncherSupport launcherSupport = new LauncherSupport(launchDefinition);
try {
@@ -106,8 +105,8 @@ public class StandaloneLauncher {
} catch (Throwable t) {
if (launcherSupport.hasTestFailures()) {
System.exit(Constants.FORK_EXIT_CODE_TESTS_FAILED);
- throw t;
}
+ throw t;
}
if (launcherSupport.hasTestFailures()) {
System.exit(Constants.FORK_EXIT_CODE_TESTS_FAILED);
diff --git a/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junitlauncher/JUnitLauncherTaskTest.java b/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junitlauncher/JUnitLauncherTaskTest.java
index 8c3fbf2c0..cdae304d2 100644
--- a/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junitlauncher/JUnitLauncherTaskTest.java
+++ b/src/tests/junit/org/apache/tools/ant/taskdefs/optional/junitlauncher/JUnitLauncherTaskTest.java
@@ -187,6 +187,77 @@ public class JUnitLauncherTaskTest {
ForkedTest.class.getName(), "testSysProp"));
}
+ /**
+ * Tests that in a forked mode execution of tests, when the {@code includeJUnitPlatformLibraries} attribute
+ * is set to false, then the execution of such tests fails with a classloading error for the JUnit platform
+ * classes
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testExcludeJUnitPlatformLibs() throws Exception {
+ final String targetName = "test-junit-platform-lib-excluded";
+ try {
+ buildRule.executeTarget(targetName);
+ Assert.fail(targetName + " was expected to fail since JUnit platform libraries " +
+ "weren't included in the classpath of the forked JVM");
+ } catch (BuildException be) {
+ // expect a ClassNotFoundException for a JUnit platform class
+ final String cnfeMessage = ClassNotFoundException.class.getName() + ": org.junit.platform";
+ if (!buildRule.getFullLog().contains(cnfeMessage)) {
+ throw be;
+ }
+ }
+ final String exlusionLogMsg = "Excluding JUnit platform libraries";
+ Assert.assertTrue("JUnit platform libraries weren't excluded from classpath", buildRule.getFullLog().contains(exlusionLogMsg));
+ }
+
+ /**
+ * Tests that in a forked mode execution of tests, when the {@code includeAntRuntimeLibraries} attribute
+ * is set to false, then the execution of such tests fails with a classloading error for the Ant runtime
+ * classes
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testExcludeAntRuntimeLibs() throws Exception {
+ final String targetName = "test-junit-ant-runtime-lib-excluded";
+ try {
+ buildRule.executeTarget(targetName);
+ Assert.fail(targetName + " was expected to fail since JUnit platform libraries " +
+ "weren't included in the classpath of the forked JVM");
+ } catch (BuildException be) {
+ // expect a Error due to missing main class (which is part of Ant runtime libraries
+ // that we excluded)
+ final String missingMainClass = "Could not find or load main class " + StandaloneLauncher.class.getName();
+ if (!buildRule.getFullLog().contains(missingMainClass)) {
+ throw be;
+ }
+ }
+ final String exlusionLogMsg = "Excluding Ant runtime libraries";
+ Assert.assertTrue("Ant runtime libraries weren't excluded from classpath", buildRule.getFullLog().contains(exlusionLogMsg));
+ }
+
+
+ /**
+ * Tests that in a forked mode execution, with {@code includeJUnitPlatformLibraries} attribute set to false
+ * and with the test classpath explicitly including JUnit platform library jars, the tests are executed successfully
+ *
+ * @throws Exception
+ */
+ @Test
+ public void testJUnitPlatformLibsCustomLocation() throws Exception {
+ final String targetName = "test-junit-platform-lib-custom-location";
+ final Path trackerFile = setupTrackerProperty(targetName);
+ buildRule.executeTarget(targetName);
+ final String exlusionLogMsg = "Excluding JUnit platform libraries";
+ Assert.assertTrue("JUnit platform libraries weren't excluded from classpath", buildRule.getFullLog().contains(exlusionLogMsg));
+ Assert.assertTrue("JupiterSampleTest#testSucceeds was expected to succeed", verifySuccess(trackerFile,
+ JupiterSampleTest.class.getName(), "testSucceeds"));
+ Assert.assertTrue("JupiterSampleTest#testFails was expected to succeed", verifyFailed(trackerFile,
+ JupiterSampleTest.class.getName(), "testFails"));
+ }
+
private Path setupTrackerProperty(final String targetName) {
final String filename = targetName + "-tracker.txt";
buildRule.getProject().setProperty(targetName + ".tracker", filename);
diff --git a/src/tests/junit/org/example/junitlauncher/Tracker.java b/src/tests/junit/org/example/junitlauncher/Tracker.java
index 8ef89b2cb..28ba1e613 100644
--- a/src/tests/junit/org/example/junitlauncher/Tracker.java
+++ b/src/tests/junit/org/example/junitlauncher/Tracker.java
@@ -110,27 +110,34 @@ public class Tracker implements TestResultFormatter {
}
public static boolean wasTestRun(final Path trackerFile, final String className) throws IOException {
- final List<String> lines = Files.readAllLines(trackerFile);
+ final List<String> lines = readTrackerFile(trackerFile);
return lines.contains(PREFIX_TEST_CLASS_STARTED + className);
}
public static boolean wasTestRun(final Path trackerFile, final String className, final String methodName) throws IOException {
- final List<String> lines = Files.readAllLines(trackerFile);
+ final List<String> lines = readTrackerFile(trackerFile);
return lines.contains(PREFIX_TEST_METHOD_STARTED + className + "#" + methodName);
}
public static boolean verifyFailed(final Path trackerFile, final String className, final String methodName) throws IOException {
- final List<String> lines = Files.readAllLines(trackerFile);
+ final List<String> lines = readTrackerFile(trackerFile);
return lines.contains(TestExecutionResult.Status.FAILED + ":test-method:" + className + "#" + methodName);
}
public static boolean verifySuccess(final Path trackerFile, final String className, final String methodName) throws IOException {
- final List<String> lines = Files.readAllLines(trackerFile);
+ final List<String> lines = readTrackerFile(trackerFile);
return lines.contains(TestExecutionResult.Status.SUCCESSFUL + ":test-method:" + className + "#" + methodName);
}
public static boolean verifySkipped(final Path trackerFile, final String className, final String methodName) throws IOException {
- final List<String> lines = Files.readAllLines(trackerFile);
+ final List<String> lines = readTrackerFile(trackerFile);
return lines.contains(PREFIX_TEST_METHOD_SKIPPED + className + "#" + methodName);
}
+
+ private static List<String> readTrackerFile(final Path trackerFile) throws IOException {
+ if (!Files.isRegularFile(trackerFile)) {
+ throw new RuntimeException(trackerFile + " is either missing or not a file");
+ }
+ return Files.readAllLines(trackerFile);
+ }
}