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')