can have multiple test projects open

This commit is contained in:
Alexey Kudravtsev
2012-06-01 12:22:19 +04:00
parent b2b090c297
commit e3928791c1
8 changed files with 43 additions and 37 deletions
@@ -37,7 +37,7 @@ public class OrderEntryTest extends DaemonAnalyzerTestCase {
VirtualFile projectFile = tempProjectRootDir.findChild("orderEntry.ipr");
myProject = ProjectManagerEx.getInstanceEx().loadProject(projectFile.getPath());
ProjectManagerEx.getInstanceEx().setCurrentTestProject(myProject);
ProjectManagerEx.getInstanceEx().openTestProject(myProject);
ModuleManagerImpl mm = (ModuleManagerImpl)ModuleManager.getInstance(myProject);
mm.projectOpened();
setUpJdk();
@@ -42,7 +42,7 @@ public class GotoImplementationTest extends CodeInsightTestCase {
myProject = ProjectManagerEx.getInstanceEx().loadProject(projectFile.getPath());
simulateProjectOpen();
ProjectManagerEx.getInstanceEx().setCurrentTestProject(myProject);
ProjectManagerEx.getInstanceEx().openTestProject(myProject);
}
@Override
@@ -80,7 +80,7 @@ public class UpdateCacheTest extends PsiTestCase{
setUpJdk();
myProjectManager.setCurrentTestProject(myProject);
myProjectManager.openTestProject(myProject);
runStartupActivities();
}
@@ -175,7 +175,7 @@ public class UpdateCacheTest extends PsiTestCase{
((InjectedLanguageManagerImpl)InjectedLanguageManager.getInstance(getProject())).pushInjectors();
setUpModule();
setUpJdk();
ProjectManagerEx.getInstanceEx().setCurrentTestProject(myProject);
ProjectManagerEx.getInstanceEx().openTestProject(myProject);
runStartupActivities();
PsiTestUtil.addSourceContentToRoots(getModule(), content);
@@ -51,12 +51,10 @@ public abstract class ProjectManagerEx extends ProjectManager {
public abstract void blockReloadingProjectOnExternalChanges();
public abstract void unblockReloadingProjectOnExternalChanges();
@Nullable
@TestOnly
public abstract Project getCurrentTestProject();
public abstract void openTestProject(@NotNull Project project);
@TestOnly
public abstract void setCurrentTestProject(@Nullable Project project);
public abstract void closeTestProject(@NotNull Project project);
// returns true on success
public abstract boolean closeAndDispose(@NotNull Project project);
@@ -64,6 +64,7 @@ import com.intellij.util.io.fs.IFile;
import com.intellij.util.messages.MessageBus;
import com.intellij.util.messages.MessageBusConnection;
import com.intellij.util.ui.UIUtil;
import gnu.trove.THashSet;
import gnu.trove.TObjectLongHashMap;
import org.jdom.Element;
import org.jdom.JDOMException;
@@ -95,7 +96,7 @@ public class ProjectManagerImpl extends ProjectManagerEx implements NamedJDOMExt
private Project[] myOpenProjectsArrayCache = {};
private final List<ProjectManagerListener> myListeners = ContainerUtil.createEmptyCOWList();
private Project myCurrentTestProject = null;
private final Set<Project> myTestProjects = new THashSet<Project>();
private final Map<VirtualFile, byte[]> mySavedCopies = new HashMap<VirtualFile, byte[]>();
private final TObjectLongHashMap<VirtualFile> mySavedTimestamps = new TObjectLongHashMap<VirtualFile>();
@@ -382,10 +383,7 @@ public class ProjectManagerImpl extends ProjectManagerEx implements NamedJDOMExt
LOG.error("Open projects cache corrupted. Open projects: "+myOpenProjects+"; cache: "+Arrays.asList(myOpenProjectsArrayCache));
}
if (ApplicationManager.getApplication().isUnitTestMode()) {
Project currentTestProject = myCurrentTestProject;
if (currentTestProject != null && !currentTestProject.isDisposed()) {
return ArrayUtil.append(myOpenProjectsArrayCache, currentTestProject);
}
return ArrayUtil.mergeArrays(myOpenProjectsArrayCache, myTestProjects.toArray(new Project[myTestProjects.size()]));
}
return myOpenProjectsArrayCache;
}
@@ -393,10 +391,7 @@ public class ProjectManagerImpl extends ProjectManagerEx implements NamedJDOMExt
@Override
public boolean isProjectOpened(Project project) {
if (ApplicationManager.getApplication().isUnitTestMode() && myCurrentTestProject != null) {
return project == myCurrentTestProject || myOpenProjects.contains(project);
}
return myOpenProjects.contains(project);
return ApplicationManager.getApplication().isUnitTestMode() && myTestProjects.contains(project) || myOpenProjects.contains(project);
}
@Override
@@ -799,16 +794,29 @@ public class ProjectManagerImpl extends ProjectManagerEx implements NamedJDOMExt
}
@Override
public void setCurrentTestProject(@Nullable final Project project) {
public void openTestProject(@NotNull final Project project) {
assert ApplicationManager.getApplication().isUnitTestMode();
myCurrentTestProject = project;
myTestProjects.add(project);
}
@Override
@Nullable
public Project getCurrentTestProject() {
public void closeTestProject(@NotNull Project project) {
assert ApplicationManager.getApplication().isUnitTestMode();
return myCurrentTestProject;
myTestProjects.remove(project);
}
@TestOnly
public void assertTestProjectsClosed() {
assert ApplicationManager.getApplication().isUnitTestMode();
if (!myTestProjects.isEmpty()) {
try {
Project project = myTestProjects.iterator().next();
throw new AssertionError("Test project is not disposed: " + project);
}
finally {
myTestProjects.clear();
}
}
}
@Override
@@ -993,7 +1001,7 @@ public class ProjectManagerImpl extends ProjectManagerEx implements NamedJDOMExt
myOpenProjects.remove(project);
cacheOpenProjects();
}
myCurrentTestProject = null;
myTestProjects.remove(project);
myChangedProjectFiles.remove(project);
@@ -71,7 +71,7 @@ import com.intellij.openapi.util.ShutDownTracker;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.openapi.vfs.encoding.EncodingManager;
@@ -92,7 +92,6 @@ import com.intellij.util.IncorrectOperationException;
import com.intellij.util.LocalTimeCounter;
import com.intellij.util.containers.CollectionFactory;
import com.intellij.util.indexing.FileBasedIndex;
import com.intellij.util.indexing.FileBasedIndexImpl;
import com.intellij.util.indexing.IndexableFileSet;
import com.intellij.util.messages.MessageBusConnection;
import com.intellij.util.ui.UIUtil;
@@ -234,7 +233,7 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da
throw new RuntimeException(e);
}
((FileBasedIndexImpl)FileBasedIndex.getInstance()).registerIndexableSet(new IndexableFileSet() {
FileBasedIndex.getInstance().registerIndexableSet(new IndexableFileSet() {
@Override
public boolean isInSet(@NotNull final VirtualFile file) {
return ourSourceRoot != null && file.getFileSystem() == ourSourceRoot.getFileSystem() && ourProject.isOpen();
@@ -335,7 +334,7 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da
((ProjectImpl)ourProject).setTemporarilyDisposed(false);
ProjectManagerEx projectManagerEx = ProjectManagerEx.getInstanceEx();
projectManagerEx.setCurrentTestProject(ourProject);
projectManagerEx.openTestProject(ourProject);
((PsiDocumentManagerImpl)PsiDocumentManager.getInstance(getProject())).clearUncommitedDocuments();
@@ -404,8 +403,7 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da
catch (Exception e) {
}
assertTrue("open: "+getProject().isOpen()+"; disposed:"+getProject().isDisposed()+"; startup passed:"+ passed+"; testProjectIsOurProject:"+(getProject() == projectManagerEx
.getCurrentTestProject())+"; all open projects: "+
assertTrue("open: "+getProject().isOpen()+"; disposed:"+getProject().isDisposed()+"; startup passed:"+ passed+"; all open projects: "+
Arrays.asList(ProjectManager.getInstance().getOpenProjects()), getProject().isInitialized());
CodeStyleSettingsManager.getInstance(getProject()).setTemporarySettings(new CodeStyleSettings());
@@ -461,7 +459,7 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da
}
}
public static void doTearDown(final Project project, IdeaTestApplication application, boolean checkForEditors) throws Exception {
public static void doTearDown(@NotNull final Project project, IdeaTestApplication application, boolean checkForEditors) throws Exception {
DocumentCommitThread.getInstance().clearQueue();
CodeStyleSettingsManager.getInstance(project).dropTemporarySettings();
checkAllTimersAreDisposed();
@@ -526,7 +524,7 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da
TemplateDataLanguageMappings.getInstance(project).cleanupForNextTest();
ProjectManagerEx.getInstanceEx().setCurrentTestProject(null);
ProjectManagerEx.getInstanceEx().closeTestProject(project);
application.setDataProvider(null);
ourTestCase = null;
((PsiManagerImpl)PsiManager.getInstance(project)).cleanupForNextTest();
@@ -705,7 +703,7 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da
ApplicationManager.getApplication().assertWriteAccessAllowed();
((ProjectImpl)ourProject).setTemporarilyDisposed(false);
final VirtualFile projFile = ((ProjectEx)ourProject).getStateStore().getProjectFile();
final File projectFile = projFile == null ? null : VfsUtil.virtualToIoFile(projFile);
final File projectFile = projFile == null ? null : VfsUtilCore.virtualToIoFile(projFile);
if (!ourProject.isDisposed()) Disposer.dispose(ourProject);
if (projectFile != null) {
@@ -44,6 +44,7 @@ import com.intellij.openapi.module.ModuleType;
import com.intellij.openapi.module.impl.ModuleManagerImpl;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ex.ProjectManagerEx;
import com.intellij.openapi.project.impl.ProjectManagerImpl;
import com.intellij.openapi.project.impl.TooManyProjectLeakedException;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ModifiableRootModel;
@@ -180,11 +181,11 @@ public abstract class PlatformTestCase extends UsefulTestCase implements DataPro
myThreadTracker = new ThreadTracker();
setUpProject();
ProjectManagerEx.getInstanceEx().setCurrentTestProject(myProject);
storeSettings();
ourTestCase = this;
if (myProject != null) {
ProjectManagerEx.getInstanceEx().openTestProject(myProject);
CodeStyleSettingsManager.getInstance(myProject).setTemporarySettings(new CodeStyleSettings());
((InjectedLanguageManagerImpl)InjectedLanguageManager.getInstance(myProject)).pushInjectors();
}
@@ -212,7 +213,7 @@ public abstract class PlatformTestCase extends UsefulTestCase implements DataPro
File projectFile = getIprFile();
myProject = createProject(projectFile, getClass().getName() + "." + getName());
myProjectManager.setCurrentTestProject(myProject);
myProjectManager.openTestProject(myProject);
LocalFileSystem.getInstance().refreshIoFiles(myFilesToDelete);
setUpModule();
@@ -482,8 +483,9 @@ public abstract class PlatformTestCase extends UsefulTestCase implements DataPro
public void run() {
Disposer.dispose(myProject);
ProjectManagerEx projectManager = ProjectManagerEx.getInstanceEx();
if (projectManager != null) {
projectManager.setCurrentTestProject(null);
if (projectManager instanceof ProjectManagerImpl) {
projectManager.closeTestProject(myProject);
((ProjectManagerImpl)projectManager).assertTestProjectsClosed();
}
}
});
@@ -162,7 +162,7 @@ class HeavyIdeaTestFixtureImpl extends BaseFixture implements HeavyIdeaTestFixtu
sm.startCacheUpdate();
sm.runPostStartupActivities();
ProjectManagerEx.getInstanceEx().setCurrentTestProject(myProject);
ProjectManagerEx.getInstanceEx().openTestProject(myProject);
((PsiDocumentManagerImpl)PsiDocumentManager.getInstance(myProject)).clearUncommitedDocuments();
}
}.execute().throwException();