From d81428bab7e9c65d48b23cc863300485f0cd6859 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Fri, 17 Jun 2022 22:26:31 +0530 Subject: [PATCH 1/6] JAVA-12359 Potential issue in Validate String as Filename in Java article --- .../StringFilenameValidationUtils.java | 2 +- .../StringFilenameValidationUnitTest.java | 25 +++++++++++-------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUtils.java b/core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUtils.java index 1a86edd45a..c1af75eca1 100644 --- a/core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUtils.java +++ b/core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUtils.java @@ -7,7 +7,7 @@ import java.util.Arrays; public class StringFilenameValidationUtils { - public static final Character[] INVALID_WINDOWS_SPECIFIC_CHARS = {'"', '*', ':', '<', '>', '?', '\\', '|', 0x7F}; + public static final Character[] INVALID_WINDOWS_SPECIFIC_CHARS = {'"', '*', ':', '<', '>', '?', '\\', '|', '/'}; public static final Character[] INVALID_UNIX_SPECIFIC_CHARS = {'\000'}; public static final String REGEX_PATTERN = "^[A-za-z0-9.]{1,255}$"; diff --git a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java index 3e787f08be..04f6b83183 100644 --- a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java +++ b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java @@ -2,6 +2,7 @@ package com.baeldung.stringfilenamevalidaiton; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.RandomUtils; +import org.assertj.core.api.InstanceOfAssertFactories; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.condition.OS; @@ -79,17 +80,21 @@ public class StringFilenameValidationUnitTest { @ParameterizedTest @EnabledOnOs(OS.WINDOWS) @MethodSource("filenamesWithInvalidWindowsChars") - public void givenFilenameStringWithInvalidWindowsCharAndIsWindows_whenValidateUsingIO_thenRaiseException(String filename) { - assertThatThrownBy(() -> validateStringFilenameUsingIO(filename)) - .isInstanceOf(IOException.class) - .hasMessageContaining("Invalid file path"); + public void givenFilenameStringWithInvalidWindowsCharAndIsWindows_whenValidateUsingIO_thenRaiseException( + String filename) { + if (!filename.contains(":")) { + assertThatThrownBy(() -> validateStringFilenameUsingIO(filename)).isInstanceOf(IOException.class) + .extracting(Throwable::getMessage, InstanceOfAssertFactories.STRING) + .containsAnyOf("The system cannot find the path specifie", + "The filename, directory name, or volume label syntax is incorrect"); + if (!filename.contains("/") && !filename.contains("\\")) { + assertThatThrownBy(() -> validateStringFilenameUsingNIO2(filename)) + .isInstanceOf(InvalidPathException.class).hasMessageContaining("Illegal char"); + } + } - assertThatThrownBy(() -> validateStringFilenameUsingNIO2(filename)) - .isInstanceOf(InvalidPathException.class) - .hasMessage("character not allowed"); - - assertThat(validateStringFilenameUsingContains(filename)).isFalse(); - } + assertThat(validateStringFilenameUsingContains(filename)).isFalse(); + } @ParameterizedTest @EnabledOnOs({OS.LINUX, OS.MAC}) From 2181c452d310ca2a4f8243193a8112e091c83d22 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Fri, 17 Jun 2022 22:37:23 +0530 Subject: [PATCH 2/6] JAVA-12359 Fix jdk 9 and above build --- .../StringFilenameValidationUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java index 04f6b83183..b86aba3873 100644 --- a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java +++ b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java @@ -70,7 +70,7 @@ public class StringFilenameValidationUnitTest { @ParameterizedTest @EnabledOnOs({OS.LINUX, OS.MAC}) - @MethodSource("filenamesWithInvalidWindowsChars") + @MethodSource("filenamesWithInvalidUnixChars") public void givenFilenameStringWithInvalidWindowsCharAndIsUnix_whenValidateUsingIO_thenReturnTrue(String filename) throws IOException { assertThat(validateStringFilenameUsingIO(filename)).isTrue(); assertThat(validateStringFilenameUsingNIO2(filename)).isTrue(); From 8d7014cfc0aea674593ca2859be254e018e1f060 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sat, 18 Jun 2022 11:50:52 +0530 Subject: [PATCH 3/6] JAVA-12359 Trying to fix failing unix platform test --- .../stringfilenamevalidaiton/StringFilenameValidationUtils.java | 2 +- .../StringFilenameValidationUnitTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUtils.java b/core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUtils.java index c1af75eca1..f79d01e0c2 100644 --- a/core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUtils.java +++ b/core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUtils.java @@ -7,7 +7,7 @@ import java.util.Arrays; public class StringFilenameValidationUtils { - public static final Character[] INVALID_WINDOWS_SPECIFIC_CHARS = {'"', '*', ':', '<', '>', '?', '\\', '|', '/'}; + public static final Character[] INVALID_WINDOWS_SPECIFIC_CHARS = {'"', '*', ':', '<', '>', '?', '\\', '|'}; public static final Character[] INVALID_UNIX_SPECIFIC_CHARS = {'\000'}; public static final String REGEX_PATTERN = "^[A-za-z0-9.]{1,255}$"; diff --git a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java index b86aba3873..04f6b83183 100644 --- a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java +++ b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java @@ -70,7 +70,7 @@ public class StringFilenameValidationUnitTest { @ParameterizedTest @EnabledOnOs({OS.LINUX, OS.MAC}) - @MethodSource("filenamesWithInvalidUnixChars") + @MethodSource("filenamesWithInvalidWindowsChars") public void givenFilenameStringWithInvalidWindowsCharAndIsUnix_whenValidateUsingIO_thenReturnTrue(String filename) throws IOException { assertThat(validateStringFilenameUsingIO(filename)).isTrue(); assertThat(validateStringFilenameUsingNIO2(filename)).isTrue(); From ca3fe06a56944d052970da90e2554b72b94261e4 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Sat, 18 Jun 2022 11:56:32 +0530 Subject: [PATCH 4/6] JAVA-12359 Changes required in windows os test due to fix of unix os failing test --- .../StringFilenameValidationUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java index 04f6b83183..36b69c2094 100644 --- a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java +++ b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java @@ -87,7 +87,7 @@ public class StringFilenameValidationUnitTest { .extracting(Throwable::getMessage, InstanceOfAssertFactories.STRING) .containsAnyOf("The system cannot find the path specifie", "The filename, directory name, or volume label syntax is incorrect"); - if (!filename.contains("/") && !filename.contains("\\")) { + if (!filename.contains("\\")) { assertThatThrownBy(() -> validateStringFilenameUsingNIO2(filename)) .isInstanceOf(InvalidPathException.class).hasMessageContaining("Illegal char"); } From 675e33fbab993edaab5d45f7c22033a9bc8f67c4 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Mon, 20 Jun 2022 20:55:14 +0530 Subject: [PATCH 5/6] JAVA-12359 Code Review Changes --- .../StringFilenameValidationUtils.java | 2 +- .../StringFilenameValidationUnitTest.java | 16 ++++++---------- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUtils.java b/core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUtils.java index f79d01e0c2..6721d52d35 100644 --- a/core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUtils.java +++ b/core-java-modules/core-java-string-operations-3/src/main/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUtils.java @@ -7,7 +7,7 @@ import java.util.Arrays; public class StringFilenameValidationUtils { - public static final Character[] INVALID_WINDOWS_SPECIFIC_CHARS = {'"', '*', ':', '<', '>', '?', '\\', '|'}; + public static final Character[] INVALID_WINDOWS_SPECIFIC_CHARS = {'"', '*', '<', '>', '?', '|'}; public static final Character[] INVALID_UNIX_SPECIFIC_CHARS = {'\000'}; public static final String REGEX_PATTERN = "^[A-za-z0-9.]{1,255}$"; diff --git a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java index 36b69c2094..3e79458a7c 100644 --- a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java +++ b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java @@ -82,16 +82,12 @@ public class StringFilenameValidationUnitTest { @MethodSource("filenamesWithInvalidWindowsChars") public void givenFilenameStringWithInvalidWindowsCharAndIsWindows_whenValidateUsingIO_thenRaiseException( String filename) { - if (!filename.contains(":")) { - assertThatThrownBy(() -> validateStringFilenameUsingIO(filename)).isInstanceOf(IOException.class) - .extracting(Throwable::getMessage, InstanceOfAssertFactories.STRING) - .containsAnyOf("The system cannot find the path specifie", - "The filename, directory name, or volume label syntax is incorrect"); - if (!filename.contains("\\")) { - assertThatThrownBy(() -> validateStringFilenameUsingNIO2(filename)) - .isInstanceOf(InvalidPathException.class).hasMessageContaining("Illegal char"); - } - } + assertThatThrownBy(() -> validateStringFilenameUsingIO(filename)).isInstanceOf(IOException.class) + .extracting(Throwable::getMessage, InstanceOfAssertFactories.STRING) + .containsAnyOf("The system cannot find the path specified", + "The filename, directory name, or volume label syntax is incorrect"); + assertThatThrownBy(() -> validateStringFilenameUsingNIO2(filename)).isInstanceOf(InvalidPathException.class) + .hasMessageContaining("Illegal char"); assertThat(validateStringFilenameUsingContains(filename)).isFalse(); } From 08a2c27339c1554b180fab75a4df3cb20a8a5467 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Tue, 21 Jun 2022 22:25:12 +0530 Subject: [PATCH 6/6] JAVA-12359 Committing Test Cases for Colon and Slash Characters --- .../StringFilenameValidationUnitTest.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java index 3e79458a7c..62690a96ef 100644 --- a/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java +++ b/core-java-modules/core-java-string-operations-3/src/test/java/com/baeldung/stringfilenamevalidaiton/StringFilenameValidationUnitTest.java @@ -26,6 +26,9 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; public class StringFilenameValidationUnitTest { private static final String CORRECT_FILENAME_PATTERN = "baeldung.txt"; + private static final String FILENAME_WITH_COLON = "bael:dung.txt"; + private static final String FILENAME_WITH_FORWARD_SLASH = "bael/dung.txt"; + private static final String FILENAME_WITH_BACKWARD_SLASH = "bael\\dung.txt"; @ParameterizedTest @MethodSource("correctAlphanumericFilenamesProvider") @@ -92,6 +95,26 @@ public class StringFilenameValidationUnitTest { assertThat(validateStringFilenameUsingContains(filename)).isFalse(); } + @Test + @EnabledOnOs(OS.WINDOWS) + public void givenFilenameStringWithInvalidColonWindowsCharAndIsWindows_thenNIO2FailsIOSucceed() + throws IOException { + assertThat(validateStringFilenameUsingIO(FILENAME_WITH_COLON)).isTrue(); + assertThatThrownBy(() -> validateStringFilenameUsingNIO2(FILENAME_WITH_COLON)) + .isInstanceOf(InvalidPathException.class).hasMessageContaining("Illegal char"); + } + + @Test + @EnabledOnOs(OS.WINDOWS) + public void givenFilenameStringWithInvalidSlashWindowsCharAndIsWindows_thenIOFailsNIO2Succeed() { + assertThatThrownBy(() -> validateStringFilenameUsingIO(FILENAME_WITH_FORWARD_SLASH)) + .isInstanceOf(IOException.class).hasMessageContaining("The system cannot find the path specified"); + assertThatThrownBy(() -> validateStringFilenameUsingIO(FILENAME_WITH_BACKWARD_SLASH)) + .isInstanceOf(IOException.class).hasMessageContaining("The system cannot find the path specified"); + assertThat(validateStringFilenameUsingNIO2(FILENAME_WITH_FORWARD_SLASH)).isTrue(); + assertThat(validateStringFilenameUsingNIO2(FILENAME_WITH_BACKWARD_SLASH)).isTrue(); + } + @ParameterizedTest @EnabledOnOs({OS.LINUX, OS.MAC}) @MethodSource("filenamesWithInvalidUnixChars")