James Moger
2012-10-11 8daefa09d99774639a355c0dfa2b989fa1007f5f
Created static repository close functions for unit testing and fixed Windows sharing violations
2 files modified
103 ■■■■ changed files
tests/com/gitblit/tests/GitBlitSuite.java 38 ●●●●● patch | view | raw | blame | history
tests/com/gitblit/tests/GitServletTest.java 65 ●●●●● patch | view | raw | blame | history
tests/com/gitblit/tests/GitBlitSuite.java
@@ -16,11 +16,17 @@
package com.gitblit.tests;
import java.io.File;
import java.lang.reflect.Field;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryCache;
import org.eclipse.jgit.lib.RepositoryCache.FileKey;
import org.eclipse.jgit.storage.file.FileRepository;
import org.eclipse.jgit.util.FS;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
@@ -189,4 +195,36 @@
            g.printStackTrace();
        }
    }
    public static void close(File repository) {
        try {
            File gitDir = FileKey.resolve(repository, FS.detect());
            if (gitDir != null && gitDir.exists()) {
                close(RepositoryCache.open(FileKey.exact(gitDir, FS.detect())));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void close(Git git) {
        close(git.getRepository());
    }
    public static void close(Repository r) {
        RepositoryCache.close(r);
        // assume 2 uses in case reflection fails
        int uses = 2;
        try {
            Field useCnt = Repository.class.getDeclaredField("useCnt");
            useCnt.setAccessible(true);
            uses = ((AtomicInteger) useCnt.get(r)).get();
        } catch (Exception e) {
            e.printStackTrace();
        }
        for (int i = 0; i < uses; i++) {
            r.close();
        }
    }
}
tests/com/gitblit/tests/GitServletTest.java
@@ -67,15 +67,19 @@
    
    public static void deleteWorkingFolders() throws Exception {
        if (ticgitFolder.exists()) {
            GitBlitSuite.close(ticgitFolder);
            FileUtils.delete(ticgitFolder, FileUtils.RECURSIVE);
        }
        if (ticgit2Folder.exists()) {
            GitBlitSuite.close(ticgit2Folder);
            FileUtils.delete(ticgit2Folder, FileUtils.RECURSIVE);
        }
        if (jgitFolder.exists()) {
            GitBlitSuite.close(jgitFolder);
            FileUtils.delete(jgitFolder, FileUtils.RECURSIVE);
        }
        if (jgit2Folder.exists()) {
            GitBlitSuite.close(jgit2Folder);
            FileUtils.delete(jgit2Folder, FileUtils.RECURSIVE);
        }
    }
@@ -88,7 +92,7 @@
        clone.setBare(false);
        clone.setCloneAllBranches(true);
        clone.setCredentialsProvider(new UsernamePasswordCredentialsProvider(account, password));
        close(clone.call());
        GitBlitSuite.close(clone.call());
        assertTrue(true);
    }
@@ -108,7 +112,7 @@
            clone.setBare(false);
            clone.setCloneAllBranches(true);
            clone.setCredentialsProvider(new UsernamePasswordCredentialsProvider("bogus", "bogus"));
            close(clone.call());
            GitBlitSuite.close(clone.call());
            cloned = true;
        } catch (Exception e) {
            // swallow the exception which we expect
@@ -143,7 +147,7 @@
            clone.setBare(false);
            clone.setCloneAllBranches(true);
            clone.setCredentialsProvider(new UsernamePasswordCredentialsProvider(user.username, user.password));
            close(clone.call());
            GitBlitSuite.close(clone.call());
            cloned = true;
        } catch (Exception e) {
            // swallow the exception which we expect
@@ -165,7 +169,7 @@
        clone.setBare(false);
        clone.setCloneAllBranches(true);
        clone.setCredentialsProvider(new UsernamePasswordCredentialsProvider(user.username, user.password));
        close(clone.call());
        GitBlitSuite.close(clone.call());
        cloned = true;
        assertTrue("Authenticated login could not clone!", cloned);
@@ -190,7 +194,7 @@
        git.add().addFilepattern(file.getName()).call();
        git.commit().setMessage("test commit").call();
        git.push().setPushAll().call();
        close(git);
        GitBlitSuite.close(git);
    }
    @Test
@@ -201,7 +205,7 @@
        clone.setBare(false);
        clone.setCloneAllBranches(true);
        clone.setCredentialsProvider(new UsernamePasswordCredentialsProvider(account, password));
        close(clone.call());
        GitBlitSuite.close(clone.call());
        assertTrue(true);
        Git git = Git.open(jgitFolder);
@@ -213,7 +217,7 @@
        git.add().addFilepattern(file.getName()).call();
        git.commit().setMessage("test commit").call();
        git.push().setPushAll().call();
        close(git);
        GitBlitSuite.close(git);
    }
    
    @Test
@@ -224,7 +228,7 @@
        clone.setBare(false);
        clone.setCloneAllBranches(true);
        clone.setCredentialsProvider(new UsernamePasswordCredentialsProvider(account, password));
        close(clone.call());
        GitBlitSuite.close(clone.call());
        assertTrue(true);
        Git git = Git.open(jgit2Folder);
@@ -241,7 +245,7 @@
        } catch (Exception e) {
            assertTrue(e.getCause().getMessage().contains("git-receive-pack not permitted"));
        }
        close(git);
        GitBlitSuite.close(git);
    }
    @Test
@@ -296,7 +300,7 @@
        clone.setBare(true);
        clone.setCloneAllBranches(true);
        clone.setCredentialsProvider(cp);
        close(clone.call());
        GitBlitSuite.close(clone.call());
        // elevate repository to clone permission
        RepositoryModel model = GitBlit.self().getRepositoryModel("refchecks/ticgit.git");
@@ -331,13 +335,16 @@
        clone.setCredentialsProvider(cp);
        
        try {
            close(clone.call());
            GitBlitSuite.close(clone.call());
        } catch (GitAPIException e) {
            if (permission.atLeast(AccessPermission.CLONE)) {
                throw e;
            } else {
                // close serving repository
                GitBlitSuite.close(refChecks);
                // user does not have clone permission
                assertTrue(e.getMessage(), e.getMessage().contains("not permitted"));
                assertTrue(e.getMessage(), e.getMessage().contains("not permitted"));
                return;
            }
        }
@@ -359,9 +366,12 @@
            if (permission.atLeast(AccessPermission.PUSH)) {
                throw e;
            } else {
                // close serving repository
                GitBlitSuite.close(refChecks);
                // user does not have push permission
                assertTrue(e.getMessage(), e.getMessage().contains("not permitted"));
                close(git);
                GitBlitSuite.close(git);
                return;
            }
        }
@@ -372,8 +382,11 @@
            if (permission.atLeast(AccessPermission.PUSH)) {
                assertTrue("User failed to push commit?! " + status.name(), Status.OK.equals(status));
            } else {
                // close serving repository
                GitBlitSuite.close(refChecks);
                assertTrue("User was able to push commit! " + status.name(), Status.REJECTED_OTHER_REASON.equals(status));
                close(git);
                GitBlitSuite.close(git);
                // skip delete test
                return;
            }
@@ -389,8 +402,11 @@
            if (Status.OK.equals(expectedCreate)) {
                assertTrue("User failed to push creation?! " + status.name(), status.equals(expectedCreate));
            } else {
                // close serving repository
                GitBlitSuite.close(refChecks);
                assertTrue("User was able to push ref creation! " + status.name(), status.equals(expectedCreate));
                close(git);
                GitBlitSuite.close(git);
                // skip delete test
                return;
            }
@@ -408,8 +424,11 @@
            if (Status.OK.equals(expectedDelete)) {
                assertTrue("User failed to push ref deletion?! " + status.name(), status.equals(Status.OK));
            } else {
                // close serving repository
                GitBlitSuite.close(refChecks);
                assertTrue("User was able to push ref deletion?! " + status.name(), status.equals(expectedDelete));
                close(git);
                GitBlitSuite.close(git);
                // skip rewind test
                return;
            }
@@ -445,17 +464,11 @@
                assertTrue("User was able to rewind master?! " + status.name(), status.equals(expectedRewind));
            }
        }
        close(git);
        GitBlitSuite.close(git);
        
        GitBlit.self().deleteUser(user.username);
    }
        // close serving repository
        GitBlitSuite.close(refChecks);
    private void close(Git git) {
        // really close the repository
        // decrement the use counter to 0
        for (int i = 0; i < 2; i++) {
            git.getRepository().close();
        }
        GitBlit.self().deleteUser(user.username);
    }
}