09587cc7265972121418484e578158986f553f60
[idea/community.git] / plugins / git4idea / tests / git4idea / test / GitPlatformTest.java
1 /*
2  * Copyright 2000-2015 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.test;
17
18 import com.intellij.openapi.components.ServiceManager;
19 import com.intellij.openapi.diagnostic.Logger;
20 import com.intellij.openapi.util.text.StringUtil;
21 import com.intellij.openapi.vcs.*;
22 import com.intellij.openapi.vcs.changes.ChangeListManager;
23 import com.intellij.openapi.vcs.changes.VcsDirtyScopeManager;
24 import com.intellij.openapi.vfs.VirtualFile;
25 import com.intellij.testFramework.PlatformTestCase;
26 import com.intellij.testFramework.TestLoggerFactory;
27 import com.intellij.testFramework.vcs.AbstractVcsTestCase;
28 import com.intellij.util.ArrayUtil;
29 import com.intellij.util.ObjectUtils;
30 import git4idea.DialogManager;
31 import git4idea.GitPlatformFacade;
32 import git4idea.GitUtil;
33 import git4idea.GitVcs;
34 import git4idea.commands.Git;
35 import git4idea.commands.GitHandler;
36 import git4idea.config.GitVcsSettings;
37 import git4idea.repo.GitRepository;
38 import git4idea.repo.GitRepositoryManager;
39 import org.jetbrains.annotations.NotNull;
40
41 import java.util.*;
42
43 public abstract class GitPlatformTest extends PlatformTestCase {
44
45   protected static final Logger LOG = Logger.getInstance(GitPlatformTest.class);
46
47   protected VirtualFile myProjectRoot;
48   protected String myProjectPath;
49   protected GitRepositoryManager myGitRepositoryManager;
50   protected GitVcsSettings myGitSettings;
51   protected GitPlatformFacade myPlatformFacade;
52   protected Git myGit;
53   protected GitVcs myVcs;
54
55   protected TestDialogManager myDialogManager;
56   protected TestVcsNotifier myVcsNotifier;
57
58   private String myTestStartedIndicator;
59
60   @Override
61   protected void setUp() throws Exception {
62     super.setUp();
63     enableDebugLogging();
64
65     myProjectRoot = myProject.getBaseDir();
66     myProjectPath = myProjectRoot.getPath();
67
68     myGitSettings = GitVcsSettings.getInstance(myProject);
69     myGitSettings.getAppSettings().setPathToGit(GitExecutor.PathHolder.GIT_EXECUTABLE);
70
71     myDialogManager = (TestDialogManager)ServiceManager.getService(DialogManager.class);
72     myVcsNotifier = (TestVcsNotifier)ServiceManager.getService(myProject, VcsNotifier.class);
73
74     myGitRepositoryManager = GitUtil.getRepositoryManager(myProject);
75     myPlatformFacade = ServiceManager.getService(myProject, GitPlatformFacade.class);
76     myGit = ServiceManager.getService(myProject, Git.class);
77     myVcs = ObjectUtils.assertNotNull(GitVcs.getInstance(myProject));
78     myVcs.doActivate();
79
80     GitTestUtil.assumeSupportedGitVersion(myVcs);
81     addSilently();
82     removeSilently();
83   }
84
85   @Override
86   @NotNull
87   public String getTestName(boolean lowercaseFirstLetter) {
88     String name = super.getTestName(lowercaseFirstLetter);
89     name = StringUtil.shortenTextWithEllipsis(name.trim().replace(" ", "_"), 12, 6, "_");
90     if (name.startsWith("_")) {
91       name = name.substring(1);
92     }
93     return name;
94   }
95
96   @Override
97   protected void tearDown() throws Exception {
98     try {
99       if (myDialogManager != null) {
100         myDialogManager.cleanup();
101       }
102       if (myVcsNotifier != null) {
103         myVcsNotifier.cleanup();
104       }
105     }
106     finally {
107       try {
108         super.tearDown();
109       }
110       finally {
111         if (myAssertionsInTestDetected) {
112           TestLoggerFactory.dumpLogToStdout(myTestStartedIndicator);
113         }
114       }
115     }
116   }
117
118   private void enableDebugLogging() {
119     List<String> commonCategories = new ArrayList<String>(Arrays.asList("#" + Executor.class.getName(),
120                                                                         "#" + GitHandler.class.getName(),
121                                                                         GitHandler.class.getName()));
122     commonCategories.addAll(getDebugLogCategories());
123     TestLoggerFactory.enableDebugLogging(myTestRootDisposable, ArrayUtil.toStringArray(commonCategories));
124     myTestStartedIndicator = createTestStartedIndicator();
125     LOG.info(myTestStartedIndicator);
126   }
127
128   @NotNull
129   protected Collection<String> getDebugLogCategories() {
130     return Collections.emptyList();
131   }
132
133   @NotNull
134   private String createTestStartedIndicator() {
135     return "Starting " + getClass().getName() + "." + getTestName(false) + Math.random();
136   }
137
138   @NotNull
139   protected GitRepository createRepository(@NotNull String rootDir) {
140     return GitTestUtil.createRepository(myProject, rootDir);
141   }
142
143   /**
144    * Clones the given source repository into a bare parent.git and adds the remote origin.
145    */
146   protected void prepareRemoteRepo(@NotNull GitRepository source) {
147     final String target = "parent.git";
148     final String targetName = "origin";
149     Executor.cd(myProjectRoot);
150     GitExecutor.git("clone --bare '%s' %s", source.getRoot().getPath(), target);
151     GitExecutor.cd(source);
152     GitExecutor.git("remote add %s '%s'", targetName, myProjectRoot + "/" + target);
153   }
154
155   protected void refresh() {
156     myProjectRoot.refresh(false, true);
157   }
158
159   protected void doActionSilently(final VcsConfiguration.StandardConfirmation op) {
160     AbstractVcsTestCase.setStandardConfirmation(myProject, GitVcs.NAME, op, VcsShowConfirmationOption.Value.DO_ACTION_SILENTLY);
161   }
162
163   protected void updateChangeListManager() {
164     ChangeListManager changeListManager = ChangeListManager.getInstance(myProject);
165     VcsDirtyScopeManager.getInstance(myProject).markEverythingDirty();
166     changeListManager.ensureUpToDate(false);
167   }
168
169   protected void addSilently() {
170     doActionSilently(VcsConfiguration.StandardConfirmation.ADD);
171   }
172
173   protected void removeSilently() {
174     doActionSilently(VcsConfiguration.StandardConfirmation.REMOVE);
175   }
176
177 }