19683b111ab5769ba68a302e5d17cddb1d06fe05
[idea/community.git] / plugins / git4idea / tests / git4idea / repo / GitRepositoryReaderTest.java
1 package git4idea.repo;
2
3 import com.intellij.openapi.application.PluginPathManager;
4 import com.intellij.openapi.util.io.FileUtil;
5 import com.intellij.openapi.util.text.StringUtil;
6 import com.intellij.openapi.vcs.VcsTestUtil;
7 import com.intellij.util.Function;
8 import com.intellij.util.containers.ContainerUtil;
9 import com.intellij.util.io.ZipUtil;
10 import com.intellij.util.ui.UIUtil;
11 import com.intellij.vcs.log.Hash;
12 import com.intellij.vcs.log.impl.HashImpl;
13 import git4idea.GitBranch;
14 import git4idea.GitLocalBranch;
15 import git4idea.test.GitPlatformTest;
16 import junit.framework.TestCase;
17 import org.jetbrains.annotations.NotNull;
18 import org.junit.After;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.junit.runner.RunWith;
22 import org.junit.runners.Parameterized;
23
24 import java.io.File;
25 import java.io.FileFilter;
26 import java.io.IOException;
27 import java.util.Collection;
28 import java.util.List;
29
30 @RunWith(Parameterized.class)
31 public class GitRepositoryReaderTest extends GitPlatformTest {
32
33   @NotNull private final File myTestCaseDir;
34
35   private File myTempDir;
36   private GitRepositoryReader myRepositoryReader;
37   private File myGitDir;
38
39   @Parameterized.Parameters(name = "{0}")
40   public static Collection<Object[]> data() {
41     File pluginRoot = new File(PluginPathManager.getPluginHomePath("git4idea"));
42     File dataDir = new File(new File(pluginRoot, "testData"), "repo");
43     File[] testCases = dataDir.listFiles(new FileFilter() {
44       @Override
45       public boolean accept(File file) {
46         return file.isDirectory();
47       }
48     });
49     return ContainerUtil.map(testCases, new Function<File, Object[]>() {
50       @Override
51       public Object[] fun(File file) {
52         return new Object[] { file.getName(), file };
53       }
54     });
55   }
56
57   @SuppressWarnings({"UnusedParameters"})
58   public GitRepositoryReaderTest(@NotNull String name, @NotNull File testDir) {
59     myTestCaseDir = testDir;
60   }
61
62   @Override
63   @Before
64   public void setUp() throws Exception {
65     super.setUp();
66     myTempDir = new File(myProjectRoot.getPath(), "test");
67     prepareTest(myTestCaseDir);
68   }
69
70   @After
71   @Override
72   public void tearDown() throws Exception {
73     FileUtil.delete(myTempDir);
74     UIUtil.invokeAndWaitIfNeeded(new Runnable() {
75       @Override
76       public void run() {
77         try {
78           GitRepositoryReaderTest.super.tearDown();
79         }
80         catch (Exception e) {
81           throw new RuntimeException(e);
82         }
83       }
84     });
85   }
86
87   private void prepareTest(File testDir) throws IOException {
88     assertTrue("Temp directory was not created", myTempDir.mkdir());
89     FileUtil.copyDir(testDir, myTempDir);
90     myGitDir = new File(myTempDir, ".git");
91     File dotGit = new File(myTempDir, "dot_git");
92     if (!dotGit.exists()) {
93       File dotGitZip = new File(myTempDir, "dot_git.zip");
94       assertTrue("Neither dot_git nor dot_git.zip were found", dotGitZip.exists());
95       ZipUtil.extract(dotGitZip, myTempDir, null);
96     }
97     FileUtil.rename(dotGit, myGitDir);
98     TestCase.assertTrue(myGitDir.exists());
99     myRepositoryReader = new GitRepositoryReader(myGitDir);
100   }
101
102
103   @NotNull
104   private static String readHead(@NotNull File dir) throws IOException {
105     return FileUtil.loadFile(new File(dir, "head.txt")).trim();
106   }
107
108   @NotNull
109   private static Branch readCurrentBranch(@NotNull File resultDir) throws IOException {
110     String branch = FileUtil.loadFile(new File(resultDir, "current-branch.txt")).trim();
111     return readBranchFromLine(branch);
112   }
113
114   @NotNull
115   private static Branch readBranchFromLine(@NotNull String branch) {
116     List<String> branchAndHash = StringUtil.split(branch, " ");
117     return new Branch(branchAndHash.get(1), HashImpl.build(branchAndHash.get(0)));
118   }
119
120   @Test
121   public void testBranches() throws Exception {
122     Collection<GitRemote> remotes = GitConfig.read(myPlatformFacade, new File(myGitDir, "config")).parseRemotes();
123     GitBranchState state = myRepositoryReader.readState(remotes);
124
125     assertEquals("HEAD revision is incorrect", readHead(myTempDir), state.getCurrentRevision());
126     assertEqualBranches(readCurrentBranch(myTempDir), state.getCurrentBranch());
127     assertBranches(state.getLocalBranches(), readBranches(myTempDir, true));
128     assertBranches(state.getRemoteBranches(), readBranches(myTempDir, false));
129   }
130
131   private static void assertEqualBranches(@NotNull Branch expected, @NotNull GitLocalBranch actual) {
132     assertEquals(expected.name, actual.getName());
133     assertEquals("Incorrect hash of branch " + actual.getName(), expected.hash, actual.getHash());
134   }
135
136   private static void assertBranches(Collection<? extends GitBranch> actualBranches, Collection<Branch> expectedBranches) {
137     VcsTestUtil.assertEqualCollections(actualBranches, expectedBranches, new VcsTestUtil.EqualityChecker<GitBranch, Branch>() {
138       @Override
139       public boolean areEqual(GitBranch actual, Branch expected) {
140         return branchesAreEqual(actual, expected);
141       }
142     });
143   }
144
145   @NotNull
146   private static Collection<Branch> readBranches(@NotNull File resultDir, boolean local) throws IOException {
147     String content = FileUtil.loadFile(new File(resultDir, local ? "local-branches.txt" : "remote-branches.txt"));
148     Collection<Branch> branches = ContainerUtil.newArrayList();
149     for (String line : StringUtil.splitByLines(content)) {
150       branches.add(readBranchFromLine(line));
151     }
152     return branches;
153   }
154
155   private static boolean branchesAreEqual(GitBranch actual, Branch expected) {
156     return actual.getFullName().equals(expected.name) && actual.getHash().equals(expected.hash);
157   }
158
159   private static class Branch {
160     final String name;
161     final Hash hash;
162
163     private Branch(String name, Hash hash) {
164       this.name = name;
165       this.hash = hash;
166     }
167
168     @Override
169     public String toString() {
170       return name;
171     }
172   }
173
174 }