From 1dfcd42b04b94bc6965905654723e02e85dfb2dc Mon Sep 17 00:00:00 2001 From: Marc-Andre Laperle Date: Mon, 19 Sep 2016 00:47:02 -0400 Subject: [PATCH] Add utility method to close secondary shells after tests When running SWTBot tests, sometimes when one test fails and leave a shell lingering, it makes all the subsequent tests fail. This change introduces a utility method to close all the secondary shells (non-main shell) so that subsequent tests have a better chance of completing successfully. This will help getting a more representative account of test failures when things go wrong. Change-Id: I4fe48c13de8588e9ddb21ae64d2c3b6a9c04b4ae Signed-off-by: Marc-Andre Laperle Reviewed-on: https://git.eclipse.org/r/81303 Reviewed-by: Alexandre Montplaisir Reviewed-by: Hudson CI --- .../ui/swtbot/tests/TestInvalidCtfTrace.java | 1 + .../ui/swtbot/tests/FindDialogTestBase.java | 8 ++-- .../ui/swtbot/tests/KernelTestBase.java | 1 + .../ProjectExplorerTraceActionsTest.java | 9 +++++ .../ui/swtbot/tests/shared/SWTBotUtils.java | 40 ++++++++++++++++++- .../viewers/events/ColumnHeaderMenuTest.java | 1 + .../viewers/events/CopyToClipboardTest.java | 1 + .../viewers/events/TmfAlignTimeAxisTest.java | 1 + 8 files changed, 57 insertions(+), 5 deletions(-) diff --git a/ctf/org.eclipse.tracecompass.tmf.ctf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ctf/ui/swtbot/tests/TestInvalidCtfTrace.java b/ctf/org.eclipse.tracecompass.tmf.ctf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ctf/ui/swtbot/tests/TestInvalidCtfTrace.java index b59b611a86..a6888ccc1a 100644 --- a/ctf/org.eclipse.tracecompass.tmf.ctf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ctf/ui/swtbot/tests/TestInvalidCtfTrace.java +++ b/ctf/org.eclipse.tracecompass.tmf.ctf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ctf/ui/swtbot/tests/TestInvalidCtfTrace.java @@ -190,6 +190,7 @@ public class TestInvalidCtfTrace { @After public void teardown() { SWTBotUtils.clearTracesFolder(fBot, PROJET_NAME); + SWTBotUtils.closeSecondaryShells(fBot); } /** diff --git a/lttng/org.eclipse.tracecompass.lttng2.kernel.ui.swtbot.tests/src/org/eclipse/tracecompass/lttng2/kernel/ui/swtbot/tests/FindDialogTestBase.java b/lttng/org.eclipse.tracecompass.lttng2.kernel.ui.swtbot.tests/src/org/eclipse/tracecompass/lttng2/kernel/ui/swtbot/tests/FindDialogTestBase.java index aeb7b150f4..0caaf6a3cd 100644 --- a/lttng/org.eclipse.tracecompass.lttng2.kernel.ui.swtbot.tests/src/org/eclipse/tracecompass/lttng2/kernel/ui/swtbot/tests/FindDialogTestBase.java +++ b/lttng/org.eclipse.tracecompass.lttng2.kernel.ui.swtbot.tests/src/org/eclipse/tracecompass/lttng2/kernel/ui/swtbot/tests/FindDialogTestBase.java @@ -38,7 +38,7 @@ import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.SWTBotUtils; import org.eclipse.tracecompass.tmf.ui.views.timegraph.AbstractTimeGraphView; import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ITimeGraphEntry; import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.TimeGraphControl; -import org.junit.AfterClass; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -94,10 +94,10 @@ public abstract class FindDialogTestBase extends KernelTestBase { } /** - * After class method to close the dialog + * After method to close the dialog */ - @AfterClass - public static void afterTest() { + @After + public void afterTest() { closeDialog(getDialogBot()); } diff --git a/lttng/org.eclipse.tracecompass.lttng2.kernel.ui.swtbot.tests/src/org/eclipse/tracecompass/lttng2/kernel/ui/swtbot/tests/KernelTestBase.java b/lttng/org.eclipse.tracecompass.lttng2.kernel.ui.swtbot.tests/src/org/eclipse/tracecompass/lttng2/kernel/ui/swtbot/tests/KernelTestBase.java index 4d3d6b9e57..2c826f7828 100644 --- a/lttng/org.eclipse.tracecompass.lttng2.kernel.ui.swtbot.tests/src/org/eclipse/tracecompass/lttng2/kernel/ui/swtbot/tests/KernelTestBase.java +++ b/lttng/org.eclipse.tracecompass.lttng2.kernel.ui.swtbot.tests/src/org/eclipse/tracecompass/lttng2/kernel/ui/swtbot/tests/KernelTestBase.java @@ -135,6 +135,7 @@ public abstract class KernelTestBase { @After public void after() { fBot.closeAllEditors(); + SWTBotUtils.closeSecondaryShells(fBot); } /** diff --git a/releng/org.eclipse.tracecompass.integration.swtbot.tests/src/org/eclipse/tracecompass/integration/swtbot/tests/projectexplorer/ProjectExplorerTraceActionsTest.java b/releng/org.eclipse.tracecompass.integration.swtbot.tests/src/org/eclipse/tracecompass/integration/swtbot/tests/projectexplorer/ProjectExplorerTraceActionsTest.java index 1c5609c947..a35085cc7f 100644 --- a/releng/org.eclipse.tracecompass.integration.swtbot.tests/src/org/eclipse/tracecompass/integration/swtbot/tests/projectexplorer/ProjectExplorerTraceActionsTest.java +++ b/releng/org.eclipse.tracecompass.integration.swtbot.tests/src/org/eclipse/tracecompass/integration/swtbot/tests/projectexplorer/ProjectExplorerTraceActionsTest.java @@ -41,6 +41,7 @@ import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.ConditionHelpers; import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.SWTBotUtils; import org.eclipse.tracecompass.tmf.ui.views.statistics.TmfStatisticsView; import org.eclipse.ui.IEditorReference; +import org.junit.After; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -118,6 +119,14 @@ public class ProjectExplorerTraceActionsTest { fLogger.removeAllAppenders(); } + /** + * Test tear down method. + */ + @After + public void afterTest() { + SWTBotUtils.closeSecondaryShells(fBot); + } + /** * Test that the expected context menu items are there *

diff --git a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/shared/org/eclipse/tracecompass/tmf/ui/swtbot/tests/shared/SWTBotUtils.java b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/shared/org/eclipse/tracecompass/tmf/ui/swtbot/tests/shared/SWTBotUtils.java index 5232ca4abd..189db0eb91 100644 --- a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/shared/org/eclipse/tracecompass/tmf/ui/swtbot/tests/shared/SWTBotUtils.java +++ b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/shared/org/eclipse/tracecompass/tmf/ui/swtbot/tests/shared/SWTBotUtils.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.TimeZone; import java.util.concurrent.atomic.AtomicBoolean; +import org.apache.log4j.Logger; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; @@ -52,6 +53,7 @@ import org.eclipse.swtbot.swt.finder.keyboard.Keyboard; import org.eclipse.swtbot.swt.finder.keyboard.Keystrokes; import org.eclipse.swtbot.swt.finder.results.Result; import org.eclipse.swtbot.swt.finder.results.VoidResult; +import org.eclipse.swtbot.swt.finder.utils.MessageFormat; import org.eclipse.swtbot.swt.finder.utils.SWTUtils; import org.eclipse.swtbot.swt.finder.waits.Conditions; import org.eclipse.swtbot.swt.finder.waits.DefaultCondition; @@ -95,8 +97,10 @@ public final class SWTBotUtils { private static final String WINDOW_MENU = "Window"; private static final String PREFERENCES_MENU_ITEM = "Preferences"; private static boolean fPrintedEnvironment = false; + private static Logger log = Logger.getLogger(SWTBotUtils.class); private SWTBotUtils() { + } private static final String TRACING_PERSPECTIVE_ID = TracingPerspectiveFactory.ID; @@ -218,6 +222,9 @@ public final class SWTBotUtils { SWTBotUtils.waitForJobs(); + closeSecondaryShells(bot); + SWTBotUtils.waitForJobs(); + final SWTBotView projectViewBot = bot.viewById(IPageLayout.ID_PROJECT_EXPLORER); projectViewBot.setFocus(); @@ -292,11 +299,42 @@ public final class SWTBotUtils { * swtbotshells for all the shells */ public static void focusMainWindow(SWTBotShell[] shellBots) { + SWTBotShell mainShell = getMainShell(shellBots); + if (mainShell != null) { + mainShell.activate(); + } + } + + private static SWTBotShell getMainShell(SWTBotShell[] shellBots) { + SWTBotShell mainShell = null; for (SWTBotShell shellBot : shellBots) { if (shellBot.getText().toLowerCase().contains("eclipse")) { - shellBot.activate(); + mainShell = shellBot; } } + return mainShell; + } + + /** + * Close all non-main shells that are visible. + * + * @param bot + * the workbench bot + */ + public static void closeSecondaryShells(SWTWorkbenchBot bot) { + SWTBotShell[] shells = bot.shells(); + SWTBotShell mainShell = getMainShell(shells); + if (mainShell == null) { + return; + } + + // Close all non-main shell but make sure we don't close an invisible + // shell such the special "limbo shell" that Eclipse needs to work + Arrays.stream(shells) + .filter(shell -> shell != mainShell) + .filter(SWTBotShell::isVisible) + .peek(shell -> log.debug(MessageFormat.format("Closing ligering shell with title {0}", shell.getText()))) + .forEach(SWTBotShell::close); } /** diff --git a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/viewers/events/ColumnHeaderMenuTest.java b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/viewers/events/ColumnHeaderMenuTest.java index c2aceccc30..1972d23980 100644 --- a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/viewers/events/ColumnHeaderMenuTest.java +++ b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/viewers/events/ColumnHeaderMenuTest.java @@ -128,6 +128,7 @@ public class ColumnHeaderMenuTest { @After public void after() { fBot.closeAllEditors(); + SWTBotUtils.closeSecondaryShells(fBot); } /** diff --git a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/viewers/events/CopyToClipboardTest.java b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/viewers/events/CopyToClipboardTest.java index 244cb8422a..59e21aae02 100644 --- a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/viewers/events/CopyToClipboardTest.java +++ b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/viewers/events/CopyToClipboardTest.java @@ -142,6 +142,7 @@ public class CopyToClipboardTest { @After public void after() { fBot.closeAllEditors(); + SWTBotUtils.closeSecondaryShells(fBot); } /** diff --git a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/viewers/events/TmfAlignTimeAxisTest.java b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/viewers/events/TmfAlignTimeAxisTest.java index d57be31159..7f47ad28c6 100644 --- a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/viewers/events/TmfAlignTimeAxisTest.java +++ b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/src/org/eclipse/tracecompass/tmf/ui/swtbot/tests/viewers/events/TmfAlignTimeAxisTest.java @@ -148,6 +148,7 @@ public class TmfAlignTimeAxisTest { SWTBotUtils.activeEventsEditor(bot).close(); /* Switch back to Tracing perspective since several tests change the perspective */ SWTBotUtils.switchToTracingPerspective(); + SWTBotUtils.closeSecondaryShells(fBot); } /** -- 2.34.1