diff options
author | Laurent Goubet | 2017-06-12 13:12:22 +0000 |
---|---|---|
committer | Laurent Goubet | 2017-06-12 14:24:55 +0000 |
commit | ad1ad915fb9b666a62a71dc02b2fb01271cbf447 (patch) | |
tree | 6e1be23125ebfd612b7beb4c82724f476aca68f8 | |
parent | 0f1fcf759299dc61c23ac1fbe64c8927c15e0c95 (diff) | |
download | org.eclipse.emf.compare-3.3.1.tar.gz org.eclipse.emf.compare-3.3.1.tar.xz org.eclipse.emf.compare-3.3.1.zip |
This particular mocking of a WrappableTreeViewer was the source of a
memory leak preventing java to retrieve 700MB of memory even after the
end of that JUnit test.
Change-Id: I994e6c2e32ef6b267be9d2e465b57dcae3ffffb2
2 files changed, 30 insertions, 36 deletions
diff --git a/plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/structuremergeviewer/NavigatableTest.java b/plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/structuremergeviewer/NavigatableTest.java index e443f7003..eeed3cd20 100644 --- a/plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/structuremergeviewer/NavigatableTest.java +++ b/plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/structuremergeviewer/NavigatableTest.java @@ -19,7 +19,6 @@ import static org.junit.Assert.assertTrue; import com.google.common.base.Strings; import org.eclipse.compare.INavigatable; -import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.Navigatable; import org.eclipse.emf.compare.ide.ui.tests.structuremergeviewer.TestContext.TestNavigatable; import org.eclipse.swt.widgets.Display; @@ -52,10 +51,7 @@ public class NavigatableTest { @After public void after() { - Tree swtTree = testContext.getTree(); - if (swtTree != null) { - swtTree.dispose(); - } + testContext.dispose(); shell.dispose(); } @@ -180,10 +176,11 @@ public class NavigatableTest { } private void assertSelectedItemIndex(int index) { - Adapter data = ((Adapter)testContext.getTree().getItem(index).getData()); - Object[] selection = testContext.getCurrentSelection(); - assertEquals(1, selection.length); - assertTrue(data == selection[0]); + Object data = testContext.getTree().getItem(index).getData(); + assertNotNull(data); + Object[] currentSelection = testContext.getCurrentSelection(); + assertEquals(1, currentSelection.length); + assertTrue(data == currentSelection[0]); } private void assertAllNextItems(TestNavigatable navigatable, TestContext context) { diff --git a/plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/structuremergeviewer/TestContext.java b/plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/structuremergeviewer/TestContext.java index 34e410d08..961edeeb9 100644 --- a/plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/structuremergeviewer/TestContext.java +++ b/plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/structuremergeviewer/TestContext.java @@ -11,10 +11,7 @@ *******************************************************************************/ package org.eclipse.emf.compare.ide.ui.tests.structuremergeviewer; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import java.util.HashMap; @@ -28,14 +25,13 @@ import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.EMFCompareSt import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.Navigatable; import org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.WrappableTreeViewer; import org.eclipse.emf.edit.tree.TreeNode; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.viewers.IOpenListener; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.OpenEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; /** * Utils class used for creating the {@link Tree} and the {@link WrappableTreeViewer}. @@ -51,7 +47,7 @@ final class TestContext { private Tree swtTree; - private Map<Integer, TreeItem> itemRetreiver; + private Map<Integer, TreeItem> itemRetriever; private WrappableTreeViewer viewer; @@ -62,7 +58,7 @@ final class TestContext { public TestContext(Shell shell) { super(); currentShell = shell; - this.itemRetreiver = new HashMap<Integer, TreeItem>(); + this.itemRetriever = new HashMap<Integer, TreeItem>(); } private Integer increment() { @@ -74,13 +70,21 @@ final class TestContext { } public TreeItem getItem(int id) { - return itemRetreiver.get(Integer.valueOf(id)); + return itemRetriever.get(Integer.valueOf(id)); } public int getNumberOfNodes() { return counter - 1; } + public void dispose() { + if (swtTree != null) { + swtTree.dispose(); + swtTree = null; + } + itemRetriever.clear(); + } + /** * Builds a {@link Tree} (convenience method for calling {@link #buildTree(int, int, boolean)} with * useString = <code>true</code>) @@ -111,30 +115,23 @@ final class TestContext { swtTree = new Tree(currentShell, SWT.NONE); swtTree.setData("root"); //$NON-NLS-1$ createSubNodes(swtTree, numberOfChildren, depth, useStrings); - viewer = spy(new WrappableTreeViewer(swtTree)); - doAnswer(selectionChanged()).when(viewer).setSelection(any(ISelection.class)); + viewer = new WrappableTreeViewer(swtTree); + viewer.addOpenListener(new IOpenListener() { + public void open(OpenEvent event) { + if (event.getSelection() instanceof IStructuredSelection) { + currentSelection = ((IStructuredSelection)event.getSelection()).toArray(); + } + } + }); AdapterFactory adapterFactory = mock(AdapterFactory.class); EMFCompareStructureMergeViewerContentProvider contentProvider = new EMFCompareStructureMergeViewerContentProvider( - adapterFactory, viewer); // mock(EMFCompareStructureMergeViewerContentProvider.class); + adapterFactory, viewer); return new TestNavigatable(viewer, contentProvider); } else { throw new AssertionError("The tree can only be built once"); //$NON-NLS-1$ } } - private Answer<Void> selectionChanged() { - return new Answer<Void>() { - public Void answer(InvocationOnMock invocation) throws Throwable { - ISelection selection = (ISelection)invocation.getArguments()[0]; - if (selection instanceof StructuredSelection) { - currentSelection = ((StructuredSelection)selection).toArray(); - } - invocation.callRealMethod(); - return null; - } - }; - } - private void createSubNodes(Object parent, int numberOfChild, int depth, boolean useStrings) { if (depth > 0) { for (int childIndex = 0; childIndex < numberOfChild; childIndex++) { @@ -157,7 +154,7 @@ final class TestContext { when(notifier.getData()).thenReturn(diff); item.setData(adapter); } - itemRetreiver.put(increment, item); + itemRetriever.put(increment, item); createSubNodes(item, numberOfChild, depth - 1, useStrings); } } |