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 2016/10/03 23:06:38 UTC

[2/2] maven-surefire git commit: [SUREFIRE-1287] Improve logging to understand why test run failed and report the right failed category

[SUREFIRE-1287] Improve logging to understand why test run failed and report the right failed category


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

Branch: refs/heads/master
Commit: e0ce6cb021d42d021704f77a689e3b663aebf084
Parents: 4b43807
Author: Tibor17 <ti...@lycos.com>
Authored: Tue Oct 4 01:06:18 2016 +0200
Committer: Tibor17 <ti...@lycos.com>
Committed: Tue Oct 4 01:06:18 2016 +0200

----------------------------------------------------------------------
 .../surefire/booterclient/ForkStarter.java      | 33 +++++++++----
 .../booterclient/output/ForkClient.java         |  1 +
 .../maven/surefire/booter/ForkedBooter.java     |  6 +--
 .../booter/SurefireBooterForkException.java     | 51 ++++++++++++++++++++
 4 files changed, 79 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/e0ce6cb0/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java
----------------------------------------------------------------------
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java
index 57c31b6..2eb8259 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java
@@ -567,7 +567,7 @@ public class ForkStarter
         log.debug( "Forking command line: " + cli );
 
         RunResult runResult = null;
-
+        SurefireBooterForkException booterForkException = null;
         try
         {
             CommandLineCallable future =
@@ -585,13 +585,17 @@ public class ForkStarter
             }
             else if ( result != SUCCESS )
             {
-                throw new SurefireBooterForkException( "Error occurred in starting fork, check output in log" );
+                booterForkException =
+                        new SurefireBooterForkException( "Error occurred in starting fork, check output in log" );
             }
         }
         catch ( CommandLineException e )
         {
             runResult = failure( forkClient.getDefaultReporterFactory().getGlobalRunStatistics().getRunResult(), e );
-            throw new SurefireBooterForkException( "Error while executing forked tests.", e.getCause() );
+            String cliErr = e.getLocalizedMessage();
+            Throwable cause = e.getCause();
+            booterForkException =
+                    new SurefireBooterForkException( "Error while executing forked tests.", cliErr, cause, runResult );
         }
         finally
         {
@@ -600,25 +604,36 @@ public class ForkStarter
             {
                 runResult = forkClient.getDefaultReporterFactory().getGlobalRunStatistics().getRunResult();
             }
+            forkClient.close( runResult.isTimeout() );
 
             if ( !runResult.isTimeout() )
             {
-                StackTraceWriter errorInFork = forkClient.getErrorInFork();
-                if ( errorInFork != null )
+                Throwable cause = booterForkException == null ? null : booterForkException.getCause();
+                String detail = booterForkException == null ? "" : "\n" + booterForkException.getMessage();
+
+                if ( forkClient.isErrorInFork() )
                 {
+                    StackTraceWriter errorInFork = forkClient.getErrorInFork();
                     // noinspection ThrowFromFinallyBlock
-                    throw new RuntimeException(
-                        "There was an error in the forked process\n" + errorInFork.writeTraceToString() );
+                    throw new RuntimeException( "There was an error in the forked process"
+                                                        + detail
+                                                        + '\n'
+                                                        + errorInFork.writeTraceToString(), cause );
                 }
                 if ( !forkClient.isSaidGoodBye() )
                 {
                     // noinspection ThrowFromFinallyBlock
                     throw new RuntimeException(
                         "The forked VM terminated without properly saying goodbye. VM crash or System.exit called?"
-                            + "\nCommand was " + cli.toString() );
+                            + "\nCommand was " + cli.toString() + detail, cause );
                 }
             }
-            forkClient.close( runResult.isTimeout() );
+
+            if ( booterForkException != null )
+            {
+                // noinspection ThrowFromFinallyBlock
+                throw booterForkException;
+            }
         }
 
         return runResult;

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/e0ce6cb0/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClient.java
----------------------------------------------------------------------
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClient.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClient.java
index d59fdd0..e6e5a6e 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClient.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClient.java
@@ -394,6 +394,7 @@ public class ForkClient
 
     public void close( boolean hadTimeout )
     {
+        // no op
     }
 
     public final boolean isSaidGoodBye()

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/e0ce6cb0/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java
----------------------------------------------------------------------
diff --git a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java
index bc8f487..98040db 100644
--- a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java
+++ b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java
@@ -131,15 +131,15 @@ public final class ForkedBooter
             }
             catch ( InvocationTargetException t )
             {
-                LegacyPojoStackTraceWriter stackTraceWriter =
-                    new LegacyPojoStackTraceWriter( "test subystem", "no method", t.getTargetException() );
+                StackTraceWriter stackTraceWriter =
+                    new LegacyPojoStackTraceWriter( "test subsystem", "no method", t.getTargetException() );
                 StringBuilder stringBuilder = new StringBuilder();
                 encode( stringBuilder, stackTraceWriter, false );
                 encodeAndWriteToOutput( ( (char) BOOTERCODE_ERROR ) + ",0," + stringBuilder + "\n" , originalOut );
             }
             catch ( Throwable t )
             {
-                StackTraceWriter stackTraceWriter = new LegacyPojoStackTraceWriter( "test subystem", "no method", t );
+                StackTraceWriter stackTraceWriter = new LegacyPojoStackTraceWriter( "test subsystem", "no method", t );
                 StringBuilder stringBuilder = new StringBuilder();
                 encode( stringBuilder, stackTraceWriter, false );
                 encodeAndWriteToOutput( ( (char) BOOTERCODE_ERROR ) + ",0," + stringBuilder + "\n", originalOut );

http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/e0ce6cb0/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooterForkException.java
----------------------------------------------------------------------
diff --git a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooterForkException.java b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooterForkException.java
index 9571c92..5f78ef5 100644
--- a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooterForkException.java
+++ b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooterForkException.java
@@ -20,12 +20,26 @@ package org.apache.maven.surefire.booter;
  */
 
 
+import org.apache.maven.surefire.suite.RunResult;
+
+import static org.apache.maven.surefire.util.internal.StringUtils.isNotBlank;
+
 /**
  * Encapsulates exceptions thrown during Surefire forking.
  */
 public class SurefireBooterForkException
     extends Exception
 {
+    public SurefireBooterForkException( String message, RunResult runResult )
+    {
+        this( message, null, null, runResult );
+    }
+
+    public SurefireBooterForkException( String message, String rethrownMessage, Throwable rethrownCause,
+                                        RunResult runResult )
+    {
+        super( toString( message, rethrownMessage, rethrownCause, runResult ), rethrownCause );
+    }
 
     public SurefireBooterForkException( String message, Throwable cause )
     {
@@ -36,4 +50,41 @@ public class SurefireBooterForkException
     {
         super( msg );
     }
+
+    private static String toString( String message, String rethrownMessage, Throwable rethrownCause,
+                                    RunResult runResult )
+    {
+        return toNewLines( message,
+                                 rethrownMessage,
+                                 rethrownCause == null ? null : rethrownCause.getLocalizedMessage(),
+                                 runResult == null ? null : runResult.getFailure(),
+                                 runResult == null ? null : toString( runResult ) );
+    }
+
+    private static String toString( RunResult runResult )
+    {
+        return "Fatal Tests run: " + runResult.getCompletedCount()
+                       + ", Failures: " + runResult.getFailures()
+                       + ", Errors: " + runResult.getErrors()
+                       + ", Skipped: " + runResult.getSkipped()
+                       + ", Flakes: " + runResult.getFlakes()
+                       + ", Elapsed timeout: " + runResult.isTimeout();
+    }
+
+    private static String toNewLines( String... messages )
+    {
+        StringBuilder result = new StringBuilder();
+        for ( String message : messages )
+        {
+            if ( isNotBlank( message ) )
+            {
+                if ( result.length() == 0 )
+                {
+                    result.append( '\n' );
+                }
+                result.append( message );
+            }
+        }
+        return result.toString();
+    }
 }