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 8cb945a77 Add FileUtilsTest.testForceDeleteUnwritableDirectory()
8cb945a77 is described below

commit 8cb945a7736813b7b822400b4807545cbd3b8ed9
Author: Gary Gregory <garydgreg...@gmail.com>
AuthorDate: Sun Mar 24 19:05:36 2024 -0400

    Add FileUtilsTest.testForceDeleteUnwritableDirectory()
---
 .../java/org/apache/commons/io/FileUtilsTest.java  | 47 ++++++++++++++++++++++
 1 file changed, 47 insertions(+)

diff --git a/src/test/java/org/apache/commons/io/FileUtilsTest.java 
b/src/test/java/org/apache/commons/io/FileUtilsTest.java
index d3aa328f7..cc8ca3d17 100644
--- a/src/test/java/org/apache/commons/io/FileUtilsTest.java
+++ b/src/test/java/org/apache/commons/io/FileUtilsTest.java
@@ -1730,6 +1730,53 @@ public class FileUtilsTest extends AbstractTempDirTest {
         }
     }
 
+    /**
+     * TODO Passes on macOS, fails on Linux and Windows with 
AccessDeniedException.
+     */
+    @Test
+    @EnabledOnOs(value = OS.MAC)
+    public void testForceDeleteUnwritableDirectory() throws Exception {
+        try (TempDirectory destDir = TempDirectory.create("dir-");
+                TempFile file = TempFile.create(destDir, "test-", ".txt")) {
+            // sanity check structure
+            assertTrue(Files.isDirectory(destDir.get()));
+            assertEquals(destDir.get(), file.get().getParent());
+            // sanity check attributes
+            final File dir = destDir.toFile();
+            assertTrue(dir.canWrite());
+            // Windows: setWritable(false) returns false.
+            assertTrue(dir.setWritable(false), () -> "setWritable(false) on " 
+ dir);
+            assertFalse(dir.canWrite());
+            assertTrue(dir.canRead());
+            // sanity check that File.delete() cannot delete non-empty 
directories.
+            assertFalse(dir.delete());
+            // delete underlying file.
+            assertFalse(file.toFile().delete());
+            // reset attribute so we can delete file and auto-close/delete dir.
+            assertTrue(dir.setWritable(true));
+            assertTrue(file.toFile().delete());
+        }
+        try (TempDirectory destDir = TempDirectory.create("dir-");
+                TempFile file = TempFile.create(destDir, "test-", ".txt")) {
+            // sanity check structure
+            assertTrue(Files.isDirectory(destDir.get()));
+            assertEquals(destDir.get(), file.get().getParent());
+            // sanity check attributes
+            final File dir = destDir.toFile();
+            assertTrue(dir.canWrite());
+            assertTrue(dir.setWritable(false));
+            assertFalse(dir.canWrite());
+            assertTrue(dir.canRead());
+            // sanity check that File.delete() cannot delete non-empty 
directories.
+            assertFalse(dir.delete());
+            // test
+            // Linux: Fails with AccessDeniedException.
+            FileUtils.forceDelete(dir);
+            assertFalse(file.exists());
+            assertFalse(dir.exists());
+        }
+    }
+
     @Test
     public void testForceDeleteUnwritableFile() throws Exception {
         try (TempFile destination = TempFile.create("test-", ".txt")) {

Reply via email to