Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Goubet2017-06-12 13:12:22 +0000
committerLaurent Goubet2017-06-12 14:24:55 +0000
commitad1ad915fb9b666a62a71dc02b2fb01271cbf447 (patch)
tree6e1be23125ebfd612b7beb4c82724f476aca68f8
parent0f1fcf759299dc61c23ac1fbe64c8927c15e0c95 (diff)
downloadorg.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
"spy"ing is the root cause of a huge memory leak3.3.1RC43.3.1
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
-rw-r--r--plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/structuremergeviewer/NavigatableTest.java15
-rw-r--r--plugins/org.eclipse.emf.compare.ide.ui.tests/src/org/eclipse/emf/compare/ide/ui/tests/structuremergeviewer/TestContext.java51
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);
}
}

Back to the top