Merge pull request #12373 from anuragkumawat/JAVA-12359
JAVA-12359 Potential issue in Validate String as Filename in Java article
This commit is contained in:
commit
69d21288b9
@ -7,7 +7,7 @@ import java.util.Arrays;
|
|||||||
|
|
||||||
public class StringFilenameValidationUtils {
|
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 Character[] INVALID_UNIX_SPECIFIC_CHARS = {'\000'};
|
||||||
|
|
||||||
public static final String REGEX_PATTERN = "^[A-za-z0-9.]{1,255}$";
|
public static final String REGEX_PATTERN = "^[A-za-z0-9.]{1,255}$";
|
||||||
|
@ -2,6 +2,7 @@ package com.baeldung.stringfilenamevalidaiton;
|
|||||||
|
|
||||||
import org.apache.commons.lang3.RandomStringUtils;
|
import org.apache.commons.lang3.RandomStringUtils;
|
||||||
import org.apache.commons.lang3.RandomUtils;
|
import org.apache.commons.lang3.RandomUtils;
|
||||||
|
import org.assertj.core.api.InstanceOfAssertFactories;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.api.condition.EnabledOnOs;
|
import org.junit.jupiter.api.condition.EnabledOnOs;
|
||||||
import org.junit.jupiter.api.condition.OS;
|
import org.junit.jupiter.api.condition.OS;
|
||||||
@ -25,6 +26,9 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
|||||||
public class StringFilenameValidationUnitTest {
|
public class StringFilenameValidationUnitTest {
|
||||||
|
|
||||||
private static final String CORRECT_FILENAME_PATTERN = "baeldung.txt";
|
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
|
@ParameterizedTest
|
||||||
@MethodSource("correctAlphanumericFilenamesProvider")
|
@MethodSource("correctAlphanumericFilenamesProvider")
|
||||||
@ -79,18 +83,38 @@ public class StringFilenameValidationUnitTest {
|
|||||||
@ParameterizedTest
|
@ParameterizedTest
|
||||||
@EnabledOnOs(OS.WINDOWS)
|
@EnabledOnOs(OS.WINDOWS)
|
||||||
@MethodSource("filenamesWithInvalidWindowsChars")
|
@MethodSource("filenamesWithInvalidWindowsChars")
|
||||||
public void givenFilenameStringWithInvalidWindowsCharAndIsWindows_whenValidateUsingIO_thenRaiseException(String filename) {
|
public void givenFilenameStringWithInvalidWindowsCharAndIsWindows_whenValidateUsingIO_thenRaiseException(
|
||||||
assertThatThrownBy(() -> validateStringFilenameUsingIO(filename))
|
String filename) {
|
||||||
.isInstanceOf(IOException.class)
|
assertThatThrownBy(() -> validateStringFilenameUsingIO(filename)).isInstanceOf(IOException.class)
|
||||||
.hasMessageContaining("Invalid file path");
|
.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");
|
||||||
|
|
||||||
assertThatThrownBy(() -> validateStringFilenameUsingNIO2(filename))
|
assertThat(validateStringFilenameUsingContains(filename)).isFalse();
|
||||||
.isInstanceOf(InvalidPathException.class)
|
}
|
||||||
.hasMessage("character not allowed");
|
|
||||||
|
|
||||||
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
|
@ParameterizedTest
|
||||||
@EnabledOnOs({OS.LINUX, OS.MAC})
|
@EnabledOnOs({OS.LINUX, OS.MAC})
|
||||||
@MethodSource("filenamesWithInvalidUnixChars")
|
@MethodSource("filenamesWithInvalidUnixChars")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user