diff options
author | Xavier Coulon | 2016-01-14 16:59:27 +0000 |
---|---|---|
committer | Jeff Johnston | 2016-01-16 04:39:40 +0000 |
commit | d8818b3a1048d9abca5743b0365160caf9977d43 (patch) | |
tree | 67cbbe4ee25a3af0da93699ac8be38f1427f0e47 | |
parent | 4b7421a420ba3913d02130bc99457aa9a29b149d (diff) | |
download | org.eclipse.linuxtools-d8818b3a1048d9abca5743b0365160caf9977d43.tar.gz org.eclipse.linuxtools-d8818b3a1048d9abca5743b0365160caf9977d43.tar.xz org.eclipse.linuxtools-d8818b3a1048d9abca5743b0365160caf9977d43.zip |
Bug 485735 - SWTException below DockerContainersContentProvider$1$1.run
Same fix as in https://bugs.eclipse.org/bugs/show_bug.cgi?id=485350 where
the listener is removed from the connection when the view is disposed.
Change-Id: Icfcdb392db398876f251fed3872e904d2eb24889
Signed-off-by: Xavier Coulon <xcoulon@redhat.com>
Reviewed-on: https://git.eclipse.org/r/64328
Tested-by: Hudson CI
Reviewed-by: Jeff Johnston <jjohnstn@redhat.com>
5 files changed, 142 insertions, 12 deletions
diff --git a/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/testutils/MockDockerClientFactory.java b/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/testutils/MockDockerClientFactory.java index 6cdd0277d2..56d774177d 100644 --- a/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/testutils/MockDockerClientFactory.java +++ b/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/testutils/MockDockerClientFactory.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2015 Red Hat. + * Copyright (c) 2015, 2016 Red Hat. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -24,6 +24,8 @@ import org.eclipse.linuxtools.docker.core.IDockerContainerInfo; import org.eclipse.linuxtools.docker.core.IDockerImage; import org.mockito.Matchers; import org.mockito.Mockito; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; import com.spotify.docker.client.DockerClient; import com.spotify.docker.client.DockerException; @@ -161,7 +163,13 @@ public class MockDockerClientFactory { public DockerClient build() { try { Mockito.when(this.dockerClient.listImages(Matchers.any())).thenReturn(this.images); - Mockito.when(this.dockerClient.listContainers(Matchers.any())).thenReturn(this.containers); + Mockito.when(this.dockerClient.listContainers(Matchers.any())).thenAnswer(new Answer<List<Container>>() { + + @Override + public List<Container> answer(InvocationOnMock invocation) { + return containers; + } + }); for(Entry<String, List<ImageSearchResult>> searchResult : this.searchResults.entrySet()) { Mockito.when(this.dockerClient.searchImages(searchResult.getKey())).thenReturn(searchResult.getValue()); } 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 afd188d853..e5dea2151b 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 @@ -17,6 +17,7 @@ import org.eclipse.linuxtools.docker.core.DockerConnectionManager; import org.eclipse.linuxtools.docker.core.IDockerConnection; import org.eclipse.linuxtools.docker.core.IDockerConnectionStorageManager; import org.eclipse.linuxtools.internal.docker.ui.testutils.MockDockerConnectionStorageManagerFactory; +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; @@ -36,15 +37,20 @@ public class DockerConnectionManagerUtils { final IDockerConnection... connections) { DockerConnectionManager.getInstance() .setConnectionStorageManager(MockDockerConnectionStorageManagerFactory.providing(connections)); - final DockerExplorerView dockerExplorerView = getDockerExplorerView(new SWTWorkbenchBot()); - if(dockerExplorerView != null) { - SWTUtils.syncExec(() -> { - DockerConnectionManager.getInstance().reloadConnections(); + final SWTWorkbenchBot bot = new SWTWorkbenchBot(); + final DockerExplorerView dockerExplorerView = getDockerExplorerView(bot); + final DockerContainersView dockerContainersView = getDockerContainersView(bot); + SWTUtils.syncExec(() -> { + DockerConnectionManager.getInstance().reloadConnections(); + if (dockerExplorerView != null) { dockerExplorerView.getCommonViewer().refresh(); dockerExplorerView.showConnectionsOrExplanations(); - }); - SWTUtils.wait(1, TimeUnit.SECONDS); - } + } + if (dockerContainersView != null) { + dockerContainersView.getViewer().refresh(); + } + }); + SWTUtils.wait(1, TimeUnit.SECONDS); } private static DockerExplorerView getDockerExplorerView(final SWTWorkbenchBot bot) { @@ -53,4 +59,10 @@ public class DockerConnectionManagerUtils { .orElse(null); } + private static DockerContainersView getDockerContainersView(final SWTWorkbenchBot bot) { + return bot.views().stream().filter(v -> v.getReference().getId().equals(DockerContainersView.VIEW_ID)) + .map(viewBot -> (DockerContainersView) (viewBot.getViewReference().getView(true))).findFirst() + .orElse(null); + } + } 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 new file mode 100644 index 0000000000..c3d2390efe --- /dev/null +++ b/containers/org.eclipse.linuxtools.docker.ui.tests/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerContainersViewSWTBotTest.java @@ -0,0 +1,108 @@ +/******************************************************************************* + * Copyright (c) 2016 Red Hat. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Red Hat - Initial Contribution + *******************************************************************************/ + +package org.eclipse.linuxtools.internal.docker.ui.views; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.eclipse.linuxtools.internal.docker.core.DockerConnection; +import org.eclipse.linuxtools.internal.docker.core.DockerContainerRefreshManager; +import org.eclipse.linuxtools.internal.docker.ui.testutils.MockDockerClientFactory; +import org.eclipse.linuxtools.internal.docker.ui.testutils.MockDockerConnectionFactory; +import org.eclipse.linuxtools.internal.docker.ui.testutils.MockDockerContainerFactory; +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.SWTUtils; +import org.eclipse.linuxtools.internal.docker.ui.testutils.swt.TestLoggerRule; +import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot; +import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView; +import org.eclipse.ui.PlatformUI; +import org.junit.Assert; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Rule; +import org.junit.Test; + +import com.spotify.docker.client.DockerClient; + +/** + * Testing the {@link DockerContainersView} + */ +public class DockerContainersViewSWTBotTest { + + private SWTWorkbenchBot bot = new SWTWorkbenchBot(); + private SWTBotView dockerContainersViewBot; + private DockerContainersView dockerContainersView; + private SWTBotView dockerExplorerBotView; + + @ClassRule + public static CloseWelcomePageRule closeWelcomePage = new CloseWelcomePageRule(); + + @Rule + public TestLoggerRule watcher = new TestLoggerRule(); + + @Rule + public ClearConnectionManagerRule clearConnectionManager = new ClearConnectionManagerRule(); + + @Before + public void setup() { + this.bot = new SWTWorkbenchBot(); + SWTUtils.asyncExec(() -> {try { + PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() + .showView(DockerContainersView.VIEW_ID); + } catch (Exception e) { + e.printStackTrace(); + Assert.fail("Failed to open Docker Explorer view: " + e.getMessage()); + }}); + this.dockerContainersViewBot = bot.viewById(DockerContainersView.VIEW_ID); + this.dockerContainersView = (DockerContainersView) (dockerContainersViewBot.getViewReference().getView(true)); + this.dockerExplorerBotView = bot.viewById(DockerExplorerView.VIEW_ID); + } + + @Test + public void shouldRemoveListenersWhenClosingView() { + // given + final DockerClient client = MockDockerClientFactory + .container(MockDockerContainerFactory.name("angry_bar").status("Stopped").build()).build(); + final DockerConnection dockerConnection = MockDockerConnectionFactory.from("Test", client).get(); + DockerConnectionManagerUtils.configureConnectionManager(dockerConnection); + // remove the DockerContainerRefreshManager + dockerConnection.removeContainerListener(DockerContainerRefreshManager + .getInstance()); + // DockerExplorerView inner classes + assertThat(dockerConnection.getContainerListeners()).hasSize(2); + // close the Docker Explorer View + dockerContainersViewBot.close(); + // there should be one listener left: DockerExplorerView + assertThat(dockerConnection.getContainerListeners()).hasSize(1); + } + + @Test + public void shouldNotRemoveListenersWhenNoSelectedConnectionBeforeClosingView() { + // given + dockerExplorerBotView.close(); + final DockerClient client = MockDockerClientFactory + .container(MockDockerContainerFactory.name("angry_bar").status("Stopped").build()).build(); + final DockerConnection dockerConnection = MockDockerConnectionFactory.from("Test", client).get(); + DockerConnectionManagerUtils.configureConnectionManager(dockerConnection); + // remove the DockerContainerRefreshManager + dockerConnection.removeContainerListener(DockerContainerRefreshManager + .getInstance()); + // DockerExplorerView inner classes + assertThat(dockerConnection.getContainerListeners()).hasSize(0); + // close the Docker Explorer View + dockerContainersViewBot.close(); + // there should be one listener left: DockerExplorerView + assertThat(dockerConnection.getContainerListeners()).hasSize(0); + } + +} 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 14039b04dd..28101ffa9e 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 @@ -578,10 +578,8 @@ public class DockerExplorerViewSWTBotTest { assertThat(dockerConnection.getImageListeners()).hasSize(1); // close the Docker Explorer View dockerExplorerViewBot.close(); - // there should be one listener left: DockerConnectionRefreshManager + // there should be no listener left assertThat(dockerConnection.getContainerListeners()).hasSize(0); assertThat(dockerConnection.getImageListeners()).hasSize(0); - - } } diff --git a/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerContainersView.java b/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerContainersView.java index da5ede59fd..69c0e785fa 100644 --- a/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerContainersView.java +++ b/containers/org.eclipse.linuxtools.docker.ui/src/org/eclipse/linuxtools/internal/docker/ui/views/DockerContainersView.java @@ -93,6 +93,10 @@ public class DockerContainersView extends ViewPart implements @Override public void dispose() { + // remove this listener instance registered on the Docker connection + if (connection != null) { + connection.removeContainerListener(this); + } // stop tracking selection changes in the Docker Explorer view (only) getSite().getWorkbenchWindow().getSelectionService() .removeSelectionListener(DockerExplorerView.VIEW_ID, this); |