package com.github.marschall.memoryfilesystem; import static java.nio.file.StandardOpenOption.READ; import static java.nio.file.StandardOpenOption.WRITE; import static java.nio.file.attribute.PosixFilePermission.OWNER_READ; import static java.nio.file.attribute.PosixFilePermission.OWNER_WRITE; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.fail; import java.io.IOException; import java.nio.channels.ByteChannel; import java.nio.file.FileSystem; import java.nio.file.FileSystemException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.nio.file.attribute.PosixFileAttributeView; import java.nio.file.attribute.PosixFileAttributes; import java.nio.file.attribute.PosixFilePermission; import java.nio.file.attribute.UserPrincipal; import java.util.Arrays; import java.util.EnumSet; import java.util.HashSet; import java.util.Set; import org.junit.Rule; import org.junit.Test; public class PosixMemoryFileSystemTest { @Rule public final PosixFileSystemRule rule = new PosixFileSystemRule(); @Test public void defaultAttributes() throws IOException { FileSystem fileSystem = this.rule.getFileSystem(); Path file = fileSystem.getPath("file.txt"); Files.createFile(file); PosixFileAttributeView sourcePosixFileAttributeView = Files.getFileAttributeView(file, PosixFileAttributeView.class); PosixFileAttributes sourcePosixAttributes = sourcePosixFileAttributeView.readAttributes(); assertNotNull("permissions", sourcePosixAttributes.permissions()); assertNotNull("owner", sourcePosixAttributes.owner()); assertNotNull("group", sourcePosixAttributes.group()); } @Test public void getOwner() throws IOException { FileSystem fileSystem = this.rule.getFileSystem(); UserPrincipal owner = Files.getOwner(fileSystem.getPath("/")); assertNotNull(owner); } @Test public void supportedFileAttributeViews() throws IOException { FileSystem fileSystem = this.rule.getFileSystem(); Set<String> actual = fileSystem.supportedFileAttributeViews(); Set<String> expected = new HashSet<>(Arrays.asList("basic", "owner", "posix")); assertEquals(expected, actual); } @Test public void copyAttributes() throws IOException { FileSystem fileSystem = this.rule.getFileSystem(); Path source = fileSystem.getPath("source.txt"); Path target = fileSystem.getPath("target.txt"); Files.createFile(source); PosixFileAttributeView sourcePosixFileAttributeView = Files.getFileAttributeView(source, PosixFileAttributeView.class); EnumSet<PosixFilePermission> permissions = EnumSet.of(OWNER_READ, OWNER_WRITE); sourcePosixFileAttributeView.setPermissions(permissions); Files.copy(source, target, StandardCopyOption.COPY_ATTRIBUTES); PosixFileAttributeView targetPosixFileAttributeView = Files.getFileAttributeView(target, PosixFileAttributeView.class); PosixFileAttributes targetPosixAttributes = targetPosixFileAttributeView.readAttributes(); assertEquals(permissions, targetPosixAttributes.permissions()); assertNotSame(permissions, targetPosixAttributes.permissions()); } @Test public void dontCopyAttributes() throws IOException { FileSystem fileSystem = this.rule.getFileSystem(); Path source = fileSystem.getPath("source.txt"); Path target = fileSystem.getPath("target.txt"); Files.createFile(source); PosixFileAttributeView sourcePosixFileAttributeView = Files.getFileAttributeView(source, PosixFileAttributeView.class); EnumSet<PosixFilePermission> permissions = EnumSet.of(OWNER_READ, OWNER_WRITE); sourcePosixFileAttributeView.setPermissions(permissions); Files.copy(source, target); PosixFileAttributeView targetPosixFileAttributeView = Files.getFileAttributeView(target, PosixFileAttributeView.class); PosixFileAttributes targetPosixAttributes = targetPosixFileAttributeView.readAttributes(); assertNotEquals(permissions, targetPosixAttributes.permissions()); } // https://bugs.openjdk.java.net/browse/JDK-8066915 @Test public void jdk8066915() throws IOException { FileSystem fileSystem = this.rule.getFileSystem(); Path directory = fileSystem.getPath("directory"); directory = Files.createDirectory(directory); try (ByteChannel channel = Files.newByteChannel(directory)) { fail("should not be able to create channel on directory"); } catch (FileSystemException e) { // should reach here assertEquals("file", directory.toAbsolutePath().toString(), e.getFile()); } try (ByteChannel channel = Files.newByteChannel(directory, READ)) { fail("should not be able to create channel on directory"); } catch (FileSystemException e) { // should reach here assertEquals("file", directory.toAbsolutePath().toString(), e.getFile()); } try (ByteChannel channel = Files.newByteChannel(directory, WRITE)) { fail("should not be able to create channel on directory"); } catch (FileSystemException e) { // should reach here assertEquals("file", directory.toAbsolutePath().toString(), e.getFile()); } } }