You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ti...@apache.org on 2018/02/16 22:49:17 UTC

[1/2] maven-surefire git commit: [SUREFIRE-1472] Multibranch Pipeline supports JDK 7-10 Maven 3.2-3.5 Linux Windows [Forced Update!]

Repository: maven-surefire
Updated Branches:
  refs/heads/SUREFIRE-1463 334fb462a -> ea8932326 (forced update)


http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerUtilTest.java
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerUtilTest.java b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerUtilTest.java
index e41dbaa..df6ca1c 100644
--- a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerUtilTest.java
+++ b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerUtilTest.java
@@ -32,7 +32,6 @@ import org.junit.experimental.theories.DataPoint;
 import org.junit.experimental.theories.Theories;
 import org.junit.experimental.theories.Theory;
 import org.junit.rules.ExpectedException;
-import org.junit.rules.Stopwatch;
 import org.junit.runner.JUnitCore;
 import org.junit.runner.Result;
 import org.junit.runner.RunWith;
@@ -46,7 +45,6 @@ import static org.apache.maven.surefire.junitcore.pc.ParallelComputerUtil.*;
 import static org.apache.maven.surefire.junitcore.JUnitCoreParameters.*;
 import static org.hamcrest.core.Is.is;
 import static org.junit.Assert.*;
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
 
 /**
  * Testing an algorithm in {@link ParallelComputerUtil} which configures
@@ -70,9 +68,6 @@ public final class ParallelComputerUtilTest
     @Rule
     public final ExpectedException exception = ExpectedException.none();
 
-    @Rule
-    public final Stopwatch stopwatch = new Stopwatch() {};
-
     @BeforeClass
     public static void beforeClass()
     {
@@ -968,7 +963,6 @@ public final class ParallelComputerUtilTest
 
     @Test
     public void withoutShutdown()
-        throws TestSetFailedException, ExecutionException, InterruptedException
     {
         Map<String, String> properties = new HashMap<String, String>();
         properties.put(PARALLEL_KEY, "methods");
@@ -976,9 +970,12 @@ public final class ParallelComputerUtilTest
         JUnitCoreParameters params = new JUnitCoreParameters( properties );
         ParallelComputerBuilder pcBuilder = new ParallelComputerBuilder( logger, params );
         ParallelComputer pc = pcBuilder.buildComputer();
-        Result result = new JUnitCore().run( pc, TestClass.class );
-        long timeSpent = stopwatch.runtime( MILLISECONDS );
-        long deltaTime = 500L;
+        final JUnitCore core = new JUnitCore();
+        final long t1 = System.currentTimeMillis();
+        final Result result = core.run( pc, TestClass.class );
+        final long t2 = System.currentTimeMillis();
+        long timeSpent = t2 - t1;
+        final long deltaTime = 500L;
 
         assertTrue( result.wasSuccessful() );
         assertThat( result.getRunCount(), is( 3 ) );
@@ -989,7 +986,7 @@ public final class ParallelComputerUtilTest
 
     @Test
     public void shutdown()
-        throws TestSetFailedException, ExecutionException, InterruptedException
+        throws TestSetFailedException
     {
         // The JUnitCore returns after 2.5s.
         // The test-methods in TestClass are NOT interrupted, and return normally after 5s.
@@ -1000,9 +997,12 @@ public final class ParallelComputerUtilTest
         JUnitCoreParameters params = new JUnitCoreParameters( properties );
         ParallelComputerBuilder pcBuilder = new ParallelComputerBuilder( logger, params );
         ParallelComputer pc = pcBuilder.buildComputer();
-        new JUnitCore().run( pc, TestClass.class );
-        long timeSpent = stopwatch.runtime( MILLISECONDS );
-        long deltaTime = 500L;
+        final JUnitCore core = new JUnitCore();
+        final long t1 = System.currentTimeMillis();
+        core.run( pc, TestClass.class );
+        final long t2 = System.currentTimeMillis();
+        final long timeSpent = t2 - t1;
+        final long deltaTime = 500L;
 
         assertEquals( 5000L, timeSpent, deltaTime );
         String description = pc.describeElapsedTimeout();
@@ -1013,19 +1013,22 @@ public final class ParallelComputerUtilTest
 
     @Test
     public void forcedShutdown()
-        throws TestSetFailedException, ExecutionException, InterruptedException
+        throws TestSetFailedException
     {
         // The JUnitCore returns after 2.5s, and the test-methods in TestClass are interrupted.
         Map<String, String> properties = new HashMap<String, String>();
         properties.put(PARALLEL_KEY, "methods");
         properties.put(THREADCOUNTMETHODS_KEY, "2");
-        properties.put(PARALLEL_TIMEOUTFORCED_KEY, Double.toString(2.5d));
+        properties.put(PARALLEL_TIMEOUTFORCED_KEY, Double.toString( 2.5d ));
         JUnitCoreParameters params = new JUnitCoreParameters( properties );
         ParallelComputerBuilder pcBuilder = new ParallelComputerBuilder( logger, params );
         ParallelComputer pc = pcBuilder.buildComputer();
-        new JUnitCore().run( pc, TestClass.class );
-        long timeSpent = stopwatch.runtime( MILLISECONDS );
-        long deltaTime = 500L;
+        final JUnitCore core = new JUnitCore();
+        final long t1 = System.currentTimeMillis();
+        core.run( pc, TestClass.class );
+        final long t2 = System.currentTimeMillis();
+        final long timeSpent = t2 - t1;
+        final long deltaTime = 500L;
 
         assertEquals( 2500L, timeSpent, deltaTime );
         String description = pc.describeElapsedTimeout();
@@ -1036,7 +1039,7 @@ public final class ParallelComputerUtilTest
 
     @Test
     public void timeoutAndForcedShutdown()
-        throws TestSetFailedException, ExecutionException, InterruptedException
+        throws TestSetFailedException
     {
         // The JUnitCore returns after 3.5s and the test-methods in TestClass are timed out after 2.5s.
         // No new test methods are scheduled for execution after 2.5s.
@@ -1044,14 +1047,17 @@ public final class ParallelComputerUtilTest
         Map<String, String> properties = new HashMap<String, String>();
         properties.put(PARALLEL_KEY, "methods");
         properties.put(THREADCOUNTMETHODS_KEY, "2");
-        properties.put(PARALLEL_TIMEOUT_KEY, Double.toString(2.5d));
-        properties.put(PARALLEL_TIMEOUTFORCED_KEY, Double.toString(3.5d));
+        properties.put(PARALLEL_TIMEOUT_KEY, Double.toString( 2.5d ));
+        properties.put(PARALLEL_TIMEOUTFORCED_KEY, Double.toString( 3.5d ));
         JUnitCoreParameters params = new JUnitCoreParameters( properties );
         ParallelComputerBuilder pcBuilder = new ParallelComputerBuilder( logger, params );
         ParallelComputer pc = pcBuilder.buildComputer();
-        new JUnitCore().run( pc, TestClass.class );
-        long timeSpent = stopwatch.runtime( MILLISECONDS );
-        long deltaTime = 500L;
+        final JUnitCore core = new JUnitCore();
+        final long t1 = System.currentTimeMillis();
+        core.run( pc, TestClass.class );
+        final long t2 = System.currentTimeMillis();
+        final long timeSpent = t2 - t1;
+        final long deltaTime = 500L;
 
         assertEquals( 3500L, timeSpent, deltaTime );
         String description = pc.describeElapsedTimeout();
@@ -1073,9 +1079,12 @@ public final class ParallelComputerUtilTest
         JUnitCoreParameters params = new JUnitCoreParameters( properties );
         ParallelComputerBuilder pcBuilder = new ParallelComputerBuilder( logger, params );
         ParallelComputer pc = pcBuilder.buildComputer();
-        new JUnitCore().run( pc, TestClass.class );
-        long timeSpent = stopwatch.runtime( MILLISECONDS );
-        long deltaTime = 500L;
+        final JUnitCore core = new JUnitCore();
+        final long t1 = System.currentTimeMillis();
+        core.run( pc, TestClass.class );
+        final long t2 = System.currentTimeMillis();
+        final long timeSpent = t2 - t1;
+        final long deltaTime = 500L;
 
         assertEquals( 3500L, timeSpent, deltaTime );
         String description = pc.describeElapsedTimeout();

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/surefire-report-parser/pom.xml
----------------------------------------------------------------------
diff --git a/surefire-report-parser/pom.xml b/surefire-report-parser/pom.xml
index 60d570f..c91a9ed 100644
--- a/surefire-report-parser/pom.xml
+++ b/surefire-report-parser/pom.xml
@@ -54,16 +54,18 @@
     <plugins>
       <plugin>
         <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <redirectTestOutputToFile>true</redirectTestOutputToFile>
-        </configuration>
         <dependencies>
           <dependency>
             <groupId>org.apache.maven.surefire</groupId>
-            <artifactId>surefire-junit47</artifactId>
-            <version>2.12.4</version>
+            <artifactId>surefire-shadefire</artifactId>
+            <version>2.12.4</version> <!-- ${shadedVersion}, but resolved due to https://issues.apache.org/jira/browse/MRELEASE-799 -->
           </dependency>
         </dependencies>
+        <configuration>
+          <includes>
+            <include>**/JUnit4SuiteTest.java</include>
+          </includes>
+        </configuration>
       </plugin>
       <plugin>
         <!-- Do we need shading here ?? -->

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/surefire-report-parser/src/test/java/org/apache/maven/plugins/surefire/report/JUnit4SuiteTest.java
----------------------------------------------------------------------
diff --git a/surefire-report-parser/src/test/java/org/apache/maven/plugins/surefire/report/JUnit4SuiteTest.java b/surefire-report-parser/src/test/java/org/apache/maven/plugins/surefire/report/JUnit4SuiteTest.java
new file mode 100644
index 0000000..142ca9d
--- /dev/null
+++ b/surefire-report-parser/src/test/java/org/apache/maven/plugins/surefire/report/JUnit4SuiteTest.java
@@ -0,0 +1,46 @@
+package org.apache.maven.plugins.surefire.report;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import junit.framework.JUnit4TestAdapter;
+import junit.framework.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * Adapt the JUnit4 tests which use only annotations to the JUnit3 test suite.
+ *
+ * @author Tibor Digana (tibor17)
+ * @since 2.21.0
+ */
+@Suite.SuiteClasses( {
+        ReportTestCaseTest.class,
+        ReportTestSuiteTest.class,
+        SurefireReportParserTest.class,
+        TestSuiteXmlParserTest.class
+} )
+@RunWith( Suite.class )
+public class JUnit4SuiteTest
+{
+    public static Test suite()
+    {
+        return new JUnit4TestAdapter( JUnit4SuiteTest.class );
+    }
+}


[2/2] maven-surefire git commit: [SUREFIRE-1472] Multibranch Pipeline supports JDK 7-10 Maven 3.2-3.5 Linux Windows

Posted by ti...@apache.org.
[SUREFIRE-1472] Multibranch Pipeline supports JDK 7-10 Maven 3.2-3.5 Linux Windows


Project: http://git-wip-us.apache.org/repos/asf/maven-surefire/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven-surefire/commit/ea893232
Tree: http://git-wip-us.apache.org/repos/asf/maven-surefire/tree/ea893232
Diff: http://git-wip-us.apache.org/repos/asf/maven-surefire/diff/ea893232

Branch: refs/heads/SUREFIRE-1463
Commit: ea89323267645b979e4078ac69a56f3894465072
Parents: 09f0eef
Author: Tibor17 <ti...@apache.org>
Authored: Tue Feb 6 05:30:00 2018 +0100
Committer: Tibor17 <ti...@apache.org>
Committed: Fri Feb 16 23:48:52 2018 +0100

----------------------------------------------------------------------
 Jenkinsfile                                     | 357 -------------------
 Jenkinsfile.groovy                              | 284 +++++++++++++++
 maven-failsafe-plugin/pom.xml                   |   5 +
 maven-surefire-common/pom.xml                   |   2 -
 maven-surefire-report-plugin/pom.xml            |   1 +
 pom.xml                                         |  93 +++--
 surefire-api/pom.xml                            |   2 -
 surefire-booter/pom.xml                         |   2 -
 surefire-its/pom.xml                            |  16 +-
 .../maven/surefire/its/JUnit47ParallelIT.java   |   6 +-
 .../apache/maven/surefire/its/UmlautDirIT.java  |  17 +-
 .../surefire/its/fixture/JUnit4SuiteTest.java   |  44 +++
 .../its/fixture/SurefireLauncherTest.java       |   4 -
 ...urefire1295AttributeJvmCrashesToTestsIT.java | 105 +++---
 .../test/resources/crash-during-test/pom.xml    |  13 +
 .../java/junit44/environment/BasicTest.java     |  52 ---
 .../java/junit44/environment/SomeOtherTest.java |  28 --
 .../junit44/environment/Test1CrashedTest.java   |  52 +++
 .../junit44/environment/Test2WaitingTest.java   |  34 ++
 .../java/junit44/environment/Test3FastTest.java |  30 ++
 surefire-providers/pom.xml                      |   1 -
 surefire-providers/surefire-junit3/pom.xml      |   1 -
 surefire-providers/surefire-junit4/pom.xml      |   6 -
 .../surefire/junitcore/pc/ParallelComputer.java |  22 +-
 .../junitcore/pc/ParallelComputerBuilder.java   |   2 +-
 .../pc/ParallelComputerBuilderTest.java         |  82 +++--
 .../junitcore/pc/ParallelComputerUtilTest.java  |  63 ++--
 surefire-report-parser/pom.xml                  |  12 +-
 .../surefire/report/JUnit4SuiteTest.java        |  46 +++
 29 files changed, 757 insertions(+), 625 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/Jenkinsfile
----------------------------------------------------------------------
diff --git a/Jenkinsfile b/Jenkinsfile
deleted file mode 100644
index c080713..0000000
--- a/Jenkinsfile
+++ /dev/null
@@ -1,357 +0,0 @@
-#!/usr/bin/env groovy
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-properties(
-    [
-        buildDiscarder(logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '0', daysToKeepStr: env.BRANCH_NAME == 'master' ? '30' : '7', numToKeepStr: '5')),
-        disableConcurrentBuilds()
-    ]
-)
-
-def oses = ['windows']  // ['linux', 'windows']
-def mavens = env.BRANCH_NAME == 'master' ? ['3.2.x', '3.3.x', '3.5.x'] : ['3.5.x']
-def jdks = ['9'] // env.BRANCH_NAME == 'master' ? ['7', '8', '9', '10'] : ['10']
-
-def cmd = ['mvn']
-def options = ['-e', '-V', '-nsu']
-def optionsITs = ['-e', '-V', '-nsu', '-P', 'run-its']
-def goals = ['clean', 'install' , 'jacoco:report']
-def goalsITs = ['verify']
-def Map stages = [:]
-
-oses.eachWithIndex { os, indexOfOs ->
-
-    mavens.eachWithIndex { maven, indexOfMaven ->
-
-        jdks.eachWithIndex { jdk, indexOfJdk ->
-
-            def String label = jenkinsEnv.labelForOS(os);
-            def String jdkTestName = jenkinsEnv.jdkFromVersion(os, jdk)
-            def String jdkName = jenkinsEnv.jdkFromVersion(os, '8')
-            def String mvnName = jenkinsEnv.mvnFromVersion(os, maven)
-
-            def stageKey = "${os}-jdk${jdk}-maven${maven}"
-
-            if (label == null || jdkTestName == null || mvnName == null) {
-                println "Skipping ${stageKey} as unsupported by Jenkins Environment."
-                return;
-            }
-
-            println "${stageKey}  ==>  Label: ${label}, JDK: ${jdkTestName}, Maven: ${mvnName}."
-
-
-            stages[stageKey] = {
-                if (os == 'windows') {
-                    node("${env.WIN_LABEL}") {
-                        try {
-                            println "Basedir = ${pwd()}."
-
-                            def mvnLocalRepoDir
-
-                            dir('.repository') {
-                                mvnLocalRepoDir = "${pwd()}"
-                            }
-
-                            println "Maven Local Repository = ${mvnLocalRepoDir}."
-
-                            dir('build') {
-                                stage("checkout ${stageKey}") {
-                                    checkout scm
-                                }
-
-                                def jdkTestHome = resolveToolNameToJavaPath(jdkTestName, mvnName)
-                                def properties = ["\"-Djdk.home=${jdkTestHome}\"", "-Djacoco.skip=true"]
-                                println("Setting JDK for testing ${properties[0]}")
-
-                                stage("build ${stageKey}") {
-                                    withMaven(jdk: jdkName, maven: mvnName,
-                                        mavenLocalRepo: mvnLocalRepoDir, mavenOpts: '-Xmx512m',
-                                        options: [
-                                            artifactsPublisher(disabled: true),
-                                    ]) {
-                                        def script = cmd + options + goals + properties
-                                        bat script.join(' ')
-                                    }
-                                }
-
-                                def propertiesITs = properties
-
-                                stage("build-failsafe-it ${stageKey}") {
-//                                    lock('maven-surefire-its') {
-//                                        timeout(time: 15, unit: 'MINUTES') {
-//                                            withMaven(jdk: jdkName, maven: mvnName,
-//                                                mavenLocalRepo: mvnLocalRepoDir, mavenOpts: '-Xmx512m',
-//                                                options: [
-//                                                    invokerPublisher(),
-//                                                    artifactsPublisher(disabled: true)
-//                                            ]) {
-//                                                def script = cmd + optionsITs + goalsITs + propertiesITs
-//                                                bat script.join(' ')
-//                                            }
-//                                        }
-//                                    }
-                                }
-                            }
-                        } finally {
-//                            Wait for INFRA installation of Pipeline Utils, use fileExists()
-//                            if (fileExists('build/maven-failsafe-plugin/target/it') {
-//                                zip(zipFile: "it--maven-failsafe-plugin--${stageKey}.zip", dir: 'build/maven-failsafe-plugin/target/it', archive: true)
-//                            }
-//
-//                            if (fileExists('build/surefire-its/target') {
-//                                zip(zipFile: "it--surefire-its--${stageKey}.zip", dir: 'build/surefire-its/target', archive: true)
-//                            }
-
-//                            archiveArtifacts(artifacts: 'build/surefire-its/target/**/log.txt', allowEmptyArchive: true, fingerprint: true, onlyIfSuccessful: false)
-
-                            stage("cleanup ${stageKey}") {
-                                // clean up after ourselves to reduce disk space
-                                cleanWs()
-                            }
-                        }
-                    }
-                } else {
-                    node("${env.NIX_LABEL}") {
-                        try {
-                            println "Basedir = ${pwd()}."
-
-                            def mvnLocalRepoDir
-
-                            dir('.repository') {
-                                mvnLocalRepoDir = "${pwd()}"
-                            }
-
-                            println "Maven Local Repository = ${mvnLocalRepoDir}."
-
-                            dir('build') {
-                                stage("checkout ${stageKey}") {
-                                    checkout scm
-                                }
-
-                                def jdkTestHome = resolveToolNameToJavaPath(jdkTestName, mvnName)
-                                //https://github.com/jacoco/jacoco/issues/629
-                                def skipPlugins = jdk != '9'
-                                def properties = ["\"-Djdk.home=${jdkTestHome}\"", "-Djacoco.skip=${skipPlugins}"]
-                                println("Setting JDK for testing ${properties[0]}")
-
-                                stage("build ${stageKey}") {
-                                    withMaven(jdk: jdkName, maven: mvnName,
-                                        mavenLocalRepo: mvnLocalRepoDir, mavenOpts: '-Xmx1g',
-                                        options: [
-                                            findbugsPublisher(disabled: skipPlugins),
-                                            openTasksPublisher(disabled: skipPlugins, ignoreCase: true,
-                                                               pattern: sourcesPatternCsv(),
-                                                               low: tasksViolationLow(),
-                                                               normal: tasksViolationNormal(),
-                                                               high: tasksViolationHigh()),
-                                            artifactsPublisher(disabled: true)
-                                    ]) {
-                                        def script = cmd + options + goals + properties
-                                        sh script.join(' ')
-                                    }
-                                }
-
-                                def propertiesITs = [properties[0], '-Djacoco.skip=true']
-
-                                stage("build-failsafe-it ${stageKey}") {
-//                                    lock('maven-surefire-its') {
-//                                        timeout(time: 15, unit: 'MINUTES') {
-//                                            withMaven(jdk: jdkName, maven: mvnName,
-//                                                mavenLocalRepo: mvnLocalRepoDir, mavenOpts: '-Xmx1g',
-//                                                options: [
-//                                                    invokerPublisher(),
-//                                                    openTasksPublisher(disabled: true, ignoreCase: true,
-//                                                                       pattern: sourcesPatternCsv(),
-//                                                                       low: tasksViolationLow(),
-//                                                                       normal: tasksViolationNormal(),
-//                                                                       high: tasksViolationHigh()),
-//                                                    artifactsPublisher(disabled: true)
-//                                            ]) {
-//                                                def script = cmd + optionsITs + goalsITs + propertiesITs
-//                                                sh script.join(' ')
-//                                            }
-//                                        }
-//                                    }
-                                }
-                            }
-                        } finally {
-                            if (indexOfMaven == mavens.size() - 1 && jdk == '9') {
-                                jacoco(changeBuildStatus: false,
-                                       execPattern: '**/*.exec',
-                                       sourcePattern: sourcesPatternCsv(),
-                                       classPattern: classPatternCsv())
-
-                                junit(healthScaleFactor: 0.0,
-                                      allowEmptyResults: true,
-                                      keepLongStdio: true,
-                                      testResults: testReportsPatternCsv())
-
-                                if (currentBuild.result == 'UNSTABLE') {
-                                    currentBuild.result = 'FAILURE'
-                                }
-                            }
-
-//                            Wait for INFRA installation of Pipeline Utils, use fileExists()
-//                            if (fileExists('build/maven-failsafe-plugin/target/it') {
-//                                zip(zipFile: "it--maven-failsafe-plugin--${stageKey}.zip", dir: 'build/maven-failsafe-plugin/target/it', archive: true)
-//                            }
-//
-//                            if (fileExists('build/surefire-its/target') {
-//                                zip(zipFile: "it--surefire-its--${stageKey}.zip", dir: 'build/surefire-its/target', archive: true)
-//                            }
-//
-//                            sh 'tar czvf it1.tgz build/maven-failsafe-plugin/target/it'
-//                            sh 'tar czvf it2.tgz build/surefire-its/target'
-//                            archiveArtifacts(artifacts: '**/*.tgz', allowEmptyArchive: true, fingerprint: true, onlyIfSuccessful: false)
-//                            archiveArtifacts(artifacts: '*.tgz', allowEmptyArchive: true, fingerprint: true, onlyIfSuccessful: false)
-
-                            stage("cleanup ${stageKey}") {
-                                // clean up after ourselves to reduce disk space
-                                cleanWs()
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
-
-timeout(time: 18, unit: 'HOURS') {
-    try {
-        parallel(stages)
-        // JENKINS-34376 seems to make it hard to detect the aborted builds
-    } catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e) {
-        // this ambiguous condition means a user probably aborted
-        if (e.causes.size() == 0) {
-            currentBuild.result = "ABORTED"
-        } else {
-            currentBuild.result = "FAILURE"
-        }
-        throw e
-    } catch (hudson.AbortException e) {
-        // this ambiguous condition means during a shell step, user probably aborted
-        if (e.getMessage().contains('script returned exit code 143')) {
-            currentBuild.result = "ABORTED"
-        } else {
-            currentBuild.result = "FAILURE"
-        }
-        throw e
-    } catch (InterruptedException e) {
-        currentBuild.result = "ABORTED"
-        throw e
-    } catch (Throwable e) {
-        currentBuild.result = "FAILURE"
-        throw e
-    } finally {
-        stage("notifications") {
-            //jenkinsNotify()
-        }
-    }
-}
-
-/**
- * It is used instead of tool(${jdkTestName}).
- */
-def resolveToolNameToJavaPath(jdkToolName, mvnName) {
-    def javaHome = null
-    try {
-        withMaven(jdk: jdkToolName, maven: mvnName) {
-            javaHome = isUnix() ? sh(script: 'echo -en $JAVA_HOME', returnStdout: true) : bat(script: '@echo %JAVA_HOME%', returnStdout: true)
-        }
-
-        if (javaHome != null) {
-            javaHome = javaHome.trim()
-            def exec = javaHome + (isUnix() ? '/bin/java' : '\\bin\\java.exe')
-            if (!fileExists(exec)) {
-                println "The ${exec} does not exist in jdkToolName=${jdkToolName}."
-                javaHome = null
-            }
-        }
-    } catch(e) {
-        println "Caught an exception while resolving 'jdkToolName' ${jdkToolName} via 'mvnName' ${mvnName}: ${e}"
-        javaHome = null;
-    }
-    assert javaHome != null : "Could not resolve ${jdkToolName} to JAVA_HOME."
-    return javaHome
-}
-
-@NonCPS
-def sourcesPatternCsv() {
-    return '**/maven-failsafe-plugin/src/main/java,' +
-            '**/maven-surefire-common/src/main/java,' +
-            '**/maven-surefire-plugin/src/main/java,' +
-            '**/maven-surefire-report-plugin/src/main/java,' +
-            '**/surefire-api/src/main/java,' +
-            '**/surefire-booter/src/main/java,' +
-            '**/surefire-grouper/src/main/java,' +
-            '**/surefire-its/src/main/java,' +
-            '**/surefire-logger-api/src/main/java,' +
-            '**/surefire-providers/**/src/main/java,' +
-            '**/surefire-report-parser/src/main/java'
-}
-
-@NonCPS
-def classPatternCsv() {
-    return '**/maven-failsafe-plugin/target/classes,' +
-            '**/maven-surefire-common/target/classes,' +
-            '**/maven-surefire-plugin/target/classes,' +
-            '**/maven-surefire-report-plugin/target/classes,' +
-            '**/surefire-api/target/classes,' +
-            '**/surefire-booter/target/classes,' +
-            '**/surefire-grouper/target/classes,' +
-            '**/surefire-its/target/classes,' +
-            '**/surefire-logger-api/target/classes,' +
-            '**/surefire-providers/**/target/classes,' +
-            '**/surefire-report-parser/target/classes'
-}
-
-@NonCPS
-def tasksViolationLow() {
-    return '@SuppressWarnings'
-}
-
-@NonCPS
-def tasksViolationNormal() {
-    return 'TODO,FIXME,@deprecated'
-}
-
-@NonCPS
-def tasksViolationHigh() {
-    return 'finalize(),Locale.setDefault,TimeZone.setDefault,\
-System.out,System.err,System.setOut,System.setErr,System.setIn,System.exit,System.gc,System.runFinalization,System.load'
-}
-
-@NonCPS
-def testReportsPatternCsv() {
-    return '**/maven-failsafe-plugin/target/surefire-reports/*.xml,' +
-            '**/maven-surefire-common/target/surefire-reports/*.xml,' +
-            '**/maven-surefire-plugin/target/surefire-reports/*.xml,' +
-            '**/maven-surefire-report-plugin/target/surefire-reports/*.xml,' +
-            '**/surefire-api/target/surefire-reports/*.xml,' +
-            '**/surefire-booter/target/surefire-reports/*.xml,' +
-            '**/surefire-grouper/target/surefire-reports/*.xml,' +
-            '**/surefire-its/target/surefire-reports/*.xml,' +
-            '**/surefire-logger-api/target/surefire-reports/*.xml,' +
-            '**/surefire-providers/**/target/surefire-reports/*.xml,' +
-            '**/surefire-report-parser/target/surefire-reports/*.xml,' +
-            '**/surefire-its/target/failsafe-reports/*.xml'
-}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/Jenkinsfile.groovy
----------------------------------------------------------------------
diff --git a/Jenkinsfile.groovy b/Jenkinsfile.groovy
new file mode 100644
index 0000000..89b0618
--- /dev/null
+++ b/Jenkinsfile.groovy
@@ -0,0 +1,284 @@
+#!/usr/bin/env groovy
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+properties(
+    [
+        buildDiscarder(logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '0', daysToKeepStr: env.BRANCH_NAME == 'master' ? '30' : '7', numToKeepStr: '5')),
+        disableConcurrentBuilds()
+    ]
+)
+
+final String NIX_LABEL = 'ubuntu-1||ubuntu-4||ubuntu-6||H19||H20'
+final String WIN_LABEL = 'windows-2016-1'
+
+final def oses = ['windows'] // ['linux', 'windows']
+final def mavens = ['3.5.x'] // env.BRANCH_NAME == 'master' ? ['3.2.x', '3.3.x', '3.5.x'] : ['3.5.x']
+final def jdks = ['9'] // env.BRANCH_NAME == 'master' ? ['7', '8', '9', '10'] : ['10']
+
+final def cmd = ['mvn']
+final def options = ['-e', '-V', '-nsu', '-P', 'run-its']
+final def goals = ['clean', 'install', 'jacoco:report']
+final Map stages = [:]
+
+oses.eachWithIndex { os, indexOfOs ->
+    stages[os] = {
+        mavens.eachWithIndex { maven, indexOfMaven ->
+            jdks.eachWithIndex { jdk, indexOfJdk ->
+                final String label = jenkinsEnv.labelForOS(os);
+                final String jdkTestName = jenkinsEnv.jdkFromVersion(os, jdk)
+                final String jdkName = jenkinsEnv.jdkFromVersion(os, '8')
+                final String mvnName = jenkinsEnv.mvnFromVersion(os, maven)
+                final String stageKey = "${os}-jdk${jdk}-maven${maven}"
+
+                if (label == null || jdkTestName == null || mvnName == null) {
+                    println "Skipping ${stageKey} as unsupported by Jenkins Environment."
+                    return;
+                }
+
+                println "${stageKey}  ==>  Label: ${label}, JDK: ${jdkTestName}, Maven: ${mvnName}."
+                if (os == 'windows') {
+                    node(WIN_LABEL) {
+                        buildProcess(stageKey, jdkName, jdkTestName, mvnName, cmd, options, goals, false)
+                    }
+                } else {
+                    node(NIX_LABEL) {
+                        boolean makeReports = indexOfMaven == mavens.size() - 1 && jdk == '9'
+                        buildProcess(stageKey, jdkName, jdkTestName, mvnName, cmd, options, goals, makeReports)
+                    }
+                }
+            }
+        }
+    }
+}
+
+timeout(time: 24, unit: 'HOURS') {
+    try {
+        parallel(stages)
+        // JENKINS-34376 seems to make it hard to detect the aborted builds
+    } catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e) {
+        // this ambiguous condition means a user probably aborted
+        if (e.causes.size() == 0) {
+            currentBuild.result = "ABORTED"
+        } else {
+            currentBuild.result = "FAILURE"
+        }
+        throw e
+    } catch (hudson.AbortException e) {
+        // this ambiguous condition means during a shell step, user probably aborted
+        if (e.getMessage().contains('script returned exit code 143')) {
+            currentBuild.result = "ABORTED"
+        } else {
+            currentBuild.result = "FAILURE"
+        }
+        throw e
+    } catch (InterruptedException e) {
+        currentBuild.result = "ABORTED"
+        throw e
+    } catch (Throwable e) {
+        currentBuild.result = "FAILURE"
+        throw e
+    } finally {
+        stage("notifications") {
+            //jenkinsNotify()
+        }
+    }
+}
+
+def buildProcess(String stageKey, String jdkName, String jdkTestName, String mvnName, cmd, options, goals, boolean makeReports) {
+    cleanWs()
+    try {
+        if (isUnix()) {
+            sh 'mkdir -p .m2'
+        } else {
+            bat 'mkdir .m2'
+        }
+        def mvnLocalRepoDir = null
+        dir('.m2') {
+            mvnLocalRepoDir = "${pwd()}"
+        }
+
+        println "Maven Local Repository = ${mvnLocalRepoDir}."
+        assert mvnLocalRepoDir != null: 'Local Maven Repository is undefined.'
+
+        stage("checkout ${stageKey}") {
+            checkout scm
+        }
+
+        def jdkTestHome = resolveToolNameToJavaPath(jdkTestName, mvnName)
+        //https://github.com/jacoco/jacoco/issues/629
+        def properties = ["\"-Djdk.home=${jdkTestHome}\"", "-Djacoco.skip=${!makeReports}"]
+        println("Setting JDK for testing ${properties[0]}")
+        def mavenOpts = '-server -XX:+UseG1GC -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -Xms64m -Xmx1g -Djava.awt.headless=true'
+
+        stage("build ${stageKey}") {
+            withMaven(jdk: jdkName, maven: mvnName,
+                    mavenLocalRepo: mvnLocalRepoDir, mavenOpts: mavenOpts,
+                    options: [
+                            findbugsPublisher(disabled: !makeReports),
+                            openTasksPublisher(disabled: true),
+                            junitPublisher(disabled: true),
+                            artifactsPublisher(disabled: true),
+                            invokerPublisher(disabled: true)
+                    ]) {
+                def script = cmd + options + goals + properties
+                if (isUnix()) {
+                    sh script.join(' ')
+                } else {
+                    bat script.join(' ')
+                }
+            }
+        }
+    } finally {
+        if (makeReports) {
+            openTasks(ignoreCase: true, canComputeNew: false, defaultEncoding: 'UTF-8', pattern: sourcesPatternCsv(),
+                    high: tasksViolationHigh(), normal: tasksViolationNormal(), low: tasksViolationLow())
+
+            jacoco(changeBuildStatus: false,
+                    execPattern: '**/*.exec',
+                    sourcePattern: sourcesPatternCsv(),
+                    classPattern: classPatternCsv())
+
+            junit(healthScaleFactor: 0.0,
+                    allowEmptyResults: true,
+                    keepLongStdio: true,
+                    testResults: testReportsPatternCsv())
+
+            if (currentBuild.result == 'UNSTABLE') {
+                currentBuild.result = 'FAILURE'
+            }
+
+            if (fileExists('maven-failsafe-plugin/target/it')) {
+                sh "tar czf failsafe-its-${stageKey}.tgz maven-failsafe-plugin/target/it"
+            }
+
+            if (fileExists('surefire-its/target')) {
+                sh "tar czf surefire-its-${stageKey}.tgz surefire-its/target"
+            }
+//          println(readFile('target/rat.txt'))
+//          Wait for INFRA installation of Pipeline Utils, use fileExists()
+//          if (fileExists('maven-failsafe-plugin/target/it')) {
+//              zip(zipFile: "it--maven-failsafe-plugin--${stageKey}.zip", dir: 'maven-failsafe-plugin/target/it', archive: true)
+//          }
+//
+//          if (fileExists('surefire-its/target')) {
+//              zip(zipFile: "it--surefire-its--${stageKey}.zip", dir: 'surefire-its/target', archive: true)
+//          }
+//
+//          archiveArtifacts(artifacts: 'surefire-its/target/**/log.txt', allowEmptyArchive: true, fingerprint: true, onlyIfSuccessful: false)
+
+            archive excludes: '**/*.jar', includes: '*.tgz'
+        }
+
+
+        stage("cleanup ${stageKey}") {
+            // clean up after ourselves to reduce disk space
+            cleanWs()
+        }
+    }
+}
+
+/**
+ * It is used instead of tool(${jdkTestName}).
+ */
+def resolveToolNameToJavaPath(jdkToolName, mvnName) {
+    def javaHome = null
+    try {
+        withMaven(jdk: jdkToolName, maven: mvnName) {
+            javaHome = isUnix() ? sh(script: 'echo -en $JAVA_HOME', returnStdout: true) : bat(script: '@echo %JAVA_HOME%', returnStdout: true)
+        }
+
+        if (javaHome != null) {
+            javaHome = javaHome.trim()
+            def exec = javaHome + (isUnix() ? '/bin/java' : '\\bin\\java.exe')
+            if (!fileExists(exec)) {
+                println "The ${exec} does not exist in jdkToolName=${jdkToolName}."
+                javaHome = null
+            }
+        }
+    } catch(e) {
+        println "Caught an exception while resolving 'jdkToolName' ${jdkToolName} via 'mvnName' ${mvnName}: ${e}"
+        javaHome = null;
+    }
+    assert javaHome != null : "Could not resolve ${jdkToolName} to JAVA_HOME."
+    return javaHome
+}
+
+@NonCPS
+static def sourcesPatternCsv() {
+    return '**/maven-failsafe-plugin/src/main/java,' +
+            '**/maven-surefire-common/src/main/java,' +
+            '**/maven-surefire-plugin/src/main/java,' +
+            '**/maven-surefire-report-plugin/src/main/java,' +
+            '**/surefire-api/src/main/java,' +
+            '**/surefire-booter/src/main/java,' +
+            '**/surefire-grouper/src/main/java,' +
+            '**/surefire-its/src/main/java,' +
+            '**/surefire-logger-api/src/main/java,' +
+            '**/surefire-providers/**/src/main/java,' +
+            '**/surefire-report-parser/src/main/java'
+}
+
+@NonCPS
+static def classPatternCsv() {
+    return '**/maven-failsafe-plugin/target/classes,' +
+            '**/maven-surefire-common/target/classes,' +
+            '**/maven-surefire-plugin/target/classes,' +
+            '**/maven-surefire-report-plugin/target/classes,' +
+            '**/surefire-api/target/classes,' +
+            '**/surefire-booter/target/classes,' +
+            '**/surefire-grouper/target/classes,' +
+            '**/surefire-its/target/classes,' +
+            '**/surefire-logger-api/target/classes,' +
+            '**/surefire-providers/**/target/classes,' +
+            '**/surefire-report-parser/target/classes'
+}
+
+@NonCPS
+static def tasksViolationLow() {
+    return '@SuppressWarnings'
+}
+
+@NonCPS
+static def tasksViolationNormal() {
+    return 'TODO,FIXME,@deprecated'
+}
+
+@NonCPS
+static def tasksViolationHigh() {
+    return 'finalize(),Locale.setDefault,TimeZone.setDefault,\
+System.out,System.err,System.setOut,System.setErr,System.setIn,System.exit,System.gc,System.runFinalization,System.load'
+}
+
+@NonCPS
+static def testReportsPatternCsv() {
+    return '**/maven-failsafe-plugin/target/surefire-reports/*.xml,' +
+            '**/maven-surefire-common/target/surefire-reports/*.xml,' +
+            '**/maven-surefire-plugin/target/surefire-reports/*.xml,' +
+            '**/maven-surefire-report-plugin/target/surefire-reports/*.xml,' +
+            '**/surefire-api/target/surefire-reports/*.xml,' +
+            '**/surefire-booter/target/surefire-reports/*.xml,' +
+            '**/surefire-grouper/target/surefire-reports/*.xml,' +
+            '**/surefire-its/target/surefire-reports/*.xml,' +
+            '**/surefire-logger-api/target/surefire-reports/*.xml,' +
+            '**/surefire-providers/**/target/surefire-reports/*.xml,' +
+            '**/surefire-report-parser/target/surefire-reports/*.xml,' +
+            '**/surefire-its/target/failsafe-reports/*.xml'
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/maven-failsafe-plugin/pom.xml
----------------------------------------------------------------------
diff --git a/maven-failsafe-plugin/pom.xml b/maven-failsafe-plugin/pom.xml
index 9e3d87b..7176456 100644
--- a/maven-failsafe-plugin/pom.xml
+++ b/maven-failsafe-plugin/pom.xml
@@ -57,6 +57,10 @@
       <classifier>site-source</classifier>
     </dependency>
     <dependency>
+      <groupId>org.apache.maven.shared</groupId>
+      <artifactId>maven-shared-utils</artifactId>
+    </dependency>
+    <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
     </dependency>
@@ -284,6 +288,7 @@
                   <goals>
                     <goal>clean</goal>
                     <goal>verify</goal>
+                    <goal>-nsu</goal>
                   </goals>
                   <setupIncludes>
                     <setupInclude>dummy-*/pom.xml</setupInclude>

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/maven-surefire-common/pom.xml
----------------------------------------------------------------------
diff --git a/maven-surefire-common/pom.xml b/maven-surefire-common/pom.xml
index 7e063c8..e6ef88a 100644
--- a/maven-surefire-common/pom.xml
+++ b/maven-surefire-common/pom.xml
@@ -171,8 +171,6 @@
       <plugin>
         <artifactId>maven-surefire-plugin</artifactId>
         <configuration>
-          <jvm>${jdk.home}/bin/java</jvm>
-          <redirectTestOutputToFile>true</redirectTestOutputToFile>
           <includes>
             <include>**/JUnit4SuiteTest.java</include>
           </includes>

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/maven-surefire-report-plugin/pom.xml
----------------------------------------------------------------------
diff --git a/maven-surefire-report-plugin/pom.xml b/maven-surefire-report-plugin/pom.xml
index 9cdd569..662db98 100644
--- a/maven-surefire-report-plugin/pom.xml
+++ b/maven-surefire-report-plugin/pom.xml
@@ -168,6 +168,7 @@
       <plugin>
         <artifactId>maven-surefire-plugin</artifactId>
         <configuration>
+          <useSystemClassLoader>true</useSystemClassLoader>
           <classpathDependencyExcludes>
             <classpathDependencyExclude>org.fusesource.jansi:jansi</classpathDependencyExclude>
           </classpathDependencyExcludes>

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index f5af360..4a768a5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -50,8 +50,8 @@
 
   <modules>
     <module>surefire-logger-api</module>
-    <module>surefire-shadefire</module>
     <module>surefire-api</module>
+    <module>surefire-shadefire</module>
     <module>surefire-booter</module>
     <module>surefire-grouper</module>
     <module>surefire-providers</module>
@@ -99,6 +99,7 @@
     <jdk.home>${java.home}/..</jdk.home>
     <maven.compiler.testSource>1.7</maven.compiler.testSource>
     <maven.compiler.testTarget>1.7</maven.compiler.testTarget>
+    <jvm.args.tests>-server -XX:+UseG1GC -Xms128m -Xmx144m -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -XX:SoftRefLRUPolicyMSPerMB=50 -Djava.awt.headless=true</jvm.args.tests>
   </properties>
 
   <dependencyManagement>
@@ -433,8 +434,10 @@
           <configuration>
             <!-- NOTE: Be sure to isolate the Surefire version under test from the version running the tests! -->
             <useSystemClassLoader>false</useSystemClassLoader>
-            <argLine>-Xms128m -Xmx144m ${jacoco.agent}</argLine>
+            <argLine>${jvm.args.tests} ${jacoco.agent}</argLine>
             <useFile>false</useFile>
+            <redirectTestOutputToFile>false</redirectTestOutputToFile>
+            <jvm>${jdk.home}/bin/java</jvm>
           </configuration>
         </plugin>
         <plugin>
@@ -470,6 +473,10 @@
           <artifactId>maven-site-plugin</artifactId>
           <version>3.4</version>
         </plugin>
+        <plugin>
+          <artifactId>maven-deploy-plugin</artifactId>
+          <version>2.8.2</version>
+        </plugin>
       </plugins>
     </pluginManagement>
     <plugins>
@@ -546,50 +553,60 @@
                   </excludes>
                 </enforceBytecodeVersion>
               </rules>
-              <fail>true</fail>
             </configuration>
           </execution>
         </executions>
+        <configuration>
+          <fail>true</fail>
+        </configuration>
       </plugin>
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>animal-sniffer-maven-plugin</artifactId>
       </plugin>
-        <plugin>
-          <groupId>org.apache.rat</groupId>
-          <artifactId>apache-rat-plugin</artifactId>
-          <version>0.12</version>
-          <executions>
-            <execution>
-              <id>rat-check</id>
-              <goals>
-                <goal>check</goal>
-              </goals>
-              <configuration>
-                <excludes combine.children="append">
-                  <exclude>Jenkinsfile</exclude>
-                  <exclude>README.md</exclude>
-                  <exclude>.gitignore</exclude>
-                  <exclude>.git/**/*</exclude>
-                  <exclude>**/.idea</exclude>
-                  <exclude>**/.svn/**/*</exclude>
-                  <exclude>**/*.iml</exclude>
-                  <exclude>**/*.ipr</exclude>
-                  <exclude>**/*.iws</exclude>
-                  <exclude>**/*.versionsBackup</exclude>
-                  <exclude>**/dependency-reduced-pom.xml</exclude>
-                  <exclude>.repository/**</exclude> <!-- jenkins with local maven repository -->
-                  <exclude>src/test/resources/**/*</exclude>
-                  <exclude>src/test/resources/**/*.css</exclude>
-                  <exclude>**/*.jj</exclude>
-                  <exclude>src/main/resources/META-INF/services/org.apache.maven.surefire.providerapi.SurefireProvider
-                  </exclude>
-                  <exclude>DEPENDENCIES</exclude>
-                </excludes>
-              </configuration>
-            </execution>
-          </executions>
-        </plugin>
+      <plugin>
+        <groupId>org.apache.rat</groupId>
+        <artifactId>apache-rat-plugin</artifactId>
+        <version>0.12</version>
+        <executions>
+          <execution>
+            <id>rat-check</id>
+            <goals>
+              <goal>check</goal>
+            </goals>
+            <configuration>
+              <excludes combine.children="append">
+                <exclude>Jenkinsfile</exclude>
+                <exclude>README.md</exclude>
+                <exclude>.gitignore</exclude>
+                <exclude>.git/**/*</exclude>
+                <exclude>**/.idea</exclude>
+                <exclude>**/.svn/**/*</exclude>
+                <exclude>**/*.iml</exclude>
+                <exclude>**/*.ipr</exclude>
+                <exclude>**/*.iws</exclude>
+                <exclude>**/*.versionsBackup</exclude>
+                <exclude>**/dependency-reduced-pom.xml</exclude>
+                <exclude>.repository/**</exclude> <!-- jenkins with local maven repository -->
+                <exclude>src/test/resources/**/*</exclude>
+                <exclude>src/test/resources/**/*.css</exclude>
+                <exclude>**/*.jj</exclude>
+                <exclude>src/main/resources/META-INF/services/org.apache.maven.surefire.providerapi.SurefireProvider
+                </exclude>
+                <exclude>DEPENDENCIES</exclude>
+                <exclude>.m2/**</exclude>
+                <exclude>.m2</exclude>
+              </excludes>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <artifactId>maven-deploy-plugin</artifactId>
+        <configuration>
+          <deployAtEnd>true</deployAtEnd>
+        </configuration>
+      </plugin>
     </plugins>
   </build>
 

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/surefire-api/pom.xml
----------------------------------------------------------------------
diff --git a/surefire-api/pom.xml b/surefire-api/pom.xml
index 00ef758..bfc4203 100644
--- a/surefire-api/pom.xml
+++ b/surefire-api/pom.xml
@@ -52,8 +52,6 @@
       <plugin>
         <artifactId>maven-surefire-plugin</artifactId>
         <configuration>
-          <jvm>${jdk.home}/bin/java</jvm>
-          <redirectTestOutputToFile>true</redirectTestOutputToFile>
           <includes>
             <include>**/JUnit4SuiteTest.java</include>
           </includes>

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/surefire-booter/pom.xml
----------------------------------------------------------------------
diff --git a/surefire-booter/pom.xml b/surefire-booter/pom.xml
index ef5e26c..a69b38b 100644
--- a/surefire-booter/pom.xml
+++ b/surefire-booter/pom.xml
@@ -116,8 +116,6 @@
           </dependency>
         </dependencies>
         <configuration>
-          <jvm>${jdk.home}/bin/java</jvm>
-          <redirectTestOutputToFile>true</redirectTestOutputToFile>
           <includes>
             <include>**/JUnit4SuiteTest.java</include>
           </includes>

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/surefire-its/pom.xml
----------------------------------------------------------------------
diff --git a/surefire-its/pom.xml b/surefire-its/pom.xml
index e679753..a14c6c6 100644
--- a/surefire-its/pom.xml
+++ b/surefire-its/pom.xml
@@ -27,7 +27,7 @@
     <version>2.21.0-SNAPSHOT</version>
   </parent>
 
-  <artifactId>surefire-is</artifactId>
+  <artifactId>surefire-its</artifactId>
 
   <name>Maven Surefire Integration Tests</name>
   <description>Used internally testing MOJOs. The project is not deployed.</description>
@@ -84,8 +84,17 @@
     <plugins>
       <plugin>
         <artifactId>maven-surefire-plugin</artifactId>
+        <dependencies>
+          <dependency>
+            <groupId>org.apache.maven.surefire</groupId>
+            <artifactId>surefire-shadefire</artifactId>
+            <version>2.12.4</version> <!-- ${shadedVersion}, but resolved due to https://issues.apache.org/jira/browse/MRELEASE-799 -->
+          </dependency>
+        </dependencies>
         <configuration>
-          <test>*Test</test>
+          <includes>
+            <include>org/apache/maven/surefire/its/fixture/JUnit4SuiteTest.java</include>
+          </includes>
         </configuration>
       </plugin>
       <plugin>
@@ -99,7 +108,7 @@
           <forkMode>once</forkMode>
           <argLine>-server -Xmx64m -XX:+UseG1GC -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -Djava.awt.headless=true</argLine>
           <includes>
-            <include>org/apache/**/*IT*.java</include>
+            <include>org/apache/**/UmlautDirIT.java</include>
           </includes>
           <!-- Pass current surefire version to the main suite so that it -->
           <!-- can forward to all integration test projects. SUREFIRE-513 -->
@@ -120,7 +129,6 @@
             <jacoco.agent>${jacoco-it.agent}</jacoco.agent>
           </systemPropertyVariables>
           <redirectTestOutputToFile>false</redirectTestOutputToFile>
-          <useFile>false</useFile>
         </configuration>
         <dependencies>
           <dependency>

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47ParallelIT.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47ParallelIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47ParallelIT.java
index 5aee1a8..fdf75ef 100644
--- a/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47ParallelIT.java
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47ParallelIT.java
@@ -524,7 +524,7 @@ public class JUnit47ParallelIT
     @Test
     public void forcedShutdownVerifyingLogs()
     {
-        // executes for 2.5 sec until timeout has elapsed
+        // attempts to run for 2.4 sec until timeout has elapsed
         unpack().parallelMethods().threadCountMethods( 3 ).disablePerCoreThreadCount()
             .parallelTestsTimeoutForcedInSeconds( 1.05d ).setTestToRun( "Waiting*Test" ).failNever().executeTest()
             .verifyTextInLog( "The test run has finished abruptly after timeout of 1.05 seconds." )
@@ -535,6 +535,8 @@ public class JUnit47ParallelIT
     private SurefireLauncher unpack()
     {
         return unpack( "junit47-parallel" )
-            .showErrorStackTraces();
+                .showErrorStackTraces()
+                .forkOnce()
+                .redirectToFile( false );
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/surefire-its/src/test/java/org/apache/maven/surefire/its/UmlautDirIT.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/UmlautDirIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/UmlautDirIT.java
index 8848dc2..7b008bc 100644
--- a/surefire-its/src/test/java/org/apache/maven/surefire/its/UmlautDirIT.java
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/UmlautDirIT.java
@@ -40,25 +40,30 @@ public class UmlautDirIT
     public void testUmlaut()
         throws Exception
     {
-        specialUnpack().executeTest().verifyErrorFreeLog().assertTestSuiteResults( 1, 0, 0, 0 );
+        specialUnpack( "1" )
+                .executeTest()
+                .verifyErrorFreeLog()
+                .assertTestSuiteResults( 1, 0, 0, 0 );
     }
 
     @Test
     public void testUmlautIsolatedClassLoader()
         throws Exception
     {
-        specialUnpack().useSystemClassLoader( false ).executeTest().assertTestSuiteResults( 1, 0, 0, 0 );
+        specialUnpack( "2" )
+                .useSystemClassLoader( false )
+                .executeTest()
+                .assertTestSuiteResults( 1, 0, 0, 0 );
     }
 
-    SurefireLauncher specialUnpack()
-        throws VerificationException, IOException
+    SurefireLauncher specialUnpack( String postfix )
+        throws IOException
     {
         SurefireLauncher unpack = unpack( "junit-pathWithUmlaut" );
         MavenLauncher maven = unpack.maven();
 
-        File dest = new File( maven.getUnpackedAt().getParentFile().getPath(), "/junit-pathWith\u00DCmlaut" );
+        File dest = new File( maven.getUnpackedAt().getParentFile().getPath(), "/junit-pathWith\u00DCmlaut_" + postfix );
         maven.moveUnpackTo( dest );
         return unpack;
     }
-
 }

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/surefire-its/src/test/java/org/apache/maven/surefire/its/fixture/JUnit4SuiteTest.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/fixture/JUnit4SuiteTest.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/fixture/JUnit4SuiteTest.java
new file mode 100644
index 0000000..3961b13
--- /dev/null
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/fixture/JUnit4SuiteTest.java
@@ -0,0 +1,44 @@
+package org.apache.maven.surefire.its.fixture;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import junit.framework.JUnit4TestAdapter;
+import junit.framework.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * Adapt the JUnit4 tests which use only annotations to the JUnit3 test suite.
+ *
+ * @author Tibor Digana (tibor17)
+ * @since 2.21.0
+ */
+@Suite.SuiteClasses( {
+        MavenLauncherTest.class,
+        SurefireLauncherTest.class
+} )
+@RunWith( Suite.class )
+public class JUnit4SuiteTest
+{
+    public static Test suite()
+    {
+        return new JUnit4TestAdapter( JUnit4SuiteTest.class );
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/surefire-its/src/test/java/org/apache/maven/surefire/its/fixture/SurefireLauncherTest.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/fixture/SurefireLauncherTest.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/fixture/SurefireLauncherTest.java
index b5df941..801ebec 100644
--- a/surefire-its/src/test/java/org/apache/maven/surefire/its/fixture/SurefireLauncherTest.java
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/fixture/SurefireLauncherTest.java
@@ -19,9 +19,6 @@ package org.apache.maven.surefire.its.fixture;
  * under the License.
  */
 
-import java.io.IOException;
-import org.apache.maven.it.VerificationException;
-
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
@@ -33,7 +30,6 @@ public class SurefireLauncherTest
 {
     @Test
     public void launcherGetsProperMethodName()
-        throws IOException, VerificationException
     {
         MavenLauncher mavenLauncher = new MavenLauncher( SurefireLauncherTest.class, "foo", "" );
         String method = new SurefireLauncher( mavenLauncher ).getTestMethodName();

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/surefire-its/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1295AttributeJvmCrashesToTestsIT.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1295AttributeJvmCrashesToTestsIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1295AttributeJvmCrashesToTestsIT.java
index 3ca758a..ab9469f 100644
--- a/surefire-its/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1295AttributeJvmCrashesToTestsIT.java
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1295AttributeJvmCrashesToTestsIT.java
@@ -19,21 +19,23 @@ package org.apache.maven.surefire.its.jiras;
  * under the License.
  */
 
-import org.apache.maven.it.VerificationException;
 import org.apache.maven.surefire.its.fixture.OutputValidator;
 import org.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
 import org.apache.maven.surefire.its.fixture.SurefireLauncher;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.experimental.theories.DataPoints;
+import org.junit.experimental.theories.FromDataPoints;
+import org.junit.experimental.theories.Theories;
+import org.junit.experimental.theories.Theory;
+import org.junit.runner.RunWith;
 
 import java.util.Iterator;
-import java.util.concurrent.TimeUnit;
 
+import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.apache.commons.lang3.SystemUtils.IS_OS_LINUX;
 import static org.apache.commons.lang3.SystemUtils.IS_OS_MAC_OSX;
+import static org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS;
 import static org.fest.assertions.Assertions.assertThat;
 import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
 
 /**
  * https://issues.apache.org/jira/browse/SUREFIRE-1295
@@ -42,67 +44,72 @@ import static org.junit.Assume.assumeTrue;
  * @author michaeltandy
  * @since 2.20
  */
+@RunWith( Theories.class )
 public class Surefire1295AttributeJvmCrashesToTestsIT
         extends SurefireJUnit4IntegrationTestCase
 {
-    @Before
-    public void skipWindows()
+    public enum ForkMode
     {
-        assumeTrue( IS_OS_LINUX || IS_OS_MAC_OSX );
+        DEFAULT,
+        ONE_FORK_NO_REUSE,
+        ONE_FORK_REUSE
     }
 
-    @Test
-    public void crashInFork() throws VerificationException, InterruptedException
-    {
-        SurefireLauncher launcher = unpack( "crash-during-test" );
+    @DataPoints( "crashStyle" )
+    public static String[] crashStyle = { "exit", "abort", "segfault" };
 
-        checkCrashTypes( launcher );
-    }
+    @DataPoints( "forkStyle" )
+    public static ForkMode[] forkStyle = ForkMode.values();
 
-    @Test
-    public void crashInSingleUseFork() throws VerificationException, InterruptedException
+    @Theory
+    public void test( @FromDataPoints( "crashStyle" ) String crashStyle,
+                      @FromDataPoints( "forkStyle" ) ForkMode forkStyle )
+            throws Exception
     {
-        SurefireLauncher launcher = unpack( "crash-during-test" )
-                                            .forkCount( 1 )
-                                            .reuseForks( false );
-
-        checkCrashTypes( launcher );
-    }
+        // JUnit Assumptions not supported by Theories runner.
+        if ( !IS_OS_LINUX && !IS_OS_MAC_OSX && !IS_OS_WINDOWS )
+        {
+            return;
+        }
 
-    @Test
-    public void crashInReusableFork() throws VerificationException, InterruptedException
-    {
-        SurefireLauncher launcher = unpack( "crash-during-test" )
-                                            .forkPerThread()
-                                            .reuseForks( true )
-                                            .threadCount( 1 );
+        SurefireLauncher launcher =
+                unpack( "crash-during-test", "_" + crashStyle + "_" + forkStyle.ordinal() )
+                .setForkJvm();
 
-        checkCrashTypes( launcher );
-    }
+        switch ( forkStyle )
+        {
+            case DEFAULT:
+                break;
+            case ONE_FORK_NO_REUSE:
+                launcher.forkCount( 1 )
+                        .reuseForks( false );
+                break;
+            case ONE_FORK_REUSE:
+                launcher.forkPerThread()
+                        .reuseForks( true )
+                        .threadCount( 1 );
+                break;
+            default:
+                fail();
+        }
 
-    private static void checkCrashTypes( SurefireLauncher launcher )
-            throws VerificationException, InterruptedException
-    {
-        checkCrash( launcher.addGoal( "-DcrashType=exit" ) );
-        checkCrash( launcher.addGoal( "-DcrashType=abort" ) );
-        checkCrash( launcher.addGoal( "-DcrashType=segfault" ) );
+        checkCrash( launcher.addGoal( "-DcrashType=" + crashStyle ) );
     }
 
-    private static void checkCrash( SurefireLauncher launcher ) throws VerificationException, InterruptedException
+    private static void checkCrash( SurefireLauncher launcher ) throws Exception
     {
         OutputValidator validator = launcher.maven()
-                                            .withFailure()
-                                            .executeTest()
-                                            .verifyTextInLog( "The forked VM terminated without properly saying "
-                                                                      + "goodbye. VM crash or System.exit called?"
-                                            )
-                                            .verifyTextInLog( "Crashed tests:" );
+                .withFailure()
+                .executeTest()
+                .verifyTextInLog( "The forked VM terminated without properly saying "
+                        + "goodbye. VM crash or System.exit called?" )
+                .verifyTextInLog( "Crashed tests:" );
 
         // Cannot flush log.txt stream because it is consumed internally by Verifier.
         // Waiting for the stream to become flushed on disk.
-        TimeUnit.SECONDS.sleep( 1L );
+        SECONDS.sleep( 1L );
 
-        for ( Iterator<String> it = validator.loadLogLines().iterator(); it.hasNext(); )
+        for ( Iterator< String > it = validator.loadLogLines().iterator(); it.hasNext(); )
         {
             String line = it.next();
             if ( line.contains( "Crashed tests:" ) )
@@ -110,7 +117,8 @@ public class Surefire1295AttributeJvmCrashesToTestsIT
                 line = it.next();
                 if ( it.hasNext() )
                 {
-                    assertThat( line ).contains( "junit44.environment.BasicTest" );
+                    assertThat( line )
+                            .contains( "junit44.environment.Test1CrashedTest" );
                 }
                 else
                 {
@@ -118,8 +126,5 @@ public class Surefire1295AttributeJvmCrashesToTestsIT
                 }
             }
         }
-
     }
-
-
 }

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/surefire-its/src/test/resources/crash-during-test/pom.xml
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/resources/crash-during-test/pom.xml b/surefire-its/src/test/resources/crash-during-test/pom.xml
index 0d9e3e7..3929e83 100644
--- a/surefire-its/src/test/resources/crash-during-test/pom.xml
+++ b/surefire-its/src/test/resources/crash-during-test/pom.xml
@@ -51,12 +51,25 @@
   </dependencies>
 
   <build>
+    <pluginManagement>
+      <plugins>
+        <!--
+        mvn clean is called beforehand.
+        The German word Umlaut which is not ASCII must be deleted the same on all M3 versions.
+        -->
+        <plugin>
+          <artifactId>maven-clean-plugin</artifactId>
+          <version>3.0.0</version>
+        </plugin>
+      </plugins>
+    </pluginManagement>
     <plugins>
       <plugin>
         <artifactId>maven-surefire-plugin</artifactId>
         <version>${surefire.version}</version>
         <configuration>
           <forkMode>once</forkMode>
+          <runOrder>alphabetical</runOrder>
         </configuration>
       </plugin>
     </plugins>

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/surefire-its/src/test/resources/crash-during-test/src/test/java/junit44/environment/BasicTest.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/resources/crash-during-test/src/test/java/junit44/environment/BasicTest.java b/surefire-its/src/test/resources/crash-during-test/src/test/java/junit44/environment/BasicTest.java
deleted file mode 100644
index 57d57bb..0000000
--- a/surefire-its/src/test/resources/crash-during-test/src/test/java/junit44/environment/BasicTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package junit44.environment;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import static org.junit.Assert.*;
-import org.junit.Test;
-import uk.me.mjt.CrashJvm;
-
-public class BasicTest
-{
-    @Test
-    public void testCrashJvm()
-    {
-        assertTrue(CrashJvm.loadedOk());
-        
-        String crashType = System.getProperty("crashType");
-        assertNotNull(crashType);
-        if ( crashType.equals( "exit" ) )
-        {
-            CrashJvm.exit();
-        }
-        else if ( crashType.equals( "abort" ) )
-        {
-            CrashJvm.abort();
-        }
-        else if (crashType.equals( "segfault" ))
-        {
-            CrashJvm.segfault();
-        }
-        else
-        {
-            fail("Don't recognise crashType " + crashType);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/surefire-its/src/test/resources/crash-during-test/src/test/java/junit44/environment/SomeOtherTest.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/resources/crash-during-test/src/test/java/junit44/environment/SomeOtherTest.java b/surefire-its/src/test/resources/crash-during-test/src/test/java/junit44/environment/SomeOtherTest.java
deleted file mode 100644
index e10f6aa..0000000
--- a/surefire-its/src/test/resources/crash-during-test/src/test/java/junit44/environment/SomeOtherTest.java
+++ /dev/null
@@ -1,28 +0,0 @@
-
-package junit44.environment;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import org.junit.Test;
-
-public class SomeOtherTest {
-    @Test
-    public void nonCrashingTest() {}
-}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/surefire-its/src/test/resources/crash-during-test/src/test/java/junit44/environment/Test1CrashedTest.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/resources/crash-during-test/src/test/java/junit44/environment/Test1CrashedTest.java b/surefire-its/src/test/resources/crash-during-test/src/test/java/junit44/environment/Test1CrashedTest.java
new file mode 100644
index 0000000..28fe637
--- /dev/null
+++ b/surefire-its/src/test/resources/crash-during-test/src/test/java/junit44/environment/Test1CrashedTest.java
@@ -0,0 +1,52 @@
+package junit44.environment;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import static org.junit.Assert.*;
+import org.junit.Test;
+import uk.me.mjt.CrashJvm;
+
+public class Test1CrashedTest
+{
+    @Test
+    public void testCrashJvm()
+    {
+        assertTrue(CrashJvm.loadedOk());
+        
+        String crashType = System.getProperty("crashType");
+        assertNotNull(crashType);
+        if ( crashType.equals( "exit" ) )
+        {
+            CrashJvm.exit();
+        }
+        else if ( crashType.equals( "abort" ) )
+        {
+            CrashJvm.abort();
+        }
+        else if (crashType.equals( "segfault" ))
+        {
+            CrashJvm.segfault();
+        }
+        else
+        {
+            fail("Don't recognise crashType " + crashType);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/surefire-its/src/test/resources/crash-during-test/src/test/java/junit44/environment/Test2WaitingTest.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/resources/crash-during-test/src/test/java/junit44/environment/Test2WaitingTest.java b/surefire-its/src/test/resources/crash-during-test/src/test/java/junit44/environment/Test2WaitingTest.java
new file mode 100644
index 0000000..dc3ce47
--- /dev/null
+++ b/surefire-its/src/test/resources/crash-during-test/src/test/java/junit44/environment/Test2WaitingTest.java
@@ -0,0 +1,34 @@
+package junit44.environment;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.junit.Test;
+
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+
+public class Test2WaitingTest
+{
+    @Test
+    public void nonCrashingTest()
+            throws InterruptedException
+    {
+        MILLISECONDS.sleep( 1500L );
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/surefire-its/src/test/resources/crash-during-test/src/test/java/junit44/environment/Test3FastTest.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/resources/crash-during-test/src/test/java/junit44/environment/Test3FastTest.java b/surefire-its/src/test/resources/crash-during-test/src/test/java/junit44/environment/Test3FastTest.java
new file mode 100644
index 0000000..3a4d88e
--- /dev/null
+++ b/surefire-its/src/test/resources/crash-during-test/src/test/java/junit44/environment/Test3FastTest.java
@@ -0,0 +1,30 @@
+package junit44.environment;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.junit.Test;
+
+public class Test3FastTest
+{
+    @Test
+    public void emptyTest()
+    {
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/surefire-providers/pom.xml
----------------------------------------------------------------------
diff --git a/surefire-providers/pom.xml b/surefire-providers/pom.xml
index 65ae76f..de5214a 100644
--- a/surefire-providers/pom.xml
+++ b/surefire-providers/pom.xml
@@ -56,7 +56,6 @@
     <plugins>
       <plugin>
         <artifactId>maven-surefire-plugin</artifactId>
-        <version>2.12.4</version> <!-- ${shadedVersion}, but resolved due to https://issues.apache.org/jira/browse/MRELEASE-799 -->
         <dependencies>
           <dependency>
             <groupId>org.apache.maven.surefire</groupId>

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/surefire-providers/surefire-junit3/pom.xml
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-junit3/pom.xml b/surefire-providers/surefire-junit3/pom.xml
index 2e906da..93375b2 100644
--- a/surefire-providers/surefire-junit3/pom.xml
+++ b/surefire-providers/surefire-junit3/pom.xml
@@ -72,7 +72,6 @@
           </execution>
         </executions>
       </plugin>
-
     </plugins>
   </build>
 

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/surefire-providers/surefire-junit4/pom.xml
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-junit4/pom.xml b/surefire-providers/surefire-junit4/pom.xml
index 870f13c..fe1496f 100644
--- a/surefire-providers/surefire-junit4/pom.xml
+++ b/surefire-providers/surefire-junit4/pom.xml
@@ -55,12 +55,6 @@
 
     <plugins>
       <plugin>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <jvm>${java.home}/bin/java</jvm>
-        </configuration>
-      </plugin>
-      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-shade-plugin</artifactId>
         <version>1.4</version>

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputer.java
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputer.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputer.java
index a198887..2e4104c 100644
--- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputer.java
+++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputer.java
@@ -67,7 +67,7 @@ public abstract class ParallelComputer
 
     protected abstract ShutdownResult describeStopped( boolean shutdownNow );
 
-    abstract boolean shutdownThreadPoolsAwaitingKilled();
+    protected abstract boolean shutdownThreadPoolsAwaitingKilled();
 
     protected final void beforeRunQuietly()
     {
@@ -249,19 +249,23 @@ public abstract class ParallelComputer
     {
         if ( testsBeforeShutdown != null )
         {
-            for ( final Description test : testsBeforeShutdown.get().getTriggeredTests() )
+            final ShutdownResult shutdownResult = testsBeforeShutdown.get();
+            if ( shutdownResult != null )
             {
-                if ( test != null && test.getDisplayName() != null )
+                for ( final Description test : shutdownResult.getTriggeredTests() )
                 {
-                    executedTests.add( test.getDisplayName() );
+                    if ( test != null && test.getDisplayName() != null )
+                    {
+                        executedTests.add( test.getDisplayName() );
+                    }
                 }
-            }
 
-            for ( final Description test : testsBeforeShutdown.get().getIncompleteTests() )
-            {
-                if ( test != null && test.getDisplayName() != null )
+                for ( final Description test : shutdownResult.getIncompleteTests() )
                 {
-                    incompleteTests.add( test.getDisplayName() );
+                    if ( test != null && test.getDisplayName() != null )
+                    {
+                        incompleteTests.add( test.getDisplayName() );
+                    }
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerBuilder.java
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerBuilder.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerBuilder.java
index fd0cab3..22d7eab 100755
--- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerBuilder.java
+++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerBuilder.java
@@ -333,7 +333,7 @@ public final class ParallelComputerBuilder
         }
 
         @Override
-        boolean shutdownThreadPoolsAwaitingKilled()
+        protected boolean shutdownThreadPoolsAwaitingKilled()
         {
             boolean notInterrupted = notThreadSafeTests.shutdownThreadPoolsAwaitingKilled();
             final Scheduler m = master;

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/ea893232/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerBuilderTest.java
----------------------------------------------------------------------
diff --git a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerBuilderTest.java b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerBuilderTest.java
index 212e157..b90da87 100755
--- a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerBuilderTest.java
+++ b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerBuilderTest.java
@@ -26,9 +26,7 @@ import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.Stopwatch;
 import org.junit.runner.Description;
 import org.junit.runner.JUnitCore;
 import org.junit.runner.Result;
@@ -54,7 +52,6 @@ import static org.hamcrest.core.Is.is;
 import static org.hamcrest.core.IsNot.not;
 import static org.apache.maven.surefire.junitcore.pc.RangeMatcher.between;
 import static org.junit.Assert.*;
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
 
 /**
  * @author Tibor Digana (tibor17)
@@ -70,9 +67,6 @@ public class ParallelComputerBuilderTest
 
     private static final ConsoleStream logger = new DefaultDirectConsoleReporter( System.out );
 
-    @Rule
-    public final Stopwatch stopwatch = new Stopwatch() {};
-
     private static void testKeepBeforeAfter( ParallelComputerBuilder builder, Class<?>... classes )
     {
         JUnitCore core = new JUnitCore();
@@ -94,8 +88,16 @@ public class ParallelComputerBuilderTest
         }
     }
 
+    @BeforeClass
+    public static void cleanup() throws InterruptedException
+    {
+        System.gc();
+        Thread.sleep( 500L );
+    }
+
     @Before
-    public void beforeTest() throws InterruptedException {
+    public void beforeTest()
+    {
         Class1.maxConcurrentMethods = 0;
         Class1.concurrentMethods = 0;
         shutdownTask = null;
@@ -104,8 +106,6 @@ public class ParallelComputerBuilderTest
         NotThreadSafeTest3.t = null;
         NormalTest1.t = null;
         NormalTest2.t = null;
-        System.gc();
-        Thread.sleep( 50L );
     }
 
     @Test
@@ -136,8 +136,11 @@ public class ParallelComputerBuilderTest
         assertFalse( parallelComputerBuilder.isOptimized() );
 
         ParallelComputerBuilder.PC computer = (ParallelComputerBuilder.PC) parallelComputerBuilder.buildComputer();
-        Result result = new JUnitCore().run( computer, TestSuite.class );
-        long timeSpent = stopwatch.runtime( MILLISECONDS );
+        final JUnitCore core = new JUnitCore();
+        final long t1 = System.currentTimeMillis();
+        final Result result = core.run( computer, TestSuite.class );
+        final long t2 = System.currentTimeMillis();
+        final long timeSpent = t2 - t1;
 
         assertThat( computer.getSuites().size(), is( 1 ) );
         assertThat( computer.getClasses().size(), is( 0 ) );
@@ -171,8 +174,11 @@ public class ParallelComputerBuilderTest
         assertFalse( parallelComputerBuilder.isOptimized() );
 
         ParallelComputerBuilder.PC computer = (ParallelComputerBuilder.PC) parallelComputerBuilder.buildComputer();
-        Result result = new JUnitCore().run( computer, TestSuite.class, Class1.class );
-        long timeSpent = stopwatch.runtime( MILLISECONDS );
+        final JUnitCore core = new JUnitCore();
+        final long t1 = System.currentTimeMillis();
+        final Result result = core.run( computer, TestSuite.class, Class1.class );
+        final long t2 = System.currentTimeMillis();
+        final long timeSpent = t2 - t1;
 
         assertThat( computer.getSuites().size(), is( 1 ) );
         assertThat( computer.getClasses().size(), is( 1 ) );
@@ -197,8 +203,11 @@ public class ParallelComputerBuilderTest
         assertFalse( parallelComputerBuilder.isOptimized() );
 
         ParallelComputerBuilder.PC computer = (ParallelComputerBuilder.PC) parallelComputerBuilder.buildComputer();
-        Result result = new JUnitCore().run( computer, TestSuite.class, Class1.class );
-        long timeSpent = stopwatch.runtime( MILLISECONDS );
+        final JUnitCore core = new JUnitCore();
+        final long t1 = System.currentTimeMillis();
+        final Result result = core.run( computer, TestSuite.class, Class1.class );
+        final long t2 = System.currentTimeMillis();
+        final long timeSpent = t2 - t1;
 
         assertThat( computer.getSuites().size(), is( 1 ) );
         assertThat( computer.getClasses().size(), is( 1 ) );
@@ -229,8 +238,11 @@ public class ParallelComputerBuilderTest
         assertFalse( parallelComputerBuilder.isOptimized() );
 
         ParallelComputerBuilder.PC computer = (ParallelComputerBuilder.PC) parallelComputerBuilder.buildComputer();
-        Result result = new JUnitCore().run( computer, TestSuite.class );
-        long timeSpent = stopwatch.runtime( MILLISECONDS );
+        final JUnitCore core = new JUnitCore();
+        final long t1 = System.currentTimeMillis();
+        final Result result = core.run( computer, TestSuite.class );
+        final long t2 = System.currentTimeMillis();
+        final long timeSpent = t2 - t1;
 
         assertThat( computer.getSuites().size(), is( 1 ) );
         assertThat( computer.getClasses().size(), is( 0 ) );
@@ -253,8 +265,11 @@ public class ParallelComputerBuilderTest
         assertFalse( parallelComputerBuilder.isOptimized() );
 
         ParallelComputerBuilder.PC computer = (ParallelComputerBuilder.PC) parallelComputerBuilder.buildComputer();
-        Result result = new JUnitCore().run( computer, TestSuite.class );
-        long timeSpent = stopwatch.runtime( MILLISECONDS );
+        final JUnitCore core = new JUnitCore();
+        final long t1 = System.currentTimeMillis();
+        final Result result = core.run( computer, TestSuite.class );
+        final long t2 = System.currentTimeMillis();
+        final long timeSpent = t2 - t1;
 
         assertThat( computer.getSuites().size(), is( 1 ) );
         assertThat( computer.getClasses().size(), is( 0 ) );
@@ -280,8 +295,11 @@ public class ParallelComputerBuilderTest
         // 2 groups with 3 threads.
         // Each group takes 0.5s.
         ParallelComputerBuilder.PC computer = (ParallelComputerBuilder.PC) parallelComputerBuilder.buildComputer();
-        Result result = new JUnitCore().run( computer, TestSuite.class, Class1.class );
-        long timeSpent = stopwatch.runtime( MILLISECONDS );
+        final JUnitCore core = new JUnitCore();
+        final long t1 = System.currentTimeMillis();
+        final Result result = core.run( computer, TestSuite.class, Class1.class );
+        final long t2 = System.currentTimeMillis();
+        final long timeSpent = t2 - t1;
 
         assertThat( computer.getSuites().size(), is( 1 ) );
         assertThat( computer.getClasses().size(), is( 1 ) );
@@ -304,8 +322,11 @@ public class ParallelComputerBuilderTest
         assertFalse( parallelComputerBuilder.isOptimized() );
 
         ParallelComputerBuilder.PC computer = (ParallelComputerBuilder.PC) parallelComputerBuilder.buildComputer();
-        Result result = new JUnitCore().run( computer, TestSuite.class, Class1.class );
-        long timeSpent = stopwatch.runtime( MILLISECONDS );
+        final JUnitCore core = new JUnitCore();
+        final long t1 = System.currentTimeMillis();
+        final Result result = core.run( computer, TestSuite.class, Class1.class );
+        final long t2 = System.currentTimeMillis();
+        final long timeSpent = t2 - t1;
 
         assertThat( computer.getSuites().size(), is( 1 ) );
         assertThat( computer.getClasses().size(), is( 1 ) );
@@ -321,8 +342,10 @@ public class ParallelComputerBuilderTest
     @Test( timeout = 2000 )
     public void shutdown()
     {
-        Result result = new ShutdownTest().run( false );
-        long timeSpent = stopwatch.runtime( MILLISECONDS );
+        final long t1 = System.currentTimeMillis();
+        final Result result = new ShutdownTest().run( false );
+        final long t2 = System.currentTimeMillis();
+        final long timeSpent = t2 - t1;
         assertTrue( result.wasSuccessful() );
         assertTrue( beforeShutdown );
         assertThat( timeSpent, between( 450, 1250 ) );
@@ -331,8 +354,10 @@ public class ParallelComputerBuilderTest
     @Test( timeout = 2000 )
     public void shutdownWithInterrupt()
     {
+        final long t1 = System.currentTimeMillis();
         new ShutdownTest().run( true );
-        long timeSpent = stopwatch.runtime( MILLISECONDS );
+        final long t2 = System.currentTimeMillis();
+        final long timeSpent = t2 - t1;
         assertTrue( beforeShutdown );
         assertThat( timeSpent, between( 450, 1250 ) );
     }
@@ -717,11 +742,12 @@ public class ParallelComputerBuilderTest
     public static class ReportOneTestAtRuntimeRunner
             extends ParentRunner
     {
-        private final Class testClass;
+        private final Class<?> testClass;
         private final Description suiteDescription;
         private Description myTestMethodDescr;
 
-        public ReportOneTestAtRuntimeRunner( Class testClass ) throws InitializationError
+        @SuppressWarnings( "unchecked" )
+        public ReportOneTestAtRuntimeRunner( Class<?> testClass ) throws InitializationError
         {
             super( Object.class );
             this.testClass = testClass;