refactor sdk leak code to work in Kotlin tests with their absence of JdkTable

This commit is contained in:
Alexey Kudravtsev
2017-10-03 14:03:07 +03:00
parent d7984ef31c
commit 74130d0a52
5 changed files with 60 additions and 18 deletions
@@ -59,7 +59,6 @@ import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.project.ex.ProjectManagerEx;
import com.intellij.openapi.project.impl.ProjectImpl;
import com.intellij.openapi.project.impl.ProjectManagerImpl;
import com.intellij.openapi.projectRoots.ProjectJdkTable;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.OrderRootType;
@@ -130,7 +129,7 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da
private static TestCase ourTestCase;
public static Thread ourTestThread;
private static LightProjectDescriptor ourProjectDescriptor;
private static Sdk[] myOldSdks;
private static SdkLeakTracker myOldSdks;
private ThreadTracker myThreadTracker;
@@ -296,7 +295,7 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da
IdeaLogger.ourErrorsOccurred = null;
ApplicationManager.getApplication().assertIsDispatchThread();
myOldSdks = ProjectJdkTable.getInstance().getAllJdks();
myOldSdks = new SdkLeakTracker();
boolean reusedProject = true;
if (ourProject == null || ourProjectDescriptor == null || !ourProjectDescriptor.equals(descriptor)) {
@@ -383,7 +382,7 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da
this::checkForSettingsDamage,
() -> doTearDown(project, ourApplication),
() -> checkEditorsReleased(),
() -> checkForJdkTableLeaks(myOldSdks),
() -> myOldSdks.checkForJdkTableLeaks(),
super::tearDown,
() -> myThreadTracker.checkLeak(),
() -> InjectedLanguageManagerImpl.checkInjectorsAreDisposed(project),
@@ -127,7 +127,7 @@ public abstract class PlatformTestCase extends UsefulTestCase implements DataPro
private static boolean ourPlatformPrefixInitialized;
private static Set<VirtualFile> ourEternallyLivingFilesCache;
private Sdk[] myOldSdks;
private SdkLeakTracker myOldSdks;
private VirtualFilePointerTracker myVirtualFilePointerTracker;
/**
@@ -148,7 +148,7 @@ public abstract class PlatformTestCase extends UsefulTestCase implements DataPro
cleanPersistedVFSContent();
}
// try to remember old sdks as soon as possible after the app instantiation
myOldSdks = ProjectJdkTable.getInstance().getAllJdks();
myOldSdks = new SdkLeakTracker();
}
private static final String[] PREFIX_CANDIDATES = {
@@ -210,7 +210,7 @@ public abstract class PlatformTestCase extends UsefulTestCase implements DataPro
initApplication();
if (myOldSdks == null) { // some bastard's overridden initApplication completely
myOldSdks = ProjectJdkTable.getInstance().getAllJdks();
myOldSdks = new SdkLeakTracker();
}
myEditorListenerTracker = new EditorListenerTracker();
@@ -522,7 +522,7 @@ public abstract class PlatformTestCase extends UsefulTestCase implements DataPro
}
})
.append(LightPlatformTestCase::checkEditorsReleased)
.append(() -> UsefulTestCase.checkForJdkTableLeaks(myOldSdks))
.append(() -> myOldSdks.checkForJdkTableLeaks())
.append(() -> myVirtualFilePointerTracker.assertPointersAreDisposed())
.append(() -> {
myProjectManager = null;
@@ -0,0 +1,47 @@
// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.testFramework;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.projectRoots.ProjectJdkTable;
import com.intellij.openapi.projectRoots.Sdk;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.TestOnly;
import org.junit.Assert;
import java.util.Arrays;
import java.util.Set;
@TestOnly
public class SdkLeakTracker {
@NotNull
private final Sdk[] oldSdks;
public SdkLeakTracker() {
ProjectJdkTable table = ProjectJdkTable.getInstance();
oldSdks = table == null ? new Sdk[0] : table.getAllJdks();
}
public void checkForJdkTableLeaks() {
ProjectJdkTable table = ProjectJdkTable.getInstance();
if (table != null) {
Sdk[] jdks = table.getAllJdks();
if (jdks.length != 0) {
Set<Sdk> leaked = new THashSet<>(Arrays.asList(jdks));
Set<Sdk> old = new THashSet<>(Arrays.asList(oldSdks));
leaked.removeAll(old);
try {
if (!leaked.isEmpty()) {
Assert.fail("Leaked SDKs: " + leaked);
}
}
finally {
for (Sdk jdk : leaked) {
WriteAction.run(()-> table.removeJdk(jdk));
}
}
}
}
}
}
@@ -34,8 +34,6 @@ import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ex.ProjectManagerEx;
import com.intellij.openapi.projectRoots.ProjectJdkTable;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
@@ -79,7 +77,7 @@ class HeavyIdeaTestFixtureImpl extends BaseFixture implements HeavyIdeaTestFixtu
private EditorListenerTracker myEditorListenerTracker;
private ThreadTracker myThreadTracker;
private final String myName;
private Sdk[] myOldSdks;
private SdkLeakTracker myOldSdks;
HeavyIdeaTestFixtureImpl(@NotNull String name) {
myName = name;
@@ -100,7 +98,7 @@ class HeavyIdeaTestFixtureImpl extends BaseFixture implements HeavyIdeaTestFixtu
myEditorListenerTracker = new EditorListenerTracker();
myThreadTracker = new ThreadTracker();
InjectedLanguageManagerImpl.pushInjectors(getProject());
myOldSdks = ProjectJdkTable.getInstance().getAllJdks();
myOldSdks = new SdkLeakTracker();
}
@Override
@@ -143,7 +141,7 @@ class HeavyIdeaTestFixtureImpl extends BaseFixture implements HeavyIdeaTestFixtu
.append(() -> myEditorListenerTracker.checkListenersLeak())
.append(() -> myThreadTracker.checkLeak())
.append(LightPlatformTestCase::checkEditorsReleased)
.append(() -> UsefulTestCase.checkForJdkTableLeaks(myOldSdks))
.append(() -> myOldSdks.checkForJdkTableLeaks())
.append(() -> PlatformTestCase.cleanupApplicationCaches(null)) // project is disposed by now, no point in passing it
.run();
}
@@ -21,8 +21,6 @@ import com.intellij.idea.IdeaTestApplication;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.ProjectJdkTable;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.vfs.newvfs.persistent.PersistentFS;
import com.intellij.psi.codeStyle.CodeStyleSchemes;
import com.intellij.psi.codeStyle.CodeStyleSettings;
@@ -38,7 +36,7 @@ import com.intellij.testFramework.fixtures.LightIdeaTestFixture;
public class LightIdeaTestFixtureImpl extends BaseFixture implements LightIdeaTestFixture {
private final LightProjectDescriptor myProjectDescriptor;
private CodeStyleSettings myOldCodeStyleSettings;
private Sdk[] myOldSdks;
private SdkLeakTracker myOldSdks;
public LightIdeaTestFixtureImpl(LightProjectDescriptor projectDescriptor) {
myProjectDescriptor = projectDescriptor;
@@ -56,7 +54,7 @@ public class LightIdeaTestFixtureImpl extends BaseFixture implements LightIdeaTe
myOldCodeStyleSettings.getIndentOptions(StdFileTypes.JAVA);
application.setDataProvider(new TestDataProvider(getProject()));
myOldSdks = ProjectJdkTable.getInstance().getAllJdks();
myOldSdks = new SdkLeakTracker();
}
@Override
@@ -71,7 +69,7 @@ public class LightIdeaTestFixtureImpl extends BaseFixture implements LightIdeaTe
.append(() -> LightPlatformTestCase.doTearDown(project, LightPlatformTestCase.getApplication()))
.append(super::tearDown)
.append(() -> LightPlatformTestCase.checkEditorsReleased())
.append(() -> UsefulTestCase.checkForJdkTableLeaks(myOldSdks))
.append(() -> myOldSdks.checkForJdkTableLeaks())
.append(() -> InjectedLanguageManagerImpl.checkInjectorsAreDisposed(project))
.append(() -> PersistentFS.getInstance().clearIdCache())
.append(() -> PlatformTestCase.cleanupApplicationCaches(project))