package com.beijunyi.parallelgit.filesystem.io;
import java.io.IOException;
import java.nio.file.Files;
import javax.annotation.Nonnull;
import com.beijunyi.parallelgit.filesystem.AbstractGitFileSystemTest;
import com.beijunyi.parallelgit.utils.BlobUtils;
import com.beijunyi.parallelgit.utils.TreeUtils;
import com.beijunyi.parallelgit.utils.io.GitFileEntry;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.TreeFormatter;
import org.junit.Before;
import org.junit.Test;
import static com.beijunyi.parallelgit.utils.io.GitFileEntry.*;
import static org.eclipse.jgit.lib.FileMode.REGULAR_FILE;
import static org.junit.Assert.*;
public class GfsChangesCollectorTest extends AbstractGitFileSystemTest {
private GfsChangesCollector changes;
@Before
public void setUp() {
changes = new GfsChangesCollector();
}
@Test
public void collectAndApplyInsertion_theNewFileShouldExistAfterTheOperation() throws IOException {
initGitFileSystem();
GitFileEntry entry = someFileEntry();
changes.addChange("/test_file.txt", entry);
changes.applyTo(gfs);
assertTrue(Files.isRegularFile(gfs.getPath("/test_file.txt")));
}
@Test
public void collectAndApplyMultipleInsertionsInDifferentDirectories_theNewFilesShouldExistAfterTheOperation() throws IOException {
initGitFileSystem("/dir/some_existing_file.txt");
GitFileEntry entry = someFileEntry();
changes.addChange("/test_file1.txt", entry);
changes.addChange("/dir/test_file2.txt", entry);
changes.applyTo(gfs);
assertTrue(Files.isRegularFile(gfs.getPath("/test_file1.txt")));
assertTrue(Files.isRegularFile(gfs.getPath("/dir/test_file2.txt")));
}
@Test
public void collectAndApplyDirectoryInsertion_theNewDirectoryShouldExistAfterTheOperation() throws IOException {
initGitFileSystem();
GitFileEntry entry = someDirectoryEntry();
changes.addChange("/test_dir", entry);
changes.applyTo(gfs);
assertTrue(Files.isDirectory(gfs.getPath("/test_dir")));
}
@Test
public void collectAndApplyFileDeletion_theFileShouldNotExistAfterTheOperation() throws IOException {
initGitFileSystem("/test_file.txt");
changes.addChange("/test_file.txt", deletion());
changes.applyTo(gfs);
assertFalse(Files.exists(gfs.getPath("/test_file.txt")));
}
@Test
public void collectAndApplyDirectoryDeletion_theDirectoryShouldNotExistAfterTheOperation() throws IOException {
initGitFileSystem("/test_dir/some_file.txt");
changes.addChange("/test_dir", deletion());
changes.applyTo(gfs);
assertFalse(Files.exists(gfs.getPath("/test_dir")));
}
@Test
public void collectAndApplyFileUpdate_theFileShouldHaveTheSpecifiedContentAfterTheOperation() throws IOException {
initGitFileSystem("/test_file.txt");
byte[] expected = someBytes();
changes.addChange("/test_file.txt", newFileEntry(expected));
changes.applyTo(gfs);
assertArrayEquals(expected, Files.readAllBytes(gfs.getPath("/test_file.txt")));
}
@Test
public void collectAndApplyDirectoryUpdate_theDirectoryShouldHaveTheSpecifiedChildrenAfterTheOperation() throws IOException {
initGitFileSystem("/test_dir/some_file.txt");
changes.addChange("/test_dir", newDirectoryEntry("child1.txt", "child2.txt"));
changes.applyTo(gfs);
assertTrue(Files.exists(gfs.getPath("/test_dir/child1.txt")));
assertTrue(Files.exists(gfs.getPath("/test_dir/child2.txt")));
}
@Test
public void collectAndApplyChangingFileToDirectory_theDirectoryShouldExistAfterTheOperation() throws IOException {
initGitFileSystem("/test_target");
changes.addChange("/test_target", newDirectoryEntry("child1.txt", "child2.txt"));
changes.applyTo(gfs);
assertTrue(Files.isDirectory(gfs.getPath("/test_target")));
}
@Test
public void collectAndApplyChangingDirectoryToFile_theFileShouldExistAfterTheOperation() throws IOException {
initGitFileSystem("/test_target/some_file.txt");
changes.addChange("/test_target", someFileEntry());
changes.applyTo(gfs);
assertTrue(Files.isRegularFile(gfs.getPath("/test_target")));
}
@Test
public void collectAndApplyFileBytesChange_theFileShouldExistAfterTheOperation() throws IOException {
initGitFileSystem();
changes.addChange("/test_file.txt", someBytes(), REGULAR_FILE);
changes.applyTo(gfs);
assertTrue(Files.exists(gfs.getPath("/test_file.txt")));
}
@Test
public void collectAndApplyFileBytesChange_theFileShouldHaveTheSpecifiedData() throws IOException {
initGitFileSystem();
byte[] expected = someBytes();
changes.addChange("/test_file.txt", expected, REGULAR_FILE);
changes.applyTo(gfs);
assertArrayEquals(expected, Files.readAllBytes(gfs.getPath("/test_file.txt")));
}
@Nonnull
private GitFileEntry newFileEntry(byte[] bytes) throws IOException {
ObjectId blobId = BlobUtils.insertBlob(bytes, repo);
return newEntry(blobId, REGULAR_FILE);
}
@Nonnull
private GitFileEntry someFileEntry() throws IOException {
return newFileEntry(someBytes());
}
@Nonnull
private GitFileEntry deletion() {
return missingEntry();
}
@Nonnull
private GitFileEntry newDirectoryEntry(String... children) throws IOException {
TreeFormatter tf = new TreeFormatter();
for(String child : children) {
GitFileEntry childEntry = someFileEntry();
tf.append(child, childEntry.getMode(), childEntry.getId());
}
ObjectId treeId = TreeUtils.insertTree(tf, repo);
return newTreeEntry(treeId);
}
@Nonnull
private GitFileEntry someDirectoryEntry() throws IOException {
return newDirectoryEntry(someFilename());
}
}