[SUREFIRE-1202] Allow rerunFailingTestsCount, skipAfterFailureCount together
Project: http://git-wip-us.apache.org/repos/asf/maven-surefire/repo Commit: http://git-wip-us.apache.org/repos/asf/maven-surefire/commit/7f64ddbf Tree: http://git-wip-us.apache.org/repos/asf/maven-surefire/tree/7f64ddbf Diff: http://git-wip-us.apache.org/repos/asf/maven-surefire/diff/7f64ddbf Branch: refs/heads/master Commit: 7f64ddbf208e47656fea57423822387bd9c13451 Parents: 6e3be85 Author: Tibor17 <tibo...@lycos.com> Authored: Sat Dec 26 02:22:36 2015 +0100 Committer: Tibor17 <tibo...@lycos.com> Committed: Sat Dec 26 02:22:50 2015 +0100 ---------------------------------------------------------------------- .../plugin/surefire/AbstractSurefireMojo.java | 8 -- .../apt/examples/rerun-failing-tests.apt.vm | 8 ++ .../site/apt/examples/skip-after-failure.apt.vm | 10 +- .../its/jiras/Surefire1202RerunAndSkipIT.java | 58 +++++++++ .../surefire-1202-rerun-and-failfast/pom.xml | 122 +++++++++++++++++++ .../src/test/java/pkg/ATest.java | 45 +++++++ .../src/test/java/pkg/BTest.java | 42 +++++++ .../src/test/java/pkg/CTest.java | 35 ++++++ .../src/test/java/pkg/DTest.java | 35 ++++++ .../src/test/java/pkg/ETest.java | 31 +++++ .../maven/surefire/common/junit4/Notifier.java | 79 ++++++++---- .../maven/surefire/junit4/JUnit4Provider.java | 15 ++- .../surefire/junitcore/JUnitCoreProvider.java | 17 +-- .../surefire/junitcore/JUnitCoreWrapper.java | 20 +-- .../surefire/junitcore/Surefire746Test.java | 2 +- 15 files changed, 463 insertions(+), 64 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/7f64ddbf/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java ---------------------------------------------------------------------- diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java index f169446..2654e2e 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java @@ -2396,14 +2396,6 @@ public abstract class AbstractSurefireMojo { throw new MojoFailureException( "Parameter \"skipAfterFailureCount\" should not be negative." ); } - - boolean isRerun = getRerunFailingTestsCount() > 0; - boolean isFailFast = getSkipAfterFailureCount() > 0; - if ( isRerun && isFailFast ) - { - throw new MojoFailureException( "Parameters [\"rerunFailingTestsCount\", \"skipAfterFailureCount\"] " - + "should not be enabled together." ); - } } private void warnIfWrongShutdownValue() http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/7f64ddbf/maven-surefire-plugin/src/site/apt/examples/rerun-failing-tests.apt.vm ---------------------------------------------------------------------- diff --git a/maven-surefire-plugin/src/site/apt/examples/rerun-failing-tests.apt.vm b/maven-surefire-plugin/src/site/apt/examples/rerun-failing-tests.apt.vm index effd7b4..8a6a8bd 100644 --- a/maven-surefire-plugin/src/site/apt/examples/rerun-failing-tests.apt.vm +++ b/maven-surefire-plugin/src/site/apt/examples/rerun-failing-tests.apt.vm @@ -139,3 +139,11 @@ mvn -D${thisPlugin.toLowerCase()}.rerunFailingTestsCount=2 test The provider <<<surefire-junit4>>> executes individual test class and consequently re-runs failed tests. The provider <<<surefire-junit47>>> executes all test classes and re-runs failed tests afterwards. + +* Re-run and skip execution + + Since of 2.19.1 you can use parameters <<<skipAfterFailureCount>>> and <<<rerunFailingTestsCount>>> together. + This is enabled by providers <<<surefire-junit4>>> and <<<surefire-junit47>>>. You can run again failed tests + and skip the rest of the test-set if errors or failures reached <<<skipAfterFailureCount>>>. + Notice that failed tests within re-run phase are not included in <<<skipAfterFailureCount>>>. + http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/7f64ddbf/maven-surefire-plugin/src/site/apt/examples/skip-after-failure.apt.vm ---------------------------------------------------------------------- diff --git a/maven-surefire-plugin/src/site/apt/examples/skip-after-failure.apt.vm b/maven-surefire-plugin/src/site/apt/examples/skip-after-failure.apt.vm index 1ba41bd..06ed150 100644 --- a/maven-surefire-plugin/src/site/apt/examples/skip-after-failure.apt.vm +++ b/maven-surefire-plugin/src/site/apt/examples/skip-after-failure.apt.vm @@ -74,4 +74,12 @@ Limitations due to race conditions. The parameter <<<reuseForks>>> should be always set to <<<true>>> (which is default value), otherwise this feature won't work properly in most cases. - \ No newline at end of file + +Other features + +* Re-run and skip execution + + Since of 2.19.1 you can use parameters <<<skipAfterFailureCount>>> and <<<rerunFailingTestsCount>>> together. + This is enabled by providers <<<surefire-junit4>>> and <<<surefire-junit47>>>. You can run again failed tests + and skip the rest of the test-set if errors or failures reached <<<skipAfterFailureCount>>>. + Notice that failed tests within re-run phase are not included in <<<skipAfterFailureCount>>>. http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/7f64ddbf/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1202RerunAndSkipIT.java ---------------------------------------------------------------------- diff --git a/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1202RerunAndSkipIT.java b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1202RerunAndSkipIT.java new file mode 100644 index 0000000..7d60138 --- /dev/null +++ b/surefire-integration-tests/src/test/java/org/apache/maven/surefire/its/jiras/Surefire1202RerunAndSkipIT.java @@ -0,0 +1,58 @@ +package org.apache.maven.surefire.its.jiras; + +/* + * 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.it.VerificationException; +import org.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase; +import org.apache.maven.surefire.its.fixture.SurefireLauncher; +import org.junit.Test; + +/** + * Allow rerunFailingTestsCount, skipAfterFailureCount together + * + * @author <a href="mailto:tibordig...@apache.org">Tibor Digana (tibor17)</a> + * @see {@linkplain https://jira.codehaus.org/browse/SUREFIRE-1202} + * @since 2.19.1 + */ +public class Surefire1202RerunAndSkipIT + extends SurefireJUnit4IntegrationTestCase +{ + @Test + public void junit47() + throws VerificationException + { + unpack().executeTest() + .assertTestSuiteResults( 5, 0, 0, 3, 4 ); + } + + @Test + public void junit4() + throws VerificationException + { + unpack().addGoal( "-Pjunit4" ) + .executeTest() + .assertTestSuiteResults( 5, 0, 0, 3, 4 ); + } + + private SurefireLauncher unpack() + { + return unpack( "surefire-1202-rerun-and-failfast" ); + } +} http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/7f64ddbf/surefire-integration-tests/src/test/resources/surefire-1202-rerun-and-failfast/pom.xml ---------------------------------------------------------------------- diff --git a/surefire-integration-tests/src/test/resources/surefire-1202-rerun-and-failfast/pom.xml b/surefire-integration-tests/src/test/resources/surefire-1202-rerun-and-failfast/pom.xml new file mode 100644 index 0000000..2ba6100 --- /dev/null +++ b/surefire-integration-tests/src/test/resources/surefire-1202-rerun-and-failfast/pom.xml @@ -0,0 +1,122 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ~ 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. + --> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>org.apache.maven.plugins.surefire</groupId> + <artifactId>jiras-surefire-1202</artifactId> + <version>1.0</version> + + <url>http://maven.apache.org</url> + + <developers> + <developer> + <id>tibordigana</id> + <name>Tibor DigaÅa (tibor17)</name> + <email>tibordig...@apache.org</email> + <roles> + <role>PMC</role> + </roles> + <timezone>Europe/Bratislava</timezone> + </developer> + </developers> + + <dependencies> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.12</version> + <scope>test</scope> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <configuration> + <source>1.5</source> + <target>1.5</target> + </configuration> + </plugin> + </plugins> + <pluginManagement> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <version>${surefire.version}</version> + <configuration> + <forkMode>once</forkMode> + <forkCount>1</forkCount> + <skipAfterFailureCount>2</skipAfterFailureCount> + <rerunFailingTestsCount>3</rerunFailingTestsCount> + </configuration> + </plugin> + </plugins> + </pluginManagement> + </build> + + <profiles> + <profile> + <id>junit47</id> + <activation> + <activeByDefault>true</activeByDefault> + </activation> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <dependencies> + <dependency> + <groupId>org.apache.maven.surefire</groupId> + <artifactId>surefire-junit47</artifactId> + <version>${surefire.version}</version> + </dependency> + </dependencies> + </plugin> + </plugins> + </build> + </profile> + <profile> + <id>junit4</id> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <dependencies> + <dependency> + <groupId>org.apache.maven.surefire</groupId> + <artifactId>surefire-junit4</artifactId> + <version>${surefire.version}</version> + </dependency> + </dependencies> + </plugin> + </plugins> + </build> + </profile> + </profiles> + +</project> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/7f64ddbf/surefire-integration-tests/src/test/resources/surefire-1202-rerun-and-failfast/src/test/java/pkg/ATest.java ---------------------------------------------------------------------- diff --git a/surefire-integration-tests/src/test/resources/surefire-1202-rerun-and-failfast/src/test/java/pkg/ATest.java b/surefire-integration-tests/src/test/resources/surefire-1202-rerun-and-failfast/src/test/java/pkg/ATest.java new file mode 100644 index 0000000..cbe3f6f --- /dev/null +++ b/surefire-integration-tests/src/test/resources/surefire-1202-rerun-and-failfast/src/test/java/pkg/ATest.java @@ -0,0 +1,45 @@ +package pkg; + +/* + * 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; +import static java.util.concurrent.TimeUnit.SECONDS; + +public class ATest +{ + private static int count; + + @Test + public void testA() + throws Exception + { + MILLISECONDS.sleep( 500 ); + if ( count++ != 2 ) + { + throw new RuntimeException( "assert \"foo\" == \"bar\"\n" + + " |\n" + + " false" + ); + } + SECONDS.sleep( 5 ); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/7f64ddbf/surefire-integration-tests/src/test/resources/surefire-1202-rerun-and-failfast/src/test/java/pkg/BTest.java ---------------------------------------------------------------------- diff --git a/surefire-integration-tests/src/test/resources/surefire-1202-rerun-and-failfast/src/test/java/pkg/BTest.java b/surefire-integration-tests/src/test/resources/surefire-1202-rerun-and-failfast/src/test/java/pkg/BTest.java new file mode 100644 index 0000000..f44d396 --- /dev/null +++ b/surefire-integration-tests/src/test/resources/surefire-1202-rerun-and-failfast/src/test/java/pkg/BTest.java @@ -0,0 +1,42 @@ +package pkg; + +/* + * 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.SECONDS; + +public class BTest +{ + + private static int count; + + @Test + public void testB() + throws InterruptedException + { + SECONDS.sleep( 2 ); + if ( count++ != 2 ) + { + throw new RuntimeException(); + } + } + +} http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/7f64ddbf/surefire-integration-tests/src/test/resources/surefire-1202-rerun-and-failfast/src/test/java/pkg/CTest.java ---------------------------------------------------------------------- diff --git a/surefire-integration-tests/src/test/resources/surefire-1202-rerun-and-failfast/src/test/java/pkg/CTest.java b/surefire-integration-tests/src/test/resources/surefire-1202-rerun-and-failfast/src/test/java/pkg/CTest.java new file mode 100644 index 0000000..e51a29d --- /dev/null +++ b/surefire-integration-tests/src/test/resources/surefire-1202-rerun-and-failfast/src/test/java/pkg/CTest.java @@ -0,0 +1,35 @@ +package pkg; + +/* + * 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 CTest +{ + @Test + public void testC() + throws InterruptedException + { + MILLISECONDS.sleep( 500 ); + } + +} http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/7f64ddbf/surefire-integration-tests/src/test/resources/surefire-1202-rerun-and-failfast/src/test/java/pkg/DTest.java ---------------------------------------------------------------------- diff --git a/surefire-integration-tests/src/test/resources/surefire-1202-rerun-and-failfast/src/test/java/pkg/DTest.java b/surefire-integration-tests/src/test/resources/surefire-1202-rerun-and-failfast/src/test/java/pkg/DTest.java new file mode 100644 index 0000000..85bc666 --- /dev/null +++ b/surefire-integration-tests/src/test/resources/surefire-1202-rerun-and-failfast/src/test/java/pkg/DTest.java @@ -0,0 +1,35 @@ +package pkg; + +/* + * 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 DTest +{ + @Test + public void testD() + throws InterruptedException + { + MILLISECONDS.sleep( 500 ); + } + +} http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/7f64ddbf/surefire-integration-tests/src/test/resources/surefire-1202-rerun-and-failfast/src/test/java/pkg/ETest.java ---------------------------------------------------------------------- diff --git a/surefire-integration-tests/src/test/resources/surefire-1202-rerun-and-failfast/src/test/java/pkg/ETest.java b/surefire-integration-tests/src/test/resources/surefire-1202-rerun-and-failfast/src/test/java/pkg/ETest.java new file mode 100644 index 0000000..a74e734 --- /dev/null +++ b/surefire-integration-tests/src/test/resources/surefire-1202-rerun-and-failfast/src/test/java/pkg/ETest.java @@ -0,0 +1,31 @@ +package pkg; + +/* + * 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 ETest +{ + @Test + public void test() + throws InterruptedException + { + } +} http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/7f64ddbf/surefire-providers/common-junit4/src/main/java/org/apache/maven/surefire/common/junit4/Notifier.java ---------------------------------------------------------------------- diff --git a/surefire-providers/common-junit4/src/main/java/org/apache/maven/surefire/common/junit4/Notifier.java b/surefire-providers/common-junit4/src/main/java/org/apache/maven/surefire/common/junit4/Notifier.java index 0cd8d98..20b711e 100644 --- a/surefire-providers/common-junit4/src/main/java/org/apache/maven/surefire/common/junit4/Notifier.java +++ b/surefire-providers/common-junit4/src/main/java/org/apache/maven/surefire/common/junit4/Notifier.java @@ -43,7 +43,7 @@ import static org.apache.maven.surefire.util.internal.ConcurrencyUtils.countDown * @author <a href="mailto:tibordig...@apache.org">Tibor Digana (tibor17)</a> * @since 2.19 */ -public final class Notifier +public class Notifier extends RunNotifier { private final Collection<RunListener> listeners = new ArrayList<RunListener>(); @@ -63,23 +63,49 @@ public final class Notifier this.skipAfterFailureCount = new AtomicInteger( skipAfterFailureCount ); } + private Notifier() + { + reporter = null; + skipAfterFailureCount = null; + } + + public static Notifier pureNotifier() + { + return new Notifier() + { + @Override + public Notifier asFailFast( boolean failFast ) + { + throw new UnsupportedOperationException( "pure notifier" ); + } + }; + } + public Notifier asFailFast( boolean failFast ) { this.failFast = failFast; return this; } + public final boolean isFailFast() + { + return failFast; + } + @Override - public void fireTestStarted( Description description ) throws StoppedByUserException + public final void fireTestStarted( Description description ) throws StoppedByUserException { // If fireTestStarted() throws exception (== skipped test), the class must not be removed from testClassNames. // Therefore this class will be removed only if test class started with some test method. super.fireTestStarted( description ); - testClassNames.remove( cutTestClassAndMethod( description ).getClazz() ); + if ( !testClassNames.isEmpty() ) + { + testClassNames.remove( cutTestClassAndMethod( description ).getClazz() ); + } } @Override - public void fireTestFailure( Failure failure ) + public final void fireTestFailure( Failure failure ) { if ( failFast ) { @@ -88,27 +114,14 @@ public final class Notifier super.fireTestFailure( failure ); } - /** - * Fire stop even to plugin process and/or call {@link org.junit.runner.notification.RunNotifier#pleaseStop()}. - */ - private void fireStopEvent() - { - if ( countDownToZero( skipAfterFailureCount ) ) - { - pleaseStop(); - } - - reporter.testExecutionSkippedByUser(); - } - @Override - public void addListener( RunListener listener ) + public final void addListener( RunListener listener ) { listeners.add( listener ); super.addListener( listener ); } - public Notifier addListeners( Collection<RunListener> given ) + public final Notifier addListeners( Collection<RunListener> given ) { for ( RunListener listener : given ) { @@ -117,7 +130,7 @@ public final class Notifier return this; } - public Notifier addListeners( RunListener... given ) + public final Notifier addListeners( RunListener... given ) { for ( RunListener listener : given ) { @@ -127,13 +140,13 @@ public final class Notifier } @Override - public void removeListener( RunListener listener ) + public final void removeListener( RunListener listener ) { listeners.remove( listener ); super.removeListener( listener ); } - public void removeListeners() + public final void removeListeners() { for ( Iterator<RunListener> it = listeners.iterator(); it.hasNext(); ) { @@ -143,8 +156,26 @@ public final class Notifier } } - public Queue<String> getRemainingTestClasses() + public final Queue<String> getRemainingTestClasses() + { + return failFast ? testClassNames : null; + } + + public final void copyListenersTo( Notifier copyTo ) + { + copyTo.addListeners( listeners ); + } + + /** + * Fire stop even to plugin process and/or call {@link org.junit.runner.notification.RunNotifier#pleaseStop()}. + */ + private void fireStopEvent() { - return testClassNames; + if ( countDownToZero( skipAfterFailureCount ) ) + { + pleaseStop(); + } + + reporter.testExecutionSkippedByUser(); } } http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/7f64ddbf/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java b/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java index fa767eb..b286bbf 100644 --- a/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java +++ b/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java @@ -46,6 +46,7 @@ import org.junit.runner.Description; import org.junit.runner.Result; import org.junit.runner.Runner; import org.junit.runner.manipulation.Filter; +import org.junit.runner.notification.RunNotifier; import org.junit.runner.notification.StoppedByUserException; import java.util.Collection; @@ -61,6 +62,7 @@ import static org.apache.maven.surefire.common.junit4.JUnit4Reflector.createDesc import static org.apache.maven.surefire.common.junit4.JUnit4Reflector.createIgnored; import static org.apache.maven.surefire.common.junit4.JUnit4RunListener.rethrowAnyTestMechanismFailures; import static org.apache.maven.surefire.common.junit4.JUnit4RunListenerFactory.createCustomListeners; +import static org.apache.maven.surefire.common.junit4.Notifier.pureNotifier; import static org.apache.maven.surefire.report.ConsoleOutputCapture.startCapture; import static org.apache.maven.surefire.report.SimpleReportEntry.withException; import static org.apache.maven.surefire.testset.TestListResolver.optionallyWildcardFilter; @@ -116,11 +118,6 @@ public class JUnit4Provider public RunResult invoke( Object forkTestSet ) throws TestSetFailedException { - if ( isRerunFailingTests() && isFailFast() ) - { - throw new TestSetFailedException( "don't enable parameters rerunFailingTestsCount, skipAfterFailureCount" ); - } - upgradeCheck(); ReporterFactory reporterFactory = providerParameters.getReporterFactory(); @@ -208,7 +205,7 @@ public class JUnit4Provider private int getSkipAfterFailureCount() { - return isFailFast() && !isRerunFailingTests() ? providerParameters.getSkipAfterFailureCount() : 0; + return isFailFast() ? providerParameters.getSkipAfterFailureCount() : 0; } private void registerShutdownListener( final TestsToRun testsToRun ) @@ -285,13 +282,15 @@ public class JUnit4Provider // Rerun failing tests if rerunFailingTestsCount is larger than 0 if ( isRerunFailingTests() ) { + Notifier rerunNotifier = pureNotifier(); + notifier.copyListenersTo( rerunNotifier ); for ( int i = 0; i < rerunFailingTestsCount && !failureListener.getAllFailures().isEmpty(); i++ ) { Set<ClassMethod> failedTests = generateFailingTests( failureListener.getAllFailures() ); failureListener.reset(); if ( !failedTests.isEmpty() ) { - executeFailedMethod( notifier, failedTests ); + executeFailedMethod( rerunNotifier, failedTests ); } } } @@ -366,7 +365,7 @@ public class JUnit4Provider } } - private void executeFailedMethod( Notifier notifier, Set<ClassMethod> failedMethods ) + private void executeFailedMethod( RunNotifier notifier, Set<ClassMethod> failedMethods ) throws TestSetFailedException { for ( ClassMethod failedMethod : failedMethods ) http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/7f64ddbf/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java index 1b45a26..606911c 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java @@ -53,6 +53,7 @@ import static java.util.Collections.unmodifiableCollection; import static org.apache.maven.surefire.booter.CommandReader.getReader; import static org.apache.maven.surefire.common.junit4.JUnit4ProviderUtil.generateFailingTests; import static org.apache.maven.surefire.common.junit4.JUnit4RunListenerFactory.createCustomListeners; +import static org.apache.maven.surefire.common.junit4.Notifier.pureNotifier; import static org.apache.maven.surefire.junitcore.ConcurrentRunListener.createInstance; import static org.apache.maven.surefire.report.ConsoleOutputCapture.startCapture; import static org.apache.maven.surefire.testset.TestListResolver.optionallyWildcardFilter; @@ -120,11 +121,6 @@ public class JUnitCoreProvider public RunResult invoke( Object forkTestSet ) throws TestSetFailedException { - if ( isRerunFailingTests() && isFailFast() ) - { - throw new TestSetFailedException( "don't enable parameters rerunFailingTestsCount, skipAfterFailureCount" ); - } - final ReporterFactory reporterFactory = providerParameters.getReporterFactory(); final RunResult runResult; @@ -153,7 +149,7 @@ public class JUnitCoreProvider try { - JUnitCoreWrapper core = new JUnitCoreWrapper( notifier, jUnitCoreParameters, consoleLogger, isFailFast() ); + JUnitCoreWrapper core = new JUnitCoreWrapper( notifier, jUnitCoreParameters, consoleLogger ); if ( commandsReader != null ) { @@ -161,11 +157,16 @@ public class JUnitCoreProvider commandsReader.awaitStarted(); } + notifier.asFailFast( isFailFast() ); core.execute( testsToRun, customRunListeners, filter ); + notifier.asFailFast( false ); // Rerun failing tests if rerunFailingTestsCount is larger than 0 if ( isRerunFailingTests() ) { + Notifier rerunNotifier = pureNotifier(); + notifier.copyListenersTo( rerunNotifier ); + JUnitCoreWrapper rerunCore = new JUnitCoreWrapper( rerunNotifier, jUnitCoreParameters, consoleLogger ); for ( int i = 0; i < rerunFailingTestsCount && !testFailureListener.getAllFailures().isEmpty(); i++ ) { List<Failure> failures = testFailureListener.getAllFailures(); @@ -173,7 +174,7 @@ public class JUnitCoreProvider testFailureListener.reset(); FilterFactory filterFactory = new FilterFactory( testClassLoader ); Filter failingMethodsFilter = filterFactory.createFailingMethodFilter( failingTests ); - core.execute( testsToRun, failingMethodsFilter ); + rerunCore.execute( testsToRun, failingMethodsFilter ); } } } @@ -215,7 +216,7 @@ public class JUnitCoreProvider private int getSkipAfterFailureCount() { - return isFailFast() && !isRerunFailingTests() ? providerParameters.getSkipAfterFailureCount() : 0; + return isFailFast() ? providerParameters.getSkipAfterFailureCount() : 0; } private void registerShutdownListener( final TestsToRun testsToRun ) http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/7f64ddbf/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreWrapper.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreWrapper.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreWrapper.java index 7ae3e75..21858fe 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreWrapper.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreWrapper.java @@ -55,15 +55,12 @@ final class JUnitCoreWrapper private final Notifier notifier; private final JUnitCoreParameters jUnitCoreParameters; private final ConsoleLogger logger; - private final boolean failFast; - JUnitCoreWrapper( Notifier notifier, JUnitCoreParameters jUnitCoreParameters, ConsoleLogger logger, - boolean failFast ) + JUnitCoreWrapper( Notifier notifier, JUnitCoreParameters jUnitCoreParameters, ConsoleLogger logger ) { this.notifier = notifier; this.jUnitCoreParameters = jUnitCoreParameters; this.logger = logger; - this.failFast = failFast; } void execute( TestsToRun testsToRun, Filter filter ) @@ -162,12 +159,12 @@ final class JUnitCoreWrapper { JUnitCore() { - super( JUnitCoreWrapper.this.notifier.asFailFast( JUnitCoreWrapper.this.failFast ) ); + super( JUnitCoreWrapper.this.notifier ); } JUnitCore withReportedTests( Class<?>... tests ) { - Queue<String> stoppedTests = getRemainingTestClasses(); + Queue<String> stoppedTests = JUnitCoreWrapper.this.notifier.getRemainingTestClasses(); if ( stoppedTests != null ) { for ( Class<?> test : tests ) @@ -183,9 +180,9 @@ final class JUnitCoreWrapper protected void afterException( Throwable e ) throws TestSetFailedException { - if ( JUnitCoreWrapper.this.failFast && e instanceof StoppedByUserException ) + if ( JUnitCoreWrapper.this.notifier.isFailFast() && e instanceof StoppedByUserException ) { - Queue<String> stoppedTests = getRemainingTestClasses(); + Queue<String> stoppedTests = JUnitCoreWrapper.this.notifier.getRemainingTestClasses(); if ( stoppedTests != null ) { String reason = e.getClass().getName(); @@ -206,16 +203,11 @@ final class JUnitCoreWrapper @Override protected void afterFinished() { - Queue<String> stoppedTests = getRemainingTestClasses(); + Queue<String> stoppedTests = JUnitCoreWrapper.this.notifier.getRemainingTestClasses(); if ( stoppedTests != null ) { stoppedTests.clear(); } } - - private Queue<String> getRemainingTestClasses() - { - return JUnitCoreWrapper.this.failFast ? JUnitCoreWrapper.this.notifier.getRemainingTestClasses() : null; - } } } http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/7f64ddbf/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/Surefire746Test.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/Surefire746Test.java b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/Surefire746Test.java index 46213df..635279d 100644 --- a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/Surefire746Test.java +++ b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/Surefire746Test.java @@ -115,7 +115,7 @@ public class Surefire746Test // and rethrows a failure which happened in listener exception.expect( TestSetFailedException.class ); JUnit4RunListener dummy = new JUnit4RunListener( new MockReporter() ); - new JUnitCoreWrapper( new Notifier( dummy, 0 ), jUnitCoreParameters, new Logger(), false ) + new JUnitCoreWrapper( new Notifier( dummy, 0 ), jUnitCoreParameters, new Logger() ) .execute( testsToRun, customRunListeners, null ); } finally