diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireHelper.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireHelper.java index 1870223f55..5822451046 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireHelper.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/SurefireHelper.java @@ -27,6 +27,7 @@ import org.apache.maven.surefire.api.cli.CommandLineOption; import org.apache.maven.surefire.api.suite.RunResult; import org.apache.maven.surefire.api.testset.TestSetFailedException; +import org.apache.maven.surefire.booter.SurefireBooterForkException; import javax.annotation.Nonnull; import java.io.File; @@ -156,7 +157,14 @@ public static void reportExecution( SurefireReportParameters reportParameters, R if ( reportParameters.isTestFailureIgnore() ) { - log.error( createErrorMessage( reportParameters, result, firstForkException ) ); + String errorMessage = createErrorMessage( reportParameters, result, firstForkException ); + + if ( firstForkException instanceof SurefireBooterForkException ) + { + throw new MojoExecutionException( errorMessage, firstForkException ); + } + + log.error( errorMessage ); } else { diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java index 9d89447aff..8bcf947203 100644 --- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java +++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/AbstractSurefireMojoTest.java @@ -2000,6 +2000,7 @@ public static class Mojo private List includes; private List excludes; private String test; + private boolean testFailureIgnore; private JUnitPlatformProviderInfo createJUnitPlatformProviderInfo( Artifact junitPlatformArtifact, TestClassPath testClasspathWrapper ) @@ -2075,13 +2076,13 @@ public void setSkip( boolean skip ) @Override public boolean isTestFailureIgnore() { - return false; + return testFailureIgnore; } @Override public void setTestFailureIgnore( boolean testFailureIgnore ) { - + this.testFailureIgnore = testFailureIgnore; } @Override diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/SurefireHelperTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/SurefireHelperTest.java index 1ecaea7435..dbe2c3697b 100644 --- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/SurefireHelperTest.java +++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/SurefireHelperTest.java @@ -19,12 +19,18 @@ * under the License. */ +import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugin.surefire.AbstractSurefireMojoTest.Mojo; +import org.apache.maven.plugin.surefire.log.PluginConsoleLogger; import org.apache.maven.surefire.api.suite.RunResult; +import org.apache.maven.surefire.api.testset.TestSetFailedException; +import org.apache.maven.surefire.booter.SurefireBooterForkException; +import org.codehaus.plexus.logging.Logger; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import org.mockito.ArgumentCaptor; import java.io.File; import java.util.ArrayList; @@ -36,7 +42,13 @@ import static org.apache.maven.plugin.surefire.SurefireHelper.reportExecution; import static org.apache.maven.surefire.shared.lang3.SystemUtils.IS_OS_WINDOWS; import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.containsString; import static org.junit.Assume.assumeTrue; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.powermock.api.mockito.PowerMockito.doNothing; +import static org.powermock.api.mockito.PowerMockito.mock; /** * Test of {@link SurefireHelper}. @@ -120,6 +132,36 @@ public void shouldEscapeWindowsPath() assertThat( escaped ).isEqualTo( root + "\\" + pathToJar ); } + @Test + public void shouldHandleFailWithoutExitCode() throws Exception + { + RunResult summary = new RunResult( 0, 0, 0, 0 ); + Mojo plugin = new Mojo(); + plugin.setTestFailureIgnore( true ); + + Logger logger = mock( Logger.class ); + when( logger.isErrorEnabled() ).thenReturn( true ); + doNothing().when( logger ).error( anyString() ); + TestSetFailedException exc = new TestSetFailedException( "failure" ); + reportExecution( plugin, summary, new PluginConsoleLogger( logger ), exc ); + ArgumentCaptor errorMessage = ArgumentCaptor.forClass( String.class ); + verify( logger ).error( errorMessage.capture() ); + assertThat( errorMessage.getValue() ).contains( "failure" ); + } + + @Test + public void shouldHandleFailIfJvmNonZeroExitCode() throws Exception + { + RunResult summary = new RunResult( 0, 0, 0, 0 ); + Mojo plugin = new Mojo(); + plugin.setTestFailureIgnore( true ); + + SurefireBooterForkException exc = new SurefireBooterForkException( "Unrecognized option: -Xxxx" ); + e.expect( MojoExecutionException.class ); + e.expectMessage( containsString( "Unrecognized option: -Xxxx" ) ); + reportExecution( plugin, summary, new PluginConsoleLogger( mock( Logger.class ) ), exc ); + } + @Test public void shouldHandleFailIfNoTests() throws Exception {