You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2023/04/19 11:49:30 UTC

[commons-io] branch master updated: [IO-790] Fix symbolic link file filter #450.

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-io.git


The following commit(s) were added to refs/heads/master by this push:
     new 5f64b1b7 [IO-790] Fix symbolic link file filter #450.
5f64b1b7 is described below

commit 5f64b1b7257ba069e57004c55495055294284263
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Wed Apr 19 07:49:25 2023 -0400

    [IO-790] Fix symbolic link file filter #450.
    
    Clean ups post PR merge
---
 src/changes/changes.xml                            |   5 +-
 .../io/filefilter/SymbolicLinkFileFilter.java      |   8 +-
 .../io/filefilter/SymbolicLinkFileFilterTest.java  | 124 ++++++++++-----------
 3 files changed, 70 insertions(+), 67 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index e0ebdafa..6c9edbbb 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -162,7 +162,7 @@ The <action> type attribute can be add,update,fix,remove.
         Fix misleading comments in FileFilterTest #334.
       </action>
       <action dev="ggregory" type="fix" due-to="Diego Marcilio">
-        Add missing javadoc for exceptions thrown for invalid arguments #339.
+        Add missing Javadoc for exceptions thrown for invalid arguments #339.
       </action>
       <action dev="ggregory" type="fix" due-to="richarda23">
         FileFilterTest minor fixes #340.
@@ -215,6 +215,9 @@ The <action> type attribute can be add,update,fix,remove.
       <action issue="IO-782" dev="ggregory" type="fix" due-to="Matteo Di Giovinazzo, Gary Gregory">
         SequenceReader should close readers when its close method is called #391.
       </action>
+      <action issue="IO-790" dev="ggregory" type="fix" due-to="Miguel Muñoz, Gary Gregory">
+        Fix symbolic link file filter #450.
+      </action>
       <!-- ADD -->
       <action type="add" dev="ggregory" due-to="Gary Gregory">
         Add GitHub coverage.yml.
diff --git a/src/main/java/org/apache/commons/io/filefilter/SymbolicLinkFileFilter.java b/src/main/java/org/apache/commons/io/filefilter/SymbolicLinkFileFilter.java
index b5a384f8..9463d27c 100644
--- a/src/main/java/org/apache/commons/io/filefilter/SymbolicLinkFileFilter.java
+++ b/src/main/java/org/apache/commons/io/filefilter/SymbolicLinkFileFilter.java
@@ -124,9 +124,11 @@ public class SymbolicLinkFileFilter extends AbstractFileFilter implements Serial
     }
 
     /**
-     * Package access, so the unit test may override to mock it. To
-     * facilitate unit testing, all calls to test if the file is a symbolic should go
-     * through this method. (See the unit test for why.)
+     * Delegates to {@link Files#isSymbolicLink(Path)} for testing.
+     * <p>
+     * Using package access for unit tests. To facilitate unit testing, all calls to test if the file is a symbolic should go through this method. (See the unit
+     * test for why.)
+     * </p>
      *
      * @param filePath The filePath to test
      * @return true if the file exists and is a symbolic link to either a file or directory, false otherwise.
diff --git a/src/test/java/org/apache/commons/io/filefilter/SymbolicLinkFileFilterTest.java b/src/test/java/org/apache/commons/io/filefilter/SymbolicLinkFileFilterTest.java
index cb66b8a1..380ad0cb 100644
--- a/src/test/java/org/apache/commons/io/filefilter/SymbolicLinkFileFilterTest.java
+++ b/src/test/java/org/apache/commons/io/filefilter/SymbolicLinkFileFilterTest.java
@@ -17,22 +17,23 @@
 
 package org.apache.commons.io.filefilter;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import java.io.File;
 import java.io.IOException;
 import java.nio.file.FileVisitResult;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.util.function.BiFunction;
 
 import org.apache.commons.io.file.PathUtils;
+import org.apache.commons.io.function.IOBiFunction;
+import org.apache.commons.lang3.SystemUtils;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
 /**
  * Tests {@link SymbolicLinkFileFilter}.
  */
@@ -44,41 +45,26 @@ public class SymbolicLinkFileFilterTest {
     public static final String DIRECTORY_NAME = "SLFF_TargetDirectory";
     public static final String DIRECTORY_LINK_NAME = "SLFF_LinkDirectory";
     public static final String MISSING = "Missing";
-    private static File testTargetFile;         // hard file
-    private static Path testTargetPath;         // hard file Path
-    private static File parentDirectoryFile;    // System Temp directory
-    private static File testLinkFile;           // symbolic link to hard file
-    private static String linkName;             // Name of link file
-    private static Path testLinkPath;           // symbolic link to hard file Path
-    private static File targetDirFile;          //
-    private static Path targetDirPath;          // hard directory Path
-    private static Path testLinkDirPath;        // symbolic link to hardDirectory
+
+    private static File testTargetFile; // hard file
+    private static Path testTargetPath; // hard file Path
+    private static File parentDirectoryFile; // System Temp directory
+    private static File testLinkFile; // symbolic link to hard file
+    private static String linkName; // Name of link file
+    private static Path testLinkPath; // symbolic link to hard file Path
+    private static File targetDirFile; //
+    private static Path targetDirPath; // hard directory Path
+    private static Path testLinkDirPath; // symbolic link to hardDirectory
     private static File testLinkDirFile;
-    private static File missingFile;            // non-existent file
+    private static File missingFile; // non-existent file
     private static SymbolicLinkFileFilter filter;
 
-    private static Path createRealSymbolicLink(Path link, Path target) {
-        try {
-            if (Files.exists(link)) {
-                Files.delete(link);
-            }
-            return Files.createSymbolicLink(link, target);
-        } catch (IOException e) {
-            throw new IllegalStateException("Failure to create Symbolic Link", e);
-        }
-    }
-
-    private static Path createMockSymbolicLink(Path lnk, Path tgt) {
-        try {
-            return Files.createFile(lnk);
-        } catch (IOException e) {
-            throw new IllegalStateException("Failure to create Symbolic Link", e);
-        }
-    }
-
     // Mock filter for testing on Windows.
     private static SymbolicLinkFileFilter createMockFilter() {
         return new SymbolicLinkFileFilter() {
+
+            private static final long serialVersionUID = 1L;
+
             @Override
             boolean isSymbolicLink(final Path filePath) {
                 return filePath.toFile().exists() && filePath.toString().contains("Link"); // Mock test
@@ -86,21 +72,42 @@ public class SymbolicLinkFileFilterTest {
         };
     }
 
+    private static Path createMockSymbolicLink(final Path link, final Path target) throws IOException {
+        return Files.createFile(link);
+    }
+
+    private static Path createRealSymbolicLink(final Path link, final Path target) throws IOException {
+        Files.deleteIfExists(link);
+        return Files.createSymbolicLink(link, target);
+    }
+
+    @AfterAll
+    static void tearDown() {
+        // Fortunately, delete() doesn't throw an exception if the file doesn't exist.
+        testLinkDirFile.delete();
+        targetDirFile.delete();
+        testLinkFile.delete();
+        testTargetFile.delete();
+    }
+
     /**
-     * <p>Unit test setup creates a hard file, a symbolic link to the hard file, a hard directory,
-     * and a symbolic link to that directory. All are created in the temp directory</p>
-     * <p>Unit test teardown deletes all four of these files.</p>
+     * <p>
+     * Unit test setup creates a hard file, a symbolic link to the hard file, a hard directory, and a symbolic link to that directory. All are created in the
+     * temp directory
+     * </p>
+     * <p>
+     * Unit test teardown deletes all four of these files.
+     * </p>
      *
      * @throws IOException If it fails to create the temporary files
      */
     @BeforeAll
     static void testSetup() throws IOException {
-        final BiFunction<Path, Path, Path> symbolicLinkCreator;
+        final IOBiFunction<Path, Path, Path> symbolicLinkCreator;
 
         // We can't create symbolic links on Windows without admin privileges,
         // so iff that's our OS, we mock them.
-        final String os = System.getProperty("os.name");
-        if (os.toLowerCase().contains("windows")) {
+        if (SystemUtils.IS_OS_WINDOWS) {
             symbolicLinkCreator = SymbolicLinkFileFilterTest::createMockSymbolicLink;
             filter = createMockFilter();
         } else {
@@ -123,18 +130,9 @@ public class SymbolicLinkFileFilterTest {
         missingFile = new File(parentDirectoryPath.toFile(), MISSING);
     }
 
-    @AfterAll
-    static void tearDown() {
-        // Fortunately, delete() doesn't throw an exception if the file doesn't exist.
-        testLinkDirFile.delete();
-        targetDirFile.delete();
-        testLinkFile.delete();
-        testTargetFile.delete();
-    }
-
     @Test
-    public void testSymbolicLinkFileFilter() {
-        assertEquals(FileVisitResult.TERMINATE, SymbolicLinkFileFilter.INSTANCE.accept(PathUtils.current(), null));
+    public void testFileFilter_HardDirectory() {
+        assertFalse(filter.accept(targetDirFile));
     }
 
     @Test
@@ -148,8 +146,8 @@ public class SymbolicLinkFileFilterTest {
     }
 
     @Test
-    public void testFileFilter_HardDirectory() {
-        assertFalse(filter.accept(targetDirFile));
+    public void testFileFilter_missingFile() {
+        assertFalse(filter.accept(missingFile));
     }
 
     @Test
@@ -158,8 +156,8 @@ public class SymbolicLinkFileFilterTest {
     }
 
     @Test
-    public void testFileFilter_missingFile() {
-        assertFalse(filter.accept(missingFile));
+    public void testFileNameFilter_HardDirectory() {
+        assertFalse(filter.accept(parentDirectoryFile, DIRECTORY_NAME));
     }
 
     @Test
@@ -173,8 +171,8 @@ public class SymbolicLinkFileFilterTest {
     }
 
     @Test
-    public void testFileNameFilter_HardDirectory() {
-        assertFalse(filter.accept(parentDirectoryFile, DIRECTORY_NAME));
+    public void testFileNameFilter_missingFile() {
+        assertFalse(filter.accept(parentDirectoryFile, MISSING));
     }
 
     @Test
@@ -183,8 +181,8 @@ public class SymbolicLinkFileFilterTest {
     }
 
     @Test
-    public void testFileNameFilter_missingFile() {
-        assertFalse(filter.accept(parentDirectoryFile, MISSING));
+    public void testPathFilter_HardDirectory() {
+        assertEquals(FileVisitResult.TERMINATE, filter.accept(targetDirPath, null));
     }
 
     @Test
@@ -198,8 +196,8 @@ public class SymbolicLinkFileFilterTest {
     }
 
     @Test
-    public void testPathFilter_HardDirectory() {
-        assertEquals(FileVisitResult.TERMINATE, filter.accept(targetDirPath, null));
+    public void testPathFilter_missingFile() {
+        assertEquals(FileVisitResult.TERMINATE, filter.accept(missingFile.toPath(), null));
     }
 
     @Test
@@ -208,7 +206,7 @@ public class SymbolicLinkFileFilterTest {
     }
 
     @Test
-    public void testPathFilter_missingFile() {
-        assertEquals(FileVisitResult.TERMINATE, filter.accept(missingFile.toPath(), null));
+    public void testSymbolicLinkFileFilter() {
+        assertEquals(FileVisitResult.TERMINATE, SymbolicLinkFileFilter.INSTANCE.accept(PathUtils.current(), null));
     }
 }