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 2022/01/23 21:51:33 UTC

[maven-surefire] 09/13: [SUREFIRE-1851] Prevent NPE in SmartStackTraceParser

This is an automated email from the ASF dual-hosted git repository.

tibordigana pushed a commit to branch release/2.22.3
in repository https://gitbox.apache.org/repos/asf/maven-surefire.git

commit ea671d2846b1421b9e96aa9f993c8dfb17eec651
Author: Adam Jones <jo...@rocketmail.com>
AuthorDate: Mon Oct 5 02:32:14 2020 +0200

    [SUREFIRE-1851] Prevent NPE in SmartStackTraceParser
    
    (cherry picked from commit 08163fa6d0d161070a6add1c05a1058781160415)
---
 .../surefire/report/SmartStackTraceParser.java     |  6 ++-
 .../apache/maven/surefire/report/ATestClass.java   |  5 +++
 .../surefire/report/SmartStackTraceParserTest.java | 15 ++++++++
 .../{ATestClass.java => SomeMockedException.java}  | 43 ++++++++++------------
 4 files changed, 45 insertions(+), 24 deletions(-)

diff --git a/surefire-providers/common-java5/src/main/java/org/apache/maven/surefire/report/SmartStackTraceParser.java b/surefire-providers/common-java5/src/main/java/org/apache/maven/surefire/report/SmartStackTraceParser.java
index 7c68f95..cccb939 100644
--- a/surefire-providers/common-java5/src/main/java/org/apache/maven/surefire/report/SmartStackTraceParser.java
+++ b/surefire-providers/common-java5/src/main/java/org/apache/maven/surefire/report/SmartStackTraceParser.java
@@ -196,11 +196,15 @@ public class SmartStackTraceParser
 
     private boolean rootIsInclass()
     {
-        return stackTrace.length > 0 && stackTrace[0].getClassName().equals( testClassName );
+        return stackTrace != null && stackTrace.length > 0 && stackTrace[0].getClassName().equals( testClassName );
     }
 
     static List<StackTraceElement> focusOnClass( StackTraceElement[] stackTrace, Class clazz )
     {
+        if ( stackTrace == null )
+        {
+            return Collections.emptyList();
+        }
         List<StackTraceElement> result = new ArrayList<StackTraceElement>();
         for ( StackTraceElement element : stackTrace )
         {
diff --git a/surefire-providers/common-java5/src/test/java/org/apache/maven/surefire/report/ATestClass.java b/surefire-providers/common-java5/src/test/java/org/apache/maven/surefire/report/ATestClass.java
index baff162..d75e741 100644
--- a/surefire-providers/common-java5/src/test/java/org/apache/maven/surefire/report/ATestClass.java
+++ b/surefire-providers/common-java5/src/test/java/org/apache/maven/surefire/report/ATestClass.java
@@ -60,4 +60,9 @@ public class ATestClass
         throw new RuntimeException( "This message will be truncated, somewhere over the rainbow. "
                                         + "Gangnam style, Gangnam style, Gangnam style, , Gangnam style, Gangnam style" );
     }
+
+    public void aMockedException()
+    {
+        throw new SomeMockedException();
+    }
 }
diff --git a/surefire-providers/common-java5/src/test/java/org/apache/maven/surefire/report/SmartStackTraceParserTest.java b/surefire-providers/common-java5/src/test/java/org/apache/maven/surefire/report/SmartStackTraceParserTest.java
index e600718..a598f5b 100644
--- a/surefire-providers/common-java5/src/test/java/org/apache/maven/surefire/report/SmartStackTraceParserTest.java
+++ b/surefire-providers/common-java5/src/test/java/org/apache/maven/surefire/report/SmartStackTraceParserTest.java
@@ -303,6 +303,21 @@ public class SmartStackTraceParserTest
         }
     }
 
+    public void testNullStackTrace()
+    {
+        try
+        {
+            new ATestClass().aMockedException();
+        }
+        catch ( Exception e )
+        {
+            SmartStackTraceParser smartStackTraceParser =
+                    new SmartStackTraceParser( ATestClass.class.getName(), e, null );
+            String res = smartStackTraceParser.getString();
+            assertEquals( "ATestClass ยป SomeMocked", res );
+        }
+    }
+
     public ExecutionException getSingleNested()
     {
         FutureTask<Object> futureTask = new FutureTask<Object>( new RunnableTestClass2() );
diff --git a/surefire-providers/common-java5/src/test/java/org/apache/maven/surefire/report/ATestClass.java b/surefire-providers/common-java5/src/test/java/org/apache/maven/surefire/report/SomeMockedException.java
similarity index 54%
copy from surefire-providers/common-java5/src/test/java/org/apache/maven/surefire/report/ATestClass.java
copy to surefire-providers/common-java5/src/test/java/org/apache/maven/surefire/report/SomeMockedException.java
index baff162..5852db2 100644
--- a/surefire-providers/common-java5/src/test/java/org/apache/maven/surefire/report/ATestClass.java
+++ b/surefire-providers/common-java5/src/test/java/org/apache/maven/surefire/report/SomeMockedException.java
@@ -19,45 +19,42 @@ package org.apache.maven.surefire.report;
  * under the License.
  */
 
-import java.io.File;
-
-@SuppressWarnings( "UnusedDeclaration" )
-public class ATestClass
+/**
+ * @author Adam Jones
+ */
+public class SomeMockedException extends RuntimeException
 {
-
-    public void failInAssert()
-    {
-        throw new AssertionError( "X is not Z" );
-    }
-
-    public void nestedFailInAssert()
+    public SomeMockedException()
     {
-        failInAssert();
     }
 
-    public void npe()
+    @Override
+    public String getMessage()
     {
-        throw new NullPointerException( "It was null" );
+        return null;
     }
 
-    public void nestedNpe()
+    @Override
+    public String getLocalizedMessage()
     {
-        npe();
+        return null;
     }
 
-    public void npeOutsideTest()
+    @Override
+    public Throwable getCause()
     {
-        File file = new File( (String) null );
+        return null;
     }
 
-    public void nestedNpeOutsideTest()
+    @Override
+    public String toString()
     {
-        npeOutsideTest();
+        return null;
     }
 
-    public void aLongTestErrorMessage()
+    @Override
+    public StackTraceElement[] getStackTrace()
     {
-        throw new RuntimeException( "This message will be truncated, somewhere over the rainbow. "
-                                        + "Gangnam style, Gangnam style, Gangnam style, , Gangnam style, Gangnam style" );
+        return null;
     }
 }