Mercurial > hg > graal-jvmci-8
changeset 18326:840257b6cdc5
mx: added --fail-fast option to unittest that stops Junit after first input class causing a test failure
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Mon, 10 Nov 2014 18:16:21 +0100 |
parents | 6f99dae5df57 |
children | 13273385abb5 |
files | graal/com.oracle.graal.test/src/com/oracle/graal/test/GraalJUnitCore.java graal/com.oracle.graal.test/src/com/oracle/graal/test/GraalTextListener.java graal/com.oracle.graal.test/src/com/oracle/graal/test/GraalVerboseTextListener.java mx/mx_graal.py |
diffstat | 4 files changed, 39 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- 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<Failure> 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);
--- 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
--- 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
--- 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 <file> 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 <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='<path>') parser.add_argument('--whitelist', help='run testcases specified in whitelist only', metavar='<path>') 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='<regex>') parser.add_argument('--color', help='enable color output', action='store_true')