This is an automated email from the ASF dual-hosted git repository. tibordigana pushed a commit to branch SUREFIRE-1617 in repository https://gitbox.apache.org/repos/asf/maven-surefire.git
commit d893d1b325776808e6ea648c9284d18a2c5a183b Author: tibordigana <tibordig...@apache.org> AuthorDate: Sun Apr 7 23:06:45 2019 +0200 [SUREFIRE-1617] Surefire fails with bad message when path contains whitespaces and colon --- .../booterclient/JarManifestForkConfiguration.java | 34 ++++++++++++++++++- .../JarManifestForkConfigurationTest.java | 38 ++++++++++++++++++++-- 2 files changed, 69 insertions(+), 3 deletions(-) diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/JarManifestForkConfiguration.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/JarManifestForkConfiguration.java index 62fa4c1..12407ac 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/JarManifestForkConfiguration.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/JarManifestForkConfiguration.java @@ -31,8 +31,10 @@ import javax.annotation.Nullable; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; +import java.net.URLEncoder; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Iterator; @@ -215,8 +217,38 @@ public final class JarManifestForkConfiguration ClasspathElementUri( URI uri ) { - this.uri = uri.toASCIIString(); + this.uri = escapeUri( uri.toASCIIString() ); absolute = false; } } + + @SuppressWarnings( "checkstyle:magicnumber" ) + static String escapeUri( String input ) + { + StringBuilder b = new StringBuilder( input.length() ); + for ( int i = 0; i < input.length(); i++ ) + { + char c = input.charAt( i ); + if ( c == ' ' ) + { + b.append( "%20" ); + } + else if ( c == '%' || c == '/' || c == '\\' ) + { + b.append( c ); + } + else + { + try + { + b.append( URLEncoder.encode( String.valueOf( c ), "UTF-8" ) ); + } + catch ( UnsupportedEncodingException e ) + { + b.append( c ); + } + } + } + return b.toString(); + } } diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/JarManifestForkConfigurationTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/JarManifestForkConfigurationTest.java index 5e71238..7f9dbd9 100644 --- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/JarManifestForkConfigurationTest.java +++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/JarManifestForkConfigurationTest.java @@ -30,6 +30,7 @@ import org.apache.maven.plugin.surefire.booterclient.output.InPluginProcessDumpS import static org.apache.maven.plugin.surefire.booterclient.JarManifestForkConfiguration.relativize; import static org.apache.maven.plugin.surefire.booterclient.JarManifestForkConfiguration.toAbsoluteUri; import static org.apache.maven.plugin.surefire.booterclient.JarManifestForkConfiguration.toClasspathElementUri; +import static org.apache.maven.plugin.surefire.booterclient.JarManifestForkConfiguration.escapeUri; import static org.fest.assertions.Assertions.assertThat; import org.junit.AfterClass; @@ -40,6 +41,7 @@ import org.junit.runner.RunWith; import static org.fest.util.Files.delete; import static org.fest.util.Files.newTemporaryFolder; import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.same; import static org.powermock.api.mockito.PowerMockito.mock; import static org.powermock.api.mockito.PowerMockito.mockStatic; @@ -88,6 +90,8 @@ public class JarManifestForkConfigurationTest .thenReturn( "../../../.m2/repository/grp/art/1.0/art-1.0.jar" ); when( toClasspathElementUri( same( parent ), same( classPathElement ), same( dumpDirectory ), anyBoolean() ) ) .thenCallRealMethod(); + when( escapeUri( anyString() ) ) + .thenCallRealMethod(); assertThat( toClasspathElementUri( parent, classPathElement, dumpDirectory, true ).uri ) .isEqualTo( "../../../.m2/repository/grp/art/1.0/art-1.0.jar" ); } @@ -105,6 +109,8 @@ public class JarManifestForkConfigurationTest .thenReturn( "../../../../../the Maven repo/grp/art/1.0/art-1.0.jar" ); when( toClasspathElementUri( same( parent ), same( classPathElement ), same( dumpDirectory ), anyBoolean() ) ) .thenCallRealMethod(); + when( escapeUri( anyString() ) ) + .thenCallRealMethod(); assertThat( toClasspathElementUri( parent, classPathElement, dumpDirectory, true ).uri ) .isEqualTo( "../../../../../the%20Maven%20repo/grp/art/1.0/art-1.0.jar" ); } @@ -122,6 +128,8 @@ public class JarManifestForkConfigurationTest .thenReturn( "..\\..\\..\\Users\\me\\.m2\\repository\\grp\\art\\1.0\\art-1.0.jar" ); when( toClasspathElementUri( same( parent ), same( classPathElement ), same( dumpDirectory ), anyBoolean() ) ) .thenCallRealMethod(); + when( escapeUri( anyString() ) ) + .thenCallRealMethod(); assertThat( toClasspathElementUri( parent, classPathElement, dumpDirectory, true ).uri ) .isEqualTo( "../../../Users/me/.m2/repository/grp/art/1.0/art-1.0.jar" ); } @@ -134,11 +142,14 @@ public class JarManifestForkConfigurationTest Path parent = mock( Path.class ); when( parent.toString() ).thenReturn( "C:\\Windows\\Temp\\surefire" ); Path classPathElement = mock( Path.class ); - when( classPathElement.toString() ).thenReturn( "C:\\Test User\\me\\.m2\\repository\\grp\\art\\1.0\\art-1.0.jar" ); + when( classPathElement.toString() ) + .thenReturn("C:\\Test User\\me\\.m2\\repository\\grp\\art\\1.0\\art-1.0.jar"); when( relativize( parent, classPathElement ) ) .thenReturn( "..\\..\\..\\Test User\\me\\.m2\\repository\\grp\\art\\1.0\\art-1.0.jar" ); when( toClasspathElementUri( same( parent ), same( classPathElement ), same( dumpDirectory ), anyBoolean() ) ) .thenCallRealMethod(); + when( escapeUri( anyString() ) ) + .thenCallRealMethod(); assertThat( toClasspathElementUri( parent, classPathElement, dumpDirectory, true ).uri ) .isEqualTo( "../../../Test%20User/me/.m2/repository/grp/art/1.0/art-1.0.jar" ); } @@ -168,6 +179,8 @@ public class JarManifestForkConfigurationTest .thenThrow( new IllegalArgumentException() ); when( toClasspathElementUri( same( parent ), same( classPathElement ), same( dumpDirectory ), anyBoolean() ) ) .thenCallRealMethod(); + when( escapeUri( anyString() ) ) + .thenCallRealMethod(); when( toAbsoluteUri( same( classPathElement ) ) ) .thenCallRealMethod(); assertThat( toClasspathElementUri( parent, classPathElement, dumpDirectory, true ).uri ) @@ -175,6 +188,27 @@ public class JarManifestForkConfigurationTest } @Test + public void shouldEscapeUri() + { + assertThat( JarManifestForkConfiguration.escapeUri( "a" ) ).isEqualTo( "a" ); + assertThat( JarManifestForkConfiguration.escapeUri( " " ) ).isEqualTo( "%20" ); + assertThat( JarManifestForkConfiguration.escapeUri( "%" ) ).isEqualTo( "%" ); + assertThat( JarManifestForkConfiguration.escapeUri( "," ) ).isEqualTo( "%2C" ); + assertThat( JarManifestForkConfiguration.escapeUri( "/" ) ).isEqualTo( "/" ); + assertThat( JarManifestForkConfiguration.escapeUri( "7" ) ).isEqualTo( "7" ); + assertThat( JarManifestForkConfiguration.escapeUri( ":" ) ).isEqualTo( "%3A" ); + assertThat( JarManifestForkConfiguration.escapeUri( "@" ) ).isEqualTo( "%40" ); + assertThat( JarManifestForkConfiguration.escapeUri( "A" ) ).isEqualTo( "A" ); + assertThat( JarManifestForkConfiguration.escapeUri( "[" ) ).isEqualTo( "%5B" ); + assertThat( JarManifestForkConfiguration.escapeUri( "\\" ) ).isEqualTo( "\\" ); + assertThat( JarManifestForkConfiguration.escapeUri( "]" ) ).isEqualTo( "%5D" ); + assertThat( JarManifestForkConfiguration.escapeUri( "`" ) ).isEqualTo( "%60" ); + assertThat( JarManifestForkConfiguration.escapeUri( "a" ) ).isEqualTo( "a" ); + assertThat( JarManifestForkConfiguration.escapeUri( "{" ) ).isEqualTo( "%7B" ); + assertThat( JarManifestForkConfiguration.escapeUri( "" + (char) 0xFF ) ).isEqualTo( "%C3%BF" ); + } + + @Test public void shouldRelativizeOnRealPlatform() { Path parentDir = new File( TMP, "test-parent-1" ) @@ -218,6 +252,6 @@ public class JarManifestForkConfigurationTest ClasspathElementUri testDirUriPath = toClasspathElementUri( parentDir, testDir, dumpDirectory, true ); assertThat( testDirUriPath.uri ) - .isEqualTo( "../@3%20test%20with%20white%20spaces" ); + .isEqualTo( "../%403%20test%20with%20white%20spaces" ); } }