[Git] Rework GitChangeProviderTest
[idea/community.git] / plugins / git4idea / tests / git4idea / tests / GitTest.java
1 /*
2  * Copyright 2000-2010 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package git4idea.tests;
17
18 import com.intellij.execution.process.ProcessOutput;
19 import com.intellij.openapi.application.PluginPathManager;
20 import com.intellij.openapi.util.SystemInfo;
21 import com.intellij.openapi.util.io.FileUtil;
22 import com.intellij.openapi.vcs.FilePath;
23 import com.intellij.openapi.vcs.VcsConfiguration;
24 import com.intellij.openapi.vcs.VcsShowConfirmationOption;
25 import com.intellij.openapi.vcs.changes.Change;
26 import com.intellij.openapi.vcs.changes.ContentRevision;
27 import com.intellij.testFramework.AbstractVcsTestCase;
28 import com.intellij.ui.GuiUtils;
29 import com.intellij.util.ui.UIUtil;
30 import git4idea.GitVcs;
31 import git4idea.config.GitVcsApplicationSettings;
32 import org.jetbrains.annotations.Nullable;
33 import org.testng.annotations.AfterMethod;
34 import org.testng.annotations.BeforeMethod;
35
36 import java.io.File;
37 import java.io.IOException;
38 import java.util.Map;
39
40 /**
41  * The common ancestor for git test cases which need git executable.
42  * These tests can be executed only if git is installed in the system and IDEA_TEST_GIT_EXECUTABLE_PATH targets to the folder which
43  * contains git executable.
44  * @author Kirill Likhodedov
45  */
46 public abstract class GitTest extends AbstractVcsTestCase {
47
48   public static final String GIT_EXECUTABLE_PATH = "IDEA_TEST_GIT_EXECUTABLE_PATH";
49
50   private static final String GIT_EXECUTABLE = "git";
51   protected GitTestRepository myMainRepo;
52   private File myProjectDir;
53
54   @BeforeMethod
55   protected void setUp() throws Exception {
56     // setting git executable
57     String exec = System.getenv(GIT_EXECUTABLE_PATH);
58     if (exec != null) {
59       myClientBinaryPath = new File(exec);
60     }
61     if (exec == null || !myClientBinaryPath.exists()) {
62       final File pluginRoot = new File(PluginPathManager.getPluginHomePath("git4idea"));
63       myClientBinaryPath = new File(pluginRoot, "tests/git4idea/tests/data/bin");
64     }
65
66     myMainRepo = initRepositories();
67
68     myProjectDir = new File(myMainRepo.getDirFixture().getTempDirPath());
69     UIUtil.invokeAndWaitIfNeeded(new Runnable() {
70       @Override
71       public void run() {
72         try {
73           initProject(myProjectDir);
74           activateVCS(GitVcs.NAME);
75         } catch (Exception e) {
76           e.printStackTrace();
77         }
78       }
79     });
80
81     final GitVcsApplicationSettings settings = GitVcsApplicationSettings.getInstance();
82     File executable = new File(myClientBinaryPath, SystemInfo.isWindows ? GIT_EXECUTABLE + ".exe" : GIT_EXECUTABLE);
83     settings.setPathToGit(executable.getPath());
84
85     myTraceClient = true;
86     doActionSilently(VcsConfiguration.StandardConfirmation.ADD);
87     doActionSilently(VcsConfiguration.StandardConfirmation.REMOVE);
88   }
89
90   /**
91    * Different implementations for {@link GitSingleUserTest} and {@link GitCollaborativeTest}:
92    * create a single or several repositories, which will be used in tests.
93    * @return main repository which IDEA project will be bound to.
94    */
95   protected abstract GitTestRepository initRepositories() throws Exception;
96
97   protected abstract void tearDownRepositories() throws Exception;
98
99   @AfterMethod
100   protected void tearDown() throws Exception {
101     GuiUtils.runOrInvokeAndWait(new Runnable() {
102       @Override
103       public void run() {
104         try {
105           tearDownProject();
106           tearDownRepositories();
107         } catch (Exception e) {
108           e.printStackTrace();
109         }
110       }
111     });
112   }
113
114   /**
115    * Executes the given native Git command with parameters in the given working directory.
116    * @param workingDir  working directory where the command will be executed. May be null.
117    * @param commandLine command and parameters (e.g. 'status, -m').
118    */
119   protected ProcessOutput executeCommand(@Nullable File workingDir, String... commandLine) throws IOException {
120     return runClient(GIT_EXECUTABLE, null, workingDir, commandLine);
121   }
122
123   protected void doActionSilently(final VcsConfiguration.StandardConfirmation op) {
124     setStandardConfirmation(GitVcs.NAME, op, VcsShowConfirmationOption.Value.DO_ACTION_SILENTLY);
125   }
126
127   protected String tos(FilePath fp) {
128     return FileUtil.getRelativePath(new File(myMainRepo.getDir().getPath()), fp.getIOFile());
129   }
130
131   protected String tos(Change change) {
132     switch (change.getType()) {
133       case NEW: return "A: " + tos(change.getAfterRevision());
134       case DELETED: return "D: " + tos(change.getBeforeRevision());
135       case MOVED: return "M: " + tos(change.getBeforeRevision()) + " -> " + tos(change.getAfterRevision());
136       case MODIFICATION: return "M: " + tos(change.getAfterRevision());
137       default: return "~: " +  tos(change.getBeforeRevision()) + " -> " + tos(change.getAfterRevision());
138     }
139   }
140
141   protected String tos(ContentRevision revision) {
142     return tos(revision.getFile());
143   }
144
145   protected String tos(Map<FilePath, Change> changes) {
146     StringBuilder stringBuilder = new StringBuilder("[");
147     for (Change change : changes.values()) {
148       stringBuilder.append(tos(change)).append(", ");
149     }
150     stringBuilder.append("]");
151     return stringBuilder.toString();
152   }
153
154 }