package com.beijunyi.parallelgit.filesystem.io; import java.io.IOException; import java.nio.file.attribute.GroupPrincipal; import java.nio.file.attribute.PosixFilePermission; import java.nio.file.attribute.UserPrincipal; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import javax.annotation.Nonnull; import com.beijunyi.parallelgit.filesystem.AbstractGitFileSystemTest; import org.junit.Before; import org.junit.Test; import static com.beijunyi.parallelgit.filesystem.io.BasicFileAttributeViewTest.readAttribute; import static org.eclipse.jgit.lib.FileMode.EXECUTABLE_FILE; import static org.junit.Assert.*; public class PosixFileAttributeViewTest extends AbstractGitFileSystemTest { @Before public void setUp() throws IOException { initRepository(); } @Test public void getName_shouldReturnPosix() throws IOException { writeToCache("/file.txt"); commitToMaster(); initGitFileSystem(); GfsFileAttributeView.Posix view = provider.getFileAttributeView(gfs.getPath("/file.txt"), GfsFileAttributeView.Posix.class); assertNotNull(view); assertEquals("posix", view.name()); } @Test public void readAttributes_shouldReturnNotNull() throws IOException { writeToCache("/file.txt"); commitToMaster(); initGitFileSystem(); GfsFileAttributeView.Posix view = provider.getFileAttributeView(gfs.getPath("/file.txt"), GfsFileAttributeView.Posix.class); assertNotNull(view); assertNotNull(view.readAttributes()); } @Test public void getOwnerOfFile_shouldReturnNull() throws IOException { writeToCache("/file.txt"); commitToMaster(); initGitFileSystem(); GfsFileAttributeView.Posix view = provider.getFileAttributeView(gfs.getPath("/file.txt"), GfsFileAttributeView.Posix.class); assertNotNull(view); assertNull(view.getOwner()); } @Test(expected = UnsupportedOperationException.class) public void setOwnerOfFile_shouldThrowUnsupportedOperationException() throws IOException { writeToCache("/file.txt"); commitToMaster(); initGitFileSystem(); GfsFileAttributeView.Posix view = provider.getFileAttributeView(gfs.getPath("/file.txt"), GfsFileAttributeView.Posix.class); assertNotNull(view); view.setOwner(new UserPrincipal() { @Nonnull @Override public String getName() { return "some_owner"; } }); } @Test(expected = UnsupportedOperationException.class) public void setGroupOfFile_shouldThrowUnsupportedOperationException() throws IOException { writeToCache("/file.txt"); commitToMaster(); initGitFileSystem(); GfsFileAttributeView.Posix view = provider.getFileAttributeView(gfs.getPath("/file.txt"), GfsFileAttributeView.Posix.class); assertNotNull(view); view.setGroup(new GroupPrincipal() { @Nonnull @Override public String getName() { return "some_group"; } }); } @Test public void getPermissionOfFile_shouldReturnNotNull() throws IOException { writeToCache("/file.txt"); commitToMaster(); initGitFileSystem(); GfsFileAttributeView.Posix view = provider.getFileAttributeView(gfs.getPath("/file.txt"), GfsFileAttributeView.Posix.class); assertNotNull(view); assertNotNull(readAttribute(view, GfsFileAttributeView.Posix.PERMISSIONS_NAME)); } @Test public void getPermissionOfFile_shouldContainOwnerRead() throws IOException { writeToCache("/file.txt"); commitToMaster(); initGitFileSystem(); GfsFileAttributeView.Posix view = provider.getFileAttributeView(gfs.getPath("/file.txt"), GfsFileAttributeView.Posix.class); assertNotNull(view); Collection permissions = (Collection) readAttribute(view, GfsFileAttributeView.Posix.PERMISSIONS_NAME); assertNotNull(permissions); assertTrue(permissions.contains(PosixFilePermission.OWNER_READ)); } @Test public void getPermissionOfFile_shouldContainOwnerWrite() throws IOException { writeToCache("/file.txt"); commitToMaster(); initGitFileSystem(); GfsFileAttributeView.Posix view = provider.getFileAttributeView(gfs.getPath("/file.txt"), GfsFileAttributeView.Posix.class); assertNotNull(view); Collection permissions = (Collection) readAttribute(view, GfsFileAttributeView.Posix.PERMISSIONS_NAME); assertNotNull(permissions); assertTrue(permissions.contains(PosixFilePermission.OWNER_WRITE)); } @Test public void getPermissionOfFile_shouldNotContainOwnerExecute() throws IOException { writeToCache("/file.txt"); commitToMaster(); initGitFileSystem(); GfsFileAttributeView.Posix view = provider.getFileAttributeView(gfs.getPath("/file.txt"), GfsFileAttributeView.Posix.class); assertNotNull(view); Collection permissions = (Collection) readAttribute(view, GfsFileAttributeView.Posix.PERMISSIONS_NAME); assertNotNull(permissions); assertFalse(permissions.contains(PosixFilePermission.OWNER_EXECUTE)); } @Test public void getPermissionOfExecutableFile_shouldContainOwnerExecute() throws IOException { writeToCache("/file.txt", someBytes(), EXECUTABLE_FILE); commitToMaster(); initGitFileSystem(); GfsFileAttributeView.Posix view = provider.getFileAttributeView(gfs.getPath("/file.txt"), GfsFileAttributeView.Posix.class); assertNotNull(view); Collection permissions = (Collection) readAttribute(view, GfsFileAttributeView.Posix.PERMISSIONS_NAME); assertNotNull(permissions); assertTrue(permissions.contains(PosixFilePermission.OWNER_EXECUTE)); } @Test public void addExecutePermissionToFile_fileShouldBecomeExecutable() throws IOException { writeToCache("/file.txt"); commitToMaster(); initGitFileSystem(); GfsFileAttributeView.Posix view = provider.getFileAttributeView(gfs.getPath("/file.txt"), GfsFileAttributeView.Posix.class); assertNotNull(view); view.setPermissions(new HashSet<>(Arrays.asList(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE, PosixFilePermission.OWNER_EXECUTE))); } @Test public void getOwnerAttributeOfFile_shouldReturnNull() throws IOException { writeToCache("/file.txt"); commitToMaster(); initGitFileSystem(); GfsFileAttributeView.Posix view = provider.getFileAttributeView(gfs.getPath("/file.txt"), GfsFileAttributeView.Posix.class); assertNotNull(view); assertNull(readAttribute(view, GfsFileAttributeView.Posix.OWNER_NAME)); } @Test public void getGroupAttributeOfFile_shouldReturnNull() throws IOException { writeToCache("/file.txt"); commitToMaster(); initGitFileSystem(); GfsFileAttributeView.Posix view = provider.getFileAttributeView(gfs.getPath("/file.txt"), GfsFileAttributeView.Posix.class); assertNotNull(view); assertNull(readAttribute(view, GfsFileAttributeView.Posix.GROUP_NAME)); } @Test(expected = UnsupportedOperationException.class) public void getNonPosixAttributeOfFile_shouldThrowUnsupportedOperationException() throws IOException { writeToCache("/file.txt"); commitToMaster(); initGitFileSystem(); GfsFileAttributeView.Posix view = provider.getFileAttributeView(gfs.getPath("/file.txt"), GfsFileAttributeView.Posix.class); assertNotNull(view); readAttribute(view, "nonPosixAttribute"); } }