Skip to content

Commit 55ccd06

Browse files
robseidelmichael-o
authored andcommitted
[SUREFIRE-2211] additionalClasspathElement with UNC path not working with Maven Failsafe Plugin
This closes #689
1 parent aa864f4 commit 55ccd06

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/JarManifestForkConfiguration.java

+5
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,11 @@ static String relativize(@Nonnull Path parent, @Nonnull Path child) throws Illeg
179179
}
180180

181181
static String toAbsoluteUri(@Nonnull Path absolutePath) {
182+
// UNC paths need to be written as file:////
183+
// see https://bugs.openjdk.org/browse/JDK-8320760
184+
if (absolutePath.toString().startsWith("\\\\")) {
185+
return absolutePath.toFile().toURI().toASCIIString();
186+
}
182187
return absolutePath.toUri().toASCIIString();
183188
}
184189

maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/JarManifestForkConfigurationTest.java

+32
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,24 @@
3131
import org.junit.BeforeClass;
3232
import org.junit.Test;
3333
import org.junit.runner.RunWith;
34+
import org.junit.runners.JUnit4;
3435
import org.mockito.invocation.InvocationOnMock;
3536
import org.mockito.stubbing.Answer;
3637
import org.powermock.core.classloader.annotations.PowerMockIgnore;
3738
import org.powermock.core.classloader.annotations.PrepareForTest;
3839
import org.powermock.modules.junit4.PowerMockRunner;
40+
import org.powermock.modules.junit4.PowerMockRunnerDelegate;
3941

4042
import static java.nio.charset.StandardCharsets.UTF_8;
4143
import static org.apache.maven.plugin.surefire.booterclient.JarManifestForkConfiguration.escapeUri;
4244
import static org.apache.maven.plugin.surefire.booterclient.JarManifestForkConfiguration.relativize;
4345
import static org.apache.maven.plugin.surefire.booterclient.JarManifestForkConfiguration.toAbsoluteUri;
4446
import static org.apache.maven.plugin.surefire.booterclient.JarManifestForkConfiguration.toClasspathElementUri;
47+
import static org.apache.maven.surefire.shared.lang3.SystemUtils.IS_OS_WINDOWS;
4548
import static org.assertj.core.api.Assertions.assertThat;
4649
import static org.assertj.core.util.Files.delete;
4750
import static org.assertj.core.util.Files.newTemporaryFolder;
51+
import static org.junit.Assume.assumeTrue;
4852
import static org.mockito.ArgumentMatchers.any;
4953
import static org.mockito.ArgumentMatchers.anyBoolean;
5054
import static org.mockito.ArgumentMatchers.anyString;
@@ -57,6 +61,7 @@
5761
* Unit tests for {@link JarManifestForkConfiguration}.
5862
*/
5963
@RunWith(PowerMockRunner.class)
64+
@PowerMockRunnerDelegate(JUnit4.class)
6065
@PrepareForTest({JarManifestForkConfiguration.class, InPluginProcessDumpSingleton.class})
6166
@PowerMockIgnore({"org.jacoco.agent.rt.*", "com.vladium.emma.rt.*"})
6267
public class JarManifestForkConfigurationTest {
@@ -163,6 +168,33 @@ public URI answer(InvocationOnMock invocation) throws URISyntaxException {
163168
.isEqualTo("file:///X:/Users/me/.m2/repository/grp/art/1.0/art-1.0.jar");
164169
}
165170

171+
@Test
172+
public void uncWindows() throws Exception {
173+
assumeTrue(IS_OS_WINDOWS);
174+
mockStatic(JarManifestForkConfiguration.class);
175+
mockStatic(InPluginProcessDumpSingleton.class);
176+
when(InPluginProcessDumpSingleton.getSingleton()).thenReturn(mock(InPluginProcessDumpSingleton.class));
177+
Path parent = mock(Path.class);
178+
when(parent.toString()).thenReturn("C:\\Windows\\Temp\\surefire");
179+
Path classPathElement = mock(Path.class);
180+
when(classPathElement.toString()).thenReturn("\\\\server\\grp\\art\\1.0\\art-1.0.jar");
181+
when(classPathElement.toFile()).thenAnswer(new Answer<File>() {
182+
@Override
183+
public File answer(InvocationOnMock invocation) {
184+
String path = invocation.getMock().toString();
185+
return new File(path);
186+
}
187+
});
188+
when(relativize(same(parent), same(classPathElement)))
189+
.thenThrow(new IllegalArgumentException("'other' has different root"));
190+
when(toClasspathElementUri(same(parent), same(classPathElement), same(dumpDirectory), anyBoolean()))
191+
.thenCallRealMethod();
192+
when(escapeUri(anyString(), any(Charset.class))).thenCallRealMethod();
193+
when(toAbsoluteUri(same(classPathElement))).thenCallRealMethod();
194+
assertThat(toClasspathElementUri(parent, classPathElement, dumpDirectory, true).uri)
195+
.isEqualTo("file:////server/grp/art/1.0/art-1.0.jar");
196+
}
197+
166198
@Test
167199
@SuppressWarnings("checkstyle:magicnumber")
168200
public void shouldEscapeUri() throws Exception {

0 commit comments

Comments
 (0)