Bret Goldsmith created SUREFIRE-1127: ----------------------------------------
Summary: Failsafe project does not fail in verify phase when a test case object errors during initialization Key: SUREFIRE-1127 URL: https://jira.codehaus.org/browse/SUREFIRE-1127 Project: Maven Surefire Issue Type: Bug Components: Maven Failsafe Plugin Affects Versions: 2.18 Environment: JDK 1.8.0_05 on Windows 7 used to recreate Reporter: Bret Goldsmith Attachments: failsafe-test.zip Sample project attached. When running a "mvn verify" - the attached project will succeed, even though there is an integration test that should obviously fail. The integration test case does not initialize correctly (it will throw a null pointer exception in one of its object initializers), which should be a test failure and therefore a project failure. I've traced this down to the fact that the generated failsafe-summary.xml file contains an empty failureMessage element: {code:xml} <?xml version="1.0" encoding="UTF-8"?> <failsafe-summary result="254" timeout="false"> <completed>0</completed> <errors>0</errors> <failures>0</failures> <skipped>0</skipped> <failureMessage></failureMessage> </failsafe-summary> {code} And so the failsafe verifier doesn't consider the project a failure. The message seems to be blank because when the failsafe plugin is writing the results, it uses the org.apache.maven.plugins.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked method to write out the first forked exception, which then calls org.apache.maven.surefire.suite.RunResult.failure() method, which then calls getStackTrace() on the exception. The getStackTrace() method looks like this: {code:java} private static String getStackTrace( Exception e ) { if ( e == null ) { return null; } ByteArrayOutputStream out = new ByteArrayOutputStream(); PrintWriter pw = new PrintWriter( out ); e.printStackTrace( pw ); return new String( out.toByteArray() ); } {code} And it specifically is doing a toBytearray on the output stream without flushing or closing the printwriter first. At least with my JVM 1.8.0_05 version, this seems to be a problem as the printwriter still maintains the trace description in a buffer. When I put a breakpoint on this and specifically flush or close the printwriter before the toByteArray, the project fails as expected. I'm not sure why this is failsafe specific, but a surefire version test case (also included in the attachment project) fails appropriately. I think a simple patch is to update RunResult.java to close the printwriter before getting the resulting stacktrace string. i.e. {code:java} private static String getStackTrace( Exception e ) { if ( e == null ) { return null; } ByteArrayOutputStream out = new ByteArrayOutputStream(); PrintWriter pw = new PrintWriter( out ); try { e.printStackTrace( pw ); } finally { pw.close(); } return new String( out.toByteArray() ); } {code} -- This message was sent by Atlassian JIRA (v6.1.6#6162)