[maven-surefire] 01/01: [SUREFIRE-1512] ProcessInfo for Windows is prone to timezone offset changes
This is an automated email from the ASF dual-hosted git repository. tibordigana pushed a commit to branch 1512 in repository https://gitbox.apache.org/repos/asf/maven-surefire.git commit c546235573817a32155b0413029b4d0a8b1f80d6 Author: Tibor17AuthorDate: Sun Apr 8 12:24:39 2018 +0200 [SUREFIRE-1512] ProcessInfo for Windows is prone to timezone offset changes --- Jenkinsfile| 2 +- .../apache/maven/surefire/booter/PpidChecker.java | 74 +++--- .../apache/maven/surefire/booter/ProcessInfo.java | 6 +- 3 files changed, 53 insertions(+), 29 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index e8e2179..5df67a0 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -32,7 +32,7 @@ properties( final def oses = ['linux', 'windows'] final def mavens = env.BRANCH_NAME == 'master' ? ['3.2.x', '3.3.x', '3.5.x'] : ['3.5.x'] -final def jdks = env.BRANCH_NAME == 'master' ? [7, 8, 9, 10] : [7, 10] +final def jdks = [7, 8, 9, 10] final def options = ['-e', '-V', '-B', '-nsu', '-P', 'run-its'] final def goals = ['clean', 'install', 'jacoco:report'] 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 32e3ad7..b480441 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 @@ -22,13 +22,15 @@ package org.apache.maven.surefire.booter; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; +import java.text.SimpleDateFormat; import java.util.Queue; import java.util.Scanner; -import java.util.StringTokenizer; +import java.util.TimeZone; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static java.lang.Integer.parseInt; import static java.lang.Long.parseLong; import static java.util.concurrent.TimeUnit.DAYS; import static java.util.concurrent.TimeUnit.HOURS; @@ -39,6 +41,8 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank; import static org.apache.commons.lang3.SystemUtils.IS_OS_HP_UX; import static org.apache.commons.lang3.SystemUtils.IS_OS_UNIX; import static org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS; +import static org.apache.maven.surefire.booter.ProcessInfo.unixProcessInfo; +import static org.apache.maven.surefire.booter.ProcessInfo.windowsProcessInfo; import static org.apache.maven.surefire.booter.ProcessInfo.ERR_PROCESS_INFO; import static org.apache.maven.surefire.booter.ProcessInfo.INVALID_PROCESS_INFO; @@ -50,6 +54,12 @@ import static org.apache.maven.surefire.booter.ProcessInfo.INVALID_PROCESS_INFO; */ final class PpidChecker { +private static final int MINUTES_TO_MILLIS = 60 * 1000; +// 25 chars https://superuser.com/questions/937380/get-creation-time-of-file-in-milliseconds/937401#937401 +private static final int WMIC_CREATION_DATE_VALUE_LENGTH = 25; +private static final int WMIC_CREATION_DATE_TIMESTAMP_LENGTH = 18; +private static final SimpleDateFormat WMIC_CREATION_DATE_FORMAT = +IS_OS_WINDOWS ? createWindowsCreationDateFormat() : null; private static final String WMIC_CREATION_DATE = "CreationDate"; private static final String WINDOWS_SYSTEM_ROOT_ENV = "SystemRoot"; private static final String RELATIVE_PATH_TO_WMIC = "System32\\Wbem"; @@ -151,7 +161,7 @@ final class PpidChecker + fromHours( matcher ) + fromMinutes( matcher ) + fromSeconds( matcher ); -return ProcessInfo.unixProcessInfo( pluginPid, pidUptime ); +return unixProcessInfo( pluginPid, pidUptime ); } } return previousProcessInfo; @@ -168,31 +178,36 @@ final class PpidChecker private boolean hasHeader; @Override -ProcessInfo consumeLine( String line, ProcessInfo previousProcessInfo ) +ProcessInfo consumeLine( String line, ProcessInfo previousProcessInfo ) throws Exception { -if ( !previousProcessInfo.isValid() ) +if ( !previousProcessInfo.isValid() && !line.isEmpty() ) { -StringTokenizer args = new StringTokenizer( line ); -if ( args.countTokens() == 1 ) +if ( hasHeader ) { -if ( hasHeader ) -{ -String startTimestamp = args.nextToken(); -return ProcessInfo.windowsProcessInfo( pluginPid, startTimestamp ); -} -else +
[maven-surefire] 01/01: [SUREFIRE-1512] ProcessInfo for Windows is prone to timezone offset changes
This is an automated email from the ASF dual-hosted git repository. tibordigana pushed a commit to branch 1512 in repository https://gitbox.apache.org/repos/asf/maven-surefire.git commit 0831fcfc4e65503dda49e2c6b48192d16148b23c Author: Tibor17AuthorDate: Sun Apr 8 12:24:39 2018 +0200 [SUREFIRE-1512] ProcessInfo for Windows is prone to timezone offset changes --- Jenkinsfile| 2 +- .../apache/maven/surefire/booter/PpidChecker.java | 74 +++--- .../apache/maven/surefire/booter/ProcessInfo.java | 6 +- 3 files changed, 53 insertions(+), 29 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index e8e2179..5792b1b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -32,7 +32,7 @@ properties( final def oses = ['linux', 'windows'] final def mavens = env.BRANCH_NAME == 'master' ? ['3.2.x', '3.3.x', '3.5.x'] : ['3.5.x'] -final def jdks = env.BRANCH_NAME == 'master' ? [7, 8, 9, 10] : [7, 10] +final def jdks = env.BRANCH_NAME == [7, 8, 9, 10] final def options = ['-e', '-V', '-B', '-nsu', '-P', 'run-its'] final def goals = ['clean', 'install', 'jacoco:report'] 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 32e3ad7..b480441 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 @@ -22,13 +22,15 @@ package org.apache.maven.surefire.booter; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; +import java.text.SimpleDateFormat; import java.util.Queue; import java.util.Scanner; -import java.util.StringTokenizer; +import java.util.TimeZone; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static java.lang.Integer.parseInt; import static java.lang.Long.parseLong; import static java.util.concurrent.TimeUnit.DAYS; import static java.util.concurrent.TimeUnit.HOURS; @@ -39,6 +41,8 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank; import static org.apache.commons.lang3.SystemUtils.IS_OS_HP_UX; import static org.apache.commons.lang3.SystemUtils.IS_OS_UNIX; import static org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS; +import static org.apache.maven.surefire.booter.ProcessInfo.unixProcessInfo; +import static org.apache.maven.surefire.booter.ProcessInfo.windowsProcessInfo; import static org.apache.maven.surefire.booter.ProcessInfo.ERR_PROCESS_INFO; import static org.apache.maven.surefire.booter.ProcessInfo.INVALID_PROCESS_INFO; @@ -50,6 +54,12 @@ import static org.apache.maven.surefire.booter.ProcessInfo.INVALID_PROCESS_INFO; */ final class PpidChecker { +private static final int MINUTES_TO_MILLIS = 60 * 1000; +// 25 chars https://superuser.com/questions/937380/get-creation-time-of-file-in-milliseconds/937401#937401 +private static final int WMIC_CREATION_DATE_VALUE_LENGTH = 25; +private static final int WMIC_CREATION_DATE_TIMESTAMP_LENGTH = 18; +private static final SimpleDateFormat WMIC_CREATION_DATE_FORMAT = +IS_OS_WINDOWS ? createWindowsCreationDateFormat() : null; private static final String WMIC_CREATION_DATE = "CreationDate"; private static final String WINDOWS_SYSTEM_ROOT_ENV = "SystemRoot"; private static final String RELATIVE_PATH_TO_WMIC = "System32\\Wbem"; @@ -151,7 +161,7 @@ final class PpidChecker + fromHours( matcher ) + fromMinutes( matcher ) + fromSeconds( matcher ); -return ProcessInfo.unixProcessInfo( pluginPid, pidUptime ); +return unixProcessInfo( pluginPid, pidUptime ); } } return previousProcessInfo; @@ -168,31 +178,36 @@ final class PpidChecker private boolean hasHeader; @Override -ProcessInfo consumeLine( String line, ProcessInfo previousProcessInfo ) +ProcessInfo consumeLine( String line, ProcessInfo previousProcessInfo ) throws Exception { -if ( !previousProcessInfo.isValid() ) +if ( !previousProcessInfo.isValid() && !line.isEmpty() ) { -StringTokenizer args = new StringTokenizer( line ); -if ( args.countTokens() == 1 ) +if ( hasHeader ) { -if ( hasHeader ) -{ -String startTimestamp = args.nextToken(); -return ProcessInfo.windowsProcessInfo( pluginPid, startTimestamp ); -} -
[maven-surefire] 01/01: [SUREFIRE-1512] ProcessInfo for Windows is prone to timezone offset changes
This is an automated email from the ASF dual-hosted git repository. tibordigana pushed a commit to branch 1512 in repository https://gitbox.apache.org/repos/asf/maven-surefire.git commit 6f12946081b2963e6078d79adaced6dc6b17f35f Author: Tibor17AuthorDate: Sun Apr 8 12:24:39 2018 +0200 [SUREFIRE-1512] ProcessInfo for Windows is prone to timezone offset changes --- .../apache/maven/surefire/booter/PpidChecker.java | 74 +++--- .../apache/maven/surefire/booter/ProcessInfo.java | 6 +- 2 files changed, 52 insertions(+), 28 deletions(-) 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 32e3ad7..b480441 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 @@ -22,13 +22,15 @@ package org.apache.maven.surefire.booter; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; +import java.text.SimpleDateFormat; import java.util.Queue; import java.util.Scanner; -import java.util.StringTokenizer; +import java.util.TimeZone; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static java.lang.Integer.parseInt; import static java.lang.Long.parseLong; import static java.util.concurrent.TimeUnit.DAYS; import static java.util.concurrent.TimeUnit.HOURS; @@ -39,6 +41,8 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank; import static org.apache.commons.lang3.SystemUtils.IS_OS_HP_UX; import static org.apache.commons.lang3.SystemUtils.IS_OS_UNIX; import static org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS; +import static org.apache.maven.surefire.booter.ProcessInfo.unixProcessInfo; +import static org.apache.maven.surefire.booter.ProcessInfo.windowsProcessInfo; import static org.apache.maven.surefire.booter.ProcessInfo.ERR_PROCESS_INFO; import static org.apache.maven.surefire.booter.ProcessInfo.INVALID_PROCESS_INFO; @@ -50,6 +54,12 @@ import static org.apache.maven.surefire.booter.ProcessInfo.INVALID_PROCESS_INFO; */ final class PpidChecker { +private static final int MINUTES_TO_MILLIS = 60 * 1000; +// 25 chars https://superuser.com/questions/937380/get-creation-time-of-file-in-milliseconds/937401#937401 +private static final int WMIC_CREATION_DATE_VALUE_LENGTH = 25; +private static final int WMIC_CREATION_DATE_TIMESTAMP_LENGTH = 18; +private static final SimpleDateFormat WMIC_CREATION_DATE_FORMAT = +IS_OS_WINDOWS ? createWindowsCreationDateFormat() : null; private static final String WMIC_CREATION_DATE = "CreationDate"; private static final String WINDOWS_SYSTEM_ROOT_ENV = "SystemRoot"; private static final String RELATIVE_PATH_TO_WMIC = "System32\\Wbem"; @@ -151,7 +161,7 @@ final class PpidChecker + fromHours( matcher ) + fromMinutes( matcher ) + fromSeconds( matcher ); -return ProcessInfo.unixProcessInfo( pluginPid, pidUptime ); +return unixProcessInfo( pluginPid, pidUptime ); } } return previousProcessInfo; @@ -168,31 +178,36 @@ final class PpidChecker private boolean hasHeader; @Override -ProcessInfo consumeLine( String line, ProcessInfo previousProcessInfo ) +ProcessInfo consumeLine( String line, ProcessInfo previousProcessInfo ) throws Exception { -if ( !previousProcessInfo.isValid() ) +if ( !previousProcessInfo.isValid() && !line.isEmpty() ) { -StringTokenizer args = new StringTokenizer( line ); -if ( args.countTokens() == 1 ) +if ( hasHeader ) { -if ( hasHeader ) -{ -String startTimestamp = args.nextToken(); -return ProcessInfo.windowsProcessInfo( pluginPid, startTimestamp ); -} -else +// now the line is CreationDate, e.g. 20180406142327.741074+120 +if ( line.length() != WMIC_CREATION_DATE_VALUE_LENGTH ) { -hasHeader = WMIC_CREATION_DATE.equals( args.nextToken() ); +throw new IllegalStateException( "WMIC CreationDate should have 25 characters " ++ line ); } +String startTimestamp = line.substring( 0,
[maven-surefire] 01/01: [SUREFIRE-1512] ProcessInfo for Windows is prone to timezone offset changes
This is an automated email from the ASF dual-hosted git repository. tibordigana pushed a commit to branch 1512 in repository https://gitbox.apache.org/repos/asf/maven-surefire.git commit dbe936285d06863f5b5218457e5920b198f28905 Author: Tibor17AuthorDate: Sun Apr 8 12:24:39 2018 +0200 [SUREFIRE-1512] ProcessInfo for Windows is prone to timezone offset changes --- .../apache/maven/surefire/booter/PpidChecker.java | 73 +++--- .../apache/maven/surefire/booter/ProcessInfo.java | 6 +- 2 files changed, 51 insertions(+), 28 deletions(-) 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 32e3ad7..97ca955 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 @@ -22,13 +22,15 @@ package org.apache.maven.surefire.booter; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; +import java.text.SimpleDateFormat; import java.util.Queue; import java.util.Scanner; -import java.util.StringTokenizer; +import java.util.TimeZone; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static java.lang.Integer.parseInt; import static java.lang.Long.parseLong; import static java.util.concurrent.TimeUnit.DAYS; import static java.util.concurrent.TimeUnit.HOURS; @@ -39,6 +41,8 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank; import static org.apache.commons.lang3.SystemUtils.IS_OS_HP_UX; import static org.apache.commons.lang3.SystemUtils.IS_OS_UNIX; import static org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS; +import static org.apache.maven.surefire.booter.ProcessInfo.unixProcessInfo; +import static org.apache.maven.surefire.booter.ProcessInfo.windowsProcessInfo; import static org.apache.maven.surefire.booter.ProcessInfo.ERR_PROCESS_INFO; import static org.apache.maven.surefire.booter.ProcessInfo.INVALID_PROCESS_INFO; @@ -50,6 +54,11 @@ import static org.apache.maven.surefire.booter.ProcessInfo.INVALID_PROCESS_INFO; */ final class PpidChecker { +private static final int MINUTES_TO_MILLIS = 60 * 1000; +// 25 chars https://superuser.com/questions/937380/get-creation-time-of-file-in-milliseconds/937401#937401 +private static final int WMIC_CREATION_DATE_VALUE_LENGTH = 25; +private static final int WMIC_CREATION_DATE_TIMESTAMP_LENGTH = 18; +private static final SimpleDateFormat WMIC_CREATION_DATE_FORMAT = createWindowsCreationDateFormat(); private static final String WMIC_CREATION_DATE = "CreationDate"; private static final String WINDOWS_SYSTEM_ROOT_ENV = "SystemRoot"; private static final String RELATIVE_PATH_TO_WMIC = "System32\\Wbem"; @@ -151,7 +160,7 @@ final class PpidChecker + fromHours( matcher ) + fromMinutes( matcher ) + fromSeconds( matcher ); -return ProcessInfo.unixProcessInfo( pluginPid, pidUptime ); +return unixProcessInfo( pluginPid, pidUptime ); } } return previousProcessInfo; @@ -168,31 +177,36 @@ final class PpidChecker private boolean hasHeader; @Override -ProcessInfo consumeLine( String line, ProcessInfo previousProcessInfo ) +ProcessInfo consumeLine( String line, ProcessInfo previousProcessInfo ) throws Exception { -if ( !previousProcessInfo.isValid() ) +if ( !previousProcessInfo.isValid() && !line.isEmpty() ) { -StringTokenizer args = new StringTokenizer( line ); -if ( args.countTokens() == 1 ) +if ( hasHeader ) { -if ( hasHeader ) -{ -String startTimestamp = args.nextToken(); -return ProcessInfo.windowsProcessInfo( pluginPid, startTimestamp ); -} -else +// now the line is CreationDate, e.g. 20180406142327.741074+120 +if ( line.length() != WMIC_CREATION_DATE_VALUE_LENGTH ) { -hasHeader = WMIC_CREATION_DATE.equals( args.nextToken() ); +throw new IllegalStateException( "WMIC CreationDate should have 25 characters " ++ line ); } +String startTimestamp = line.substring( 0, WMIC_CREATION_DATE_TIMESTAMP_LENGTH ); +
[maven-surefire] 01/01: [SUREFIRE-1512] ProcessInfo for Windows is prone to timezone offset changes
This is an automated email from the ASF dual-hosted git repository. tibordigana pushed a commit to branch 1512 in repository https://gitbox.apache.org/repos/asf/maven-surefire.git commit b67ce44f245e0418268c8d37ef4d807d28c520be Author: Tibor17AuthorDate: Sun Apr 8 12:24:39 2018 +0200 [SUREFIRE-1512] ProcessInfo for Windows is prone to timezone offset changes --- .../apache/maven/surefire/booter/PpidChecker.java | 74 +++--- .../apache/maven/surefire/booter/ProcessInfo.java | 6 +- 2 files changed, 52 insertions(+), 28 deletions(-) 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 32e3ad7..491a786 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 @@ -22,13 +22,16 @@ package org.apache.maven.surefire.booter; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; +import java.text.SimpleDateFormat; +import java.util.Locale; import java.util.Queue; import java.util.Scanner; -import java.util.StringTokenizer; +import java.util.TimeZone; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static java.lang.Integer.parseInt; import static java.lang.Long.parseLong; import static java.util.concurrent.TimeUnit.DAYS; import static java.util.concurrent.TimeUnit.HOURS; @@ -39,6 +42,8 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank; import static org.apache.commons.lang3.SystemUtils.IS_OS_HP_UX; import static org.apache.commons.lang3.SystemUtils.IS_OS_UNIX; import static org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS; +import static org.apache.maven.surefire.booter.ProcessInfo.unixProcessInfo; +import static org.apache.maven.surefire.booter.ProcessInfo.windowsProcessInfo; import static org.apache.maven.surefire.booter.ProcessInfo.ERR_PROCESS_INFO; import static org.apache.maven.surefire.booter.ProcessInfo.INVALID_PROCESS_INFO; @@ -50,6 +55,11 @@ import static org.apache.maven.surefire.booter.ProcessInfo.INVALID_PROCESS_INFO; */ final class PpidChecker { +private static final int MINUTES_TO_MILLIS = 60 * 1000; +// 25 chars https://superuser.com/questions/937380/get-creation-time-of-file-in-milliseconds/937401#937401 +private static final int WMIC_CREATION_DATE_VALUE_LENGTH = 25; +private static final int WMIC_CREATION_DATE_TIMESTAMP_LENGTH = 18; +private static final SimpleDateFormat WMIC_CREATION_DATE_FORMAT = createWindowsCreationDateFormat(); private static final String WMIC_CREATION_DATE = "CreationDate"; private static final String WINDOWS_SYSTEM_ROOT_ENV = "SystemRoot"; private static final String RELATIVE_PATH_TO_WMIC = "System32\\Wbem"; @@ -151,7 +161,7 @@ final class PpidChecker + fromHours( matcher ) + fromMinutes( matcher ) + fromSeconds( matcher ); -return ProcessInfo.unixProcessInfo( pluginPid, pidUptime ); +return unixProcessInfo( pluginPid, pidUptime ); } } return previousProcessInfo; @@ -168,31 +178,36 @@ final class PpidChecker private boolean hasHeader; @Override -ProcessInfo consumeLine( String line, ProcessInfo previousProcessInfo ) +ProcessInfo consumeLine( String line, ProcessInfo previousProcessInfo ) throws Exception { -if ( !previousProcessInfo.isValid() ) +if ( !previousProcessInfo.isValid() && !line.isEmpty() ) { -StringTokenizer args = new StringTokenizer( line ); -if ( args.countTokens() == 1 ) +if ( hasHeader ) { -if ( hasHeader ) -{ -String startTimestamp = args.nextToken(); -return ProcessInfo.windowsProcessInfo( pluginPid, startTimestamp ); -} -else +// now the line is CreationDate, e.g. 20180406142327.741074+120 +if ( line.length() != WMIC_CREATION_DATE_VALUE_LENGTH ) { -hasHeader = WMIC_CREATION_DATE.equals( args.nextToken() ); +throw new IllegalStateException( "WMIC CreationDate should have 25 characters " ++ line ); } +String startTimestamp = line.substring( 0,
[maven-surefire] 01/01: [SUREFIRE-1512] ProcessInfo for Windows is prone to timezone offset changes
This is an automated email from the ASF dual-hosted git repository. tibordigana pushed a commit to branch 1512 in repository https://gitbox.apache.org/repos/asf/maven-surefire.git commit 8d04fd3601f6e42a1b9d79ea07346661f52e0f04 Author: Tibor17AuthorDate: Sun Apr 8 12:24:39 2018 +0200 [SUREFIRE-1512] ProcessInfo for Windows is prone to timezone offset changes --- .../apache/maven/surefire/booter/PpidChecker.java | 67 ++ .../apache/maven/surefire/booter/ProcessInfo.java | 6 +- 2 files changed, 45 insertions(+), 28 deletions(-) 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 32e3ad7..ec8da79 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 @@ -22,13 +22,16 @@ package org.apache.maven.surefire.booter; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; +import java.text.SimpleDateFormat; +import java.util.Locale; import java.util.Queue; import java.util.Scanner; -import java.util.StringTokenizer; +import java.util.TimeZone; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static java.lang.Integer.parseInt; import static java.lang.Long.parseLong; import static java.util.concurrent.TimeUnit.DAYS; import static java.util.concurrent.TimeUnit.HOURS; @@ -39,6 +42,8 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank; import static org.apache.commons.lang3.SystemUtils.IS_OS_HP_UX; import static org.apache.commons.lang3.SystemUtils.IS_OS_UNIX; import static org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS; +import static org.apache.maven.surefire.booter.ProcessInfo.unixProcessInfo; +import static org.apache.maven.surefire.booter.ProcessInfo.windowsProcessInfo; import static org.apache.maven.surefire.booter.ProcessInfo.ERR_PROCESS_INFO; import static org.apache.maven.surefire.booter.ProcessInfo.INVALID_PROCESS_INFO; @@ -50,6 +55,11 @@ import static org.apache.maven.surefire.booter.ProcessInfo.INVALID_PROCESS_INFO; */ final class PpidChecker { +private static final int MINUTES_TO_MILLIS = 60 * 1000; +// 25 chars https://superuser.com/questions/937380/get-creation-time-of-file-in-milliseconds/937401#937401 +private static final int WMIC_CREATION_DATE_VALUE_LENGTH = 25; +private static final int WMIC_CREATION_DATE_TIMESTAMP_LENGTH = 18; +private static final SimpleDateFormat WMIC_CREATION_DATE_FORMAT = createWindowsCreationDateFormat(); private static final String WMIC_CREATION_DATE = "CreationDate"; private static final String WINDOWS_SYSTEM_ROOT_ENV = "SystemRoot"; private static final String RELATIVE_PATH_TO_WMIC = "System32\\Wbem"; @@ -151,7 +161,7 @@ final class PpidChecker + fromHours( matcher ) + fromMinutes( matcher ) + fromSeconds( matcher ); -return ProcessInfo.unixProcessInfo( pluginPid, pidUptime ); +return unixProcessInfo( pluginPid, pidUptime ); } } return previousProcessInfo; @@ -168,31 +178,36 @@ final class PpidChecker private boolean hasHeader; @Override -ProcessInfo consumeLine( String line, ProcessInfo previousProcessInfo ) +ProcessInfo consumeLine( String line, ProcessInfo previousProcessInfo ) throws Exception { -if ( !previousProcessInfo.isValid() ) +if ( !previousProcessInfo.isValid() && !line.isEmpty() ) { -StringTokenizer args = new StringTokenizer( line ); -if ( args.countTokens() == 1 ) +if ( hasHeader ) { -if ( hasHeader ) -{ -String startTimestamp = args.nextToken(); -return ProcessInfo.windowsProcessInfo( pluginPid, startTimestamp ); -} -else +// now the line is CreationDate, e.g. 20180406142327.741074+120 +if ( line.length() != WMIC_CREATION_DATE_VALUE_LENGTH ) { -hasHeader = WMIC_CREATION_DATE.equals( args.nextToken() ); +throw new IllegalStateException( "WMIC CreationDate should have 25 characters " ++ line ); } +String startTimestamp = line.substring( 0,
[maven-surefire] 01/01: [SUREFIRE-1512] ProcessInfo for Windows is prone to timezone offset changes
This is an automated email from the ASF dual-hosted git repository. tibordigana pushed a commit to branch 1512 in repository https://gitbox.apache.org/repos/asf/maven-surefire.git commit 0919299a4031a2c5a34975a8fef14378289832e7 Author: Tibor17AuthorDate: Sun Apr 8 12:24:39 2018 +0200 [SUREFIRE-1512] ProcessInfo for Windows is prone to timezone offset changes --- .../apache/maven/surefire/booter/PpidChecker.java | 67 ++ .../apache/maven/surefire/booter/ProcessInfo.java | 6 +- 2 files changed, 45 insertions(+), 28 deletions(-) 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 32e3ad7..03c5dad 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 @@ -22,13 +22,16 @@ package org.apache.maven.surefire.booter; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; +import java.text.SimpleDateFormat; +import java.util.Locale; import java.util.Queue; import java.util.Scanner; -import java.util.StringTokenizer; +import java.util.TimeZone; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static java.lang.Integer.parseInt; import static java.lang.Long.parseLong; import static java.util.concurrent.TimeUnit.DAYS; import static java.util.concurrent.TimeUnit.HOURS; @@ -39,6 +42,8 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank; import static org.apache.commons.lang3.SystemUtils.IS_OS_HP_UX; import static org.apache.commons.lang3.SystemUtils.IS_OS_UNIX; import static org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS; +import static org.apache.maven.surefire.booter.ProcessInfo.unixProcessInfo; +import static org.apache.maven.surefire.booter.ProcessInfo.windowsProcessInfo; import static org.apache.maven.surefire.booter.ProcessInfo.ERR_PROCESS_INFO; import static org.apache.maven.surefire.booter.ProcessInfo.INVALID_PROCESS_INFO; @@ -50,6 +55,11 @@ import static org.apache.maven.surefire.booter.ProcessInfo.INVALID_PROCESS_INFO; */ final class PpidChecker { +private static final int MINUTES_TO_MILLIS = 60 * 1000; +// 25 chars https://superuser.com/questions/937380/get-creation-time-of-file-in-milliseconds/937401#937401 +private static final int WMIC_CREATION_DATE_VALUE_LENGTH = 25; +private static final int WMIC_CREATION_DATE_TIMESTAMP_LENGTH = 18; +private static final SimpleDateFormat WMIC_CREATION_DATE_FORMAT = createWindowsCreationDateFormat(); private static final String WMIC_CREATION_DATE = "CreationDate"; private static final String WINDOWS_SYSTEM_ROOT_ENV = "SystemRoot"; private static final String RELATIVE_PATH_TO_WMIC = "System32\\Wbem"; @@ -151,7 +161,7 @@ final class PpidChecker + fromHours( matcher ) + fromMinutes( matcher ) + fromSeconds( matcher ); -return ProcessInfo.unixProcessInfo( pluginPid, pidUptime ); +return unixProcessInfo( pluginPid, pidUptime ); } } return previousProcessInfo; @@ -168,31 +178,36 @@ final class PpidChecker private boolean hasHeader; @Override -ProcessInfo consumeLine( String line, ProcessInfo previousProcessInfo ) +ProcessInfo consumeLine( String line, ProcessInfo previousProcessInfo ) throws Exception { -if ( !previousProcessInfo.isValid() ) +if ( !previousProcessInfo.isValid() && !line.isEmpty() ) { -StringTokenizer args = new StringTokenizer( line ); -if ( args.countTokens() == 1 ) +if ( hasHeader ) { -if ( hasHeader ) -{ -String startTimestamp = args.nextToken(); -return ProcessInfo.windowsProcessInfo( pluginPid, startTimestamp ); -} -else +// now the line is CreationDate, e.g. 20180406142327.741074+120 +if ( line.length() != WMIC_CREATION_DATE_VALUE_LENGTH ) { -hasHeader = WMIC_CREATION_DATE.equals( args.nextToken() ); +throw new IllegalStateException( "WMIC CreationDate should have 25 characters " ++ line ); } +String startTimestamp = line.substring( 0,
[maven-surefire] 01/01: [SUREFIRE-1512] ProcessInfo for Windows is prone to timezone offset changes
This is an automated email from the ASF dual-hosted git repository. tibordigana pushed a commit to branch 1512 in repository https://gitbox.apache.org/repos/asf/maven-surefire.git commit 806044ec7539138ddf43b5a21912bd3738df2ef2 Author: Tibor17AuthorDate: Sun Apr 8 12:24:39 2018 +0200 [SUREFIRE-1512] ProcessInfo for Windows is prone to timezone offset changes --- .../apache/maven/surefire/booter/PpidChecker.java | 67 ++ .../apache/maven/surefire/booter/ProcessInfo.java | 2 +- 2 files changed, 44 insertions(+), 25 deletions(-) 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 32e3ad7..03c5dad 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 @@ -22,13 +22,16 @@ package org.apache.maven.surefire.booter; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; +import java.text.SimpleDateFormat; +import java.util.Locale; import java.util.Queue; import java.util.Scanner; -import java.util.StringTokenizer; +import java.util.TimeZone; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static java.lang.Integer.parseInt; import static java.lang.Long.parseLong; import static java.util.concurrent.TimeUnit.DAYS; import static java.util.concurrent.TimeUnit.HOURS; @@ -39,6 +42,8 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank; import static org.apache.commons.lang3.SystemUtils.IS_OS_HP_UX; import static org.apache.commons.lang3.SystemUtils.IS_OS_UNIX; import static org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS; +import static org.apache.maven.surefire.booter.ProcessInfo.unixProcessInfo; +import static org.apache.maven.surefire.booter.ProcessInfo.windowsProcessInfo; import static org.apache.maven.surefire.booter.ProcessInfo.ERR_PROCESS_INFO; import static org.apache.maven.surefire.booter.ProcessInfo.INVALID_PROCESS_INFO; @@ -50,6 +55,11 @@ import static org.apache.maven.surefire.booter.ProcessInfo.INVALID_PROCESS_INFO; */ final class PpidChecker { +private static final int MINUTES_TO_MILLIS = 60 * 1000; +// 25 chars https://superuser.com/questions/937380/get-creation-time-of-file-in-milliseconds/937401#937401 +private static final int WMIC_CREATION_DATE_VALUE_LENGTH = 25; +private static final int WMIC_CREATION_DATE_TIMESTAMP_LENGTH = 18; +private static final SimpleDateFormat WMIC_CREATION_DATE_FORMAT = createWindowsCreationDateFormat(); private static final String WMIC_CREATION_DATE = "CreationDate"; private static final String WINDOWS_SYSTEM_ROOT_ENV = "SystemRoot"; private static final String RELATIVE_PATH_TO_WMIC = "System32\\Wbem"; @@ -151,7 +161,7 @@ final class PpidChecker + fromHours( matcher ) + fromMinutes( matcher ) + fromSeconds( matcher ); -return ProcessInfo.unixProcessInfo( pluginPid, pidUptime ); +return unixProcessInfo( pluginPid, pidUptime ); } } return previousProcessInfo; @@ -168,31 +178,36 @@ final class PpidChecker private boolean hasHeader; @Override -ProcessInfo consumeLine( String line, ProcessInfo previousProcessInfo ) +ProcessInfo consumeLine( String line, ProcessInfo previousProcessInfo ) throws Exception { -if ( !previousProcessInfo.isValid() ) +if ( !previousProcessInfo.isValid() && !line.isEmpty() ) { -StringTokenizer args = new StringTokenizer( line ); -if ( args.countTokens() == 1 ) +if ( hasHeader ) { -if ( hasHeader ) -{ -String startTimestamp = args.nextToken(); -return ProcessInfo.windowsProcessInfo( pluginPid, startTimestamp ); -} -else +// now the line is CreationDate, e.g. 20180406142327.741074+120 +if ( line.length() != WMIC_CREATION_DATE_VALUE_LENGTH ) { -hasHeader = WMIC_CREATION_DATE.equals( args.nextToken() ); +throw new IllegalStateException( "WMIC CreationDate should have 25 characters " ++ line ); } +String startTimestamp = line.substring( 0,
[maven-surefire] 01/01: [SUREFIRE-1512] ProcessInfo for Windows is prone to timezone offset changes
This is an automated email from the ASF dual-hosted git repository. tibordigana pushed a commit to branch 1512 in repository https://gitbox.apache.org/repos/asf/maven-surefire.git commit 611505db1dfd6b046d98ffa0340b55bb6a74a633 Author: Tibor17AuthorDate: Sun Apr 8 12:24:39 2018 +0200 [SUREFIRE-1512] ProcessInfo for Windows is prone to timezone offset changes --- .../apache/maven/surefire/booter/PpidChecker.java | 60 +- .../apache/maven/surefire/booter/ProcessInfo.java | 2 +- 2 files changed, 37 insertions(+), 25 deletions(-) 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 32e3ad7..5ba0119 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 @@ -22,13 +22,15 @@ package org.apache.maven.surefire.booter; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; +import java.text.SimpleDateFormat; +import java.util.Locale; import java.util.Queue; import java.util.Scanner; -import java.util.StringTokenizer; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static java.lang.Integer.parseInt; import static java.lang.Long.parseLong; import static java.util.concurrent.TimeUnit.DAYS; import static java.util.concurrent.TimeUnit.HOURS; @@ -39,6 +41,8 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank; import static org.apache.commons.lang3.SystemUtils.IS_OS_HP_UX; import static org.apache.commons.lang3.SystemUtils.IS_OS_UNIX; import static org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS; +import static org.apache.maven.surefire.booter.ProcessInfo.unixProcessInfo; +import static org.apache.maven.surefire.booter.ProcessInfo.windowsProcessInfo; import static org.apache.maven.surefire.booter.ProcessInfo.ERR_PROCESS_INFO; import static org.apache.maven.surefire.booter.ProcessInfo.INVALID_PROCESS_INFO; @@ -50,6 +54,12 @@ import static org.apache.maven.surefire.booter.ProcessInfo.INVALID_PROCESS_INFO; */ final class PpidChecker { +private static final int MINUTES_TO_MILLIS = 60 * 1000; +// 25 chars https://superuser.com/questions/937380/get-creation-time-of-file-in-milliseconds/937401#937401 +private static final int WMIC_CREATION_DATE_VALUE_LENGTH = 25; +private static final int WMIC_CREATION_DATE_TIMESTAMP_LENGTH = 18; +private static final SimpleDateFormat WMIC_CREATION_DATE_FORMAT += new SimpleDateFormat( "MMddHHmmss'.'SSS", Locale.ROOT ); private static final String WMIC_CREATION_DATE = "CreationDate"; private static final String WINDOWS_SYSTEM_ROOT_ENV = "SystemRoot"; private static final String RELATIVE_PATH_TO_WMIC = "System32\\Wbem"; @@ -151,7 +161,7 @@ final class PpidChecker + fromHours( matcher ) + fromMinutes( matcher ) + fromSeconds( matcher ); -return ProcessInfo.unixProcessInfo( pluginPid, pidUptime ); +return unixProcessInfo( pluginPid, pidUptime ); } } return previousProcessInfo; @@ -168,31 +178,36 @@ final class PpidChecker private boolean hasHeader; @Override -ProcessInfo consumeLine( String line, ProcessInfo previousProcessInfo ) +ProcessInfo consumeLine( String line, ProcessInfo previousProcessInfo ) throws Exception { -if ( !previousProcessInfo.isValid() ) +if ( !previousProcessInfo.isValid() && !line.isEmpty() ) { -StringTokenizer args = new StringTokenizer( line ); -if ( args.countTokens() == 1 ) +if ( hasHeader ) { -if ( hasHeader ) +// now the line is CreationDate, e.g. 20180406142327.741074+120 +if ( line.length() != WMIC_CREATION_DATE_VALUE_LENGTH ) { -String startTimestamp = args.nextToken(); -return ProcessInfo.windowsProcessInfo( pluginPid, startTimestamp ); -} -else -{ -hasHeader = WMIC_CREATION_DATE.equals( args.nextToken() ); +throw new IllegalStateException( "WMIC CreationDate should have 25 characters " ++ line ); } +String startTimestamp = line.substring( 0,
[maven-surefire] 01/01: [SUREFIRE-1512] ProcessInfo for Windows is prone to timezone offset changes
This is an automated email from the ASF dual-hosted git repository. tibordigana pushed a commit to branch 1512 in repository https://gitbox.apache.org/repos/asf/maven-surefire.git commit 3c472ff6e1ca4fef9e3cf2beda35734d00af510b Author: Tibor17AuthorDate: Sun Apr 8 12:24:39 2018 +0200 [SUREFIRE-1512] ProcessInfo for Windows is prone to timezone offset changes --- .../apache/maven/surefire/booter/PpidChecker.java | 47 +++--- .../apache/maven/surefire/booter/ProcessInfo.java | 2 +- 2 files changed, 33 insertions(+), 16 deletions(-) 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 32e3ad7..d56a82a 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 @@ -22,6 +22,8 @@ package org.apache.maven.surefire.booter; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; +import java.text.SimpleDateFormat; +import java.util.Locale; import java.util.Queue; import java.util.Scanner; import java.util.StringTokenizer; @@ -29,6 +31,7 @@ import java.util.concurrent.ConcurrentLinkedQueue; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static java.lang.Integer.parseInt; import static java.lang.Long.parseLong; import static java.util.concurrent.TimeUnit.DAYS; import static java.util.concurrent.TimeUnit.HOURS; @@ -39,6 +42,8 @@ import static org.apache.commons.lang3.StringUtils.isNotBlank; import static org.apache.commons.lang3.SystemUtils.IS_OS_HP_UX; import static org.apache.commons.lang3.SystemUtils.IS_OS_UNIX; import static org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS; +import static org.apache.maven.surefire.booter.ProcessInfo.unixProcessInfo; +import static org.apache.maven.surefire.booter.ProcessInfo.windowsProcessInfo; import static org.apache.maven.surefire.booter.ProcessInfo.ERR_PROCESS_INFO; import static org.apache.maven.surefire.booter.ProcessInfo.INVALID_PROCESS_INFO; @@ -50,6 +55,12 @@ import static org.apache.maven.surefire.booter.ProcessInfo.INVALID_PROCESS_INFO; */ final class PpidChecker { +private static final int MINUTES_TO_MILLIS = 60 * 1000; +// 25 chars https://superuser.com/questions/937380/get-creation-time-of-file-in-milliseconds/937401#937401 +private static final int WMIC_CREATION_DATE_FORMAT_LENGTH = 25; +private static final int WMIC_CREATION_DATE_TIMESTAMP_LENGTH = 18; +private static final SimpleDateFormat WMIC_CREATION_DATE_FORMAT += new SimpleDateFormat( "MMddHHmmss'.'SSS", Locale.ROOT ); private static final String WMIC_CREATION_DATE = "CreationDate"; private static final String WINDOWS_SYSTEM_ROOT_ENV = "SystemRoot"; private static final String RELATIVE_PATH_TO_WMIC = "System32\\Wbem"; @@ -151,7 +162,7 @@ final class PpidChecker + fromHours( matcher ) + fromMinutes( matcher ) + fromSeconds( matcher ); -return ProcessInfo.unixProcessInfo( pluginPid, pidUptime ); +return unixProcessInfo( pluginPid, pidUptime ); } } return previousProcessInfo; @@ -168,7 +179,7 @@ final class PpidChecker private boolean hasHeader; @Override -ProcessInfo consumeLine( String line, ProcessInfo previousProcessInfo ) +ProcessInfo consumeLine( String line, ProcessInfo previousProcessInfo ) throws Exception { if ( !previousProcessInfo.isValid() ) { @@ -177,8 +188,18 @@ final class PpidChecker { if ( hasHeader ) { -String startTimestamp = args.nextToken(); -return ProcessInfo.windowsProcessInfo( pluginPid, startTimestamp ); +String creationDate = args.nextToken(); +if ( creationDate.length() != WMIC_CREATION_DATE_FORMAT_LENGTH ) +{ +throw new IllegalStateException( "WMIC CreationDate should have 25 characters " ++ creationDate ); +} +String startTimestamp = creationDate.substring( 0, WMIC_CREATION_DATE_TIMESTAMP_LENGTH ); +int indexOfTimeZone = WMIC_CREATION_DATE_FORMAT_LENGTH - 4; +long startTimestampMillisUTC = +WMIC_CREATION_DATE_FORMAT.parse( startTimestamp ).getTime() +