memory leaks in fixtures: remove added sdk after test finishes

This commit is contained in:
Alexey Kudravtsev
2017-09-13 14:04:22 +03:00
parent f7d66216e7
commit 1ce2d76658
5 changed files with 73 additions and 14 deletions

View File

@@ -20,6 +20,7 @@ import com.intellij.openapi.components.ExpandMacroToPathMap;
import com.intellij.openapi.components.impl.ComponentManagerImpl;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.fileEditor.ex.FileEditorProviderManager;
import com.intellij.openapi.fileEditor.impl.EditorHistoryManager;
import com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl;
import com.intellij.openapi.fileEditor.impl.FileEditorProviderManagerImpl;
import com.intellij.openapi.util.Disposer;
@@ -73,6 +74,9 @@ public abstract class FileEditorManagerTestCase extends LightPlatformCodeInsight
myOldDockContainers = null;
((ComponentManagerImpl)getProject()).registerComponentInstance(FileEditorManager.class, myOldManager);
myManager.closeAllFiles();
for (VirtualFile file : EditorHistoryManager.getInstance(getProject()).getFiles()) {
EditorHistoryManager.getInstance(getProject()).removeFile(file);
}
((FileEditorProviderManagerImpl)FileEditorProviderManager.getInstance()).clearSelectedProviders();
}
finally {
@@ -82,11 +86,6 @@ public abstract class FileEditorManagerTestCase extends LightPlatformCodeInsight
}
}
@Override
protected boolean isWriteActionRequired() {
return false;
}
protected VirtualFile getFile(String path) {
String fullPath = getTestDataPath() + path;
VirtualFile file = LocalFileSystem.getInstance().refreshAndFindFileByPath(fullPath);

View File

@@ -15,6 +15,7 @@
*/
package com.intellij.testFramework;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.application.RunResult;
@@ -34,6 +35,7 @@ import com.intellij.openapi.roots.impl.libraries.ProjectLibraryTable;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.roots.libraries.LibraryTable;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
@@ -247,6 +249,20 @@ public class PsiTestUtil {
public static void addLibrary(Module module, String libName, String libPath, String... jarArr) {
ModuleRootModificationUtil.updateModel(module, model -> addLibrary(module, model, libName, libPath, jarArr));
}
public static void addLibrary(@NotNull Disposable parent, Module module, String libName, String libPath, String... jarArr) {
Ref<Library> ref = new Ref<>();
ModuleRootModificationUtil.updateModel(module, model -> ref.set(addLibrary(module, model, libName, libPath, jarArr)));
Disposer.register(parent, () -> {
Library library = ref.get();
ModuleRootModificationUtil.updateModel(module, model -> model.removeOrderEntry(model.findLibraryOrderEntry(library)));
WriteCommandAction.runWriteCommandAction(null, ()-> {
LibraryTable table = ProjectLibraryTable.getInstance(module.getProject());
LibraryTable.ModifiableModel model = table.getModifiableModel();
model.removeLibrary(library);
model.commit();
});
});
}
public static void addProjectLibrary(Module module, String libName, List<String> classesRootPaths) {
List<VirtualFile> roots = ContainerUtil.map(classesRootPaths, path -> VirtualFileManager.getInstance().refreshAndFindFileByUrl(VfsUtil.getUrlForLibraryRoot(new File(path))));
@@ -263,6 +279,7 @@ public class PsiTestUtil {
return result.get();
}
@NotNull
private static Library addProjectLibrary(Module module,
ModifiableRootModel model,
String libName,
@@ -302,11 +319,12 @@ public class PsiTestUtil {
return result.getResultObject();
}
public static void addLibrary(Module module,
ModifiableRootModel model,
String libName,
String libPath,
String... jarArr) {
@NotNull
public static Library addLibrary(Module module,
ModifiableRootModel model,
String libName,
String libPath,
String... jarArr) {
List<VirtualFile> classesRoots = new ArrayList<>();
for (String jar : jarArr) {
if (!libPath.endsWith("/") && !jar.startsWith("/")) {
@@ -323,7 +341,7 @@ public class PsiTestUtil {
assert root != null : "Library root folder not found: " + path + "!/";
classesRoots.add(root);
}
addProjectLibrary(module, model, libName, classesRoots, Collections.emptyList());
return addProjectLibrary(module, model, libName, classesRoots, Collections.emptyList());
}
public static void addLibrary(Module module,

View File

@@ -26,6 +26,8 @@ import com.intellij.ide.structureView.newStructureView.StructureViewComponent
import com.intellij.ide.util.treeView.AbstractTreeNode
import com.intellij.openapi.application.PluginPathManager
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx
import com.intellij.openapi.fileEditor.impl.EditorHistoryManager
import com.intellij.openapi.fileTypes.StdFileTypes
import com.intellij.openapi.util.Disposer
import com.intellij.openapi.util.io.FileUtil
@@ -45,6 +47,14 @@ class IdeaDecompilerTest : LightCodeInsightFixtureTestCase() {
myFixture.testDataPath = "${PluginPathManager.getPluginHomePath("java-decompiler")}/plugin/testData"
}
override fun tearDown() {
FileEditorManagerEx.getInstanceEx(project).closeAllFiles()
for (file in EditorHistoryManager.getInstance(project).files) {
EditorHistoryManager.getInstance(project).removeFile(file)
}
super.tearDown()
}
fun testSimple() {
val file = getTestFile("${PlatformTestUtil.getRtJarPath()}!/java/lang/String.class")
val decompiled = IdeaDecompiler().getText(file).toString()

View File

@@ -16,6 +16,8 @@
package com.jetbrains.python.pyi;
import com.intellij.codeInspection.LocalInspectionTool;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.util.Disposer;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiFile;
import com.jetbrains.python.fixtures.PyTestCase;
@@ -27,6 +29,18 @@ import org.jetbrains.annotations.NotNull;
* @author vlan
*/
public class PyiInspectionsTest extends PyTestCase {
private Disposable myRootsDisposable;
@Override
protected void tearDown() throws Exception {
if (myRootsDisposable != null) {
Disposer.dispose(myRootsDisposable);
myRootsDisposable = null;
}
super.tearDown();
}
private void doTestByExtension(@NotNull Class<? extends LocalInspectionTool> inspectionClass, @NotNull String extension) {
doTestByFileName(inspectionClass, getTestName(false) + extension);
}
@@ -106,7 +120,7 @@ public class PyiInspectionsTest extends PyTestCase {
}
public void testPyiRelativeImports() {
PyiTypeTest.addPyiStubsToContentRoot(myFixture);
myRootsDisposable = PyiTypeTest.addPyiStubsToContentRoot(myFixture);
doTestByFileName(PyUnresolvedReferencesInspection.class, "package_with_stub_in_path/a.pyi");
}
}

View File

@@ -15,8 +15,11 @@
*/
package com.jetbrains.python.pyi;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ContentEntry;
import com.intellij.openapi.roots.ModuleRootModificationUtil;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.vfs.StandardFileSystems;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDocumentManager;
@@ -35,12 +38,23 @@ import org.jetbrains.annotations.Nullable;
* @author vlan
*/
public class PyiTypeTest extends PyTestCase {
public static void addPyiStubsToContentRoot(CodeInsightTestFixture fixture) {
private Disposable myDisposable;
// return Disposable which undoes configuration
public static Disposable addPyiStubsToContentRoot(CodeInsightTestFixture fixture) {
final String path = fixture.getTestDataPath() + "/pyi/pyiStubs";
final VirtualFile file = StandardFileSystems.local().refreshAndFindFileByPath(path);
assertNotNull(file);
file.refresh(false, true);
ModuleRootModificationUtil.addContentRoot(fixture.getModule(), path);
return ()->ModuleRootModificationUtil.updateModel(fixture.getModule(), model -> {
for (ContentEntry entry : model.getContentEntries()) {
if (file.equals(entry.getFile())) {
model.removeContentEntry(entry);
}
}
});
}
@Nullable
@@ -57,6 +71,10 @@ public class PyiTypeTest extends PyTestCase {
@Override
public void tearDown() throws Exception {
if (myDisposable != null) {
Disposer.dispose(myDisposable);
myDisposable = null;
}
setLanguageLevel(null);
super.tearDown();
}
@@ -97,7 +115,7 @@ public class PyiTypeTest extends PyTestCase {
}
public void testPyiOnPythonPath() {
addPyiStubsToContentRoot(myFixture);
myDisposable = addPyiStubsToContentRoot(myFixture);
doTest("int");
}