diff options
author | Xavier Coulon | 2016-08-25 20:33:49 +0000 |
---|---|---|
committer | Jeff Johnston | 2016-08-26 18:24:44 +0000 |
commit | 2f5471f0d63eacff01143b927b76c1013ab4e562 (patch) | |
tree | a9132f2f4a5ad29751c534b2426a74e278457351 | |
parent | f107e191a5cbe83dccc25172d74676b325bfbcc7 (diff) | |
download | org.eclipse.linuxtools-2f5471f0d63eacff01143b927b76c1013ab4e562.tar.gz org.eclipse.linuxtools-2f5471f0d63eacff01143b927b76c1013ab4e562.tar.xz org.eclipse.linuxtools-2f5471f0d63eacff01143b927b76c1013ab4e562.zip |
Bug 500158 - Add context menu to open Hierarchy view in Containers and Images views
Added context menu when selecting an image or a container in
the Docker Images and Docker Containers view
Added tests to verify that the Docker Image Hierarchy view
is opened when calling the command from the context menu
Change-Id: I69238475af5a420357fcbcae0ad7a376b06260e6
Signed-off-by: Xavier Coulon <xcoulon@redhat.com>
Reviewed-on: https://git.eclipse.org/r/79723
Tested-by: Hudson CI
Reviewed-by: Jeff Johnston <jjohnstn@redhat.com>
9 files changed, 143 insertions, 17 deletions
diff --git a/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/testutils/swt/AbstractSWTBotAssertion.java b/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/testutils/swt/AbstractSWTBotAssertion.java index c71468bc3d..0e0f2a3c16 100644 --- a/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/testutils/swt/AbstractSWTBotAssertion.java +++ b/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/testutils/swt/AbstractSWTBotAssertion.java @@ -40,7 +40,8 @@ public abstract class AbstractSWTBotAssertion<Assertion extends AbstractSWTBotAs public Assertion isNotEnabled() { notNullValue(); if(actual.isEnabled()) { - failWithMessage("Expected widget with text '%s (%s)' to be disabled but it was not", actual.getText()); + failWithMessage("Expected widget with text '%s (%s)' to be disabled but it was not", actual.getText(), + actual.getToolTipText()); } return (Assertion) this; } diff --git a/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/testutils/swt/DockerConnectionManagerUtils.java b/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/testutils/swt/DockerConnectionManagerUtils.java index 62bdafedb9..9be3f4498f 100644 --- a/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/testutils/swt/DockerConnectionManagerUtils.java +++ b/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/testutils/swt/DockerConnectionManagerUtils.java @@ -18,6 +18,7 @@ import org.eclipse.linuxtools.internal.docker.ui.testutils.MockDockerConnectionS import org.eclipse.linuxtools.internal.docker.ui.views.DockerContainersView; import org.eclipse.linuxtools.internal.docker.ui.views.DockerExplorerView; import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot; +import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView; /** * @@ -52,17 +53,24 @@ public class DockerConnectionManagerUtils { public static void configureConnectionManager(final IDockerConnectionStorageManager connectionStorageManager) { DockerConnectionManager.getInstance().setConnectionStorageManager(connectionStorageManager); final SWTWorkbenchBot bot = new SWTWorkbenchBot(); - final DockerExplorerView dockerExplorerView = SWTUtils.getView(bot, DockerExplorerView.VIEW_ID); - final DockerContainersView dockerContainersView = (DockerContainersView) SWTUtils.getView(bot, - DockerContainersView.VIEW_ID); + final SWTBotView dockerExplorerBotView = SWTUtils.getSWTBotView(bot, DockerExplorerView.VIEW_ID); + final SWTBotView dockerContainersBotView = SWTUtils.getSWTBotView(bot, DockerContainersView.VIEW_ID); SWTUtils.syncExec(() -> { DockerConnectionManager.getInstance().reloadConnections(); - if (dockerExplorerView != null) { - dockerExplorerView.getCommonViewer().refresh(); - dockerExplorerView.showConnectionsOrExplanations(); + if (dockerExplorerBotView != null) { + final DockerExplorerView dockerExplorerView = (DockerExplorerView) dockerExplorerBotView + .getViewReference().getView(false); + if (dockerExplorerView != null) { + dockerExplorerView.getCommonViewer().refresh(); + dockerExplorerView.showConnectionsOrExplanations(); + } } - if (dockerContainersView != null) { - dockerContainersView.getViewer().refresh(); + if (dockerContainersBotView != null) { + final DockerContainersView dockerContainersView = (DockerContainersView) dockerContainersBotView + .getViewReference().getView(false); + if (dockerContainersView != null) { + dockerContainersView.getViewer().refresh(); + } } }); } diff --git a/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/testutils/swt/SWTUtils.java b/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/testutils/swt/SWTUtils.java index 283b3edf4c..09e0074d87 100644 --- a/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/testutils/swt/SWTUtils.java +++ b/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/testutils/swt/SWTUtils.java @@ -29,6 +29,7 @@ import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.linuxtools.internal.docker.ui.views.DockerExplorerView; import org.eclipse.swt.SWT; import org.eclipse.swt.SWTException; +import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Menu; @@ -37,10 +38,14 @@ import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot; import org.eclipse.swtbot.eclipse.finder.waits.Conditions; import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView; import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException; +import org.eclipse.swtbot.swt.finder.finders.ContextMenuHelper; import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable; import org.eclipse.swtbot.swt.finder.results.Result; import org.eclipse.swtbot.swt.finder.results.VoidResult; +import org.eclipse.swtbot.swt.finder.widgets.AbstractSWTBot; import org.eclipse.swtbot.swt.finder.widgets.SWTBotMenu; +import org.eclipse.swtbot.swt.finder.widgets.SWTBotTable; +import org.eclipse.swtbot.swt.finder.widgets.SWTBotTableItem; import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarButton; import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree; import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem; @@ -92,7 +97,6 @@ public class SWTUtils { * @throws SWTException * if an {@link SWTException} occurred */ - @Deprecated public static void syncAssert(final Runnable runnable) throws SWTException, ComparisonFailure { final Queue<ComparisonFailure> failure = new ArrayBlockingQueue<>(1); final Queue<SWTException> swtException = new ArrayBlockingQueue<>(1); @@ -268,6 +272,14 @@ public class SWTUtils { return swtBotTreeItem; } + public static SWTBotTableItem getListItem(final SWTBotTable table, final String name) { + return Stream.iterate(0, i -> i + 1).limit(table.rowCount()).map(rowNumber -> table.getTableItem(rowNumber)) + .filter(rowItem -> { + return Stream.iterate(0, j -> j + 1).limit(table.columnCount()) + .map(colNum -> rowItem.getText(colNum)).anyMatch(colValue -> colValue.contains(name)); + }).findFirst().orElse(null); + } + /** * Waits for the given duration * @@ -442,8 +454,7 @@ public class SWTUtils { @SuppressWarnings("unchecked") public static <T> T getView(final SWTWorkbenchBot bot, final String viewId) { - return (T) bot.views().stream().filter(v -> v.getViewReference().getId().equals(viewId)).findFirst() - .map(v -> v.getReference().getView(false)).orElse(null); + return (T) bot.viewById(viewId).getReference().getView(false); } /** @@ -452,7 +463,8 @@ public class SWTUtils { * @throws InterruptedException */ public static boolean isConsoleViewVisible(final SWTWorkbenchBot bot) { - return SWTUtils.getView(bot, IConsoleConstants.ID_CONSOLE_VIEW) != null; + return bot.views().stream() + .anyMatch(v -> v.getViewReference().getId().equals(IConsoleConstants.ID_CONSOLE_VIEW)); } public static SWTBotToolbarButton getConsoleToolbarButtonWithTooltipText(final SWTWorkbenchBot bot, final String tooltipText) { @@ -460,4 +472,25 @@ public class SWTUtils { .filter(button -> button.getToolTipText().equals(tooltipText)).findFirst().get(); } + public static void closeView(final SWTWorkbenchBot bot, final String viewId) { + bot.views().stream().filter(v -> v.getReference().getId().equals(viewId)).forEach(v -> v.close()); + } + + /** + * Creates a new {@link SWTBotMenu} from the context. This avoids some + * unexpected "Widget is disposed" errors. + * + * @param bot + * the bot + * @param menuName + * the name of the menu to find + * @return the context menu + * @see <a href= + * "https://www.eclipse.org/forums/index.php?t=msg&th=11863&start=0&">Eclipse + * forum</a> + */ + public static SWTBotMenu getContextMenu(final AbstractSWTBot<? extends Control> bot, final String menuName) { + return new SWTBotMenu(ContextMenuHelper.contextMenu(bot, menuName)); + } + } diff --git a/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerContainersViewSWTBotTest.java b/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerContainersViewSWTBotTest.java index 32c1678802..081096d37c 100644 --- a/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerContainersViewSWTBotTest.java +++ b/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerContainersViewSWTBotTest.java @@ -13,6 +13,8 @@ package org.eclipse.linuxtools.internal.docker.ui.views; import static org.assertj.core.api.Assertions.assertThat; +import java.util.concurrent.TimeUnit; + import org.eclipse.linuxtools.internal.docker.core.DockerConnection; import org.eclipse.linuxtools.internal.docker.core.DockerContainerRefreshManager; import org.eclipse.linuxtools.internal.docker.ui.testutils.MockContainerFactory; @@ -22,11 +24,13 @@ import org.eclipse.linuxtools.internal.docker.ui.testutils.MockImageFactory; import org.eclipse.linuxtools.internal.docker.ui.testutils.swt.ClearConnectionManagerRule; import org.eclipse.linuxtools.internal.docker.ui.testutils.swt.CloseWelcomePageRule; import org.eclipse.linuxtools.internal.docker.ui.testutils.swt.DockerConnectionManagerUtils; +import org.eclipse.linuxtools.internal.docker.ui.testutils.swt.DockerImageHierarchyViewAssertion; import org.eclipse.linuxtools.internal.docker.ui.testutils.swt.SWTUtils; import org.eclipse.linuxtools.internal.docker.ui.testutils.swt.TestLoggerRule; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot; import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView; +import org.eclipse.swtbot.swt.finder.widgets.SWTBotTableItem; import org.eclipse.ui.PlatformUI; import org.junit.Assert; import org.junit.Before; @@ -80,6 +84,12 @@ public class DockerContainersViewSWTBotTest { this.dockerExplorerBotView = bot.viewById(DockerExplorerView.VIEW_ID); } + private SWTBotTableItem selectContainerInTable(final String containerName) { + final SWTBotTableItem tableItem = SWTUtils.getListItem(dockerContainersViewBot.bot().table(), containerName); + assertThat(tableItem).isNotNull(); + return tableItem.click().select(); + } + @Test public void defaultContainersTest() { // default connection with 1 image should be displayed @@ -127,4 +137,23 @@ public class DockerContainersViewSWTBotTest { assertThat(dockerConnection.getContainerListeners()).hasSize(0); } + @Test + public void shouldOpenImageHierarchyView() { + // given + final DockerClient client = MockDockerClientFactory + .container(MockContainerFactory.name("angry_bar").status("Stopped").build()).build(); + final DockerConnection dockerConnection = MockDockerConnectionFactory.from("Test", client) + .withDefaultTCPConnectionSettings(); + DockerConnectionManagerUtils.configureConnectionManager(dockerConnection); + // make sure the hierarchy view is closed. + SWTUtils.closeView(this.bot, DockerImageHierarchyView.VIEW_ID); + // open the context menu on one of the containers + selectContainerInTable("angry_bar"); + SWTUtils.getContextMenu(dockerContainersViewBot.bot().table(), "Open Image Hierarchy").click(); + // wait 1sec + SWTUtils.wait(1, TimeUnit.SECONDS); + DockerImageHierarchyViewAssertion.assertThat(SWTUtils.getView(bot, DockerImageHierarchyView.VIEW_ID)) + .isNotNull(); + } + } diff --git a/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerExplorerViewSWTBotTest.java b/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerExplorerViewSWTBotTest.java index 0832f4ba7e..540766d838 100644 --- a/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerExplorerViewSWTBotTest.java +++ b/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerExplorerViewSWTBotTest.java @@ -388,7 +388,7 @@ public class DockerExplorerViewSWTBotTest { DockerConnectionManagerUtils.configureConnectionManager(dockerConnection); // open the context menu on one of the containers selectContainersInTreeView("Test", "gentle_foo", "angry_bar"); - final SWTBotMenu menuCommand = dockerExplorerViewBot.bot().tree().contextMenu("Pause"); + final SWTBotMenu menuCommand = SWTUtils.getContextMenu(dockerExplorerViewBot.bot().tree(), "Pause"); // then MenuAssertion.assertThat(menuCommand).isVisible().isNotEnabled(); } diff --git a/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerImageHierarchyViewSWTBotTest.java b/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerImageHierarchyViewSWTBotTest.java index 55cc2571f6..8f881adbc0 100644 --- a/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerImageHierarchyViewSWTBotTest.java +++ b/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerImageHierarchyViewSWTBotTest.java @@ -196,7 +196,8 @@ public class DockerImageHierarchyViewSWTBotTest { dockerExplorerViewBot.bot().tree().contextMenu("Open Image Hierarchy").click(); //$NON-NLS-1$ // then the view should be visible and selection should be on // foo_container1 - DockerImageHierarchyViewAssertion.assertThat(getDockerImageHierarchyView()) + + DockerImageHierarchyViewAssertion.assertThat(SWTUtils.getView(this.bot, DockerImageHierarchyView.VIEW_ID)) .hasSelectedElement(this.connection.getContainer("sha256:foo_container1")); } diff --git a/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerImagesViewSWTBotTest.java b/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerImagesViewSWTBotTest.java index 56346e5fdb..0a0cad053a 100644 --- a/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerImagesViewSWTBotTest.java +++ b/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerImagesViewSWTBotTest.java @@ -13,6 +13,8 @@ package org.eclipse.linuxtools.internal.docker.ui.views; import static org.assertj.core.api.Assertions.assertThat; +import java.util.concurrent.TimeUnit; + import org.eclipse.linuxtools.internal.docker.core.DockerConnection; import org.eclipse.linuxtools.internal.docker.core.DockerContainerRefreshManager; import org.eclipse.linuxtools.internal.docker.ui.testutils.MockContainerFactory; @@ -22,12 +24,14 @@ import org.eclipse.linuxtools.internal.docker.ui.testutils.MockImageFactory; import org.eclipse.linuxtools.internal.docker.ui.testutils.swt.ClearConnectionManagerRule; import org.eclipse.linuxtools.internal.docker.ui.testutils.swt.CloseWelcomePageRule; import org.eclipse.linuxtools.internal.docker.ui.testutils.swt.DockerConnectionManagerUtils; +import org.eclipse.linuxtools.internal.docker.ui.testutils.swt.DockerImageHierarchyViewAssertion; import org.eclipse.linuxtools.internal.docker.ui.testutils.swt.SWTUtils; import org.eclipse.linuxtools.internal.docker.ui.testutils.swt.TestLoggerRule; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot; import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView; import org.eclipse.swtbot.swt.finder.SWTBot; +import org.eclipse.swtbot.swt.finder.widgets.SWTBotTableItem; import org.eclipse.ui.PlatformUI; import org.junit.Assert; import org.junit.Before; @@ -82,6 +86,12 @@ public class DockerImagesViewSWTBotTest { this.dockerExplorerBotView = bot.viewById(DockerExplorerView.VIEW_ID); } + private SWTBotTableItem selectImageInTable(final String imageName) { + final SWTBotTableItem tableItem = SWTUtils.getListItem(dockerImagesBotView.bot().table(), imageName); + assertThat(tableItem).isNotNull(); + return tableItem.click().select(); + } + @Test public void shouldShowDefaultImages() { // then default connection with 1 image should be displayed @@ -144,4 +154,25 @@ public class DockerImagesViewSWTBotTest { // there should be one listener left: DockerExplorerView assertThat(dockerConnection.getImageListeners()).hasSize(0); } + + @Test + public void shouldOpenImageHierarchyView() { + // given + final DockerClient client = MockDockerClientFactory.image(MockImageFactory.name("angry_bar").build()) + .image(MockImageFactory.name("gentle_foo").build()).build(); + final DockerConnection dockerConnection = MockDockerConnectionFactory.from("Test", client) + .withDefaultTCPConnectionSettings(); + DockerConnectionManagerUtils.configureConnectionManager(dockerConnection); + // make sure the hierarchy view is closed. + SWTUtils.closeView(this.bot, DockerImageHierarchyView.VIEW_ID); + // open the context menu on one of the containers + selectImageInTable("angry_bar"); + SWTUtils.getContextMenu(dockerImagesBotView.bot().table(), "Open Image Hierarchy").click(); + // wait 1sec + SWTUtils.wait(1, TimeUnit.SECONDS); + DockerImageHierarchyViewAssertion.assertThat(SWTUtils.getView(bot, DockerImageHierarchyView.VIEW_ID)) + .isNotNull(); + } + + } diff --git a/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/wizards/ImagePushSWTBotTests.java b/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/wizards/ImagePushSWTBotTests.java index a73b741ec3..beff20e7f8 100644 --- a/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/wizards/ImagePushSWTBotTests.java +++ b/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/wizards/ImagePushSWTBotTests.java @@ -98,7 +98,7 @@ public class ImagePushSWTBotTests { // when opening the "Push Image..." wizard final SWTBotTree dockerExplorerViewTreeBot = dockerExplorerViewBot.bot().tree(); dockerExplorerViewTreeBot.select(imageTreeItem); - dockerExplorerViewTreeBot.contextMenu("Push...").click(); + SWTUtils.getContextMenu(dockerExplorerViewTreeBot, "Push...").click(); } @Test diff --git a/containers/org.eclipse.linuxtools.docker.ui/plugin.xml b/containers/org.eclipse.linuxtools.docker.ui/plugin.xml index e6c21e4fc4..a9dfe60839 100644 --- a/containers/org.eclipse.linuxtools.docker.ui/plugin.xml +++ b/containers/org.eclipse.linuxtools.docker.ui/plugin.xml @@ -429,7 +429,7 @@ class="org.eclipse.linuxtools.internal.docker.ui.commands.PauseContainersCommandHandler"> <enabledWhen> <with variable="selection"> - <iterate ifEmpty="false"> + <iterate ifEmpty="false" operator="and"> <or> <and> <instanceof @@ -1542,6 +1542,18 @@ style="push"> </command> </menuContribution> + <!-- containers view context menu: open hierarchy --> + <menuContribution + locationURI="popup:org.eclipse.linuxtools.docker.ui.dockerContainersView"> + <command + commandId="org.eclipse.linuxtools.docker.ui.commands.openInHierarchyView" + icon="icons/class_hi.png" + label="%command.openInHierarchyView.menu.name" + mnemonic="R" + style="push"> + </command> + </menuContribution> + <!-- containers view toolbar: refresh view --> <menuContribution locationURI="toolbar:org.eclipse.linuxtools.docker.ui.dockerContainersView"> @@ -1688,6 +1700,17 @@ style="push"> </command> </menuContribution> + <!-- image view context menu: open hierarchy --> + <menuContribution + locationURI="popup:org.eclipse.linuxtools.docker.ui.dockerImagesView"> + <command + commandId="org.eclipse.linuxtools.docker.ui.commands.openInHierarchyView" + icon="icons/class_hi.png" + label="%command.openInHierarchyView.menu.name" + mnemonic="R" + style="push"> + </command> + </menuContribution> <!-- images view toolbar: remove images --> <menuContribution locationURI="toolbar:org.eclipse.linuxtools.docker.ui.dockerImagesView"> |