code: package com.beijunyi.parallelgit.filesystem.io;
  
  import java.io.IOException;
  import java.nio.file.attribute.BasicFileAttributes;
  import java.nio.file.attribute.FileTime;
  import javax.annotation.Nonnull;
  
  import com.beijunyi.parallelgit.filesystem.AbstractGitFileSystemTest;
  import org.junit.Before;
  import org.junit.Test;
  
  import static java.nio.file.Files.readAttributes;
  import static org.eclipse.jgit.lib.Constants.encodeASCII;
  import static org.eclipse.jgit.lib.FileMode.*;
  import static org.junit.Assert.*;
  
  public class BasicFileAttributesTest extends AbstractGitFileSystemTest {
  
    @Before
    public void setUp() throws IOException {
      initRepository();
    }
  
    @Test
    public void getSize_shouldReturnTheFileSize() throws IOException {
      byte[] data = encodeASCII("13 bytes data");
      writeToCache("/file.txt", data);
      commitToMaster();
      initGitFileSystem();
  
      BasicFileAttributes attributes = readPosixAttributes("/file.txt");
      assertEquals(13L, attributes.size());
    }
  
    @Test
    public void getSizeAttributeOfDirectory_shouldReturnZero() throws IOException {
      writeToCache("/dir/file.txt");
      commitToMaster();
      initGitFileSystem();
  
      BasicFileAttributes attributes = readPosixAttributes("/dir");
      assertEquals(0L, attributes.size());
    }
  
    @Test
    public void getCreationTimeAttributeOfFile_shouldReturnEpoch() throws IOException {
      writeToCache("/file.txt");
      commitToMaster();
      initGitFileSystem();
  
      BasicFileAttributes attributes = readPosixAttributes("/file.txt");
      assertEquals(FileTime.fromMillis(0), attributes.creationTime());
    }
  
    @Test
    public void getLastAccessTimeAttributeOfFile_shouldReturnEpoch() throws IOException {
      writeToCache("/file.txt");
      commitToMaster();
      initGitFileSystem();
  
      BasicFileAttributes attributes = readPosixAttributes("/file.txt");
      assertEquals(FileTime.fromMillis(0), attributes.lastAccessTime());
    }
  
    @Test
    public void getLastModifiedTimeAttributeOfFile_shouldReturnEpoch() throws IOException {
      writeToCache("/file.txt");
      commitToMaster();
      initGitFileSystem();
  
      BasicFileAttributes attributes = readPosixAttributes("/file.txt");
      assertEquals(FileTime.fromMillis(0), attributes.lastModifiedTime());
    }
  
    @Test
    public void getFileKeyAttributeOfFile_shouldReturnNull() throws IOException {
      writeToCache("/file.txt");
      commitToMaster();
      initGitFileSystem();
  
      BasicFileAttributes attributes = readPosixAttributes("/file.txt");
      assertNull(attributes.fileKey());
    }
  
    @Test
    public void getIsDirectoryAttributeOfFile_shouldReturnFalse() throws IOException {
      writeToCache("/file.txt");
      commitToMaster();
      initGitFileSystem();
  
      BasicFileAttributes attributes = readPosixAttributes("/file.txt");
      assertEquals(false, attributes.isDirectory());
    }
  
    @Test
    public void getIsDirectoryAttributeOfDirectory_shouldReturnTrue() throws IOException {
      writeToCache("/dir/file.txt");
      commitToMaster();
      initGitFileSystem();
  
      BasicFileAttributes attributes = readPosixAttributes("/dir");
      assertEquals(true, attributes.isDirectory());
    }
  
    @Test
    public void getIsRegularFileAttributeOfFile_shouldReturnTrue() throws IOException {
      writeToCache("/file.txt");
      commitToMaster();
      initGitFileSystem();
  
      BasicFileAttributes attributes = readPosixAttributes("/file.txt");
      assertEquals(true, attributes.isRegularFile());
    }
  
    @Test
    public void getIsRegularFileAttributeOfExecutableFile_shouldReturnTrue() throws IOException {
      writeToCache("/file.txt", someBytes(), EXECUTABLE_FILE);
      commitToMaster();
      initGitFileSystem();
  
      BasicFileAttributes attributes = readPosixAttributes("/file.txt");
      assertEquals(true, attributes.isRegularFile());
    }
  
    @Test
    public void getIsRegularFileAttributeOfDirectory_shouldReturnFalse() throws IOException {
      writeToCache("/dir/file.txt");
      commitToMaster();
      initGitFileSystem();
  
      BasicFileAttributes attributes = provider.readAttributes(gfs.getPath("/dir"), BasicFileAttributes.class);
      assertEquals(false, attributes.isRegularFile());
    }
  
    @Test
    public void getIsSymbolicLinkAttributeOfFile_shouldReturnFalse() throws IOException {
      writeToCache("/file.txt");
      commitToMaster();
      initGitFileSystem();
  
      BasicFileAttributes attributes = readPosixAttributes("/file.txt");
      assertEquals(false, attributes.isSymbolicLink());
    }
  
    @Test
    public void getIsSymbolicLinkAttributeOfSymbolicLink_shouldReturnTrue() throws IOException {
      writeToCache("/file.txt", someBytes(), SYMLINK);
      commitToMaster();
      initGitFileSystem();
  
      BasicFileAttributes attributes = readPosixAttributes("/file.txt");
      assertEquals(true, attributes.isSymbolicLink());
    }
  
    @Test
    public void getIsOtherAttributeOfFile_shouldReturnFalse() throws IOException {
      writeToCache("/file.txt");
      commitToMaster();
      initGitFileSystem();
  
      BasicFileAttributes attributes = readPosixAttributes("/file.txt");
      assertEquals(false, attributes.isOther());
    }
  
    @Nonnull
    private BasicFileAttributes readPosixAttributes(String path) throws IOException {
      return readAttributes(gfs.getPath(path), BasicFileAttributes.class);
    }
    
  }
  