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");
}
}