diff --git a/core/src/test/java/jenkins/util/io/PathRemoverTest.java b/core/src/test/java/jenkins/util/io/PathRemoverTest.java index 2ea2ebf5ee..4d176b49a1 100644 --- a/core/src/test/java/jenkins/util/io/PathRemoverTest.java +++ b/core/src/test/java/jenkins/util/io/PathRemoverTest.java @@ -34,7 +34,14 @@ import org.junit.rules.Timeout; import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.io.UncheckedIOException; import java.nio.file.Files; +import java.nio.file.NoSuchFileException; +import java.nio.file.Path; +import java.nio.file.attribute.PosixFileAttributes; +import java.nio.file.attribute.PosixFilePermission; +import java.util.Arrays; +import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; @@ -78,18 +85,35 @@ public class PathRemoverTest { @Test public void testForceRemoveFile_ReadOnly() throws IOException { - File dir = tmp.newFolder(); - File file = new File(dir, "file.tmp"); - touchWithFileName(file); - file.setWritable(false); - dir.setWritable(false); - assertFalse("Unable to make file read-only: " + file, Files.isWritable(file.toPath())); - assertFalse("Unable to make directory read-only: " + dir, Files.isWritable(dir.toPath())); + Path dir = Files.createTempDirectory("remover"); + Path file = dir.resolve("file.tmp"); + touchWithFileName(file.toFile()); + makeReadOnly(file); + makeReadOnly(dir); + assertFalse("Unable to make file read-only: " + file, Files.isWritable(file)); + assertFalse("Unable to make directory read-only: " + dir, Files.isWritable(dir)); PathRemover remover = PathRemover.newSimpleRemover(); - remover.forceRemoveFile(file.toPath()); + remover.forceRemoveFile(file); - assertFalse("Unable to delete file: " + file, file.exists()); + assertTrue("Unable to delete file: " + file, Files.notExists(file)); + } + + private static void makeReadOnly(Path path) { + try { + PosixFileAttributes attrs = Files.readAttributes(path, PosixFileAttributes.class); + Set permissions = attrs.permissions(); + permissions.removeAll(Arrays.asList(PosixFilePermission.OWNER_WRITE, PosixFilePermission.GROUP_WRITE, PosixFilePermission.OTHERS_WRITE)); + Files.setPosixFilePermissions(path, permissions); + } catch (NoSuchFileException ignored) { + return; + } catch (UnsupportedOperationException ignored) { + // retry with setWritable + } catch (IOException e) { + throw new UncheckedIOException(e); + } + // fallback method for filesystems that don't support POSIX attributes + path.toFile().setWritable(false); } @Test