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/05 22:07:33 UTC

[20/51] [partial] maven-surefire git commit: [SUREFIRE-1471] Too long Windows path cause CI issues. Renamed surefire-intergation-tests to surefire-its.

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/09f0eef8/surefire-its/src/test/java/org/apache/maven/surefire/its/ForkConsoleOutputIT.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/ForkConsoleOutputIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/ForkConsoleOutputIT.java
new file mode 100644
index 0000000..6aac330
--- /dev/null
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/ForkConsoleOutputIT.java
@@ -0,0 +1,87 @@
+package org.apache.maven.surefire.its;
+
+/*
+ * 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.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
+import org.apache.maven.surefire.its.fixture.SurefireLauncher;
+import org.junit.Test;
+
+/**
+ * Asserts proper behaviour of console output when forking
+ * SUREFIRE-639
+ * SUREFIRE-651
+ *
+ * @author Kristian Rosenvold
+ */
+public class ForkConsoleOutputIT
+    extends SurefireJUnit4IntegrationTestCase
+{
+    @Test
+    public void printSummaryTrueWithRedirect()
+    {
+        unpack().setForkJvm()
+                .redirectToFile( true )
+                .printSummary( true )
+                .executeTest()
+                .getSurefireReportsFile( "forkConsoleOutput.Test1-output.txt" )
+                .assertFileExists();
+    }
+
+    @Test
+    public void printSummaryTrueWithoutRedirect()
+    {
+        unpack().setForkJvm()
+                .redirectToFile( false )
+                .printSummary( true )
+                .executeTest()
+                .getSurefireReportsFile( "forkConsoleOutput.Test1-output.txt" )
+                .assertFileNotExists();
+    }
+
+    @Test
+    public void printSummaryFalseWithRedirect()
+    {
+        unpack().setForkJvm()
+                .redirectToFile( true )
+                .printSummary( false )
+                .debugLogging()
+                .showErrorStackTraces()
+                .executeTest()
+                .getSurefireReportsFile( "forkConsoleOutput.Test1-output.txt" )
+                .assertFileExists();
+    }
+
+    @Test
+    public void printSummaryFalseWithoutRedirect()
+    {
+        unpack().setForkJvm()
+                .redirectToFile( false )
+                .printSummary( false )
+                .executeTest()
+                .getSurefireReportsFile( "forkConsoleOutput.Test1-output.txt" )
+                .assertFileNotExists();
+    }
+
+
+    private SurefireLauncher unpack()
+    {
+        return unpack( "/fork-consoleOutput" );
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/09f0eef8/surefire-its/src/test/java/org/apache/maven/surefire/its/ForkConsoleOutputWithErrorsIT.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/ForkConsoleOutputWithErrorsIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/ForkConsoleOutputWithErrorsIT.java
new file mode 100644
index 0000000..e5feb7f
--- /dev/null
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/ForkConsoleOutputWithErrorsIT.java
@@ -0,0 +1,47 @@
+package org.apache.maven.surefire.its;
+
+/*
+ * 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.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
+import org.junit.Test;
+
+/**
+ * Asserts proper behaviour of console output when forking
+ * SUREFIRE-639
+ * SUREFIRE-651
+ *
+ * @author Kristian Rosenvold
+ */
+public class ForkConsoleOutputWithErrorsIT
+        extends SurefireJUnit4IntegrationTestCase
+{
+    @Test
+    public void xmlFileContainsConsoleOutput()
+    {
+        unpack( "/fork-consoleOutputWithErrors" )
+                .setForkJvm()
+                .failNever()
+                .redirectToFile( true )
+                .executeTest()
+                .getSurefireReportsXmlFile( "TEST-forkConsoleOutput.Test2.xml" )
+                .assertContainsText( "sout: Will Fail soon" )
+                .assertContainsText( "serr: Will Fail now" );
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/09f0eef8/surefire-its/src/test/java/org/apache/maven/surefire/its/ForkModeIT.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/ForkModeIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/ForkModeIT.java
new file mode 100644
index 0000000..574d144
--- /dev/null
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/ForkModeIT.java
@@ -0,0 +1,241 @@
+package org.apache.maven.surefire.its;
+
+/*
+ * 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.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.fail;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+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.apache.maven.surefire.its.fixture.TestFile;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * Test forkMode
+ * 
+ * @author <a href="mailto:dfabulich@apache.org">Dan Fabulich</a>
+ */
+public class ForkModeIT
+    extends SurefireJUnit4IntegrationTestCase
+{
+
+    private OutputValidator outputValidator;
+
+    @BeforeClass
+    public static void installDumpPidPlugin()
+        throws Exception
+    {
+        unpack( ForkModeIT.class, "test-helper-dump-pid-plugin", "plugin" ).executeInstall();
+    }
+
+    @Test
+    public void testForkModeAlways()
+    {
+        String[] pids = doTest( unpack( getProject() ).setForkJvm().forkAlways() );
+        assertDifferentPids( pids );
+        assertEndWith( pids, "_1_1", 3 );
+        assertFalse( "pid 1 is not the same as the main process' pid", pids[0].equals( getMainPID() ) );
+    }
+
+    @Test
+    public void testForkModePerTest()
+    {
+        String[] pids = doTest( unpack( getProject() ).setForkJvm().forkPerTest() );
+        assertDifferentPids( pids );
+        assertEndWith( pids, "_1_1", 3 );
+        assertFalse( "pid 1 is not the same as the main process' pid", pids[0].equals( getMainPID() ) );
+    }
+
+    @Test
+    public void testForkModeNever()
+    {
+        String[] pids = doTest( unpack( getProject() ).forkNever() );
+        assertSamePids( pids );
+        assertEndWith( pids, "_1_1", 3 );
+        assertEquals( "my pid is equal to pid 1 of the test", getMainPID(), pids[0] );
+    }
+
+    @Test
+    public void testForkModeNone()
+    {
+        String[] pids = doTest( unpack( getProject() ).forkMode( "none" ) );
+        assertSamePids( pids );
+        assertEndWith( pids, "_1_1", 3 );
+        assertEquals( "my pid is equal to pid 1 of the test", getMainPID(), pids[0] );
+    }
+
+    @Test
+    public void testForkModeOncePerThreadSingleThread()
+    {
+        String[] pids = doTest( unpack( getProject() )
+                .setForkJvm()
+                .forkPerThread()
+                .reuseForks( true )
+                .threadCount( 1 ) );
+        assertSamePids( pids );
+        assertEndWith( pids, "_1_1", 3 );
+        assertFalse( "pid 1 is not the same as the main process' pid", pids[0].equals( getMainPID() ) );
+    }
+
+    @Test
+    public void testForkModeOncePerThreadTwoThreads()
+    {
+        String[] pids = doTest( unpack( getProject() )
+                .forkPerThread()
+                .reuseForks( true )
+                .threadCount( 2 )
+                .addGoal( "-DsleepLength=1200" ) );
+        assertDifferentPids( pids, 2 );
+        assertFalse( "pid 1 is not the same as the main process' pid", pids[0].equals( getMainPID() ) );
+    }
+
+    @Test
+    public void testForkCountZero()
+    {
+        String[] pids = doTest( unpack( getProject() ).forkCount( 0 ) );
+        assertSamePids( pids );
+        assertEndWith( pids, "_1_1", 3 );
+        assertEquals( "my pid is equal to pid 1 of the test", getMainPID(), pids[0] );
+    }
+
+    @Test
+    public void testForkCountOneNoReuse()
+    {
+        String[] pids = doTest( unpack( getProject() ).setForkJvm().forkCount( 1 ).reuseForks( false ) );
+        assertDifferentPids( pids );
+        assertEndWith( pids, "_1_1", 3 );
+        assertFalse( "pid 1 is not the same as the main process' pid", pids[0].equals( getMainPID() ) );
+    }
+
+    @Test
+    public void testForkCountOneReuse()
+    {
+        String[] pids = doTest( unpack( getProject() ).setForkJvm().forkCount( 1 ).reuseForks( true ) );
+        assertSamePids( pids );
+        assertEndWith( pids, "_1_1", 3 );
+        assertFalse( "pid 1 is not the same as the main process' pid", pids[0].equals( getMainPID() ) );
+    }
+
+    @Test
+    public void testForkCountTwoNoReuse()
+    {
+        String[] pids =
+            doTest( unpack( getProject() ).setForkJvm().forkCount( 2 ).reuseForks( false ).addGoal( "-DsleepLength=1200" ) );
+        assertDifferentPids( pids );
+        assertFalse( "pid 1 is not the same as the main process' pid", pids[0].equals( getMainPID() ) );
+    }
+
+    @Test
+    public void testForkCountTwoReuse()
+    {
+        String[] pids =
+            doTest( unpack( getProject() ).forkCount( 2 ).reuseForks( true ).addGoal( "-DsleepLength=1200" ) );
+        assertDifferentPids( pids, 2 );
+        assertFalse( "pid 1 is not the same as the main process' pid", pids[0].equals( getMainPID() ) );
+    }
+
+    private void assertEndWith( String[] pids, String suffix, int expectedMatches )
+    {
+        int matches = 0;
+        for ( String pid : pids )
+        {
+            if ( pid.endsWith( suffix ) )
+            {
+                matches++;
+            }
+        }
+
+        assertEquals( "suffix " + suffix + " matched the correct number of pids", expectedMatches, matches );
+    }
+
+    private void assertDifferentPids( String[] pids, int numOfDifferentPids )
+    {
+        Set<String> pidSet = new HashSet<String>( Arrays.asList( pids ) );
+        assertEquals( "number of different pids is not as expected", numOfDifferentPids, pidSet.size() );
+    }
+
+    @Test
+    public void testForkModeOnce()
+    {
+        String[] pids = doTest( unpack( getProject() ).forkOnce() );
+        assertSamePids( pids );
+        assertFalse( "pid 1 is not the same as the main process' pid", pids[0].equals( getMainPID() ) );
+    }
+
+    private String getMainPID()
+    {
+        final TestFile targetFile = outputValidator.getTargetFile( "maven.pid" );
+        String pid = targetFile.slurpFile();
+        return pid + " testValue_1_1";
+    }
+
+    private void assertSamePids( String[] pids )
+    {
+        assertEquals( "pid 1 didn't match pid 2", pids[0], pids[1] );
+        assertEquals( "pid 1 didn't match pid 3", pids[0], pids[2] );
+    }
+
+    private void assertDifferentPids( String[] pids )
+    {
+        if ( pids[0].equals( pids[1] ) )
+        {
+            fail( "pid 1 matched pid 2: " + pids[0] );
+        }
+
+        if ( pids[0].equals( pids[2] ) )
+        {
+            fail( "pid 1 matched pid 3: " + pids[0] );
+        }
+
+        if ( pids[1].equals( pids[2] ) )
+        {
+            fail( "pid 2 matched pid 3: " + pids[0] );
+        }
+    }
+
+    private String[] doTest( SurefireLauncher forkMode )
+    {
+        forkMode.sysProp( "testProperty", "testValue_${surefire.threadNumber}_${surefire.forkNumber}" );
+        forkMode.addGoal( "org.apache.maven.plugins.surefire:maven-dump-pid-plugin:dump-pid" );
+        outputValidator = forkMode.executeTest();
+        outputValidator.verifyErrorFreeLog().assertTestSuiteResults( 3, 0, 0, 0 );
+        String[] pids = new String[3];
+        for ( int i = 1; i <= pids.length; i++ )
+        {
+            final TestFile targetFile = outputValidator.getTargetFile( "test" + i + "-pid" );
+            String pid = targetFile.slurpFile();
+            pids[i - 1] = pid;
+        }
+        return pids;
+    }
+
+    protected String getProject()
+    {
+        return "fork-mode";
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/09f0eef8/surefire-its/src/test/java/org/apache/maven/surefire/its/ForkModeMultiModuleIT.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/ForkModeMultiModuleIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/ForkModeMultiModuleIT.java
new file mode 100644
index 0000000..22588cc
--- /dev/null
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/ForkModeMultiModuleIT.java
@@ -0,0 +1,162 @@
+package org.apache.maven.surefire.its;
+
+/*
+ * 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.apache.maven.surefire.its.fixture.*;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Test forkMode in a multi module project with parallel maven builds
+ * 
+ * @author Andreas Gudian
+ */
+public class ForkModeMultiModuleIT
+    extends SurefireJUnit4IntegrationTestCase
+{
+    @Test
+    public void testForkCountOneNoReuse()
+    {
+        List<String> pids = doTest( unpack( getProject() ).forkCount( 1 ).reuseForks( false ) );
+        assertAllDifferentPids( pids );
+        int matchesOne = countSuffixMatches( pids, "_1_1");
+        int matchesTwo = countSuffixMatches( pids, "_2_2" );
+        assertTrue( "At least one fork had forkNumber 1", matchesOne >= 1 );
+        assertTrue( "At least one fork had forkNumber 2", matchesTwo >= 1 );
+        assertEquals( "No other forkNumbers than 1 and 2 have been used", 6, matchesOne + matchesTwo);
+    }
+
+
+    @Test
+    public void testForkCountOneReuse()
+    {
+        List<String> pids = doTest( unpack( getProject() ).forkCount( 1 ).reuseForks( true ) );
+        assertDifferentPids( pids, 2 );
+        assertEndWith( pids, "_1_1", 3 );
+        assertEndWith( pids, "_2_2", 3 );
+    }
+
+    @Test
+    public void testForkCountTwoNoReuse()
+    {
+        List<String> pids = doTest( unpack( getProject() ).forkCount( 2 ).reuseForks( false ) );
+        assertAllDifferentPids( pids );
+        int matchesOne = countSuffixMatches( pids, "_1_1");
+        int matchesTwo = countSuffixMatches( pids, "_2_2" );
+        int matchesThree = countSuffixMatches( pids, "_3_3");
+        int matchesFour = countSuffixMatches( pids, "_4_4" );
+        assertTrue( "At least one fork had forkNumber 1", matchesOne >= 1 );
+        assertTrue( "At least one fork had forkNumber 2", matchesTwo >= 1 );
+        assertTrue( "At least one fork had forkNumber 3", matchesThree >= 1 );
+        assertTrue( "At least one fork had forkNumber 4", matchesFour >= 1 );
+        assertEquals( "No other forkNumbers than 1, 2, 3, or 4 have been used", 6, matchesOne + matchesTwo + matchesThree + matchesFour );
+    }
+
+    @Test
+    public void testForkCountTwoReuse()
+    {
+        List<String> pids =
+            doTest( unpack( getProject() ).forkCount( 2 ).reuseForks( true ) );
+        assertDifferentPids( pids, 4 );
+        
+        int matchesOne = countSuffixMatches( pids, "_1_1");
+        int matchesTwo = countSuffixMatches( pids, "_2_2" );
+        int matchesThree = countSuffixMatches( pids, "_3_3");
+        int matchesFour = countSuffixMatches( pids, "_4_4" );
+        assertTrue( "At least one fork had forkNumber 1", matchesOne >= 1 );
+        assertTrue( "At least one fork had forkNumber 2", matchesTwo >= 1 );
+        assertTrue( "At least one fork had forkNumber 3", matchesThree >= 1 );
+        assertTrue( "At least one fork had forkNumber 4", matchesFour >= 1 );
+        assertEquals( "No other forkNumbers than 1, 2, 3, or 4 have been used", 6, matchesOne + matchesTwo + matchesThree + matchesFour );
+    }
+
+    private void assertEndWith( List<String> pids, String suffix, int expectedMatches )
+    {
+        int matches = countSuffixMatches( pids, suffix );
+
+        assertEquals( "suffix " + suffix + " matched the correct number of pids", expectedMatches, matches );
+    }
+
+    private int countSuffixMatches( List<String> pids, String suffix )
+    {
+        int matches = 0;
+        for ( String pid : pids )
+        {
+            if ( pid.endsWith( suffix ) )
+            {
+                matches++;
+            }
+        }
+        return matches;
+    }
+
+    private void assertDifferentPids( List<String> pids, int numOfDifferentPids )
+    {
+        Set<String> pidSet = new HashSet<String>( pids );
+        assertEquals( "number of different pids is not as expected", numOfDifferentPids, pidSet.size() );
+    }
+
+    private void assertAllDifferentPids( List<String> pids )
+    {
+        assertDifferentPids( pids, pids.size() );
+    }
+
+    private List<String> doTest( SurefireLauncher forkMode )
+    {
+        forkMode.addGoal( "-T2" );
+        forkMode.sysProp( "testProperty", "testValue_${surefire.threadNumber}_${surefire.forkNumber}" );
+        final OutputValidator outputValidator = forkMode.setForkJvm().executeTest();
+        List<String> pids = new ArrayList<String>( 6 );
+        pids.addAll( validateModule( outputValidator, "module-a" ) );
+        pids.addAll( validateModule( outputValidator, "module-b" ) );
+
+        return pids;
+    }
+
+    private List<String> validateModule( OutputValidator outputValidator, String module )
+    {
+        HelperAssertions.assertTestSuiteResults( 3, 0, 0, 0, new File( outputValidator.getBaseDir(), module ) );
+
+        List<String> pids = new ArrayList<String>( 3 );
+        for ( int i = 1; i <= 3; i++ )
+        {
+            final TestFile targetFile = outputValidator.getTargetFile( module, "test" + i + "-pid" );
+            String pid = targetFile.slurpFile();
+            pids.add( pid );
+        }
+        
+        return pids;
+    }
+
+    protected String getProject()
+    {
+        return "fork-mode-multimodule";
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/09f0eef8/surefire-its/src/test/java/org/apache/maven/surefire/its/ForkModeTestNGIT.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/ForkModeTestNGIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/ForkModeTestNGIT.java
new file mode 100644
index 0000000..5ba0577
--- /dev/null
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/ForkModeTestNGIT.java
@@ -0,0 +1,35 @@
+package org.apache.maven.surefire.its;
+
+/*
+ * 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.
+ */
+
+/**
+ * Test forkMode
+ *
+ * @author <a href="mailto:velo.br@gmail.com">Marvin Froeder</a>
+ */
+public class ForkModeTestNGIT
+    extends ForkModeIT
+{
+    @Override
+    protected String getProject()
+    {
+        return "fork-mode-testng";
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/09f0eef8/surefire-its/src/test/java/org/apache/maven/surefire/its/IncludesExcludesFromFileIT.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/IncludesExcludesFromFileIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/IncludesExcludesFromFileIT.java
new file mode 100644
index 0000000..a6c539c
--- /dev/null
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/IncludesExcludesFromFileIT.java
@@ -0,0 +1,95 @@
+package org.apache.maven.surefire.its;
+
+/*
+ * 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.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.Test;
+
+/**
+ * Test include/exclude from files.
+ * <br>
+ * Based on {@link IncludesExcludesIT}.
+ */
+public class IncludesExcludesFromFileIT
+    extends SurefireJUnit4IntegrationTestCase
+{
+    private SurefireLauncher unpack()
+    {
+        return unpack( "/includes-excludes-from-file" );
+    }
+
+    @Test
+    public void testSimple()
+    {
+        testWithProfile( "simple" );
+    }
+
+    @Test
+    public void testSimpleMixed()
+    {
+        testWithProfile( "simple-mixed" );
+    }
+
+    @Test
+    public void testRegex()
+    {
+        testWithProfile( "regex" );
+    }
+
+    @Test
+    public void testPath()
+    {
+        testWithProfile( "path" );
+    }
+
+    @Test
+    public void testMissingExcludes()
+    {
+        expectBuildFailure("missing-excludes-file", "Failed to load list from file", "no-such-excludes-file");
+    }
+
+    @Test
+    public void testMissingIncludes()
+    {
+        expectBuildFailure( "missing-includes-file", "Failed to load list from file", "no-such-includes-file" );
+    }
+
+    private void testWithProfile( String profile )
+    {
+        final OutputValidator outputValidator = unpack().
+                activateProfile( profile ).executeTest().verifyErrorFree( 2 );
+
+        outputValidator.getTargetFile( "testTouchFile.txt" ).assertFileExists();
+        outputValidator.getTargetFile( "defaultTestTouchFile.txt" ).assertFileExists();
+    }
+
+    private void expectBuildFailure( final String profile, final String... messages )
+    {
+        final OutputValidator outputValidator = unpack().activateProfile( profile )
+            .maven().withFailure().executeTest();
+
+        for ( String message : messages )
+        {
+            outputValidator.verifyTextInLog( message );
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/09f0eef8/surefire-its/src/test/java/org/apache/maven/surefire/its/IncludesExcludesIT.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/IncludesExcludesIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/IncludesExcludesIT.java
new file mode 100644
index 0000000..46bdeb6
--- /dev/null
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/IncludesExcludesIT.java
@@ -0,0 +1,68 @@
+package org.apache.maven.surefire.its;
+
+/*
+ * 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.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.Test;
+
+/**
+ * Test include/exclude patterns.
+ *
+ * @author Benjamin Bentmann
+ */
+public class IncludesExcludesIT
+    extends SurefireJUnit4IntegrationTestCase
+{
+    private SurefireLauncher unpack()
+    {
+        return unpack( "/includes-excludes" );
+    }
+
+    /**
+     * Test surefire inclusions/exclusions
+     */
+    @Test
+    public void testIncludesExcludes()
+    {
+        testWithProfile( "simple" );
+    }
+
+    @Test
+    public void testRegexIncludesExcludes()
+    {
+        testWithProfile( "regex" );
+    }
+
+    @Test
+    public void testPathBasedIncludesExcludes()
+    {
+        testWithProfile( "path" );
+    }
+
+    private void testWithProfile( String profile )
+    {
+        final OutputValidator outputValidator = unpack().
+            activateProfile( profile ).executeTest().verifyErrorFree( 2 );
+        outputValidator.getTargetFile( "testTouchFile.txt" ).assertFileExists();
+        outputValidator.getTargetFile( "defaultTestTouchFile.txt" ).assertFileExists();
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/09f0eef8/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit44HamcrestIT.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit44HamcrestIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit44HamcrestIT.java
new file mode 100644
index 0000000..7bf90f0
--- /dev/null
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit44HamcrestIT.java
@@ -0,0 +1,38 @@
+package org.apache.maven.surefire.its;
+
+/*
+ * 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.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
+import org.junit.Test;
+
+/**
+ * Test project using JUnit4.4 (including Hamcrest extensions)
+ *
+ * @author <a href="mailto:dfabulich@apache.org">Dan Fabulich</a>
+ */
+public class JUnit44HamcrestIT
+    extends SurefireJUnit4IntegrationTestCase
+{
+    @Test
+    public void testJUnit44Hamcrest()
+    {
+        executeErrorFreeTest( "junit44-hamcrest", 1 );
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/09f0eef8/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47ConcurrencyIT.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47ConcurrencyIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47ConcurrencyIT.java
new file mode 100644
index 0000000..57007a7
--- /dev/null
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47ConcurrencyIT.java
@@ -0,0 +1,58 @@
+package org.apache.maven.surefire.its;
+
+/*
+ * 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.apache.maven.surefire.its.fixture.OutputValidator;
+import org.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.*;
+import static org.hamcrest.CoreMatchers.*;
+
+/**
+ * Basic suite test using all known versions of JUnit 4.x
+ *
+ * @author Kristian Rosenvold
+ */
+public class JUnit47ConcurrencyIT
+    extends SurefireJUnit4IntegrationTestCase
+{
+    @Test
+    public void test47()
+        throws Exception
+    {
+        OutputValidator validator = unpack( "junit47-concurrency" )
+            .executeTest()
+            .verifyErrorFree( 4 );
+        String result = null;
+        for ( String line : validator.loadLogLines() )
+        {
+            if ( line.startsWith( "[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed:" ) )
+            {
+                result = line;
+                break;
+            }
+        }
+        assertNotNull( result);
+        assertThat( result, anyOf( containsString( "Time elapsed: 1." ), containsString( "Time elapsed: 0.9" ) ) );
+        assertThat( result, endsWith( " s - in concurrentjunit47.src.test.java.junit47.BasicTest" ) );
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/09f0eef8/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
new file mode 100644
index 0000000..5aee1a8
--- /dev/null
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47ParallelIT.java
@@ -0,0 +1,540 @@
+package org.apache.maven.surefire.its;
+
+/*
+ * 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.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
+import org.apache.maven.surefire.its.fixture.SurefireLauncher;
+import org.junit.Test;
+
+/**
+ * Testing JUnitCoreWrapper with ParallelComputerBuilder.
+ *
+ * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
+ * @since 2.16
+ */
+public class JUnit47ParallelIT
+    extends SurefireJUnit4IntegrationTestCase
+{
+
+    @Test
+    public void unknownThreadCountSuites()
+    {
+        unpack().parallelSuites().setTestToRun( "TestClass" ).failNever().executeTest().verifyTextInLog(
+            "Use threadCount or threadCountSuites > 0 or useUnlimitedThreads=true for parallel='suites'" );
+    }
+
+    @Test
+    public void unknownThreadCountClasses()
+    {
+        unpack().parallelClasses().setTestToRun( "TestClass" ).failNever().executeTest().verifyTextInLog(
+            "Use threadCount or threadCountClasses > 0 or useUnlimitedThreads=true for parallel='classes'" );
+    }
+
+    @Test
+    public void unknownThreadCountMethods()
+    {
+        unpack().parallelMethods().setTestToRun( "TestClass" ).failNever().executeTest().verifyTextInLog(
+            "Use threadCount or threadCountMethods > 0 or useUnlimitedThreads=true for parallel='methods'" );
+
+    }
+
+    @Test
+    public void unknownThreadCountBoth()
+    {
+        unpack().parallelBoth().setTestToRun( "TestClass" ).failNever().executeTest().verifyTextInLog(
+            "Use useUnlimitedThreads=true, " +
+                "or only threadCount > 0, " +
+                "or (threadCountClasses > 0 and threadCountMethods > 0), " +
+                "or (threadCount > 0 and threadCountClasses > 0 and threadCountMethods > 0), " +
+                "or (threadCount > 0 and threadCountClasses > 0 and threadCount > threadCountClasses) " +
+                "for parallel='both' or parallel='classesAndMethods'" );
+    }
+
+    @Test
+    public void unknownThreadCountAll()
+    {
+        unpack().parallelAll().setTestToRun( "TestClass" ).failNever().executeTest().verifyTextInLog(
+            "Use useUnlimitedThreads=true, " +
+                "or only threadCount > 0, " +
+                "or (threadCountSuites > 0 and threadCountClasses > 0 and threadCountMethods > 0), " +
+                "or every thread-count is specified, " +
+                "or (threadCount > 0 and threadCountSuites > 0 and threadCountClasses > 0 " +
+                "and threadCount > threadCountSuites + threadCountClasses) " +
+                "for parallel='all'" );
+    }
+
+    @Test
+    public void unknownThreadCountSuitesAndClasses()
+    {
+        unpack().parallelSuitesAndClasses().setTestToRun( "TestClass" ).failNever().executeTest().verifyTextInLog(
+            "Use useUnlimitedThreads=true, " +
+                "or only threadCount > 0, " +
+                "or (threadCountSuites > 0 and threadCountClasses > 0), " +
+                "or (threadCount > 0 and threadCountSuites > 0 and threadCountClasses > 0) " +
+                "or (threadCount > 0 and threadCountSuites > 0 and threadCount > threadCountSuites) " +
+                "for parallel='suitesAndClasses' or 'both'" );
+    }
+
+    @Test
+    public void unknownThreadCountSuitesAndMethods()
+    {
+        unpack().parallelSuitesAndMethods().setTestToRun( "TestClass" ).failNever().executeTest().verifyTextInLog(
+            "Use useUnlimitedThreads=true, " +
+                "or only threadCount > 0, " +
+                "or (threadCountSuites > 0 and threadCountMethods > 0), " +
+                "or (threadCount > 0 and threadCountSuites > 0 and threadCountMethods > 0), " +
+                "or (threadCount > 0 and threadCountSuites > 0 and threadCount > threadCountSuites) " +
+                "for parallel='suitesAndMethods'" );
+    }
+
+    @Test
+    public void unknownThreadCountClassesAndMethods()
+    {
+        unpack().parallelClassesAndMethods().setTestToRun( "TestClass" ).failNever().executeTest().verifyTextInLog(
+            "Use useUnlimitedThreads=true, " +
+                "or only threadCount > 0, " +
+                "or (threadCountClasses > 0 and threadCountMethods > 0), " +
+                "or (threadCount > 0 and threadCountClasses > 0 and threadCountMethods > 0), " +
+                "or (threadCount > 0 and threadCountClasses > 0 and threadCount > threadCountClasses) " +
+                "for parallel='both' or parallel='classesAndMethods'" );
+    }
+
+    @Test
+    public void serial()
+    {
+        // takes 7.2 sec
+        unpack().setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void unlimitedThreadsSuites1()
+    {
+        // takes 3.6 sec
+        unpack().parallelSuites().useUnlimitedThreads().setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree(
+            24 );
+    }
+
+    @Test
+    public void unlimitedThreadsSuites2()
+    {
+        // takes 3.6 sec
+        unpack().parallelSuites().useUnlimitedThreads().threadCountSuites( 5 ).setTestToRun(
+            "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void unlimitedThreadsClasses1()
+    {
+        // takes 1.8 sec
+        unpack().parallelClasses().useUnlimitedThreads().setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree(
+            24 );
+    }
+
+    @Test
+    public void unlimitedThreadsClasses2()
+    {
+        // takes 1.8 sec
+        unpack().parallelClasses().useUnlimitedThreads().threadCountClasses( 5 ).setTestToRun(
+            "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void unlimitedThreadsMethods1()
+    {
+        // takes 2.4 sec
+        unpack().parallelMethods().useUnlimitedThreads().setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree(
+            24 );
+    }
+
+    @Test
+    public void unlimitedThreadsMethods2()
+    {
+        // takes 2.4 sec
+        unpack().parallelMethods().useUnlimitedThreads().threadCountMethods( 5 ).setTestToRun(
+            "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void unlimitedThreadsSuitesAndClasses1()
+    {
+        // takes 0.9 sec
+        unpack().parallelSuitesAndClasses().useUnlimitedThreads().setTestToRun(
+            "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void unlimitedThreadsSuitesAndClasses2()
+    {
+        // takes 0.9 sec
+        // 1.8 sec with 4 parallel classes
+        unpack().parallelSuitesAndClasses().useUnlimitedThreads().threadCountSuites( 5 ).threadCountClasses(
+            15 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void unlimitedThreadsSuitesAndMethods1()
+    {
+        // takes 1.2 sec
+        unpack().parallelSuitesAndMethods().useUnlimitedThreads().setTestToRun(
+            "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void unlimitedThreadsSuitesAndMethods2()
+    {
+        // takes 1.2 sec
+        unpack().parallelSuitesAndMethods().useUnlimitedThreads().threadCountSuites( 5 ).threadCountMethods(
+            15 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void unlimitedThreadsClassesAndMethods1()
+    {
+        // takes 0.6 sec
+        unpack().parallelClassesAndMethods().useUnlimitedThreads().setTestToRun(
+            "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void unlimitedThreadsClassesAndMethods2()
+    {
+        // takes 0.6 sec
+        unpack().parallelClassesAndMethods().useUnlimitedThreads().threadCountClasses( 5 ).threadCountMethods(
+            15 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void unlimitedThreadsAll1()
+    {
+        // takes 0.3 sec
+        unpack().parallelAll().useUnlimitedThreads().setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void unlimitedThreadsAll2()
+    {
+        // takes 0.3 sec
+        unpack().parallelAll().useUnlimitedThreads().threadCountSuites( 5 ).threadCountClasses( 15 ).threadCountMethods(
+            30 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void threadCountSuites()
+    {
+        // takes 3.6 sec
+        unpack().parallelSuites().threadCount( 3 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void threadCountClasses()
+    {
+        // takes 3.6 sec for single core
+        // takes 1.8 sec for double core
+        unpack().parallelClasses().threadCount( 3 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void threadCountMethods()
+    {
+        // takes 2.4 sec
+        unpack().parallelMethods().threadCount( 3 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void threadCountClassesAndMethodsOneCore()
+    {
+        // takes 4.8 sec
+        unpack().disablePerCoreThreadCount().disableParallelOptimization().parallelClassesAndMethods().threadCount(
+            3 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void threadCountClassesAndMethodsOneCoreOptimized()
+    {
+        // the number of reused threads in leafs depends on the number of runners and CPU
+        unpack().disablePerCoreThreadCount().parallelClassesAndMethods().threadCount( 3 ).setTestToRun(
+            "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void threadCountClassesAndMethods()
+    {
+        // takes 2.4 sec for double core CPU
+        unpack().disableParallelOptimization().parallelClassesAndMethods().threadCount( 3 ).setTestToRun(
+            "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void threadCountClassesAndMethodsOptimized()
+    {
+        // the number of reused threads in leafs depends on the number of runners and CPU
+        unpack().parallelClassesAndMethods().threadCount( 3 ).setTestToRun(
+            "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void threadCountSuitesAndMethods()
+    {
+        // usually 24 times 0.3 sec = 7.2 sec with one core CPU
+        // takes 1.8 sec for double core CPU
+        unpack().disableParallelOptimization().parallelSuitesAndMethods().threadCount( 3 ).setTestToRun(
+            "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void threadCountSuitesAndMethodsOptimized()
+    {
+        // the number of reused threads in leafs depends on the number of runners and CPU
+        unpack().parallelSuitesAndMethods().threadCount( 3 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree(
+            24 );
+    }
+
+    @Test
+    public void threadCountSuitesAndClasses()
+    {
+        unpack().disableParallelOptimization().parallelSuitesAndClasses().threadCount( 3 ).setTestToRun(
+            "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void threadCountSuitesAndClassesOptimized()
+    {
+        // the number of reused threads in leafs depends on the number of runners and CPU
+        unpack().parallelSuitesAndClasses().threadCount( 3 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree(
+            24 );
+    }
+
+    @Test
+    public void threadCountAll()
+    {
+        unpack().disableParallelOptimization().parallelAll().threadCount( 3 ).setTestToRun(
+            "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void threadCountAllOptimized()
+    {
+        // the number of reused threads in leafs depends on the number of runners and CPU
+        unpack().parallelAll().threadCount( 3 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void everyThreadCountSuitesAndClasses()
+    {
+        // takes 1.8 sec for double core CPU
+        unpack().parallelSuitesAndClasses().threadCount( 3 ).threadCountSuites( 34 ).threadCountClasses(
+            66 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void everyThreadCountSuitesAndMethods()
+    {
+        // takes 1.8 sec for double core CPU
+        unpack().parallelSuitesAndMethods().threadCount( 3 ).threadCountSuites( 34 ).threadCountMethods(
+            66 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void everyThreadCountClassesAndMethods()
+    {
+        // takes 1.8 sec for double core CPU
+        unpack().parallelClassesAndMethods().threadCount( 3 ).threadCountClasses( 34 ).threadCountMethods(
+            66 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void everyThreadCountAll()
+    {
+        // takes 2.4 sec for double core CPU
+        unpack().parallelAll().threadCount( 3 ).threadCountSuites( 17 ).threadCountClasses( 34 ).threadCountMethods(
+            49 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void reusableThreadCountSuitesAndClasses()
+    {
+        // 4 * cpu to 5 * cpu threads to run test classes
+        // takes cca 1.8 sec
+        unpack().disableParallelOptimization().parallelSuitesAndClasses().disablePerCoreThreadCount().threadCount(
+            6 ).threadCountSuites( 2 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void reusableThreadCountSuitesAndClassesOptimized()
+    {
+        // the number of reused threads in leafs depends on the number of runners and CPU
+        unpack().parallelSuitesAndClasses().disablePerCoreThreadCount().threadCount( 6 ).threadCountSuites(
+            2 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void reusableThreadCountSuitesAndMethods()
+    {
+        // 4 * cpu to 5 * cpu threads to run test methods
+        // takes cca 1.8 sec
+        unpack().disableParallelOptimization().parallelSuitesAndMethods().disablePerCoreThreadCount().threadCount(
+            6 ).threadCountSuites( 2 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void reusableThreadCountSuitesAndMethodsOptimized()
+    {
+        // the number of reused threads in leafs depends on the number of runners and CPU
+        unpack().parallelSuitesAndMethods().disablePerCoreThreadCount().threadCount( 6 ).threadCountSuites(
+            2 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void reusableThreadCountClassesAndMethods()
+    {
+        // 4 * cpu to 5 * cpu threads to run test methods
+        // takes cca 1.8 sec
+        unpack().disableParallelOptimization().parallelClassesAndMethods().disablePerCoreThreadCount().threadCount(
+            6 ).threadCountClasses( 2 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void reusableThreadCountClassesAndMethodsOptimized()
+    {
+        // the number of reused threads in leafs depends on the number of runners and CPU
+        unpack().parallelClassesAndMethods().disablePerCoreThreadCount().threadCount( 6 ).threadCountClasses(
+            2 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void reusableThreadCountAll()
+    {
+        // 8 * cpu to 13 * cpu threads to run test methods
+        // takes 0.9 sec
+        unpack().disableParallelOptimization().parallelAll().disablePerCoreThreadCount().threadCount(
+            14 ).threadCountSuites( 2 ).threadCountClasses( 4 ).setTestToRun(
+            "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void reusableThreadCountAllOptimized()
+    {
+        // the number of reused threads in leafs depends on the number of runners and CPU
+        unpack().parallelAll().disablePerCoreThreadCount().threadCount( 14 ).threadCountSuites( 2 ).threadCountClasses(
+            4 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void suites()
+    {
+        // takes 3.6 sec
+        unpack().parallelSuites().threadCountSuites( 5 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree(
+            24 );
+    }
+
+    @Test
+    public void classes()
+    {
+        // takes 1.8 sec on any CPU because the suites are running in a sequence
+        unpack().parallelClasses().threadCountClasses( 5 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree(
+            24 );
+    }
+
+    @Test
+    public void methods()
+    {
+        // takes 2.4 sec on any CPU because every class has only three methods
+        // and the suites and classes are running in a sequence
+        unpack().parallelMethods().threadCountMethods( 5 ).setTestToRun( "Suite*Test" ).executeTest().verifyErrorFree(
+            24 );
+    }
+
+    @Test
+    public void suitesAndClasses()
+    {
+        // takes 0.9 sec
+        unpack().parallelSuitesAndClasses().threadCountSuites( 5 ).threadCountClasses( 15 ).setTestToRun(
+            "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void suitesAndMethods()
+    {
+        // takes 1.2 sec on any CPU
+        unpack().parallelSuitesAndMethods().threadCountSuites( 5 ).threadCountMethods( 15 ).setTestToRun(
+            "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void classesAndMethods()
+    {
+        // takes 0.6 sec on any CPU
+        unpack().parallelClassesAndMethods().threadCountClasses( 5 ).threadCountMethods( 15 ).setTestToRun(
+            "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void all()
+    {
+        // takes 0.3 sec on any CPU
+        unpack().parallelAll().threadCountSuites( 5 ).threadCountClasses( 15 ).threadCountMethods( 30 ).setTestToRun(
+            "Suite*Test" ).executeTest().verifyErrorFree( 24 );
+    }
+
+    @Test
+    public void shutdown()
+    {
+        // executes for 2.5 sec until timeout has elapsed
+        unpack().parallelMethods().threadCountMethods( 2 ).parallelTestsTimeoutInSeconds( 2.5d ).setTestToRun(
+            "TestClass" ).failNever().executeTest().verifyTextInLog(
+            "The test run has finished abruptly after timeout of 2.5 seconds." );
+    }
+
+    @Test
+    public void forcedShutdown()
+    {
+        // executes for 2.5 sec until timeout has elapsed
+        unpack().parallelMethods().threadCountMethods( 2 ).parallelTestsTimeoutForcedInSeconds( 2.5d ).setTestToRun(
+            "TestClass" ).failNever().executeTest().verifyTextInLog(
+            "The test run has finished abruptly after timeout of 2.5 seconds." );
+    }
+
+    @Test
+    public void timeoutAndForcedShutdown()
+    {
+        // executes for one sec until timeout has elapsed
+        unpack().parallelMethods().threadCountMethods( 2 ).parallelTestsTimeoutInSeconds(
+            1 ).parallelTestsTimeoutForcedInSeconds( 2.5d ).setTestToRun(
+            "TestClass" ).failNever().executeTest().verifyTextInLog(
+            "The test run has finished abruptly after timeout of 1.0 seconds." );
+    }
+
+    @Test
+    public void forcedShutdownVerifyingLogs()
+    {
+        // executes for 2.5 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." )
+            .verifyTextInLog( "These tests were executed in prior to the shutdown operation:" )
+            .verifyTextInLog( "These tests are incomplete:" );
+    }
+
+    private SurefireLauncher unpack()
+    {
+        return unpack( "junit47-parallel" )
+            .showErrorStackTraces();
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/09f0eef8/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47ParallelNotThreadSafeIT.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47ParallelNotThreadSafeIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47ParallelNotThreadSafeIT.java
new file mode 100644
index 0000000..bf393ca
--- /dev/null
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47ParallelNotThreadSafeIT.java
@@ -0,0 +1,52 @@
+package org.apache.maven.surefire.its;
+
+/*
+ * 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.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
+import org.apache.maven.surefire.its.fixture.SurefireLauncher;
+import org.junit.Test;
+
+/**
+ * Testing {@code @net.jcip.annotations.NotThreadSafe} with ParallelComputerBuilder.
+ *
+ * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
+ * @since 2.19
+ */
+public class JUnit47ParallelNotThreadSafeIT
+    extends SurefireJUnit4IntegrationTestCase
+{
+
+    private SurefireLauncher unpack()
+    {
+        return unpack( "junit47-parallel-nts" );
+    }
+
+    @Test
+    public void test()
+    {
+        unpack()
+            .parallelAll()
+            .useUnlimitedThreads()
+            .executeTest()
+            .verifyErrorFree( 2 )
+            .verifyTextInLog( "xxx-maven-surefire-plugin@NotThreadSafe" )
+            .verifyTextInLog( "expected-thread" );
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/09f0eef8/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47RedirectOutputIT.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47RedirectOutputIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47RedirectOutputIT.java
new file mode 100644
index 0000000..aa38dac
--- /dev/null
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47RedirectOutputIT.java
@@ -0,0 +1,71 @@
+package org.apache.maven.surefire.its;
+
+/*
+ * 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.apache.commons.lang.StringUtils;
+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.Test;
+
+import java.io.IOException;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+
+public class JUnit47RedirectOutputIT
+    extends SurefireJUnit4IntegrationTestCase
+{
+    @Test
+    public void testPrintSummaryTrueWithRedirect()
+        throws Exception
+    {
+        final OutputValidator clean = unpack().redirectToFile( true ).addGoal( "clean" ).executeTest();
+        checkReports( clean );
+    }
+
+    @Test
+    public void testClassesParallel()
+        throws Exception
+    {
+        final OutputValidator clean =
+            unpack().redirectToFile( true ).parallelClasses().addGoal( "clean" ).executeTest();
+        checkReports( clean );
+    }
+
+    private void checkReports( OutputValidator validator )
+        throws IOException
+    {
+        String report = StringUtils.trimToNull(
+            validator.getSurefireReportsFile( "junit47ConsoleOutput.Test1-output.txt" ).readFileToString() );
+        assertNotNull( report );
+        String report2 = StringUtils.trimToNull(
+            validator.getSurefireReportsFile( "junit47ConsoleOutput.Test2-output.txt" ).readFileToString() );
+        assertNotNull( report2 );
+        assertFalse( validator.getSurefireReportsFile( "junit47ConsoleOutput.Test3-output.txt" ).exists() );
+    }
+
+
+    private SurefireLauncher unpack()
+    {
+        return unpack( "/junit47-redirect-output" );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/09f0eef8/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47RerunFailingTestWithCucumberIT.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47RerunFailingTestWithCucumberIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47RerunFailingTestWithCucumberIT.java
new file mode 100644
index 0000000..9fe1775
--- /dev/null
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47RerunFailingTestWithCucumberIT.java
@@ -0,0 +1,80 @@
+package org.apache.maven.surefire.its;
+
+/*
+ * 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.apache.maven.surefire.its.fixture.HelperAssertions.assumeJavaVersion;
+
+import org.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
+import org.apache.maven.surefire.its.fixture.SurefireLauncher;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests using the JUnit 47 provider to rerun failing tests with the cucumber runner. The main
+ * problem that the junit4 provider has with the cucumber runner is that the junit Description
+ * instance created by the runner has a null test class attribute. This requires that tests are
+ * rerun based on their description.
+ *
+ * @author mpkorstanje
+ */
+public class JUnit47RerunFailingTestWithCucumberIT
+    extends SurefireJUnit4IntegrationTestCase {
+
+    @Before
+    public void assumeJdk17() {
+        assumeJavaVersion(1.7d);
+    }
+
+
+    private SurefireLauncher unpack() {
+        return unpack("junit47-rerun-failing-tests-with-cucumber")
+            .setJUnitVersion("4.12");
+    }
+
+    @Test
+    public void testRerunFailingErrorTestsFalse() {
+        unpack()
+            .maven()
+            .addGoal("-Dsurefire.rerunFailingTestsCount=" + 0)
+            .withFailure()
+            .executeTest()
+            .assertTestSuiteResults(1, 0, 1, 0, 0);
+    }
+
+    @Test
+    public void testRerunFailingErrorTestsWithOneRetry() {
+        unpack()
+            .maven()
+            .addGoal("-Dsurefire.rerunFailingTestsCount=" + 1)
+            .withFailure()
+            .executeTest()
+            .assertTestSuiteResults(1, 0, 1, 0, 0);
+    }
+
+    @Test
+    public void testRerunFailingErrorTestsTwoRetry() {
+        unpack()
+            .maven()
+            .addGoal("-Dsurefire.rerunFailingTestsCount=" + 2)
+            .executeTest()
+            .assertTestSuiteResults(1, 0, 0, 0, 2);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/09f0eef8/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47StaticInnerClassTestsIT.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47StaticInnerClassTestsIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47StaticInnerClassTestsIT.java
new file mode 100644
index 0000000..e50e6d7
--- /dev/null
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47StaticInnerClassTestsIT.java
@@ -0,0 +1,34 @@
+package org.apache.maven.surefire.its;
+
+/*
+ * 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.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
+import org.junit.Test;
+
+public class JUnit47StaticInnerClassTestsIT
+    extends SurefireJUnit4IntegrationTestCase
+{
+
+    @Test
+    public void testStaticInnerClassTests()
+    {
+        executeErrorFreeTest( "junit47-static-inner-class-tests", 3 );
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/09f0eef8/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47WithCucumberIT.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47WithCucumberIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47WithCucumberIT.java
new file mode 100644
index 0000000..38c2eae
--- /dev/null
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit47WithCucumberIT.java
@@ -0,0 +1,70 @@
+package org.apache.maven.surefire.its;
+
+/*
+ * 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.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.apache.maven.surefire.its.fixture.HelperAssertions.assumeJavaVersion;
+
+/**
+ * Tests the JUnit 47 provider with the cucumber runner. At the moment, they don't play along that perfectly (minor
+ * glitches in the reports with parallel=classes), but at least all tests are executed, the execution times are counted
+ * correctly and failing tests are reported. The main problem that the junit47 provider has with the cucumber runner is
+ * that the junit Description instance created by the runner has a null test class attribute.
+ * 
+ * @author agudian
+ */
+public class JUnit47WithCucumberIT
+    extends SurefireJUnit4IntegrationTestCase
+{
+
+    @Before
+    public void assumeJdk16()
+    {
+        assumeJavaVersion( 1.6d );
+    }
+
+    @Test
+    public void testWithoutParallel()
+    {
+        // 8 tests in total is what's probably correct
+        doTest( "none", 8 );
+    }
+
+    @Test
+    public void testWithParallelClasses()
+    {
+        // with parallel=classes, we get 9 tests in total,
+        // as the dummy "scenario" test entry is reported twice: once as success, and once with the failure from the
+        // failing test step
+        doTest( "classes", 9 );
+    }
+
+    private void doTest( String parallel, int total )
+    {
+        unpack( "junit47-cucumber" )
+                .sysProp( "parallel", parallel )
+                .sysProp( "threadCount", "2" )
+                .executeTest()
+                .assertTestSuiteResults( total, 0, 2, 0 );
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/09f0eef8/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit48TestCategoriesIT.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit48TestCategoriesIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit48TestCategoriesIT.java
new file mode 100644
index 0000000..fdb56f7
--- /dev/null
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit48TestCategoriesIT.java
@@ -0,0 +1,145 @@
+package org.apache.maven.surefire.its;
+
+/*
+ * 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.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
+import org.apache.maven.surefire.its.fixture.SurefireLauncher;
+import org.junit.Test;
+
+/**
+ * Test project using "groups" support
+ *
+ * @author <a href="mailto:todd@apache.org">Todd Lipcon</a>
+ * @author <a href="mailto:krosenvold@apache.org">Kristian Rosenvold</a>
+ */
+public class JUnit48TestCategoriesIT
+        extends SurefireJUnit4IntegrationTestCase
+{
+    @Test
+    public void testCategoriesAB()
+    {
+        runAB( unpacked() );
+    }
+
+    @Test
+    public void testCategoriesABForkAlways()
+    {
+        runAB( unpacked().forkAlways() );
+    }
+
+    @Test
+    public void testCategoriesACFullyQualifiedClassName()
+    {
+        runACFullyQualifiedClassName( unpacked() );
+    }
+
+    @Test
+    public void testCategoriesACFullyQualifiedClassNameForkAlways()
+    {
+        runACFullyQualifiedClassName( unpacked().forkAlways() );
+    }
+
+    @Test
+    public void testCategoriesACClassNameSuffix()
+    {
+        runACClassNameSuffix( unpacked() );
+    }
+
+    @Test
+    public void testCategoriesACClassNameSuffixForkAlways()
+    {
+        runACClassNameSuffix( unpacked().forkAlways() );
+    }
+
+    @Test
+    public void testCategoriesBadCategory()
+    {
+        runBadCategory( unpacked() );
+    }
+
+    @Test
+    public void testBadCategoryForkAlways()
+    {
+        runBadCategory( unpacked().forkAlways() );
+    }
+
+    private static void runAB( SurefireLauncher unpacked )
+    {
+        unpacked.executeTest()
+                .verifyErrorFreeLog()
+                .assertTestSuiteResults( 3, 0, 0, 0 )
+                .verifyTextInLog( "catA: 1" )
+                .verifyTextInLog( "catB: 1" )
+                .verifyTextInLog( "catC: 0" )
+                .verifyTextInLog( "catNone: 0" );
+    }
+
+    private static void runACClassNameSuffix( SurefireLauncher unpacked )
+    {
+        unpacked.groups( "CategoryA,CategoryC" )
+                .executeTest()
+                .verifyErrorFreeLog()
+                .assertTestSuiteResults( 6, 0, 0, 0 )
+                .verifyTextInLog( "catA: 1" )
+                .verifyTextInLog( "catB: 0" )
+                .verifyTextInLog( "catC: 1" )
+                .verifyTextInLog( "catNone: 0" )
+                .verifyTextInLog( "mA: 1" )
+
+                // This seems questionable !? The class is annotated with category C and method with B
+                .verifyTextInLog( "mB: 1" )
+
+                .verifyTextInLog( "mC: 1" )
+                .verifyTextInLog( "CatNone: 1" );
+    }
+
+    private static void runACFullyQualifiedClassName( SurefireLauncher unpacked )
+    {
+        unpacked.groups( "junit4.CategoryA,junit4.CategoryC" )
+                .executeTest()
+                .verifyErrorFreeLog()
+                .assertTestSuiteResults( 6, 0, 0, 0 )
+                .verifyTextInLog( "catA: 1" )
+                .verifyTextInLog( "catB: 0" )
+                .verifyTextInLog( "catC: 1" )
+                .verifyTextInLog( "catNone: 0" )
+                .verifyTextInLog( "mA: 1" )
+
+                // This seems questionable !? The class is annotated with category C and method with B
+                .verifyTextInLog( "mB: 1" )
+
+                .verifyTextInLog( "mC: 1" )
+                .verifyTextInLog( "CatNone: 1" );
+    }
+
+    private static void runBadCategory( SurefireLauncher unpacked )
+    {
+        unpacked.failIfNoTests( false )
+                .groups( "BadCategory" )
+                .executeTest()
+                .verifyErrorFreeLog();
+    }
+
+    private SurefireLauncher unpacked()
+    {
+        return unpack( "/junit48-categories" );
+        // .debugSurefireFork();
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/09f0eef8/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit4ForkAlwaysStaticInitPollutionIT.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit4ForkAlwaysStaticInitPollutionIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit4ForkAlwaysStaticInitPollutionIT.java
new file mode 100644
index 0000000..19b937d
--- /dev/null
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit4ForkAlwaysStaticInitPollutionIT.java
@@ -0,0 +1,38 @@
+package org.apache.maven.surefire.its;
+
+/*
+ * 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.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
+import org.junit.Test;
+
+/**
+ * Test JUnit 4 tests marked with "Ignore" attribute
+ *
+ * @author <a href="mailto:dfabulich@apache.org">Dan Fabulich</a>
+ */
+public class JUnit4ForkAlwaysStaticInitPollutionIT
+    extends SurefireJUnit4IntegrationTestCase
+{
+    @Test
+    public void testJunit4Ignore()
+    {
+        executeErrorFreeTest( "junit4-forkAlways-staticInit", 2 );
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/09f0eef8/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit4IgnoreIT.java
----------------------------------------------------------------------
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit4IgnoreIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit4IgnoreIT.java
new file mode 100644
index 0000000..71ec3d8
--- /dev/null
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnit4IgnoreIT.java
@@ -0,0 +1,52 @@
+package org.apache.maven.surefire.its;
+
+/*
+ * 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.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
+import org.apache.maven.surefire.its.fixture.SurefireLauncher;
+import org.junit.Test;
+
+/**
+ * Test JUnit 4 tests marked with "Ignore" attribute
+ *
+ * @author <a href="mailto:dfabulich@apache.org">Dan Fabulich</a>
+ */
+public class JUnit4IgnoreIT
+    extends SurefireJUnit4IntegrationTestCase
+{
+    @Test
+    public void testJunit4Ignore()
+    {
+        // Todo: Support assumption failure == ignore for junit4
+        unpack().executeTest().verifyErrorFreeLog().assertTestSuiteResults( 7, 0, 0, 6 );
+    }
+
+    @Test
+    public void testJunit47ParallelIgnore()
+    {
+        unpack().setJUnitVersion( "4.8.1" ).parallelClasses().executeTest().verifyErrorFreeLog().assertTestSuiteResults(
+            7, 0, 0, 7 );
+    }
+
+    private SurefireLauncher unpack()
+    {
+        return unpack( "/junit-ignore" );
+    }
+}