From 82263976e3861d16e15aa96addfc7db0f5e36016 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 7 Apr 2011 19:47:15 +0200 Subject: [PATCH] make tests stoppable via IDEA 'Stop' button on unix (don't wait forever in a shutdown hook) --- .../application/impl/ApplicationImpl.java | 29 +++++++------------ .../testFramework/LightPlatformTestCase.java | 2 +- .../openapi/util/ShutDownTracker.java | 25 ++++++++++++++++ 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java index 0d2ccf5b3684..a878e19483cc 100644 --- a/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/application/impl/ApplicationImpl.java @@ -71,7 +71,6 @@ import org.picocontainer.MutablePicoContainer; import javax.swing.*; import java.awt.*; import java.io.IOException; -import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.List; import java.util.concurrent.*; @@ -245,25 +244,17 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application if (isDisposed() || isDisposeInProgress()) { return; } - try { - SwingUtilities.invokeAndWait(new Runnable() { - public void run() { - ApplicationManagerEx.setApplication(ApplicationImpl.this); - try { - saveAll(); - } - finally { - disposeSelf(); - } + ShutDownTracker.invokeAndWait(isUnitTestMode(), new Runnable() { + public void run() { + ApplicationManagerEx.setApplication(ApplicationImpl.this); + try { + saveAll(); } - }); - } - catch (InterruptedException e) { - LOG.error(e); - } - catch (InvocationTargetException e) { - LOG.error(e); - } + finally { + disposeSelf(); + } + } + }); } }); } diff --git a/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java b/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java index 6e1c4f16c91c..635712957238 100644 --- a/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java +++ b/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java @@ -683,7 +683,7 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da ShutDownTracker.getInstance().registerShutdownTask(new Runnable() { @Override public void run() { - UIUtil.invokeAndWaitIfNeeded(new Runnable() { + ShutDownTracker.invokeAndWait(true, new Runnable() { @Override public void run() { closeAndDeleteProject(); diff --git a/platform/util/src/com/intellij/openapi/util/ShutDownTracker.java b/platform/util/src/com/intellij/openapi/util/ShutDownTracker.java index 12f0e5b58973..1495b45741e0 100644 --- a/platform/util/src/com/intellij/openapi/util/ShutDownTracker.java +++ b/platform/util/src/com/intellij/openapi/util/ShutDownTracker.java @@ -16,9 +16,11 @@ package com.intellij.openapi.util; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.util.concurrency.Semaphore; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import javax.swing.*; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; @@ -127,4 +129,27 @@ public class ShutDownTracker implements Runnable { private synchronized T removeLast(LinkedList list) { return list.isEmpty()? null : list.removeLast(); } + + public static void invokeAndWait(boolean timed, Runnable runnable) { + if (timed) { + final Semaphore semaphore = new Semaphore(); + semaphore.down(); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + semaphore.up(); + } + }); + if (!semaphore.waitFor(1000)) { + return; + } + } + + try { + SwingUtilities.invokeAndWait(runnable); + } + catch (Exception e) { + LOG.error(e); + } + } }