package usecases; import java.io.IOException; import java.nio.file.AccessDeniedException; import java.nio.file.Files; import java.nio.file.Path; import java.util.Random; import com.beijunyi.parallelgit.filesystem.AbstractGitFileSystemTest; import com.beijunyi.parallelgit.filesystem.GitPath; import com.beijunyi.parallelgit.utils.BlobUtils; import com.beijunyi.parallelgit.utils.CacheUtils; import com.beijunyi.parallelgit.utils.RepositoryUtils; import org.eclipse.jgit.dircache.DirCacheBuilder; import org.eclipse.jgit.lib.AnyObjectId; import org.eclipse.jgit.util.FileUtils; import org.junit.Test; import static com.beijunyi.parallelgit.utils.CacheUtils.addFile; import static java.nio.file.StandardOpenOption.APPEND; import static org.eclipse.jgit.lib.Constants.MASTER; import static org.eclipse.jgit.lib.FileMode.REGULAR_FILE; import static org.junit.Assert.*; public class FilesWriteTest extends AbstractGitFileSystemTest { @Test public void writeExistingFile_shouldOverwriteItsContent() throws IOException { initRepository(); writeToCache("/file.txt", "old content"); commitToMaster(); initGitFileSystem(); byte[] data =someBytes(); Path file = gfs.getPath("/file.txt"); Files.write(file, data); assertArrayEquals(data, Files.readAllBytes(file)); } @Test public void writeLargeFile_shouldWork() throws IOException { repoDir = FileUtils.createTempDir(getClass().getSimpleName(), null, null); repo = RepositoryUtils.createRepository(repoDir, true); DirCacheBuilder builder = CacheUtils.keepEverything(cache); byte[] largeData = new byte[50*1024*1024+1]; Random random = new Random(); random.nextBytes(largeData); AnyObjectId blobId = BlobUtils.insertBlob(largeData, repo); addFile("large.txt", REGULAR_FILE, blobId, builder); builder.finish(); commitToMaster(); initGitFileSystemForBranch(MASTER); byte[] data = someBytes(); Path file = gfs.getPath("/large.txt"); Files.write(file, data, APPEND); } @Test public void writeNonExistentFile_shouldCreateNewFile() throws IOException { initGitFileSystem(); GitPath file = gfs.getPath("/file.txt"); Files.write(file, someBytes()); assertTrue(Files.exists(file)); } @Test(expected = AccessDeniedException.class) public void writeDirectory_shouldThrowAccessDeniedException() throws IOException { initRepository(); writeToCache("/dir/file.txt"); commitToMaster(); initGitFileSystem(); GitPath dir = gfs.getPath("/dir"); Files.write(dir, someBytes()); } @Test(expected = AccessDeniedException.class) public void writeRoot_shouldThrowAccessDeniedException() throws IOException { initGitFileSystem(); Files.write(root, someBytes()); } }