Skip to content

Commit 26e0858

Browse files
authored
Merge pull request eugenp#12373 from anuragkumawat/JAVA-12359
JAVA-12359 Potential issue in Validate String as Filename in Java article
2 parents 65f55d6 + 6c45e3c commit 26e0858

File tree

2 files changed

+36
-12
lines changed

2 files changed

+36
-12
lines changed

core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
public class StringFilenameValidationUtils {
99

10-
public static final Character[] INVALID_WINDOWS_SPECIFIC_CHARS = {'"', '*', ':', '<', '>', '?', '\\', '|', 0x7F};
10+
public static final Character[] INVALID_WINDOWS_SPECIFIC_CHARS = {'"', '*', '<', '>', '?', '|'};
1111
public static final Character[] INVALID_UNIX_SPECIFIC_CHARS = {'\000'};
1212

1313
public static final String REGEX_PATTERN = "^[A-za-z0-9.]{1,255}$";

core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.apache.commons.lang3.RandomStringUtils;
44
import org.apache.commons.lang3.RandomUtils;
5+
import org.assertj.core.api.InstanceOfAssertFactories;
56
import org.junit.jupiter.api.Test;
67
import org.junit.jupiter.api.condition.EnabledOnOs;
78
import org.junit.jupiter.api.condition.OS;
@@ -25,6 +26,9 @@
2526
public class StringFilenameValidationUnitTest {
2627

2728
private static final String CORRECT_FILENAME_PATTERN = "baeldung.txt";
29+
private static final String FILENAME_WITH_COLON = "bael:dung.txt";
30+
private static final String FILENAME_WITH_FORWARD_SLASH = "bael/dung.txt";
31+
private static final String FILENAME_WITH_BACKWARD_SLASH = "bael\\dung.txt";
2832

2933
@ParameterizedTest
3034
@MethodSource("correctAlphanumericFilenamesProvider")
@@ -79,18 +83,38 @@ public void givenFilenameStringWithInvalidWindowsCharAndIsUnix_whenValidateUsing
7983
@ParameterizedTest
8084
@EnabledOnOs(OS.WINDOWS)
8185
@MethodSource("filenamesWithInvalidWindowsChars")
82-
public void givenFilenameStringWithInvalidWindowsCharAndIsWindows_whenValidateUsingIO_thenRaiseException(String filename) {
83-
assertThatThrownBy(() -> validateStringFilenameUsingIO(filename))
84-
.isInstanceOf(IOException.class)
85-
.hasMessageContaining("Invalid file path");
86-
87-
assertThatThrownBy(() -> validateStringFilenameUsingNIO2(filename))
88-
.isInstanceOf(InvalidPathException.class)
89-
.hasMessage("character not allowed");
90-
91-
assertThat(validateStringFilenameUsingContains(filename)).isFalse();
92-
}
86+
public void givenFilenameStringWithInvalidWindowsCharAndIsWindows_whenValidateUsingIO_thenRaiseException(
87+
String filename) {
88+
assertThatThrownBy(() -> validateStringFilenameUsingIO(filename)).isInstanceOf(IOException.class)
89+
.extracting(Throwable::getMessage, InstanceOfAssertFactories.STRING)
90+
.containsAnyOf("The system cannot find the path specified",
91+
"The filename, directory name, or volume label syntax is incorrect");
92+
assertThatThrownBy(() -> validateStringFilenameUsingNIO2(filename)).isInstanceOf(InvalidPathException.class)
93+
.hasMessageContaining("Illegal char");
94+
95+
assertThat(validateStringFilenameUsingContains(filename)).isFalse();
96+
}
9397

98+
@Test
99+
@EnabledOnOs(OS.WINDOWS)
100+
public void givenFilenameStringWithInvalidColonWindowsCharAndIsWindows_thenNIO2FailsIOSucceed()
101+
throws IOException {
102+
assertThat(validateStringFilenameUsingIO(FILENAME_WITH_COLON)).isTrue();
103+
assertThatThrownBy(() -> validateStringFilenameUsingNIO2(FILENAME_WITH_COLON))
104+
.isInstanceOf(InvalidPathException.class).hasMessageContaining("Illegal char");
105+
}
106+
107+
@Test
108+
@EnabledOnOs(OS.WINDOWS)
109+
public void givenFilenameStringWithInvalidSlashWindowsCharAndIsWindows_thenIOFailsNIO2Succeed() {
110+
assertThatThrownBy(() -> validateStringFilenameUsingIO(FILENAME_WITH_FORWARD_SLASH))
111+
.isInstanceOf(IOException.class).hasMessageContaining("The system cannot find the path specified");
112+
assertThatThrownBy(() -> validateStringFilenameUsingIO(FILENAME_WITH_BACKWARD_SLASH))
113+
.isInstanceOf(IOException.class).hasMessageContaining("The system cannot find the path specified");
114+
assertThat(validateStringFilenameUsingNIO2(FILENAME_WITH_FORWARD_SLASH)).isTrue();
115+
assertThat(validateStringFilenameUsingNIO2(FILENAME_WITH_BACKWARD_SLASH)).isTrue();
116+
}
117+
94118
@ParameterizedTest
95119
@EnabledOnOs({OS.LINUX, OS.MAC})
96120
@MethodSource("filenamesWithInvalidUnixChars")

0 commit comments

Comments
 (0)