blob: 9c847376cc9b2d15a90ed8b1f2d703248f574a8b [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.testFramework.vcs;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Getter;
import com.intellij.openapi.vcs.AbstractVcs;
import com.intellij.openapi.vcs.ProjectLevelVcsManager;
import com.intellij.openapi.vcs.VcsDirectoryMapping;
import com.intellij.openapi.vcs.changes.*;
import com.intellij.openapi.vcs.changes.committed.MockAbstractVcs;
import com.intellij.openapi.vcs.changes.committed.MockDelayingChangeProvider;
import com.intellij.openapi.vcs.impl.ProjectLevelVcsManagerImpl;
import com.intellij.openapi.vcs.impl.projectlevelman.AllVcses;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
public class DuringChangeListManagerUpdateTestScheme {
private final MockDelayingChangeProvider myChangeProvider;
private final VcsDirtyScopeManager myDirtyScopeManager;
private final ChangeListManager myClManager;
/**
* call in setUp
*/
public DuringChangeListManagerUpdateTestScheme(final Project project, final String tmpDirPath) {
final MockAbstractVcs vcs = new MockAbstractVcs(project);
myChangeProvider = new MockDelayingChangeProvider();
vcs.setChangeProvider(myChangeProvider);
final File mockVcsRoot = new File(tmpDirPath, "mock");
mockVcsRoot.mkdir();
final VirtualFile vRoot = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(mockVcsRoot);
final ProjectLevelVcsManagerImpl projectLevelVcsManager = (ProjectLevelVcsManagerImpl) ProjectLevelVcsManager.getInstance(project);
projectLevelVcsManager.registerVcs(vcs);
//projectLevelVcsManager.setDirectoryMapping(mockVcsRoot.getAbsolutePath(), vcs.getName());
final ArrayList<VcsDirectoryMapping> list =
new ArrayList<VcsDirectoryMapping>(projectLevelVcsManager.getDirectoryMappings());
list.add(new VcsDirectoryMapping(vRoot.getPath(), vcs.getName()));
projectLevelVcsManager.setDirectoryMappings(list);
AbstractVcs vcsFound = projectLevelVcsManager.findVcsByName(vcs.getName());
final VirtualFile[] roots = projectLevelVcsManager.getRootsUnderVcs(vcsFound);
assert roots.length == 1 : Arrays.asList(roots) + "; " + vcs.getName() + "; " + Arrays.toString(AllVcses.getInstance(project).getAll());
myDirtyScopeManager = VcsDirtyScopeManager.getInstance(project);
myClManager = ChangeListManager.getInstance(project);
}
public void doTest(final Runnable runnable) {
final TimeoutWaiter waiter = new TimeoutWaiter();
final DuringUpdateTest test = new DuringUpdateTest(waiter, runnable);
myChangeProvider.setTest(test);
waiter.setControlled(test);
myDirtyScopeManager.markEverythingDirty();
myClManager.ensureUpToDate(false);
waiter.startTimeout();
if (test.getException() != null) {
test.getException().printStackTrace();
}
assert test.get() : (test.getException() == null ? null : test.getException().getMessage());
}
private class DuringUpdateTest implements Runnable, Getter<Boolean> {
private boolean myDone;
private final TimeoutWaiter myWaiter;
private final Runnable myRunnable;
private Exception myException;
protected DuringUpdateTest(final TimeoutWaiter waiter, final Runnable runnable) {
myWaiter = waiter;
myRunnable = runnable;
}
public void run() {
try {
myRunnable.run();
}
catch (final Exception e) {
myException = e;
}
myDone = myException == null;
myChangeProvider.setTest(null);
myChangeProvider.unlock();
synchronized (myWaiter) {
myWaiter.notifyAll();
}
}
public Exception getException() {
return myException;
}
public Boolean get() {
return myDone;
}
}
public static void checkFilesAreInList(final VirtualFile[] files, final String listName, final ChangeListManager manager) {
checkFilesAreInList(listName, manager, files);
}
public static void checkFilesAreInList(final String listName, final ChangeListManager manager, final VirtualFile... files) {
assert manager.findChangeList(listName) != null;
final LocalChangeList list = manager.findChangeList(listName);
final Collection<Change> changes = list.getChanges();
assert changes.size() == files.length : "size: " + changes.size() + " " + debugRealListContent(list);
for (Change change : changes) {
final VirtualFile vf = change.getAfterRevision().getFile().getVirtualFile();
boolean found = false;
for (VirtualFile file : files) {
if (file.equals(vf)) {
found = true;
break;
}
}
assert found == true : debugRealListContent(list);
}
}
public static void checkDeletedFilesAreInList(final VirtualFile[] files, final String listName, final ChangeListManager manager) {
assert manager.findChangeList(listName) != null;
final LocalChangeList list = manager.findChangeList(listName);
final Collection<Change> changes = list.getChanges();
assert changes.size() == files.length : debugRealListContent(list);
for (Change change : changes) {
final File vf = change.getBeforeRevision().getFile().getIOFile();
boolean found = false;
for (VirtualFile vfile : files) {
final File file = new File(vfile.getPath());
if (file.equals(vf)) {
found = true;
break;
}
}
assert found == true : debugRealListContent(list);
}
}
private static String debugRealListContent(final LocalChangeList list) {
final StringBuilder sb = new StringBuilder(list.getName() + ": ");
final Collection<Change> changeCollection = list.getChanges();
for (Change change : changeCollection) {
sb.append(change.toString()).append(' ');
}
return sb.toString();
}
}