package com.beijunyi.parallelgit.utils; import java.io.IOException; import javax.annotation.Nonnull; import com.beijunyi.parallelgit.AbstractParallelGitTest; import org.eclipse.jgit.dircache.DirCache; import org.eclipse.jgit.dircache.DirCacheBuilder; import org.eclipse.jgit.dircache.DirCacheEditor; import org.eclipse.jgit.lib.AnyObjectId; import org.eclipse.jgit.lib.FileMode; import org.eclipse.jgit.lib.ObjectId; import org.junit.Before; import org.junit.Test; import static org.eclipse.jgit.lib.FileMode.*; import static org.eclipse.jgit.lib.ObjectId.zeroId; import static org.junit.Assert.*; public class CacheUtilsEditTest extends AbstractParallelGitTest { @Nonnull private static DirCache setupCache(String... files) { DirCache cache = DirCache.newInCore(); DirCacheBuilder builder = cache.builder(); for(String file : files) CacheUtils.addFile(file, REGULAR_FILE, zeroId(), builder); builder.finish(); return cache; } @Before public void setUp() throws IOException { initRepository(); } @Test public void keepEverything_ExistingEntriesShouldBeKept() throws IOException { writeMultipleToCache("/file1.txt", "/file2.txt"); DirCacheBuilder builder = CacheUtils.keepEverything(cache); builder.finish(); assertNotNull(CacheUtils.getEntry("/file1.txt", cache)); assertNotNull(CacheUtils.getEntry("/file2.txt", cache)); } @Test public void addFile_theFileShouldExistInTheCacheAfterTheOperation() { CacheUtils.addFile("/test_file.txt", someObjectId(), cache); assertNotNull(CacheUtils.getEntry("/test_file.txt", cache)); } @Test public void addFile_theAddedFileShouldHaveTheSpecifiedObjectId() { AnyObjectId expected = someObjectId(); CacheUtils.addFile("/test_file.txt", expected, cache); assertEquals(expected, CacheUtils.getBlob("/test_file.txt", cache)); } @Test public void addFile_theAddedFileShouldHaveTheSpecifiedFileMode() { FileMode expected = EXECUTABLE_FILE; CacheUtils.addFile("/test_file.txt", expected, someObjectId(), cache); assertEquals(expected, CacheUtils.getFileMode("/test_file.txt", cache)); } @Test public void addFilesWithDirCacheBuilderTest() { DirCache cache = DirCache.newInCore(); DirCacheBuilder builder = cache.builder(); String[] files = new String[] {"a/b/c1.txt", "a/c2.txt", "a/c3.txt", "a/b/c4.txt"}; for(String file : files) CacheUtils.addFile(file, REGULAR_FILE, zeroId(), builder);builder.finish(); int entryCount = cache.getEntryCount(); assertEquals(4, entryCount); } @Test public void deleteFileTest() { DirCache cache = setupCache("a/b/c1.txt", "a/c2.txt", "a/c3.txt"); CacheUtils.deleteFile("non_existent_file", cache); assertEquals(3, cache.getEntryCount()); CacheUtils.deleteFile("a/b/c1.txt", cache); assertEquals(2, cache.getEntryCount()); CacheUtils.deleteFile("a/c2.txt", cache); assertEquals(1, cache.getEntryCount()); } @Test public void deleteFilesWithDirCacheEditorTest() { DirCache cache = setupCache("a/b/c1.txt", "a/b/c2.txt", "a/c3.txt", "a/c4.txt", "a/c5.txt", "a/c6.txt"); DirCacheEditor editor = cache.editor(); CacheUtils.deleteFile("a/b/c1.txt", editor); CacheUtils.deleteFile("a/c3.txt", editor); CacheUtils.deleteFile("a/c4.txt", editor); CacheUtils.deleteFile("a/c6.txt", editor); editor.finish(); assertEquals(2, cache.getEntryCount()); assertNull(cache.getEntry("a/b/c1.txt")); assertNotNull(cache.getEntry("a/b/c2.txt")); assertNotNull(cache.getEntry("a/c5.txt")); } @Test public void deleteTreeTest() { DirCache cache = setupCache("a/b/c1.txt", "a/b/c2.txt", "a/c3.txt", "a/c4.txt", "a/c5.txt", "a/c6.txt"); CacheUtils.deleteDirectory("a/b", cache); assertEquals(4, cache.getEntryCount()); assertNull(cache.getEntry("a/b/c1.txt")); assertNull(cache.getEntry("a/b/c2.txt")); assertNotNull(cache.getEntry("a/c3.txt")); assertNotNull(cache.getEntry("a/c4.txt")); assertNotNull(cache.getEntry("a/c5.txt")); assertNotNull(cache.getEntry("a/c6.txt")); } @Test public void deleteMultipleTreesTest() { DirCache cache = setupCache("a/b/c1.txt", "a/b/c2.txt", "a/d/c3.txt", "a/d/c4.txt", "a/c5.txt", "a/c6.txt"); DirCacheEditor editor = cache.editor(); CacheUtils.deleteDirectory("a/b", editor); CacheUtils.deleteDirectory("a/d", editor); editor.finish(); assertEquals(2, cache.getEntryCount()); assertNotNull(cache.getEntry("a/c5.txt")); assertNotNull(cache.getEntry("a/c6.txt")); } @Test public void updateFileBlob_theEntryBlobShouldEqualToTheInputBlobAfterTheOperation() throws IOException { writeToCache("/test_file.txt"); ObjectId expected = someObjectId(); CacheUtils.updateFileBlob("/test_file.txt", expected, cache); assertEquals(expected, CacheUtils.getBlob("/test_file.txt", cache)); } @Test public void updateFileMode_theEntryFileModeShouldEqualToTheInputFileModeAfterTheOperation() throws IOException { writeToCache("/test_file.txt"); CacheUtils.updateFileMode("/test_file.txt", EXECUTABLE_FILE, cache); assertEquals(EXECUTABLE_FILE, CacheUtils.getFileMode("/test_file.txt", cache)); } }