From 6ad9e23e04b471a5cb6066431282815155233266 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Mon, 8 Feb 2010 12:06:54 +0300 Subject: [PATCH] more thorough cleanup --- .../codeInsight/daemon/DaemonAnalyzerTestCase.java | 7 +- .../com/intellij/util/PatchedWeakReference.java | 2 + .../testFramework/LightPlatformTestCase.java | 89 ++++++++++------------ .../intellij/testFramework/PlatformTestCase.java | 55 +++---------- .../fixtures/impl/HeavyIdeaTestFixtureImpl.java | 37 ++------- .../fixtures/impl/LightIdeaTestFixtureImpl.java | 4 +- 6 files changed, 65 insertions(+), 129 deletions(-) diff --git a/java/testFramework/src/com/intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java b/java/testFramework/src/com/intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java index ea6a40a455..431801f908 100644 --- a/java/testFramework/src/com/intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java +++ b/java/testFramework/src/com/intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java @@ -59,6 +59,7 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.UsageSearchContext; import com.intellij.testFramework.ExpectedHighlightingData; import com.intellij.testFramework.FileTreeAccessFilter; +import com.intellij.testFramework.LightPlatformTestCase; import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl; import com.intellij.util.IncorrectOperationException; import gnu.trove.THashMap; @@ -90,7 +91,7 @@ public abstract class DaemonAnalyzerTestCase extends CodeInsightTestCase { enableInspectionTool(tool); } - final InspectionProfileImpl profile = new InspectionProfileImpl(PROFILE) { + final InspectionProfileImpl profile = new InspectionProfileImpl(LightPlatformTestCase.PROFILE) { @NotNull public ModifiableModel getModifiableModel() { mySource = this; @@ -127,10 +128,10 @@ public abstract class DaemonAnalyzerTestCase extends CodeInsightTestCase { }; final InspectionProfileManager inspectionProfileManager = InspectionProfileManager.getInstance(); inspectionProfileManager.addProfile(profile); - inspectionProfileManager.setRootProfile(PROFILE); + inspectionProfileManager.setRootProfile(LightPlatformTestCase.PROFILE); Disposer.register(getProject(), new Disposable() { public void dispose() { - inspectionProfileManager.deleteProfile(PROFILE); + inspectionProfileManager.deleteProfile(LightPlatformTestCase.PROFILE); } }); InspectionProjectProfileManager.getInstance(getProject()).updateProfile(profile); diff --git a/platform/platform-impl/src/com/intellij/util/PatchedWeakReference.java b/platform/platform-impl/src/com/intellij/util/PatchedWeakReference.java index e419ad49b3..1401cbda83 100644 --- a/platform/platform-impl/src/com/intellij/util/PatchedWeakReference.java +++ b/platform/platform-impl/src/com/intellij/util/PatchedWeakReference.java @@ -17,6 +17,7 @@ package com.intellij.util; import com.intellij.concurrency.JobScheduler; import com.intellij.openapi.diagnostic.Logger; +import org.jetbrains.annotations.TestOnly; import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; @@ -83,6 +84,7 @@ public class PatchedWeakReference extends WeakReference{ } } + @TestOnly public static void clearAll() { synchronized (ourQueue) { while (ourQueue.poll() != null); diff --git a/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java b/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java index de93fbf7b0..7fc5616a24 100644 --- a/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java +++ b/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java @@ -17,6 +17,7 @@ package com.intellij.testFramework; import com.intellij.ProjectTopics; import com.intellij.codeHighlighting.HighlightDisplayLevel; +import com.intellij.codeInsight.completion.CompletionProgressIndicator; import com.intellij.codeInsight.daemon.HighlightDisplayKey; import com.intellij.codeInsight.lookup.LookupManager; import com.intellij.codeInspection.InspectionProfileEntry; @@ -60,17 +61,14 @@ import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; -import com.intellij.openapi.vfs.impl.VirtualFilePointerManagerImpl; import com.intellij.openapi.vfs.newvfs.ManagingFS; import com.intellij.openapi.vfs.newvfs.persistent.PersistentFS; -import com.intellij.openapi.vfs.pointers.VirtualFilePointerManager; import com.intellij.profile.codeInspection.InspectionProfileManager; import com.intellij.profile.codeInspection.InspectionProjectProfileManager; import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.psi.impl.PsiDocumentManagerImpl; -import com.intellij.psi.impl.PsiManagerEx; import com.intellij.psi.impl.PsiManagerImpl; import com.intellij.psi.impl.source.tree.injected.InjectedLanguageManagerImpl; import com.intellij.util.IncorrectOperationException; @@ -98,7 +96,7 @@ import java.util.Map; * @author yole */ public abstract class LightPlatformTestCase extends UsefulTestCase implements DataProvider { - protected static final String PROFILE = "Configurable"; + public static final String PROFILE = "Configurable"; private static IdeaTestApplication ourApplication; protected static Project ourProject; private static Module ourModule; @@ -141,20 +139,8 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da ourApplication.setDataProvider(dataProvider); } - private void cleanupApplicationCaches() { - ((VirtualFilePointerManagerImpl)VirtualFilePointerManager.getInstance()).cleanupForNextTest(); - if (ourProject != null) { - ((UndoManagerImpl)UndoManager.getInstance(ourProject)).dropHistoryInTests(); - ((PsiManagerEx)getPsiManager()).getFileManager().cleanupForNextTest(); - } - - resetAllFields(); - - /* - if (ourPsiManager != null) { - ((PsiManagerImpl)ourPsiManager).cleanupForNextTest(); - } - */ + public static IdeaTestApplication getApplication() { + return ourApplication; } protected void resetAllFields() { @@ -219,7 +205,7 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da FileBasedIndex.getInstance().registerIndexableSet(new IndexableFileSet() { public boolean isInSet(final VirtualFile file) { - return file.getFileSystem() == ourSourceRoot.getFileSystem(); + return ourSourceRoot != null && file.getFileSystem() == ourSourceRoot.getFileSystem(); } public void iterateIndexableFilesIn(final VirtualFile file, final ContentIterator iterator) { @@ -272,7 +258,6 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da }); - //((PsiManagerImpl) PsiManager.getInstance(ourProject)).runPreStartupActivity(); ((StartupManagerImpl)StartupManager.getInstance(getProject())).runStartupActivities(); } }); @@ -390,12 +375,9 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da } protected void tearDown() throws Exception { - ((StartupManagerImpl)StartupManager.getInstance(getProject())).prepareForNextTest(); - checkAllTimersAreDisposed(); - CodeStyleSettingsManager.getInstance(getProject()).dropTemporarySettings(); checkForSettingsDamage(); - doTearDown(); + doTearDown(getProject(), ourApplication, true); super.tearDown(); @@ -403,56 +385,66 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da checkInjectorsAreDisposed(); } - public static void doTearDown() throws Exception { - UsefulTestCase.doPostponedFormatting(ourProject); + public static void doTearDown(Project project, IdeaTestApplication application, boolean checkForEditors) throws Exception { + checkAllTimersAreDisposed(); + UsefulTestCase.doPostponedFormatting(project); - LookupManager.getInstance(ourProject).hideActiveLookup(); + LookupManager lookupManager = LookupManager.getInstance(project); + if (lookupManager != null) { + lookupManager.hideActiveLookup(); + } + ((StartupManagerImpl)StartupManager.getInstance(project)).prepareForNextTest(); InspectionProfileManager.getInstance().deleteProfile(PROFILE); assertNotNull("Application components damaged", ProjectManager.getInstance()); ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { - try { - final VirtualFile[] children = ourSourceRoot.getChildren(); - for (VirtualFile child : children) { - child.delete(this); + if (ourSourceRoot != null) { + try { + final VirtualFile[] children = ourSourceRoot.getChildren(); + for (VirtualFile child : children) { + child.delete(this); + } + } + catch (IOException e) { + //noinspection CallToPrintStackTrace + e.printStackTrace(); } - } - catch (IOException e) { - //noinspection CallToPrintStackTrace - e.printStackTrace(); } FileDocumentManager manager = FileDocumentManager.getInstance(); if (manager instanceof FileDocumentManagerImpl) { ((FileDocumentManagerImpl)manager).dropAllUnsavedDocuments(); } + ApplicationManager.getApplication().runWriteAction(EmptyRunnable.getInstance()); // Flash posponed formatting if any. + manager.saveAllDocuments(); } }); -// final Project[] openProjects = ProjectManagerEx.getInstanceEx().getOpenProjects(); -// assertTrue(Arrays.asList(openProjects).contains(ourProject)); - assertFalse(PsiManager.getInstance(getProject()).isDisposed()); + assertFalse(PsiManager.getInstance(project).isDisposed()); if (!ourAssertionsInTestDetected) { if (IdeaLogger.ourErrorsOccurred != null) { throw IdeaLogger.ourErrorsOccurred; } - //assertTrue("Logger errors occurred. ", IdeaLogger.ourErrorsOccurred == null); } - ((PsiDocumentManagerImpl)PsiDocumentManager.getInstance(getProject())).clearUncommitedDocuments(); + ((PsiDocumentManagerImpl)PsiDocumentManager.getInstance(project)).clearUncommitedDocuments(); ((UndoManagerImpl)UndoManager.getGlobalInstance()).dropHistoryInTests(); ProjectManagerEx.getInstanceEx().setCurrentTestProject(null); - ourApplication.setDataProvider(null); + application.setDataProvider(null); ourTestCase = null; - ((PsiManagerImpl)ourPsiManager).cleanupForNextTest(); + ((PsiManagerImpl)PsiManager.getInstance(project)).cleanupForNextTest(); - final Editor[] allEditors = EditorFactory.getInstance().getAllEditors(); - if (allEditors.length > 0) { - for (Editor allEditor : allEditors) { - EditorFactory.getInstance().releaseEditor(allEditor); + CompletionProgressIndicator.cleanupForNextTest(); + + if (checkForEditors) { + final Editor[] allEditors = EditorFactory.getInstance().getAllEditors(); + if (allEditors.length > 0) { + for (Editor allEditor : allEditors) { + EditorFactory.getInstance().releaseEditor(allEditor); + } + fail("Unreleased editors: " + allEditors.length); } - fail("Unreleased editors: " + allEditors.length); } } @@ -475,7 +467,8 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da finally { ourTestThread = null; try { - cleanupApplicationCaches(); + PlatformTestCase.cleanupApplicationCaches(ourProject); + resetAllFields(); } catch (Throwable e) { e.printStackTrace(); diff --git a/platform/testFramework/src/com/intellij/testFramework/PlatformTestCase.java b/platform/testFramework/src/com/intellij/testFramework/PlatformTestCase.java index 99078b1e60..0a7b73f1d2 100644 --- a/platform/testFramework/src/com/intellij/testFramework/PlatformTestCase.java +++ b/platform/testFramework/src/com/intellij/testFramework/PlatformTestCase.java @@ -15,8 +15,6 @@ */ package com.intellij.testFramework; -import com.intellij.codeInsight.completion.CompletionProgressIndicator; -import com.intellij.codeInsight.lookup.LookupManager; import com.intellij.ide.highlighter.ModuleFileType; import com.intellij.ide.highlighter.ProjectFileType; import com.intellij.ide.startup.impl.StartupManagerImpl; @@ -32,10 +30,6 @@ import com.intellij.openapi.command.impl.UndoManagerImpl; import com.intellij.openapi.command.undo.UndoManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.editor.EditorFactory; -import com.intellij.openapi.editor.impl.EditorFactoryImpl; -import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.module.EmptyModuleType; import com.intellij.openapi.module.Module; @@ -43,7 +37,6 @@ import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.module.ModuleType; import com.intellij.openapi.module.impl.ModuleManagerImpl; import com.intellij.openapi.project.Project; -import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.project.ex.ProjectManagerEx; import com.intellij.openapi.project.impl.TooManyProjectLeakedException; import com.intellij.openapi.projectRoots.Sdk; @@ -61,13 +54,12 @@ import com.intellij.openapi.vfs.impl.local.LocalFileSystemImpl; import com.intellij.openapi.vfs.newvfs.ManagingFS; import com.intellij.openapi.vfs.newvfs.persistent.PersistentFS; import com.intellij.openapi.vfs.pointers.VirtualFilePointerManager; -import com.intellij.profile.codeInspection.InspectionProfileManager; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; -import com.intellij.psi.impl.PsiDocumentManagerImpl; +import com.intellij.psi.impl.PsiManagerEx; import com.intellij.util.PatchedWeakReference; import junit.framework.TestCase; import org.jetbrains.annotations.NonNls; @@ -85,7 +77,6 @@ import java.util.HashSet; * @author yole */ public abstract class PlatformTestCase extends UsefulTestCase implements DataProvider { - protected static final String PROFILE = "Configurable"; protected static IdeaTestApplication ourApplication; protected boolean myRunCommandForTest = false; protected ProjectManagerEx myProjectManager; @@ -265,7 +256,12 @@ public abstract class PlatformTestCase extends UsefulTestCase implements DataPro return EmptyModuleType.getInstance(); } - private void cleanupApplicationCaches() { + public static void cleanupApplicationCaches(Project project) { + if (project != null) { + ((UndoManagerImpl)UndoManager.getInstance(project)).dropHistoryInTests(); + ((PsiManagerEx)PsiManager.getInstance(project)).getFileManager().cleanupForNextTest(); + } + try { LocalFileSystemImpl localFileSystem = (LocalFileSystemImpl)LocalFileSystem.getInstance(); if (localFileSystem != null) { @@ -280,37 +276,17 @@ public abstract class PlatformTestCase extends UsefulTestCase implements DataPro virtualFilePointerManager.cleanupForNextTest(); } PatchedWeakReference.clearAll(); - resetAllFields(); } protected void tearDown() throws Exception { - checkAllTimersAreDisposed(); - if (myProject != null) { - ((StartupManagerImpl)StartupManager.getInstance(myProject)).prepareForNextTest(); - final LookupManager lookupManager = LookupManager.getInstance(myProject); - if (lookupManager != null) { - lookupManager.hideActiveLookup(); - } + LightPlatformTestCase.doTearDown(getProject(), ourApplication, true); - ((PsiDocumentManagerImpl)PsiDocumentManager.getInstance(getProject())).clearUncommitedDocuments(); - } - - InspectionProfileManager.getInstance().deleteProfile(PROFILE); try { checkForSettingsDamage(); - assertNotNull("Application components damaged", ProjectManager.getInstance()); - - ApplicationManager.getApplication().runWriteAction(EmptyRunnable.getInstance()); // Flash posponed formatting if any. - FileDocumentManager.getInstance().saveAllDocuments(); - - doPostponedFormatting(myProject); - try { disposeProject(); - ((UndoManagerImpl)UndoManager.getGlobalInstance()).dropHistoryInTests(); - for (final File fileToDelete : myFilesToDelete) { delete(fileToDelete); } @@ -331,25 +307,13 @@ public abstract class PlatformTestCase extends UsefulTestCase implements DataPro } assertTrue("Logger errors occurred in " + getFullName(), IdeaLogger.ourErrorsOccurred == null); } - - ourApplication.setDataProvider(null); - } finally { ourTestCase = null; } - CompletionProgressIndicator.cleanupForNextTest(); super.tearDown(); - EditorFactory editorFactory = EditorFactory.getInstance(); - final Editor[] allEditors = editorFactory.getAllEditors(); - ((EditorFactoryImpl)editorFactory).validateEditorsAreReleased(getProject()); - for (Editor editor : allEditors) { - editorFactory.releaseEditor(editor); - } - assertEquals(0, allEditors.length); - //cleanTheWorld(); myEditorListenerTracker.checkListenersLeak(); myThreadTracker.checkLeak(); @@ -450,7 +414,8 @@ public abstract class PlatformTestCase extends UsefulTestCase implements DataPro try { ApplicationManager.getApplication().invokeAndWait(new Runnable() { public void run() { - cleanupApplicationCaches(); + cleanupApplicationCaches(getProject()); + resetAllFields(); } }, ModalityState.NON_MODAL); } diff --git a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/HeavyIdeaTestFixtureImpl.java b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/HeavyIdeaTestFixtureImpl.java index 8208c880c3..73e9eeaa93 100644 --- a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/HeavyIdeaTestFixtureImpl.java +++ b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/HeavyIdeaTestFixtureImpl.java @@ -16,7 +16,6 @@ package com.intellij.testFramework.fixtures.impl; -import com.intellij.codeInsight.completion.CompletionProgressIndicator; import com.intellij.ide.highlighter.ProjectFileType; import com.intellij.ide.startup.impl.StartupManagerImpl; import com.intellij.idea.IdeaTestApplication; @@ -24,10 +23,6 @@ import com.intellij.openapi.actionSystem.DataProvider; import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.WriteCommandAction; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.editor.EditorFactory; -import com.intellij.openapi.editor.impl.EditorFactoryImpl; -import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.fileEditor.OpenFileDescriptor; import com.intellij.openapi.module.Module; @@ -36,17 +31,15 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ex.ProjectManagerEx; import com.intellij.openapi.startup.StartupManager; import com.intellij.openapi.util.Disposer; -import com.intellij.openapi.util.EmptyRunnable; 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.VirtualFile; -import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; -import com.intellij.psi.impl.PsiDocumentManagerImpl; import com.intellij.testFramework.EditorListenerTracker; +import com.intellij.testFramework.LightPlatformTestCase; import com.intellij.testFramework.PlatformTestCase; import com.intellij.testFramework.ThreadTracker; import com.intellij.testFramework.builders.ModuleFixtureBuilder; @@ -94,20 +87,12 @@ class HeavyIdeaTestFixtureImpl extends BaseFixture implements HeavyIdeaTestFixtu } public void tearDown() throws Exception { - ((StartupManagerImpl)StartupManager.getInstance(getProject())).prepareForNextTest(); - checkAllTimersAreDisposed(); - ((PsiDocumentManagerImpl)PsiDocumentManager.getInstance(getProject())).clearUncommitedDocuments(); + LightPlatformTestCase.doTearDown(getProject(), myApplication, false); - for (ModuleFixtureBuilder moduleFixtureBuilder: myModuleFixtureBuilders) { + for (ModuleFixtureBuilder moduleFixtureBuilder : myModuleFixtureBuilders) { moduleFixtureBuilder.getFixture().tearDown(); } - ProjectManagerEx.getInstanceEx().setCurrentTestProject(null); - ApplicationManager.getApplication().runWriteAction(EmptyRunnable.getInstance()); // Flash posponed formatting if any. - FileDocumentManager.getInstance().saveAllDocuments(); - - doPostponedFormatting(myProject); - Runnable runnable = new Runnable() { public void run() { ApplicationManager.getApplication().runWriteAction(new Runnable() { @@ -119,25 +104,15 @@ class HeavyIdeaTestFixtureImpl extends BaseFixture implements HeavyIdeaTestFixtu }; if (ApplicationManager.getApplication().isDispatchThread()) { runnable.run(); - } else { + } + else { SwingUtilities.invokeAndWait(runnable); } for (final File fileToDelete : myFilesToDelete) { boolean deleted = FileUtil.delete(fileToDelete); - assert deleted : "Can't delete "+fileToDelete; - } - - myApplication.setDataProvider(null); - - EditorFactory editorFactory = EditorFactory.getInstance(); - final Editor[] allEditors = editorFactory.getAllEditors(); - ((EditorFactoryImpl)editorFactory).validateEditorsAreReleased(getProject()); - for (Editor editor : allEditors) { - editorFactory.releaseEditor(editor); + assert deleted : "Can't delete " + fileToDelete; } - assert 0 == editorFactory.getAllEditors().length : "There are unrealeased editors"; - CompletionProgressIndicator.cleanupForNextTest(); super.tearDown(); diff --git a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/LightIdeaTestFixtureImpl.java b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/LightIdeaTestFixtureImpl.java index 809a44a562..995b6cafd1 100644 --- a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/LightIdeaTestFixtureImpl.java +++ b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/LightIdeaTestFixtureImpl.java @@ -35,7 +35,7 @@ import org.jetbrains.annotations.Nullable; * @author mike */ class LightIdeaTestFixtureImpl extends BaseFixture implements LightIdeaTestFixture { - private LightProjectDescriptor myProjectDescriptor; + private final LightProjectDescriptor myProjectDescriptor; public LightIdeaTestFixtureImpl(LightProjectDescriptor projectDescriptor) { myProjectDescriptor = projectDescriptor; @@ -68,7 +68,7 @@ class LightIdeaTestFixtureImpl extends BaseFixture implements LightIdeaTestFixtu public void tearDown() throws Exception { CodeStyleSettingsManager.getInstance(getProject()).dropTemporarySettings(); checkForSettingsDamage(); - LightPlatformTestCase.doTearDown(); + LightPlatformTestCase.doTearDown(getProject(), LightPlatformTestCase.getApplication(), true); super.tearDown(); } -- 2.11.4.GIT