Clean application after test in compiler tests

It's disposed after Disposer.dispose(myTestRootDisposable) in tearDown and mixing compiler tests
with non-compiler tests may ruin classes initialization with

"com.intellij.util.IncorrectOperationException: Sorry but parent: com.intellij.mock.MockApplicationEx@52439591 has already been disposed"

(cherry picked from commit f3badb6)
This commit is contained in:
Nikolay Krasko
2016-09-23 16:41:12 +03:00
committed by Nikolay Krasko
parent 1c0be7f0ba
commit 520e187e46
2 changed files with 24 additions and 25 deletions
@@ -16,23 +16,15 @@
package org.jetbrains.kotlin.test;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment;
import org.jetbrains.kotlin.utils.ExceptionUtilsKt;
import java.lang.reflect.Field;
public abstract class KotlinTestWithEnvironment extends KotlinTestWithEnvironmentManagement {
private KotlinCoreEnvironment environment;
private Application application;
@Override
protected void setUp() throws Exception {
application = ApplicationManager.getApplication();
super.setUp();
environment = createEnvironment();
}
@@ -42,23 +34,6 @@ public abstract class KotlinTestWithEnvironment extends KotlinTestWithEnvironmen
removeEnvironment();
environment = null;
super.tearDown();
if (application == null) {
resetApplicationToNull();
}
application = null;
}
protected void resetApplicationToNull() {
try {
Field ourApplicationField = ApplicationManager.class.getDeclaredField("ourApplication");
ourApplicationField.setAccessible(true);
ourApplicationField.set(null, null);
}
catch (Exception e) {
throw ExceptionUtilsKt.rethrow(e);
}
}
protected abstract KotlinCoreEnvironment createEnvironment() throws Exception;
@@ -17,6 +17,8 @@
package org.jetbrains.kotlin.test.testFramework;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.impl.ApplicationInfoImpl;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Disposer;
@@ -36,6 +38,7 @@ import junit.framework.TestCase;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.utils.ExceptionUtilsKt;
import org.junit.Assert;
import java.io.File;
@@ -55,6 +58,8 @@ public abstract class KtUsefulTestCase extends TestCase {
private static final Map<String, Long> TOTAL_SETUP_COST_MILLIS = new HashMap<String, Long>();
private static final Map<String, Long> TOTAL_TEARDOWN_COST_MILLIS = new HashMap<String, Long>();
private Application application;
@NotNull
protected final Disposable myTestRootDisposable = new Disposable() {
@Override
@@ -81,6 +86,8 @@ public abstract class KtUsefulTestCase extends TestCase {
@Override
protected void setUp() throws Exception {
application = ApplicationManager.getApplication();
super.setUp();
String testName = FileUtil.sanitizeFileName(getTestName(true));
@@ -121,6 +128,23 @@ public abstract class KtUsefulTestCase extends TestCase {
UIUtil.removeLeakingAppleListeners();
super.tearDown();
if (application == null) {
resetApplicationToNull();
}
application = null;
}
protected void resetApplicationToNull() {
try {
Field ourApplicationField = ApplicationManager.class.getDeclaredField("ourApplication");
ourApplicationField.setAccessible(true);
ourApplicationField.set(null, null);
}
catch (Exception e) {
throw ExceptionUtilsKt.rethrow(e);
}
}
private boolean hasTmpFilesToKeep() {