[Mercurial Tests] Introduced HgSingleUserTestCase, HgCollaborativeTestCase, HgTestRep...
[idea/community.git] / plugins / hg4idea / testSrc / org / zmlx / hg4idea / test / HgAbstractTestCase.java
1 // Copyright 2010 Victor Iacoban
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software distributed under
10 // the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
11 // either express or implied. See the License for the specific language governing permissions and
12 // limitations under the License.
13 package org.zmlx.hg4idea.test;
14
15 import com.intellij.execution.process.ProcessOutput;
16 import com.intellij.openapi.application.PluginPathManager;
17 import com.intellij.openapi.vcs.VcsConfiguration;
18 import com.intellij.openapi.vcs.VcsShowConfirmationOption;
19 import com.intellij.openapi.vcs.changes.VcsDirtyScopeManager;
20 import com.intellij.openapi.vfs.LocalFileSystem;
21 import com.intellij.openapi.vfs.VirtualFile;
22 import com.intellij.testFramework.AbstractVcsTestCase;
23 import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory;
24 import com.intellij.testFramework.fixtures.TempDirTestFixture;
25 import com.intellij.vcsUtil.VcsUtil;
26 import org.jetbrains.annotations.Nullable;
27 import org.testng.annotations.BeforeMethod;
28 import org.zmlx.hg4idea.HgFile;
29 import org.zmlx.hg4idea.HgVcs;
30
31 import java.io.*;
32
33 import static org.testng.Assert.assertTrue;
34
35 /**
36  * The ancestor of all hg4idea test cases.
37  */
38 public abstract class HgAbstractTestCase extends AbstractVcsTestCase {
39
40   public static final String HG_EXECUTABLE_PATH = "IDEA_TEST_HG_EXECUTABLE_PATH";
41
42   // some shortcuts to use in tests
43   protected static final String AFILE = "a.txt";
44   protected static final String BDIR = "b";
45   protected static final String BFILE = "b.txt";
46   protected static final String BFILE_PATH = BDIR + File.separator + BFILE;
47   protected static final String FILE_CONTENT = "Sample file content.";
48   protected static final String FILE_CONTENT_2 = "some other file content";
49
50   protected File myProjectDir; // location of the project repository. Initialized differently in each test: by init or by clone.
51   protected HgTestChangeListManager myChangeListManager;
52
53   @BeforeMethod
54   protected void setUp() throws Exception {
55     // setting hg executable
56     String exec = System.getenv(HG_EXECUTABLE_PATH);
57     if (exec != null) {
58       myClientBinaryPath = new File(exec);
59     }
60     if (exec == null || !myClientBinaryPath.exists()) {
61       final File pluginRoot = new File(PluginPathManager.getPluginHomePath(HgVcs.VCS_NAME));
62       myClientBinaryPath = new File(pluginRoot, "testData/bin");
63     }
64     HgVcs.setTestHgExecutablePath(myClientBinaryPath.getPath());
65
66     myTraceClient = true;
67   }
68
69   /**
70    * Creates a new Mercurial repository in a temporary test directory.
71    * @return created repository
72    */
73   protected HgTestRepository createRepository() throws Exception {
74     final TempDirTestFixture dirFixture = createFixtureDir();
75     final File repo = new File(dirFixture.getTempDirPath());
76     ProcessOutput processOutput = runHg(repo, "init");
77     verify(processOutput);
78     return new HgTestRepository(this, dirFixture);
79   }
80
81   protected static TempDirTestFixture createFixtureDir() throws Exception {
82     final TempDirTestFixture fixture = IdeaTestFixtureFactory.getFixtureFactory().createTempDirTestFixture();
83     fixture.setUp();
84     return fixture;
85   }
86
87   protected void enableSilentOperation(final VcsConfiguration.StandardConfirmation op) {
88     setStandardConfirmation(HgVcs.VCS_NAME, op, VcsShowConfirmationOption.Value.DO_ACTION_SILENTLY);
89   }
90
91   protected void disableSilentOperation(final VcsConfiguration.StandardConfirmation op) {
92     setStandardConfirmation(HgVcs.VCS_NAME, op, VcsShowConfirmationOption.Value.DO_NOTHING_SILENTLY);
93   }
94
95   /**
96    * Runs the hg command.
97    *
98    * @param commandLine the name of the command and its arguments.
99    */
100   protected ProcessOutput runHgOnProjectRepo(String... commandLine) throws IOException {
101     return runHg(myProjectDir, commandLine);
102   }
103
104   /**
105    * Verifies the status of the file calling native 'hg status' command.
106    *
107    * @param status status as returned by {@link #added(java.lang.String)} and other methods.
108    * @throws IOException
109    */
110   protected void verifyStatus(String... status) throws IOException {
111     verify(runHg(myProjectDir, "status"), status);
112 }
113   /**
114    * Calls "hg add ." to add everything to the index.
115    */
116   protected ProcessOutput addAll() throws IOException {
117     return runHg(myProjectDir, "add", ".");
118   }
119
120   /**
121    * Calls "hg commit -m <commitMessage>" to commit the index.
122    */
123   protected ProcessOutput commitAll(String commitMessage) throws IOException {
124     return runHg(myProjectDir, "commit", "-m", commitMessage);
125   }
126
127   protected HgFile getHgFile(String... filepath) {
128     File fileToInclude = myProjectDir;
129     for (String path : filepath) {
130       fileToInclude = new File(fileToInclude, path);
131     }
132     return new HgFile(myWorkingCopyDir, fileToInclude);
133   }
134                        
135
136
137   protected VirtualFile makeFile(File file) throws IOException {
138     file.createNewFile();
139     VcsDirtyScopeManager.getInstance(myProject).fileDirty(myWorkingCopyDir);
140     LocalFileSystem.getInstance().refresh(false);
141     return VcsUtil.getVirtualFile(file);
142   }
143
144   /**
145    * Executes the given native Mercurial command with parameters in the given working directory.
146    * @param workingDir  working directory where the command will be executed. May be null.
147    * @param commandLine command and parameters (e.g. 'status, -m').
148    */
149   protected ProcessOutput runHg(@Nullable File workingDir, String... commandLine) throws IOException {
150     return runClient(HgVcs.HG_EXECUTABLE_FILE_NAME, null, workingDir, commandLine);
151   }
152
153   protected File fillFile(File aParentDir, String[] filePath, String fileContents) throws FileNotFoundException {
154     File parentDir = aParentDir;
155     for (int i = 0; i < filePath.length - 1; i++) {
156       File current = new File(parentDir, filePath[i]);
157       if (!current.exists() || !current.isDirectory()) {
158         assertTrue(current.mkdir());
159       }
160       parentDir = current;
161     }
162     File outputFile = new File(parentDir, filePath[filePath.length - 1]);
163
164     PrintStream printer = new PrintStream(new FileOutputStream(outputFile));
165     printer.print(fileContents);
166     printer.close();
167
168     return outputFile;
169   }
170
171 }