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 2019/10/24 21:33:37 UTC

[maven-surefire] branch docker-alpine updated: [JDK 11 Alpine Linux] Surefire handled random order of pid and /procps does not filter pid on busybox distributions

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

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


The following commit(s) were added to refs/heads/docker-alpine by this push:
     new dc1341c  [JDK 11 Alpine Linux] Surefire handled random order of pid and /procps does not filter pid on busybox distributions
dc1341c is described below

commit dc1341c81cadcc21a5c77ce67b03868b70149a33
Author: tibordigana <ti...@apache.org>
AuthorDate: Thu Oct 24 23:33:25 2019 +0200

    [JDK 11 Alpine Linux] Surefire handled random order of pid and /procps does not filter pid on busybox distributions
---
 ...ooterDeserializerProviderConfigurationTest.java |  2 +-
 .../maven/surefire/booter/BooterDeserializer.java  |  4 +--
 .../apache/maven/surefire/booter/ForkedBooter.java |  2 +-
 .../apache/maven/surefire/booter/PpidChecker.java  | 15 +++++++----
 .../apache/maven/surefire/booter/ProcessInfo.java  | 10 +++----
 .../maven/surefire/booter/PpidCheckerTest.java     | 31 +++++++++++-----------
 6 files changed, 35 insertions(+), 29 deletions(-)

diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/BooterDeserializerProviderConfigurationTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/BooterDeserializerProviderConfigurationTest.java
index 3869911..4cdff1b 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/BooterDeserializerProviderConfigurationTest.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/BooterDeserializerProviderConfigurationTest.java
@@ -244,7 +244,7 @@ public class BooterDeserializerProviderConfigurationTest
         final File propsTest = booterSerializer.serialize( props, booterConfiguration, testProviderConfiguration, test,
                                                            readTestsFromInStream, 51L, 1 );
         BooterDeserializer booterDeserializer = new BooterDeserializer( new FileInputStream( propsTest ) );
-        assertEquals( 51L, (Object) booterDeserializer.getPluginPid() );
+        assertEquals( "51", (Object) booterDeserializer.getPluginPid() );
         return booterDeserializer.deserialize();
     }
 
diff --git a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/BooterDeserializer.java b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/BooterDeserializer.java
index 75aad1f..3312df5 100644
--- a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/BooterDeserializer.java
+++ b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/BooterDeserializer.java
@@ -61,9 +61,9 @@ public class BooterDeserializer
     /**
      * @return PID of Maven process where plugin is executed; or null if PID could not be determined.
      */
-    public Long getPluginPid()
+    public String getPluginPid()
     {
-        return properties.getLongProperty( PLUGIN_PID );
+        return properties.getProperty( PLUGIN_PID );
     }
 
     public ProviderConfiguration deserialize()
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 194dc88..93deb20 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
@@ -188,7 +188,7 @@ public final class ForkedBooter
         }
     }
 
-    private PingScheduler listenToShutdownCommands( Long ppid, ConsoleLogger logger )
+    private PingScheduler listenToShutdownCommands( String ppid, ConsoleLogger logger )
     {
         PpidChecker ppidChecker = ppid == null ? null : new PpidChecker( ppid );
         commandReader.addShutdownListener( createExitHandler( ppidChecker ) );
diff --git a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/PpidChecker.java b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/PpidChecker.java
index 99ca159..475fb71 100644
--- a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/PpidChecker.java
+++ b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/PpidChecker.java
@@ -74,14 +74,14 @@ final class PpidChecker
      * The etime is in the form of [[dd-]hh:]mm:ss on Unix like systems.
      * See the workaround https://issues.apache.org/jira/browse/SUREFIRE-1451.
      */
-    static final Pattern UNIX_CMD_OUT_PATTERN = compile( "^(((\\d+)-)?(\\d{1,2}):)?(\\d{1,2}):(\\d{1,2})$" );
+    static final Pattern UNIX_CMD_OUT_PATTERN = compile( "^(((\\d+)-)?(\\d{1,2}):)?(\\d{1,2}):(\\d{1,2})\\s+(\\d+)$" );
 
-    private final long ppid;
+    private final String ppid;
 
     private volatile ProcessInfo parentProcessInfo;
     private volatile boolean stopped;
 
-    PpidChecker( long ppid )
+    PpidChecker( @Nonnull String ppid )
     {
         this.ppid = ppid;
     }
@@ -170,7 +170,7 @@ final class PpidChecker
                 if ( previousOutputLine.isInvalid() )
                 {
                     Matcher matcher = UNIX_CMD_OUT_PATTERN.matcher( line );
-                    if ( matcher.matches() )
+                    if ( matcher.matches() && ppid.equals( fromPID( matcher ) ) )
                     {
                         long pidUptime = fromDays( matcher )
                                                  + fromHours( matcher )
@@ -182,7 +182,7 @@ final class PpidChecker
                 return previousOutputLine;
             }
         };
-        String cmd = unixPathToPS() + " -o etime= " + ( IS_OS_LINUX ? "" : "-p " ) + ppid;
+        String cmd = unixPathToPS() + " -o etime,pid " + ( IS_OS_LINUX ? "" : "-p " ) + ppid;
         return reader.execute( "/bin/sh", "-c", cmd );
     }
 
@@ -305,6 +305,11 @@ final class PpidChecker
         return s == null ? 0L : parseLong( s );
     }
 
+    static String fromPID( Matcher matcher )
+    {
+        return matcher.group( 7 );
+    }
+
     private static void checkValid( Scanner scanner )
             throws IOException
     {
diff --git a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProcessInfo.java b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProcessInfo.java
index 77d7e8d..c7e22de 100644
--- a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProcessInfo.java
+++ b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ProcessInfo.java
@@ -42,20 +42,20 @@ final class ProcessInfo
      * <br>
      * <pre>/bin/ps -o etime= -p 123</pre>
      */
-    static @Nonnull ProcessInfo unixProcessInfo( long pid, long etime )
+    static @Nonnull ProcessInfo unixProcessInfo( String pid, long etime )
     {
         return new ProcessInfo( pid, etime );
     }
 
-    static @Nonnull ProcessInfo windowsProcessInfo( long pid, long startTimestamp )
+    static @Nonnull ProcessInfo windowsProcessInfo( String pid, long startTimestamp )
     {
         return new ProcessInfo( pid, startTimestamp );
     }
 
-    private final Long pid;
+    private final String pid;
     private final Comparable time;
 
-    private ProcessInfo( Long pid, Comparable time )
+    private ProcessInfo( String pid, Comparable time )
     {
         this.pid = pid;
         this.time = time;
@@ -76,7 +76,7 @@ final class ProcessInfo
         return this == ERR_PROCESS_INFO;
     }
 
-    long getPID()
+    String getPID()
     {
         checkValid();
         return pid;
diff --git a/surefire-booter/src/test/java/org/apache/maven/surefire/booter/PpidCheckerTest.java b/surefire-booter/src/test/java/org/apache/maven/surefire/booter/PpidCheckerTest.java
index ccccd61..2801ffd 100644
--- a/surefire-booter/src/test/java/org/apache/maven/surefire/booter/PpidCheckerTest.java
+++ b/surefire-booter/src/test/java/org/apache/maven/surefire/booter/PpidCheckerTest.java
@@ -65,7 +65,7 @@ public class PpidCheckerTest
     @Test
     public void shouldHavePidAtBegin()
     {
-        long expectedPid = Long.parseLong( ManagementFactory.getRuntimeMXBean().getName().split( "@" )[0].trim() );
+        String expectedPid = ManagementFactory.getRuntimeMXBean().getName().split( "@" )[0].trim();
 
         PpidChecker checker = new PpidChecker( expectedPid );
         ProcessInfo processInfo = IS_OS_UNIX ? checker.unix() : checker.windows();
@@ -89,7 +89,7 @@ public class PpidCheckerTest
     @Test
     public void shouldHavePid() throws Exception
     {
-        long expectedPid = Long.parseLong( ManagementFactory.getRuntimeMXBean().getName().split( "@" )[0].trim() );
+        String expectedPid = ManagementFactory.getRuntimeMXBean().getName().split( "@" )[0].trim();
         System.out.println( "java version " + System.getProperty( "java.version" ) + " expectedPid=" + expectedPid );
 
         PpidChecker checker = new PpidChecker( expectedPid );
@@ -134,7 +134,7 @@ public class PpidCheckerTest
     @Test
     public void shouldBeStopped()
     {
-        PpidChecker checker = new PpidChecker( 0L );
+        PpidChecker checker = new PpidChecker( "0" );
         checker.stop();
 
         assertThat( checker.canUse() )
@@ -151,9 +151,7 @@ public class PpidCheckerTest
     @Test
     public void shouldNotFindSuchPID()
     {
-        long ppid = 1_000_000L;
-
-        PpidChecker checker = new PpidChecker( ppid );
+        PpidChecker checker = new PpidChecker( "1000000" );
         setInternalState( checker, "parentProcessInfo", ProcessInfo.ERR_PROCESS_INFO );
 
         assertThat( checker.canUse() )
@@ -170,9 +168,7 @@ public class PpidCheckerTest
     @Test
     public void shouldNotBeAlive()
     {
-        long ppid = 1_000_000L;
-
-        PpidChecker checker = new PpidChecker( ppid );
+        PpidChecker checker = new PpidChecker( "1000000" );
 
         assertThat( checker.canUse() )
                 .isTrue();
@@ -184,49 +180,54 @@ public class PpidCheckerTest
     @Test
     public void shouldParseEtime()
     {
-        Matcher m = PpidChecker.UNIX_CMD_OUT_PATTERN.matcher( "38" );
+        Matcher m = PpidChecker.UNIX_CMD_OUT_PATTERN.matcher( "38 1234567890" );
         assertThat( m.matches() )
                 .isFalse();
 
-        m = PpidChecker.UNIX_CMD_OUT_PATTERN.matcher( "05:38" );
+        m = PpidChecker.UNIX_CMD_OUT_PATTERN.matcher( "05:38 1234567890" );
         assertThat( m.matches() )
                 .isTrue();
         assertThat( PpidChecker.fromDays( m ) ).isEqualTo( 0L );
         assertThat( PpidChecker.fromHours( m ) ).isEqualTo( 0L );
         assertThat( PpidChecker.fromMinutes( m ) ).isEqualTo( 300L );
         assertThat( PpidChecker.fromSeconds( m ) ).isEqualTo( 38L );
+        assertThat( PpidChecker.fromPID( m ) ).isEqualTo( "1234567890" );
 
-        m = PpidChecker.UNIX_CMD_OUT_PATTERN.matcher( "00:05:38" );
+        m = PpidChecker.UNIX_CMD_OUT_PATTERN.matcher( "00:05:38 1234567890" );
         assertThat( m.matches() )
                 .isTrue();
         assertThat( PpidChecker.fromDays( m ) ).isEqualTo( 0L );
         assertThat( PpidChecker.fromHours( m ) ).isEqualTo( 0L );
         assertThat( PpidChecker.fromMinutes( m ) ).isEqualTo( 300L );
         assertThat( PpidChecker.fromSeconds( m ) ).isEqualTo( 38L );
+        assertThat( PpidChecker.fromPID( m ) ).isEqualTo( "1234567890" );
 
-        m = PpidChecker.UNIX_CMD_OUT_PATTERN.matcher( "01:05:38" );
+        m = PpidChecker.UNIX_CMD_OUT_PATTERN.matcher( "01:05:38 1234567890" );
         assertThat( m.matches() )
                 .isTrue();
         assertThat( PpidChecker.fromDays( m ) ).isEqualTo( 0L );
         assertThat( PpidChecker.fromHours( m ) ).isEqualTo( 3600L );
         assertThat( PpidChecker.fromMinutes( m ) ).isEqualTo( 300L );
         assertThat( PpidChecker.fromSeconds( m ) ).isEqualTo( 38L );
+        assertThat( PpidChecker.fromPID( m ) ).isEqualTo( "1234567890" );
 
-        m = PpidChecker.UNIX_CMD_OUT_PATTERN.matcher( "02-01:05:38" );
+        m = PpidChecker.UNIX_CMD_OUT_PATTERN.matcher( "02-01:05:38 1234567890" );
         assertThat( m.matches() )
                 .isTrue();
         assertThat( PpidChecker.fromDays( m ) ).isEqualTo( 2 * 24 * 3600L );
         assertThat( PpidChecker.fromHours( m ) ).isEqualTo( 3600L );
         assertThat( PpidChecker.fromMinutes( m ) ).isEqualTo( 300L );
         assertThat( PpidChecker.fromSeconds( m ) ).isEqualTo( 38L );
+        assertThat( PpidChecker.fromPID( m ) ).isEqualTo( "1234567890" );
 
-        m = PpidChecker.UNIX_CMD_OUT_PATTERN.matcher( "02-1:5:3" );
+        m = PpidChecker.UNIX_CMD_OUT_PATTERN.matcher( "02-1:5:3 1234567890" );
         assertThat( m.matches() )
                 .isTrue();
         assertThat( PpidChecker.fromDays( m ) ).isEqualTo( 2 * 24 * 3600L );
         assertThat( PpidChecker.fromHours( m ) ).isEqualTo( 3600L );
         assertThat( PpidChecker.fromMinutes( m ) ).isEqualTo( 300L );
         assertThat( PpidChecker.fromSeconds( m ) ).isEqualTo( 3L );
+        assertThat( PpidChecker.fromPID( m ) ).isEqualTo( "1234567890" );
     }
 
     @Test