code: package com.beijunyi.parallelgit.filesystem;
  
  import java.io.IOException;
  import java.nio.file.AccessDeniedException;
  import java.nio.file.AccessMode;
  import java.nio.file.NoSuchFileException;
  
  import org.junit.Before;
  import org.junit.Test;
  
  import static org.eclipse.jgit.lib.FileMode.EXECUTABLE_FILE;
  
  public class GitFileSystemProviderCheckAccessTest extends AbstractGitFileSystemTest {
  
    @Before
    public void setupFileSystem() throws IOException {
      initRepository();
      writeToCache("dir/file.txt");
      writeToCache("dir/executable.sh", someBytes(), EXECUTABLE_FILE);
      commitToMaster();
      initGitFileSystem();
    }
  
    @Test
    public void fileCheckReadAccess() throws IOException {
      provider.checkAccess(gfs.getPath("/dir/file.txt"), AccessMode.READ);
    }
  
    @Test
    public void fileCheckWriteAccess() throws IOException {
      provider.checkAccess(gfs.getPath("/dir/file.txt"), AccessMode.WRITE);
    }
  
    @Test
    public void fileCheckReadWriteAccess() throws IOException {
      provider.checkAccess(gfs.getPath("/dir/file.txt"), AccessMode.READ, AccessMode.WRITE);
    }
  
    @Test(expected = AccessDeniedException.class)
    public void fileCheckExecuteAccess() throws IOException {
      provider.checkAccess(gfs.getPath("/dir/file.txt"), AccessMode.EXECUTE);
    }
  
    @Test
    public void executableFileCheckExecuteAccess() throws IOException {
      provider.checkAccess(gfs.getPath("/dir/executable.sh"), AccessMode.EXECUTE);
    }
  
    @Test
    public void directoryCheckReadAccess() throws IOException {
      provider.checkAccess(gfs.getPath("/dir"), AccessMode.READ);
    }
  
    @Test
    public void directoryCheckWriteAccess() throws IOException {
      provider.checkAccess(gfs.getPath("/dir"), AccessMode.WRITE);
    }
  
    @Test
    public void directoryCheckReadWriteAccess() throws IOException {
      provider.checkAccess(gfs.getPath("/dir"), AccessMode.READ, AccessMode.WRITE);
    }
  
    @Test(expected = AccessDeniedException.class)
    public void directoryCheckExecuteAccess() throws IOException {
      provider.checkAccess(gfs.getPath("/dir"), AccessMode.EXECUTE);
    }
  
    @Test
    public void rootCheckReadAccess() throws IOException {
      provider.checkAccess(gfs.getPath("/"), AccessMode.READ);
    }
  
    @Test
    public void rootCheckWriteAccess() throws IOException {
      provider.checkAccess(gfs.getPath("/"), AccessMode.WRITE);
    }
  
    @Test
    public void rootCheckReadWriteAccess() throws IOException {
      provider.checkAccess(gfs.getPath("/"), AccessMode.READ, AccessMode.WRITE);
    }
  
    @Test(expected = AccessDeniedException.class)
    public void rootCheckExecuteAccess() throws IOException {
      provider.checkAccess(gfs.getPath("/"), AccessMode.EXECUTE);
    }
  
    @Test(expected = NoSuchFileException.class)
    public void nonExistentFileCheckReadAccess() throws IOException {
      provider.checkAccess(gfs.getPath("/non_existent_file.txt"), AccessMode.READ);
    }
  
    @Test(expected = NoSuchFileException.class)
    public void nonExistentFileCheckWriteAccess() throws IOException {
      provider.checkAccess(gfs.getPath("/non_existent_file.txt"), AccessMode.WRITE);
    }
  
    @Test(expected = NoSuchFileException.class)
    public void nonExistentFileCheckReadWriteAccess() throws IOException {
      provider.checkAccess(gfs.getPath("/non_existent_file.txt"), AccessMode.READ, AccessMode.WRITE);
    }
  
    @Test(expected = NoSuchFileException.class)
    public void nonExistentFileCheckExecuteAccess() throws IOException {
      provider.checkAccess(gfs.getPath("/non_existent_file.txt"), AccessMode.EXECUTE);
    }
  
  }
  