# HG changeset patch # User Doug Simon # Date 1415639781 -3600 # Node ID 840257b6cdc5ea315b9ec83892febe5a46178dec # Parent 6f99dae5df578dc62eebd48c72fc6f45a0f483c1 mx: added --fail-fast option to unittest that stops Junit after first input class causing a test failure diff -r 6f99dae5df57 -r 840257b6cdc5 graal/com.oracle.graal.test/src/com/oracle/graal/test/GraalJUnitCore.java --- a/graal/com.oracle.graal.test/src/com/oracle/graal/test/GraalJUnitCore.java Mon Nov 10 18:13:01 2014 +0100 +++ b/graal/com.oracle.graal.test/src/com/oracle/graal/test/GraalJUnitCore.java Mon Nov 10 18:16:21 2014 +0100 @@ -30,6 +30,8 @@ import org.junit.internal.*; import org.junit.runner.*; import org.junit.runner.notification.*; +import org.junit.runners.*; +import org.junit.runners.model.*; public class GraalJUnitCore { @@ -52,6 +54,7 @@ List missingClasses = new ArrayList<>(); boolean verbose = false; boolean enableTiming = false; + boolean failFast = false; boolean color = false; boolean eagerStackTrace = false; boolean gcAfterTest = false; @@ -63,6 +66,8 @@ // command line arguments if (each.contentEquals("-JUnitVerbose")) { verbose = true; + } else if (each.contentEquals("-JUnitFailFast")) { + failFast = true; } else if (each.contentEquals("-JUnitEnableTiming")) { enableTiming = true; } else if (each.contentEquals("-JUnitColor")) { @@ -107,12 +112,13 @@ } } } - GraalJUnitRunListener graalListener; + final GraalTextListener textListener; if (!verbose) { - graalListener = new GraalTextListener(system); + textListener = new GraalTextListener(system); } else { - graalListener = new GraalVerboseTextListener(system); + textListener = new GraalVerboseTextListener(system); } + GraalJUnitRunListener graalListener = textListener; if (enableTiming) { graalListener = new TimingDecorator(graalListener); } @@ -132,6 +138,24 @@ } else { request = Request.method(classes.get(0), methodName); } + if (failFast) { + Runner runner = request.getRunner(); + if (runner instanceof ParentRunner) { + ParentRunner parentRunner = (ParentRunner) runner; + parentRunner.setScheduler(new RunnerScheduler() { + public void schedule(Runnable childStatement) { + if (textListener.getLastFailure() == null) { + childStatement.run(); + } + } + + public void finished() { + } + }); + } else { + system.out().println("Unexpected Runner subclass " + runner.getClass().getName() + " - fail fast not supported"); + } + } Result result = junitCore.run(request); for (Failure each : missingClasses) { result.getFailures().add(each); diff -r 6f99dae5df57 -r 840257b6cdc5 graal/com.oracle.graal.test/src/com/oracle/graal/test/GraalTextListener.java --- a/graal/com.oracle.graal.test/src/com/oracle/graal/test/GraalTextListener.java Mon Nov 10 18:13:01 2014 +0100 +++ b/graal/com.oracle.graal.test/src/com/oracle/graal/test/GraalTextListener.java Mon Nov 10 18:16:21 2014 +0100 @@ -31,6 +31,7 @@ public class GraalTextListener implements GraalJUnitRunListener { private final PrintStream fWriter; + protected Failure lastFailure; public GraalTextListener(JUnitSystem system) { this(system.out()); @@ -45,6 +46,10 @@ return fWriter; } + public Failure getLastFailure() { + return lastFailure; + } + @Override public void testRunStarted(Description description) { } @@ -77,6 +82,7 @@ @Override public void testFailed(Failure failure) { getWriter().print('E'); + lastFailure = failure; } @Override diff -r 6f99dae5df57 -r 840257b6cdc5 graal/com.oracle.graal.test/src/com/oracle/graal/test/GraalVerboseTextListener.java --- a/graal/com.oracle.graal.test/src/com/oracle/graal/test/GraalVerboseTextListener.java Mon Nov 10 18:13:01 2014 +0100 +++ b/graal/com.oracle.graal.test/src/com/oracle/graal/test/GraalVerboseTextListener.java Mon Nov 10 18:16:21 2014 +0100 @@ -71,6 +71,7 @@ @Override public void testFailed(Failure failure) { getWriter().print("FAILED"); + lastFailure = failure; } @Override diff -r 6f99dae5df57 -r 840257b6cdc5 mx/mx_graal.py --- a/mx/mx_graal.py Mon Nov 10 18:13:01 2014 +0100 +++ b/mx/mx_graal.py Mon Nov 10 18:16:21 2014 +0100 @@ -1141,7 +1141,7 @@ f_testfile.close() harness(projectsCp, vmArgs) -def _unittest(args, annotations, prefixCp="", blacklist=None, whitelist=None, verbose=False, enable_timing=False, regex=None, color=False, eager_stacktrace=False, gc_after_test=False): +def _unittest(args, annotations, prefixCp="", blacklist=None, whitelist=None, verbose=False, fail_fast=False, enable_timing=False, regex=None, color=False, eager_stacktrace=False, gc_after_test=False): testfile = os.environ.get('MX_TESTFILE', None) if testfile is None: (_, testfile) = tempfile.mkstemp(".testclasses", "graal") @@ -1151,6 +1151,8 @@ coreArgs = [] if verbose: coreArgs.append('-JUnitVerbose') + if fail_fast: + coreArgs.append('-JUnitFailFast') if enable_timing: coreArgs.append('-JUnitEnableTiming') if color: @@ -1206,6 +1208,7 @@ --whitelist run only testcases which are included in the given whitelist --verbose enable verbose JUnit output + --fail-fast stop after first JUnit test class that has a failure --enable-timing enable JUnit test timing --regex run only testcases matching a regular expression --color enable colors output @@ -1250,6 +1253,7 @@ parser.add_argument('--blacklist', help='run all testcases not specified in the blacklist', metavar='') parser.add_argument('--whitelist', help='run testcases specified in whitelist only', metavar='') parser.add_argument('--verbose', help='enable verbose JUnit output', action='store_true') + parser.add_argument('--fail-fast', help='stop after first JUnit test class that has a failure', action='store_true') parser.add_argument('--enable-timing', help='enable JUnit test timing', action='store_true') parser.add_argument('--regex', help='run only testcases matching a regular expression', metavar='') parser.add_argument('--color', help='enable color output', action='store_true')