Skip to content

Commit 8d5fa59

Browse files
committed
Make HierarchicalOutputDirectoryProvider more strict
1 parent 875799d commit 8d5fa59

File tree

2 files changed

+12
-20
lines changed

2 files changed

+12
-20
lines changed

junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/HierarchicalOutputDirectoryProvider.java

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,27 +10,28 @@
1010

1111
package org.junit.platform.launcher.core;
1212

13-
import static java.util.Collections.unmodifiableSet;
14-
1513
import java.io.IOException;
1614
import java.nio.file.Files;
1715
import java.nio.file.Path;
1816
import java.nio.file.Paths;
19-
import java.util.Arrays;
20-
import java.util.HashSet;
2117
import java.util.List;
22-
import java.util.Set;
2318
import java.util.function.Supplier;
19+
import java.util.regex.Pattern;
2420

2521
import org.junit.platform.engine.TestDescriptor;
2622
import org.junit.platform.engine.UniqueId.Segment;
2723
import org.junit.platform.engine.reporting.OutputDirectoryProvider;
2824

25+
/**
26+
* Hierarchical {@link OutputDirectoryProvider} that creates directories based on
27+
* the unique ID segments of a {@link TestDescriptor}.
28+
*
29+
* @since 1.12
30+
*/
2931
class HierarchicalOutputDirectoryProvider implements OutputDirectoryProvider {
3032

31-
private static final Set<Character> FORBIDDEN_CHARS = unmodifiableSet(
32-
new HashSet<>(Arrays.asList('\0', '/', '\\', ':', '*', '?', '"', '<', '>', '|')));
33-
private static final char REPLACEMENT = '_';
33+
private static final Pattern FORBIDDEN_CHARS = Pattern.compile("[^a-z0-9.,_\\-() ]", Pattern.CASE_INSENSITIVE);
34+
private static final String REPLACEMENT = "_";
3435

3536
private final Supplier<Path> rootDirSupplier;
3637
private volatile Path rootDir;
@@ -62,15 +63,6 @@ private static Path toSanitizedPath(Segment segment) {
6263
}
6364

6465
private static String sanitizeName(String value) {
65-
StringBuilder result = new StringBuilder(value.length());
66-
for (int i = 0; i < value.length(); i++) {
67-
char c = value.charAt(i);
68-
result.append(isForbiddenCharacter(c) ? REPLACEMENT : c);
69-
}
70-
return result.toString();
71-
}
72-
73-
private static boolean isForbiddenCharacter(char c) {
74-
return FORBIDDEN_CHARS.contains(c) || Character.isISOControl(c);
66+
return FORBIDDEN_CHARS.matcher(value).replaceAll(REPLACEMENT);
7567
}
7668
}

platform-tests/src/test/java/org/junit/platform/launcher/core/HierarchicalOutputDirectoryProviderTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,14 +70,14 @@ void createsSubDirectoriesBasedOnUniqueId() throws Exception {
7070

7171
@Test
7272
void replacesForbiddenCharacters() throws Exception {
73-
var uniqueId = UniqueId.forEngine("engine<>") //
73+
var uniqueId = UniqueId.forEngine("Engine<>") //
7474
.append("irrelevant", "*/abc");
7575
when(testDescriptor.getUniqueId()).thenReturn(uniqueId);
7676

7777
var outputDir = provider.createOutputDirectory(testDescriptor);
7878

7979
assertThat(outputDir) //
80-
.isEqualTo(tempDir.resolve(Path.of("engine__", "__abc"))) //
80+
.isEqualTo(tempDir.resolve(Path.of("Engine__", "__abc"))) //
8181
.exists();
8282
}
8383
}

0 commit comments

Comments
 (0)