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 2020/10/08 20:35:32 UTC

[maven-surefire] branch gh-build-fix updated: [GH] build fix

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

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


The following commit(s) were added to refs/heads/gh-build-fix by this push:
     new 9ebeb8f  [GH] build fix
9ebeb8f is described below

commit 9ebeb8fb4e9a2a51aba7d817f754e1750cbd6b28
Author: tibordigana <ti...@apache.org>
AuthorDate: Thu Oct 8 22:35:24 2020 +0200

    [GH] build fix
---
 .../booterclient/output/ForkClientTest.java        | 337 ++++++++++++++-------
 1 file changed, 226 insertions(+), 111 deletions(-)

diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClientTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClientTest.java
index 7f2dfd0..59c99bf 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClientTest.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClientTest.java
@@ -58,7 +58,6 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TestName;
 import org.junit.runner.Description;
-import org.mockito.ArgumentCaptor;
 
 import javax.annotation.Nonnull;
 import java.io.ByteArrayInputStream;
@@ -66,6 +65,7 @@ import java.io.Closeable;
 import java.io.File;
 import java.nio.channels.ReadableByteChannel;
 import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
 
@@ -89,7 +89,6 @@ import static org.apache.maven.surefire.api.booter.ForkedProcessEventType.BOOTER
 import static org.apache.maven.surefire.api.report.RunMode.NORMAL_RUN;
 import static org.fest.assertions.Assertions.assertThat;
 import static org.fest.assertions.MapAssert.entry;
-import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.eq;
 import static org.mockito.Mockito.mock;
@@ -138,30 +137,26 @@ public class ForkClientTest
         String nativeStream = "Listening for transport dt_socket at address: bla";
         EH eventHandler = new EH();
         CountdownCloseable countdown = new CountdownCloseable( mock( Closeable.class ), 1 );
-        ConsoleLogger logger = mock( ConsoleLogger.class );
-        ForkNodeArguments arguments = mock( ForkNodeArguments.class );
-        when( arguments.getConsoleLogger() ).thenReturn( logger );
-        when( logger.isDebugEnabled() ).thenReturn( false );
-        when( logger.isInfoEnabled() ).thenReturn( true );
+        ConsoleLoggerMock logger = new ConsoleLoggerMock( false, true, true, true );
+        ForkNodeArgumentsMock arguments = new ForkNodeArgumentsMock( logger, new File( "" ) );
         ReadableByteChannel channel = newChannel( new ByteArrayInputStream( nativeStream.getBytes() ) );
         try ( EventConsumerThread t = new EventConsumerThread( "t", channel, eventHandler, countdown, arguments ) )
         {
             t.start();
-
             countdown.awaitClosed();
-
-            verify( logger )
-                .info( "Listening for transport dt_socket at address: bla" );
+            assertThat( logger.info )
+                .hasSize( 1 )
+                .contains( "Listening for transport dt_socket at address: bla" );
         }
 
         assertThat( eventHandler.sizeOfEventCache() )
             .isEqualTo( 0 );
 
-        verify( logger ).isDebugEnabled();
-
-        verify( logger ).isInfoEnabled();
+        assertThat( logger.isDebugEnabledCalled )
+            .isTrue();
 
-        verifyNoMoreInteractions( logger );
+        assertThat( logger.isInfoEnabledCalled )
+            .isTrue();
     }
 
     @Test
@@ -170,25 +165,20 @@ public class ForkClientTest
         String nativeStream = "\nCould not create the Java Virtual Machine\n";
         EH eventHandler = new EH();
         CountdownCloseable countdown = new CountdownCloseable( mock( Closeable.class ), 1 );
-        ConsoleLogger logger = mock( ConsoleLogger.class );
-        ForkNodeArguments arguments = mock( ForkNodeArguments.class );
-        when( arguments.dumpStreamText( anyString() ) ).thenReturn( new File( "" ) );
-        when( arguments.getConsoleLogger() ).thenReturn( logger );
+        ConsoleLoggerMock logger = new ConsoleLoggerMock( false, false, false, false );
+        ForkNodeArgumentsMock arguments = new ForkNodeArgumentsMock( logger, new File( "" ) );
         ReadableByteChannel channel = newChannel( new ByteArrayInputStream( nativeStream.getBytes() ) );
         try ( EventConsumerThread t = new EventConsumerThread( "t", channel, eventHandler, countdown, arguments ) )
         {
             t.start();
-
             countdown.awaitClosed();
-
-            verify( logger )
-                .error( "Could not create the Java Virtual Machine" );
+            assertThat( logger.error )
+                .hasSize( 1 )
+                .contains( "Could not create the Java Virtual Machine" );
         }
 
         assertThat( eventHandler.sizeOfEventCache() )
             .isEqualTo( 0 );
-
-        verifyNoMoreInteractions( logger );
     }
 
     @Test
@@ -197,25 +187,20 @@ public class ForkClientTest
         String nativeStream = "\nError occurred during initialization of VM\n";
         EH eventHandler = new EH();
         CountdownCloseable countdown = new CountdownCloseable( mock( Closeable.class ), 1 );
-        ConsoleLogger logger = mock( ConsoleLogger.class );
-        ForkNodeArguments arguments = mock( ForkNodeArguments.class );
-        when( arguments.dumpStreamText( anyString() ) ).thenReturn( new File( "" ) );
-        when( arguments.getConsoleLogger() ).thenReturn( logger );
+        ConsoleLoggerMock logger = new ConsoleLoggerMock( false, false, false, false );
+        ForkNodeArgumentsMock arguments = new ForkNodeArgumentsMock( logger, new File( "" ) );
         ReadableByteChannel channel = newChannel( new ByteArrayInputStream( nativeStream.getBytes() ) );
         try ( EventConsumerThread t = new EventConsumerThread( "t", channel, eventHandler, countdown, arguments ) )
         {
             t.start();
-
             countdown.awaitClosed();
-
-            verify( logger )
-                .error( "Error occurred during initialization of VM" );
+            assertThat( logger.error )
+                .hasSize( 1 )
+                .contains( "Error occurred during initialization of VM" );
         }
 
         assertThat( eventHandler.sizeOfEventCache() )
             .isEqualTo( 0 );
-
-        verifyNoMoreInteractions( logger );
     }
 
     @Test
@@ -224,25 +209,20 @@ public class ForkClientTest
         String nativeStream = "\nError: A fatal exception has occurred. Program will exit.\n";
         EH eventHandler = new EH();
         CountdownCloseable countdown = new CountdownCloseable( mock( Closeable.class ), 1 );
-        ConsoleLogger logger = mock( ConsoleLogger.class );
-        ForkNodeArguments arguments = mock( ForkNodeArguments.class );
-        when( arguments.dumpStreamText( anyString() ) ).thenReturn( new File( "" ) );
-        when( arguments.getConsoleLogger() ).thenReturn( logger );
+        ConsoleLoggerMock logger = new ConsoleLoggerMock( false, false, false, false );
+        ForkNodeArgumentsMock arguments = new ForkNodeArgumentsMock( logger, new File( "" ) );
         ReadableByteChannel channel = newChannel( new ByteArrayInputStream( nativeStream.getBytes() ) );
         try ( EventConsumerThread t = new EventConsumerThread( "t", channel, eventHandler, countdown, arguments ) )
         {
             t.start();
-
             countdown.awaitClosed();
-
-            verify( logger )
-                .error( "Error: A fatal exception has occurred. Program will exit." );
+            assertThat( logger.error )
+                .hasSize( 1 )
+                .contains( "Error: A fatal exception has occurred. Program will exit." );
         }
 
         assertThat( eventHandler.sizeOfEventCache() )
             .isEqualTo( 0 );
-
-        verifyNoMoreInteractions( logger );
     }
 
     @Test
@@ -251,25 +231,20 @@ public class ForkClientTest
         String nativeStream = "\nCould not reserve enough space for object heap\n";
         EH eventHandler = new EH();
         CountdownCloseable countdown = new CountdownCloseable( mock( Closeable.class ), 1 );
-        ConsoleLogger logger = mock( ConsoleLogger.class );
-        ForkNodeArguments arguments = mock( ForkNodeArguments.class );
-        when( arguments.dumpStreamText( anyString() ) ).thenReturn( new File( "" ) );
-        when( arguments.getConsoleLogger() ).thenReturn( logger );
+        ConsoleLoggerMock logger = new ConsoleLoggerMock( false, false, false, false );
+        ForkNodeArgumentsMock arguments = new ForkNodeArgumentsMock( logger, new File( "" ) );
         ReadableByteChannel channel = newChannel( new ByteArrayInputStream( nativeStream.getBytes() ) );
         try ( EventConsumerThread t = new EventConsumerThread( "t", channel, eventHandler, countdown, arguments ) )
         {
             t.start();
-
             countdown.awaitClosed();
-
-            verify( logger )
-                .error( "Could not reserve enough space for object heap" );
+            assertThat( logger.error )
+                .hasSize( 1 )
+                .contains( "Could not reserve enough space for object heap" );
         }
 
         assertThat( eventHandler.sizeOfEventCache() )
             .isEqualTo( 0 );
-
-        verifyNoMoreInteractions( logger );
     }
 
     @Test
@@ -278,25 +253,20 @@ public class ForkClientTest
         String nativeStream = "\njava.lang.module.FindException: Module java.ws.rs not found, required by com.foo.api";
         EH eventHandler = new EH();
         CountdownCloseable countdown = new CountdownCloseable( mock( Closeable.class ), 1 );
-        ConsoleLogger logger = mock( ConsoleLogger.class );
-        ForkNodeArguments arguments = mock( ForkNodeArguments.class );
-        when( arguments.dumpStreamText( anyString() ) ).thenReturn( new File( "" ) );
-        when( arguments.getConsoleLogger() ).thenReturn( logger );
+        ConsoleLoggerMock logger = new ConsoleLoggerMock( false, false, false, false );
+        ForkNodeArgumentsMock arguments = new ForkNodeArgumentsMock( logger, new File( "" ) );
         ReadableByteChannel channel = newChannel( new ByteArrayInputStream( nativeStream.getBytes() ) );
         try ( EventConsumerThread t = new EventConsumerThread( "t", channel, eventHandler, countdown, arguments ) )
         {
             t.start();
-
             countdown.awaitClosed();
-
-            verify( logger )
-                .error( "java.lang.module.FindException: Module java.ws.rs not found, required by com.foo.api" );
+            assertThat( logger.error )
+                .hasSize( 1 )
+                .contains( "java.lang.module.FindException: Module java.ws.rs not found, required by com.foo.api" );
         }
 
         assertThat( eventHandler.sizeOfEventCache() )
             .isEqualTo( 0 );
-
-        verifyNoMoreInteractions( logger );
     }
 
     @Test
@@ -305,25 +275,20 @@ public class ForkClientTest
         String nativeStream = "\njava.lang.module.FindException: Module java.ws.rs not found, required by com.foo.api";
         EH eventHandler = new EH();
         CountdownCloseable countdown = new CountdownCloseable( mock( Closeable.class ), 1 );
-        ConsoleLogger logger = mock( ConsoleLogger.class );
-        ForkNodeArguments arguments = mock( ForkNodeArguments.class );
-        when( arguments.dumpStreamText( anyString() ) ).thenReturn( new File( "" ) );
-        when( arguments.getConsoleLogger() ).thenReturn( logger );
+        ConsoleLoggerMock logger = new ConsoleLoggerMock( false, false, false, false );
+        ForkNodeArgumentsMock arguments = new ForkNodeArgumentsMock( logger, new File( "" ) );
         ReadableByteChannel channel = newChannel( new ByteArrayInputStream( nativeStream.getBytes() ) );
         try ( EventConsumerThread t = new EventConsumerThread( "t", channel, eventHandler, countdown, arguments ) )
         {
             t.start();
-
             countdown.awaitClosed();
-
-            verify( logger )
-                .error( "java.lang.module.FindException: Module java.ws.rs not found, required by com.foo.api" );
+            assertThat( logger.error )
+                .hasSize( 1 )
+                .contains( "java.lang.module.FindException: Module java.ws.rs not found, required by com.foo.api" );
         }
 
         assertThat( eventHandler.sizeOfEventCache() )
             .isEqualTo( 0 );
-
-        verifyNoMoreInteractions( logger );
     }
 
     @Test
@@ -332,41 +297,34 @@ public class ForkClientTest
         String nativeStream = "unordered error";
         EH eventHandler = new EH();
         CountdownCloseable countdown = new CountdownCloseable( mock( Closeable.class ), 1 );
-        ConsoleLogger logger = mock( ConsoleLogger.class );
-        ForkNodeArguments arguments = mock( ForkNodeArguments.class );
-        when( arguments.getConsoleLogger() ).thenReturn( logger );
-        when( logger.isDebugEnabled() )
-            .thenReturn( true );
-        when( arguments.dumpStreamText( anyString() ) ).thenReturn( new File( "" ) );
+        ConsoleLoggerMock logger = new ConsoleLoggerMock( true, true, true, true );
+        ForkNodeArgumentsMock arguments = new ForkNodeArgumentsMock( logger, new File( "" ) );
         ReadableByteChannel channel = newChannel( new ByteArrayInputStream( nativeStream.getBytes() ) );
         try ( EventConsumerThread t = new EventConsumerThread( "t", channel, eventHandler, countdown, arguments ) )
         {
             t.start();
-
             countdown.awaitClosed();
-
-            verify( logger )
-                .debug( "unordered error" );
+            assertThat( logger.debug )
+                .hasSize( 1 )
+                .contains( "unordered error" );
         }
 
         assertThat( eventHandler.sizeOfEventCache() )
             .isEqualTo( 0 );
 
-        verify( logger ).isDebugEnabled();
+        assertThat( logger.isDebugEnabledCalled )
+            .isTrue();
 
-        ArgumentCaptor<String> dumpText = ArgumentCaptor.forClass( String.class );
-        verify( arguments ).dumpStreamText( dumpText.capture() );
         String msg = "Corrupted STDOUT by directly writing to native stream in forked JVM 0. Stream 'unordered error'.";
-        assertThat( dumpText.getValue() )
-            .isEqualTo( msg );
+        assertThat( arguments.dumpStreamText )
+            .hasSize( 1 )
+            .contains( msg );
 
-        ArgumentCaptor<String> warningText = ArgumentCaptor.forClass( String.class );
-        verify( arguments ).logWarningAtEnd( warningText.capture() );
-        assertThat( warningText.getValue() )
+        assertThat( arguments.logWarningAtEnd )
+            .hasSize( 1 );
+        assertThat( arguments.logWarningAtEnd.peek() )
             .startsWith( "Corrupted STDOUT by directly writing to native stream in forked JVM 0. "
                 + "See FAQ web page and the dump file" );
-
-        verifyNoMoreInteractions( logger );
     }
 
     @Test
@@ -375,11 +333,8 @@ public class ForkClientTest
         String nativeStream = "Listening for transport dt_socket at address: bla\n:maven-surefire-event:\u0003:bye:\n";
         EH eventHandler = new EH();
         CountdownCloseable countdown = new CountdownCloseable( mock( Closeable.class ), 1 );
-        ForkNodeArguments arguments = mock( ForkNodeArguments.class );
-        when( arguments.dumpStreamText( anyString() ) ).thenReturn( new File( "" ) );
-        ConsoleLogger logger = mock( ConsoleLogger.class );
-        when( arguments.getConsoleLogger() ).thenReturn( logger );
-        when( logger.isDebugEnabled() ).thenReturn( true );
+        ConsoleLoggerMock logger = new ConsoleLoggerMock( true, true, true, true );
+        ForkNodeArgumentsMock arguments = new ForkNodeArgumentsMock( logger, new File( "" ) );
         ReadableByteChannel channel = newChannel( new ByteArrayInputStream( nativeStream.getBytes() ) );
         try ( EventConsumerThread t = new EventConsumerThread( "t", channel, eventHandler, countdown, arguments ) )
         {
@@ -393,8 +348,9 @@ public class ForkClientTest
             assertThat( event.getEventType() )
                 .isEqualTo( BOOTERCODE_BYE );
 
-            verify( logger )
-                .debug( "Listening for transport dt_socket at address: bla" );
+            assertThat( logger.debug )
+                .hasSize( 1 )
+                .contains( "Listening for transport dt_socket at address: bla" );
 
             countdown.awaitClosed();
         }
@@ -402,9 +358,8 @@ public class ForkClientTest
         assertThat( eventHandler.sizeOfEventCache() )
             .isEqualTo( 0 );
 
-        verify( logger ).isDebugEnabled();
-
-        verifyNoMoreInteractions( logger );
+        assertThat( logger.isDebugEnabledCalled )
+            .isTrue();
     }
 
     @Test
@@ -747,9 +702,8 @@ public class ForkClientTest
             + ":\u0000\u0000\u0000\u0002:s1:\u0000\u0000\u0000\u0002:s2:";
         EH eventHandler = new EH();
         CountdownCloseable countdown = new CountdownCloseable( mock( Closeable.class ), 1 );
-        ConsoleLogger logger = mock( ConsoleLogger.class );
-        ForkNodeArguments arguments = mock( ForkNodeArguments.class );
-        when( arguments.getConsoleLogger() ).thenReturn( logger );
+        ConsoleLoggerMock logger = new ConsoleLoggerMock( false, false, false, false );
+        ForkNodeArgumentsMock arguments = new ForkNodeArgumentsMock( logger, new File( "" ) );
         ReadableByteChannel channel = newChannel( new ByteArrayInputStream( nativeStream.getBytes() ) );
         try ( EventConsumerThread t = new EventConsumerThread( "t", channel, eventHandler, countdown, arguments ) )
         {
@@ -775,13 +729,12 @@ public class ForkClientTest
 
             countdown.awaitClosed();
 
-            verifyZeroInteractions( logger );
+            assertThat( logger.isCalled() )
+                .isFalse();
         }
 
         assertThat( eventHandler.sizeOfEventCache() )
             .isEqualTo( 0 );
-
-        verifyNoMoreInteractions( logger );
     }
 
     @Test
@@ -1881,4 +1834,166 @@ public class ForkClientTest
             cache.add( event );
         }
     }
+
+    /**
+     * Threadsafe impl. Mockito and Powermock are not thread-safe.
+     */
+    private static class ForkNodeArgumentsMock implements ForkNodeArguments
+    {
+        private final ConcurrentLinkedQueue<String> dumpStreamText = new ConcurrentLinkedQueue<>();
+        private final ConcurrentLinkedQueue<String> logWarningAtEnd = new ConcurrentLinkedQueue<>();
+        private final ConsoleLogger logger;
+        private final File dumpStreamTextFile;
+
+        ForkNodeArgumentsMock( ConsoleLogger logger, File dumpStreamTextFile )
+        {
+            this.logger = logger;
+            this.dumpStreamTextFile = dumpStreamTextFile;
+        }
+
+        @Nonnull
+        @Override
+        public String getSessionId()
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public int getForkChannelId()
+        {
+            return 0;
+        }
+
+        @Nonnull
+        @Override
+        public File dumpStreamText( @Nonnull String text )
+        {
+            dumpStreamText.add( text );
+            return dumpStreamTextFile;
+        }
+
+        @Nonnull
+        @Override
+        public File dumpStreamException( @Nonnull Throwable t )
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public void logWarningAtEnd( @Nonnull String text )
+        {
+            logWarningAtEnd.add( text );
+        }
+
+        @Nonnull
+        @Override
+        public ConsoleLogger getConsoleLogger()
+        {
+            return logger;
+        }
+
+        boolean isCalled()
+        {
+            return !dumpStreamText.isEmpty() || !logWarningAtEnd.isEmpty();
+        }
+    }
+
+    /**
+     * Threadsafe impl. Mockito and Powermock are not thread-safe.
+     */
+    private static class ConsoleLoggerMock implements ConsoleLogger
+    {
+        final ConcurrentLinkedQueue<String> debug = new ConcurrentLinkedQueue<>();
+        final ConcurrentLinkedQueue<String> info = new ConcurrentLinkedQueue<>();
+        final ConcurrentLinkedQueue<String> error = new ConcurrentLinkedQueue<>();
+        final boolean isDebug;
+        final boolean isInfo;
+        final boolean isWarning;
+        final boolean isError;
+        boolean called;
+        boolean isDebugEnabledCalled;
+        boolean isInfoEnabledCalled;
+
+        ConsoleLoggerMock( boolean isDebug, boolean isInfo, boolean isWarning, boolean isError )
+        {
+            this.isDebug = isDebug;
+            this.isInfo = isInfo;
+            this.isWarning = isWarning;
+            this.isError = isError;
+        }
+
+        @Override
+        public boolean isDebugEnabled()
+        {
+            isDebugEnabledCalled = true;
+            called = true;
+            return isDebug;
+        }
+
+        @Override
+        public void debug( String message )
+        {
+            debug.add( message );
+            called = true;
+        }
+
+        @Override
+        public boolean isInfoEnabled()
+        {
+            isInfoEnabledCalled = true;
+            called = true;
+            return isInfo;
+        }
+
+        @Override
+        public void info( String message )
+        {
+            info.add( message );
+            called = true;
+        }
+
+        @Override
+        public boolean isWarnEnabled()
+        {
+            called = true;
+            return isWarning;
+        }
+
+        @Override
+        public void warning( String message )
+        {
+            called = true;
+        }
+
+        @Override
+        public boolean isErrorEnabled()
+        {
+            called = true;
+            return isError;
+        }
+
+        @Override
+        public void error( String message )
+        {
+            error.add( message );
+            called = true;
+        }
+
+        @Override
+        public void error( String message, Throwable t )
+        {
+            called = true;
+        }
+
+        @Override
+        public void error( Throwable t )
+        {
+            called = true;
+        }
+
+        boolean isCalled()
+        {
+            return called;
+        }
+    }
 }