cvs/testSource/com/intellij/cvsSupport2/BaseCvs2TestCase.java (517 lines of code) (raw):

package com.intellij.cvsSupport2; import com.intellij.cvsSupport2.actions.update.UpdateSettings; import com.intellij.cvsSupport2.actions.update.UpdateSettingsOnCvsConfiguration; import com.intellij.cvsSupport2.application.CvsEntriesManager; import com.intellij.cvsSupport2.config.CvsApplicationLevelConfiguration; import com.intellij.cvsSupport2.config.CvsConfiguration; import com.intellij.cvsSupport2.config.CvsRootConfiguration; import com.intellij.cvsSupport2.connections.CvsEnvironment; import com.intellij.cvsSupport2.connections.login.CvsLoginWorker; import com.intellij.cvsSupport2.connections.pserver.PServerCvsSettings; import com.intellij.cvsSupport2.connections.pserver.PServerLoginProvider; import com.intellij.cvsSupport2.cvsExecution.CvsOperationExecutor; import com.intellij.cvsSupport2.cvsExecution.CvsOperationExecutorCallback; import com.intellij.cvsSupport2.cvsExecution.ModalityContextImpl; import com.intellij.cvsSupport2.cvshandlers.CommandCvsHandler; import com.intellij.cvsSupport2.cvshandlers.CvsHandler; import com.intellij.cvsSupport2.cvshandlers.CvsUpdatePolicy; import com.intellij.cvsSupport2.cvsoperations.common.CvsOperation; import com.intellij.cvsSupport2.cvsoperations.common.ReceivedFileProcessor; import com.intellij.cvsSupport2.cvsoperations.cvsCheckOut.CheckoutProjectOperation; import com.intellij.cvsSupport2.cvsoperations.cvsCommit.CommitFilesOperation; import com.intellij.cvsSupport2.cvsoperations.cvsImport.ImportOperation; import com.intellij.cvsSupport2.cvsoperations.cvsMessages.CvsCompositeListener; import com.intellij.cvsSupport2.cvsoperations.cvsMessages.CvsMessagesListener; import com.intellij.cvsSupport2.cvsoperations.cvsUpdate.UpdateOperation; import com.intellij.cvsSupport2.cvsoperations.dateOrRevision.RevisionOrDate; import com.intellij.cvsSupport2.cvsoperations.dateOrRevision.SimpleRevision; import com.intellij.cvsSupport2.errorHandling.CannotFindCvsRootException; import com.intellij.cvsSupport2.javacvsImpl.CvsCommandStopper; import com.intellij.cvsSupport2.javacvsImpl.FileReadOnlyHandler; import com.intellij.cvsSupport2.javacvsImpl.io.*; import com.intellij.cvsSupport2.updateinfo.UpdatedFilesProcessor; import com.intellij.execution.process.OSProcessHandler; import com.intellij.execution.process.ProcessAdapter; import com.intellij.execution.process.ProcessEvent; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.LineTokenizer; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vcs.*; import com.intellij.openapi.vcs.ex.ProjectLevelVcsManagerEx; import com.intellij.openapi.vcs.impl.ProjectLevelVcsManagerImpl; import com.intellij.openapi.vcs.update.UpdatedFiles; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.testFramework.HeavyPlatformTestCase; import com.intellij.testFramework.PsiTestUtil; import com.intellij.util.SystemProperties; import com.intellij.util.ThreeState; import com.intellij.util.WaitFor; import com.intellij.vcsUtil.VcsUtil; import junit.framework.TestResult; import org.jetbrains.annotations.NotNull; import org.netbeans.lib.cvsclient.*; import org.netbeans.lib.cvsclient.admin.AdminReader; import org.netbeans.lib.cvsclient.admin.AdminWriter; import org.netbeans.lib.cvsclient.command.Command; import org.netbeans.lib.cvsclient.command.CommandException; import org.netbeans.lib.cvsclient.command.KeywordSubstitution; import org.netbeans.lib.cvsclient.connection.AuthenticationException; import org.netbeans.lib.cvsclient.connection.IConnection; import org.netbeans.lib.cvsclient.event.EventManager; import org.netbeans.lib.cvsclient.file.LocalFileReader; import org.netbeans.lib.cvsclient.file.LocalFileWriter; import org.netbeans.lib.cvsclient.progress.IProgressViewer; import org.netbeans.lib.cvsclient.util.DefaultIgnoreFileFilter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; public abstract class BaseCvs2TestCase extends HeavyPlatformTestCase implements CvsEnvironment { protected static final String LINE_SEPARATOR = System.getProperty("line.separator"); protected CvsVcs2 myVcs; protected static final String PROJECT_PATH = TestObject.getProjectDirectory().getAbsolutePath(); protected Collection myCreatedConnections = new ArrayList(); protected static final String TEST_FILE_EXTENSION = "txt"; protected static final TestFile TEST_FILE = TestFile.createInProject("file1." + TEST_FILE_EXTENSION); protected static final TestObject TEST_DIRECTORY = new TestDirectory(TestObject.getProjectDirectory(), "directory"); protected static final TestFile FILE_TO_EXCLUDE = TestFile.createInProject("fileToExclude.txt"); protected static final TestFile FILE_TO_ADD = TestFile.createInProject("fileToAdd.txt"); protected static final TestFile FILE_TO_REMOVE = TestFile.createInProject("fileToRemove.txt"); protected static final TestFile FILE_TO_CHECKIN = TestFile.createInProject("fileCheckin.txt"); public static final String NEW_CONTENT = "new content"; protected PServerCvsSettings myConfig; protected static final String COMMENT = "log message"; protected File myAnotherLocation = new File(TestObject.getWorkingFolder(), "AnotherLocation"); private String myTag; protected int myLogins; protected UpdateSettings myUpdateSettings = null; protected final CvsConfiguration myConfiguration; protected Collection<VcsException> myErrors; protected Collection<VcsException> myWarnings; private LocalFileSystem.WatchRequest myWorkingFolderWatchRequest; public BaseCvs2TestCase() { myConfiguration = new CvsConfiguration(); } @Override public TestResult run() { try { final TestResult result = new TestResult(); AdminWriter.WRITE_RELATIVE_PATHS = false; run(result); AdminWriter.WRITE_RELATIVE_PATHS = true; run(result); return result; } finally { AdminWriter.WRITE_RELATIVE_PATHS = true; } } @Override protected void setUp() throws Exception { super.setUp(); final File parentFile = TestObject.getWorkingFolder().getParentFile(); myWorkingFolderWatchRequest = LocalFileSystem.getInstance().addRootToWatch(parentFile.getCanonicalPath(), true); CvsEntriesManager.getInstance().activate(); CvsApplicationLevelConfiguration.getInstance().CHECKOUT_PRUNE_EMPTY_DIRECTORIES = false; myAnotherLocation.mkdir(); PServerLoginProvider.registerPasswordProvider(new PServerLoginProvider() { @Override public String getScrambledPasswordForCvsRoot(String cvsroot) { return getPassword(cvsroot); } @Override public CvsLoginWorker getLoginWorker(Project project, PServerCvsSettings pServerCvsSettings) { return new CvsLoginWorker() { @Override public boolean promptForPassword() { return true; } @Override public ThreeState silentLogin(boolean forceCheck) { ++ myLogins; return ThreeState.YES; } @Override public void goOffline() { } }; } }); initTestConfiguration(); myVcs = new CvsVcs2(myProject); Thread.sleep(1000); deleteRepository(); deleteProjectDirectory(); createRepository(); createProjectDirectory(); // ((StartupManagerImpl) StartupManager.getInstance(myProject)).runStartupActivities(); final ProjectLevelVcsManagerEx manager = ProjectLevelVcsManagerEx.getInstanceEx(myProject); manager.getConfirmation(VcsConfiguration.StandardConfirmation.ADD).setValue(VcsShowConfirmationOption.Value.DO_NOTHING_SILENTLY); manager.getConfirmation(VcsConfiguration.StandardConfirmation.REMOVE).setValue(VcsShowConfirmationOption.Value.DO_NOTHING_SILENTLY); //createFileInCvsRoot("rcstemplate", "PR:\n"); appendStringsToFileInCvsRoot("rcsinfo", new String[]{"ALL $CVSROOT/CVSROOT/rcstemplate"}); TestObject.getProjectDirectory().mkdirs(); PsiTestUtil.addContentRoot(myModule, LocalFileSystem.getInstance().findFileByIoFile(TestObject.getProjectDirectory())); //((ProjectLevelVcsManagerImpl)ProjectLevelVcsManager.getInstance(myProject)).registerVcs(CvsVcs2.getInstance(myProject)); //((ProjectLevelVcsManagerImpl)ProjectLevelVcsManager.getInstance(myProject)).initialize(); ProjectLevelVcsManager.getInstance(myProject).setDirectoryMapping("", CvsVcs2.getInstance(myProject).getName()); } @Override protected void tearDown() throws Exception { ((ProjectLevelVcsManagerImpl)ProjectLevelVcsManager.getInstance(myProject)).unregisterVcs(CvsVcs2.getInstance(myProject)); myAnotherLocation.delete(); CvsEntriesManager.getInstance().clearAll(); new WaitFor(10000) { @Override protected boolean condition() { return ReadThread.READ_THREADS.isEmpty(); } }.assertCompleted(ReadThread.READ_THREADS.toString()); CvsEntriesManager.getInstance().deactivate(); if (myWorkingFolderWatchRequest != null) { LocalFileSystem.getInstance().removeWatchedRoot(myWorkingFolderWatchRequest); } myVcs = null; myCreatedConnections = null; super.tearDown(); } private void initTestConfiguration() { CvsRootConfiguration cvsRootConfiguration = CvsApplicationLevelConfiguration.createNewConfiguration(CvsApplicationLevelConfiguration.getInstance()); cvsRootConfiguration.CVS_ROOT = ":pserver:" + TestObject.getUser() + "@127.0.0.1:" + TestObject.getRepositoryPath(); myConfig = new PServerCvsSettings(cvsRootConfiguration); myConfig.HOST = "127.0.0.1"; myConfig.USER = TestObject.getUser(); myConfig.REPOSITORY = TestObject.getRepositoryPath(); myConfig.PASSWORD = getPassword(""); } public void importAndCheckoutProject() throws Exception { importProject(); checkoutProject(); } protected void importProject() throws Exception { ImportOperation importOperation = ImportOperation.createTestInstance(TestObject.getProjectDirectory(), this); execute(importOperation); } protected void checkoutProject() { checkoutProjectTo(getProjectRoot()); } protected void checkoutProjectTo(File checkoutLocation) { checkoutModuleTo(checkoutLocation, getModuleName()); } protected void checkoutModuleTo(File checkoutLocation, String moduleName) { deleteDirectory(new File(checkoutLocation, moduleName)); refreshFileSystem(); CvsHandler checkoutHandler = CommandCvsHandler.createCheckoutHandler(this, new String[]{moduleName}, checkoutLocation, false, false, null); checkoutHandler.login(myProject); checkoutHandler.internalRun(myProject, ModalityContextImpl.NON_MODAL, true); refreshFileSystem(); } protected void executeCommand(Command command, File base) throws VcsException { refreshFileSystem(); IConnection connection = openConnection(); try { executeCommand(connection, command); } finally { closeConnection(connection); } } private void executeCommand(IConnection connection, Command command) throws VcsException { refreshFileSystem(); final IClientEnvironment clientEnvironment = new ClientEnvironment(connection, new File(PROJECT_PATH), new File(PROJECT_PATH), getCvsRoot(), new LocalFileReader(new SendTextFilePreprocessor()), new LocalFileWriter( new ReceiveTextFilePreprocessor(ReceivedFileProcessor.DEFAULT)), new AdminReader(CvsApplicationLevelConfiguration.getCharset()), new AdminWriter(CodeStyleSettingsManager.getInstance() .getCurrentSettings().getLineSeparator(), CvsApplicationLevelConfiguration.getCharset()), new DefaultIgnoreFileFilter(), new FileReadOnlyHandler(), CvsApplicationLevelConfiguration.getCharset()); final EventManager eventManager = new EventManager(CvsApplicationLevelConfiguration.getCharset()); final IRequestProcessor requestProcessor = new RequestProcessor(clientEnvironment, command.getGlobalOptions(), eventManager, new StreamLogger(), new CvsCommandStopper(), -1); try { connection.open(new StreamLogger()); command.execute(requestProcessor, eventManager, eventManager, clientEnvironment, new IProgressViewer() { @Override public void setProgress(double value) { } }); } catch (CommandException e) { throw new VcsException(e); } catch (AuthenticationException e) { } finally { try { connection.close(); } catch (IOException e) { } } } private static void closeConnection(IConnection connection) throws VcsException { try { connection.close(); } catch (IOException e) { throw new VcsException(e); } } private IConnection openConnection() throws VcsException { IConnection result; try { result = createConnection(new ReadWriteStatistics()); result.open(new StreamLogger()); } catch (AuthenticationException e) { throw new VcsException(e); } return result; } protected static File getProjectRoot() { return TestObject.getWorkingFolder(); } @Override public IConnection createConnection(ReadWriteStatistics statistics) { return myConfig.createConnection(new ReadWriteStatistics()); } protected static String getModuleName() { return TestObject.getProjectDirectory().getName(); } protected static void deleteRepository() { deleteDirectory(TestObject.getRepositoryDirectory()); } protected static void deleteDirectory(File directory) { boolean deleted = FileUtil.delete(directory); assertTrue(directory.getAbsolutePath(), deleted); } protected static void deleteProjectDirectory() { deleteDirectory(TestObject.getProjectDirectory()); } protected static void createProjectDirectory() { assertTrue(CheckinProjectTest.PROJECT_PATH, TestObject.getProjectDirectory().mkdir()); } protected static void createRepository() throws Exception { String[] cmdarray = {"cvs", "-d", TestObject.getRepositoryPath(), "init"}; final OSProcessHandler process = new OSProcessHandler(Runtime.getRuntime().exec(cmdarray), StringUtil.join(cmdarray, " ")); process.addProcessListener(new ProcessAdapter() { @Override public void onTextAvailable(@NotNull final ProcessEvent event, @NotNull final Key outputType) { System.out.println(event.getText()); } }); process.startNotify(); process.waitFor(); process.destroyProcess(); if (TestObject.getUser().equals("builduser")) { // otherwise assume it's the logged in user and no config is required createCvsRootConfigFile("passwd", "builduser::LABS\\" + SystemProperties.getUserName()); createCvsRootConfigFile("admin", "builduser"); } } private static void createCvsRootConfigFile(String fileName, String content) throws IOException { File f = new File(TestObject.getRepositoryPath(), "CVSROOT\\" + fileName); try (FileWriter w = new FileWriter(f)) { w.write(content); } } protected void putTestFileToRepository() throws IOException, VcsException { BaseCvs2TestCase.TEST_FILE.createInProject(); BaseCvs2TestCase.TEST_FILE.addToVcs(myVcs); commitTransaction(); } protected void commitTransaction() throws VcsException { commitTransaction(COMMENT); } protected void commitTransaction(String comment) throws VcsException { refreshFileSystem(); myVcs.commitTransaction(comment); } protected void execute(CvsOperation operation) throws Exception { refreshFileSystem(); CvsOperationExecutor executor = new CvsOperationExecutor(myProject, ModalityState.NON_MODAL); executor.performActionSync(new CommandCvsHandler("Test Operation", operation), CvsOperationExecutorCallback.EMPTY); if (!executor.hasNoErrors()) throw executor.getFirstError(); } protected void appendStringsToFileInCvsRoot(String fileInCvsRoot, String[] stringsToAppend) throws Exception { File cvsroot = new File(TestObject.getWorkingFolder(), "CVSROOT"); final File file = new File(cvsroot, fileInCvsRoot); try { String moduleName = cvsroot.getName() + "/" + file.getName(); execute(CheckoutProjectOperation.createTestInstance(this, moduleName, cvsroot.getParentFile())); assertTrue("File " + file.getAbsolutePath() + " should be checked out", file.isFile()); for (String aStringsToAppend : stringsToAppend) { appendStringToFile(file, aStringsToAppend); } ApplicationManager.getApplication().runWriteAction(() -> { LocalFileSystem.getInstance().refreshAndFindFileByIoFile(file); }); CommitFilesOperation commitFilesOperation = new CommitFilesOperation(false); commitFilesOperation.addFile(file.getAbsolutePath()); execute(commitFilesOperation); } catch (CannotFindCvsRootException ignored) { } finally { FileUtil.delete(cvsroot); } } private static void appendStringToFile(File moduleFile, String s) throws IOException { FileUtil.writeToFile(moduleFile, "\n"+s, true); } @Override public String getCvsRootAsString() { return ":pserver:" + TestObject.getUser() + "@localhost:" + TestObject.getRepositoryPath() + "\n"; } public static String getPassword(String cvsroot) { return TestObject.getScrambledPassword(); } protected static void assertEqualsAsText(String expected, String actual) { String expectedNew = replaceNewLines(expected); String actualNew = replaceNewLines(actual); assertEquals(expectedNew, actualNew); } private static String replaceNewLines(String expected) { StringBuilder buffer = new StringBuilder(); String[] strings = LineTokenizer.tokenize(expected.toCharArray(), false, false); for (int i = 0; i < strings.length; i++) { if (i > 0) buffer.append("\n"); buffer.append(strings[i]); } return buffer.toString(); } protected void createNewTestFileRevisionWithContent(String fileContent) throws Exception { checkoutToAnotherLocation(); TestFile anotherTestFile = getTestFileIn(myAnotherLocation); anotherTestFile.changeContentTo(fileContent); myVcs.getStandardOperationsProvider().checkinFile(anotherTestFile.getAbsolutePath(), null, null); commitTransaction(); } protected void setIsBinary(String extension) throws Exception { appendStringsToFileInCvsRoot("cvswrappers", new String[]{"*." + extension + " -k 'b'"}); } @Override public CvsLoginWorker getLoginWorker(Project project) { return new CvsLoginWorker() { @Override public boolean promptForPassword() { return true; } @Override public ThreeState silentLogin(boolean forceCheck) { ++ myLogins; return ThreeState.YES; } @Override public void goOffline() { } }; } @Override public RevisionOrDate getRevisionOrDate() { return new SimpleRevision(myTag); } protected static TestFile getTestFileIn(File anotherLocation) { return getFileIn(anotherLocation, TEST_FILE); } protected static TestFile getFileIn(File anotherLocation, File file) { String oldName = file.getAbsolutePath(); String oldParent = TestObject.getWorkingFolder().getAbsolutePath(); String newParent = anotherLocation.getAbsolutePath(); String newName = newParent + oldName.substring(oldParent.length()); return new TestFile(newName); } protected void checkoutToAnotherLocation() { myAnotherLocation.delete(); myAnotherLocation.mkdir(); checkoutProjectTo(myAnotherLocation); } protected void setWorkingTag(String branchName) { myTag = branchName; } @Override public String getRepository() { return myConfig.getRepository(); } @Override public CvsRoot getCvsRoot() { return myConfig.getCvsRoot(); } protected static void refreshFileSystem() { try { Thread.sleep(300); } catch (InterruptedException e) { LOG.error(e); } ApplicationManager.getApplication().runWriteAction(() -> LocalFileSystem.getInstance().refresh(false)); } protected UpdateSettings getUpdateSettings(CvsConfiguration configuration) { if (myUpdateSettings != null) { return myUpdateSettings; } return new UpdateSettingsOnCvsConfiguration(configuration, false, false); } @Override public boolean isValid() { return true; } protected void addFile(TestObject testFile, KeywordSubstitution ks) throws IOException, VcsException { addFile(testFile, ks, COMMENT); } protected void addFile(TestObject testFile, KeywordSubstitution ks, String message) throws IOException, VcsException { refreshFileSystem(); testFile.createInProject(); assertFalse(testFile.isInRepository()); testFile.addToVcs(myVcs, ks); assertFalse(testFile.isInRepository()); refreshFileSystem(); commitTransaction(message); assertTrue(testFile.isInRepository()); refreshFileSystem(); } protected void addFile(TestObject testFile) throws IOException, VcsException { addFile(testFile, null); } @Override public boolean isOffline() { return false; } @Override public CommandException processException(CommandException t) { return t; } protected UpdateSettings getUpdateSettings() { return getUpdateSettings(myConfiguration); } protected UpdatedFiles updateProjectDirectory() throws Exception { refreshFileSystem(); UpdatedFiles info = CvsUpdatePolicy.createUpdatedFiles(); CvsCompositeListener cvsCompositeListener = new CvsCompositeListener(); cvsCompositeListener.addCvsListener(CvsMessagesListener.STANDARD_OUTPUT); cvsCompositeListener.addCvsListener(new UpdatedFilesProcessor(info)); UpdateOperation operation = new UpdateOperation(createArrayOn(TestObject.getProjectDirectory().getVirtualFile()), getUpdateSettings(), myProject); CommandCvsHandler handler = new CommandCvsHandler("Update", operation); handler.addCvsListener(cvsCompositeListener); CvsOperationExecutor executor = new CvsOperationExecutor(myProject); executor.performActionSync(handler, CvsOperationExecutorCallback.EMPTY); myErrors = executor.getResult().getErrors(); myWarnings = executor.getResult().getWarnings(); if (!myErrors.isEmpty()) { throw myErrors.iterator().next(); } return info; } public static FilePath[] createArrayOn(VirtualFile file) { return new FilePath[]{VcsUtil.getFilePath(file)}; } }