|
2 | 2 |
|
3 | 3 | import org.apache.commons.lang3.RandomStringUtils; |
4 | 4 | import org.apache.commons.lang3.RandomUtils; |
| 5 | +import org.assertj.core.api.InstanceOfAssertFactories; |
5 | 6 | import org.junit.jupiter.api.Test; |
6 | 7 | import org.junit.jupiter.api.condition.EnabledOnOs; |
7 | 8 | import org.junit.jupiter.api.condition.OS; |
|
25 | 26 | public class StringFilenameValidationUnitTest { |
26 | 27 |
|
27 | 28 | 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"; |
28 | 32 |
|
29 | 33 | @ParameterizedTest |
30 | 34 | @MethodSource("correctAlphanumericFilenamesProvider") |
@@ -79,18 +83,38 @@ public void givenFilenameStringWithInvalidWindowsCharAndIsUnix_whenValidateUsing |
79 | 83 | @ParameterizedTest |
80 | 84 | @EnabledOnOs(OS.WINDOWS) |
81 | 85 | @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 | + } |
93 | 97 |
|
| 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 | + |
94 | 118 | @ParameterizedTest |
95 | 119 | @EnabledOnOs({OS.LINUX, OS.MAC}) |
96 | 120 | @MethodSource("filenamesWithInvalidUnixChars") |
|
0 commit comments