Bug 507844: [Unittest] UI testsuite references causes memory issues
trying to clean up all unnecessary data after testsuite finished
execution
diff --git a/plugins/org.eclipse.ease.modules.unittest.ui/src/org/eclipse/ease/modules/unittest/ui/sourceprovider/TestSuiteSource.java b/plugins/org.eclipse.ease.modules.unittest.ui/src/org/eclipse/ease/modules/unittest/ui/sourceprovider/TestSuiteSource.java
index 309e744..a558679 100644
--- a/plugins/org.eclipse.ease.modules.unittest.ui/src/org/eclipse/ease/modules/unittest/ui/sourceprovider/TestSuiteSource.java
+++ b/plugins/org.eclipse.ease.modules.unittest.ui/src/org/eclipse/ease/modules/unittest/ui/sourceprovider/TestSuiteSource.java
@@ -56,7 +56,7 @@
@SuppressWarnings("rawtypes")
@Override
public Map getCurrentState() {
- final Map<String, Object> result = new HashMap<String, Object>();
+ final Map<String, Object> result = new HashMap<>();
result.put(VARIABLE_TESTSUITE, fCurrentSuite);
@@ -64,7 +64,7 @@
}
public void setActiveSuite(final TestSuite suite) {
- if ((suite != null) && (suite.equals(fCurrentSuite)))
+ if (fCurrentSuite.equals(suite))
// nothing changed
return;
@@ -75,7 +75,7 @@
if (fCurrentSuite instanceof TestSuite)
((TestSuite) fCurrentSuite).addTestListener(this);
- fireSourceChanged(ISources.ACTIVE_PART, VARIABLE_TESTSUITE, suite);
+ fireSourceChanged(ISources.ACTIVE_PART, VARIABLE_TESTSUITE, fCurrentSuite);
final IEvaluationService evaluationService = (IEvaluationService) PlatformUI.getWorkbench().getService(IEvaluationService.class);
evaluationService.requestEvaluation(VARIABLE_TESTSUITE);
@@ -95,5 +95,4 @@
evaluationService.requestEvaluation(VARIABLE_TESTSUITE);
}
}
-
}
diff --git a/plugins/org.eclipse.ease.modules.unittest.ui/src/org/eclipse/ease/modules/unittest/ui/views/TestSuiteContentProvider.java b/plugins/org.eclipse.ease.modules.unittest.ui/src/org/eclipse/ease/modules/unittest/ui/views/TestSuiteContentProvider.java
index 54e34de..83d5d63 100644
--- a/plugins/org.eclipse.ease.modules.unittest.ui/src/org/eclipse/ease/modules/unittest/ui/views/TestSuiteContentProvider.java
+++ b/plugins/org.eclipse.ease.modules.unittest.ui/src/org/eclipse/ease/modules/unittest/ui/views/TestSuiteContentProvider.java
@@ -19,15 +19,17 @@
@Override
protected void populateElements(final Object inputElement) {
- final TestSuite suite = (TestSuite) ((Object[]) inputElement)[0];
+ if (inputElement != null) {
+ final TestSuite suite = (TestSuite) ((Object[]) inputElement)[0];
- for (final TestFile testfile : suite.getChildren()) {
- final Object file = testfile.getFile();
- if (file instanceof IFile)
- registerElement(((IFile) file).getParent().getProjectRelativePath(), testfile);
+ for (final TestFile testfile : suite.getChildren()) {
+ final Object file = testfile.getFile();
+ if (file instanceof IFile)
+ registerElement(((IFile) file).getParent().getProjectRelativePath(), testfile);
+ }
+
+ registerNodeReplacement(ROOT, suite);
+ setShowRoot(true);
}
-
- registerNodeReplacement(ROOT, suite);
- setShowRoot(true);
}
}
diff --git a/plugins/org.eclipse.ease.modules.unittest.ui/src/org/eclipse/ease/modules/unittest/ui/views/UnitTestView.java b/plugins/org.eclipse.ease.modules.unittest.ui/src/org/eclipse/ease/modules/unittest/ui/views/UnitTestView.java
index 7c1455a..9093718 100644
--- a/plugins/org.eclipse.ease.modules.unittest.ui/src/org/eclipse/ease/modules/unittest/ui/views/UnitTestView.java
+++ b/plugins/org.eclipse.ease.modules.unittest.ui/src/org/eclipse/ease/modules/unittest/ui/views/UnitTestView.java
@@ -90,7 +90,7 @@
public static final String TEST_STATUS_PROPERTY = "test status";
private static class Statistics {
- private final Map<Object, Integer> mCounters = new HashMap<Object, Integer>();
+ private final Map<Object, Integer> mCounters = new HashMap<>();
public synchronized void updateCounter(final Object identifier, final int value) {
if (mCounters.containsKey(identifier))
@@ -508,7 +508,7 @@
private class UpdateUI extends UIJob {
- private final List<Object> fElements = new ArrayList<Object>();
+ private final List<Object> fElements = new ArrayList<>();
public UpdateUI() {
super("Update Script Unit View");
@@ -530,7 +530,7 @@
// create a local copy of elements so we can continue tests without waiting for the UI updater
ArrayList<Object> localElements;
synchronized (fElements) {
- localElements = new ArrayList<Object>(fElements);
+ localElements = new ArrayList<>(fElements);
fElements.clear();
}
@@ -754,6 +754,9 @@
// save timing information
if (fRuntimeInformation != null)
fRuntimeInformation.save();
+
+ // clear data to minimize memory footprint in eclipse caches
+ currentSuite.reset();
}
fFileTreeViewer.setInput(new Object[] { suite });
@@ -795,6 +798,18 @@
if (fRuntimeInformation != null)
fRuntimeInformation.save();
+ // allow for garbage collection as eclipse does not clean up views correctly on clode
+ fRuntimeInformation = null;
+ final TestSuiteSource instance = TestSuiteSource.getActiveInstance();
+ if (instance != null)
+ instance.setActiveSuite(null);
+
+ fFileTreeViewer.setInput(new Object[0]);
+
+ // clear data to minimize memory footprint in eclipse caches
+ if (currentSuite != null)
+ currentSuite.reset();
+
super.dispose();
}
diff --git a/plugins/org.eclipse.ease.modules.unittest/src/org/eclipse/ease/modules/unittest/components/TestSuite.java b/plugins/org.eclipse.ease.modules.unittest/src/org/eclipse/ease/modules/unittest/components/TestSuite.java
index ffdc934..33e8125 100644
--- a/plugins/org.eclipse.ease.modules.unittest/src/org/eclipse/ease/modules/unittest/components/TestSuite.java
+++ b/plugins/org.eclipse.ease.modules.unittest/src/org/eclipse/ease/modules/unittest/components/TestSuite.java
@@ -69,7 +69,7 @@
private final TestSuiteModel fTestModel;
private boolean fTerminated = false;
- private final Map<String, TestFile> fTestFiles = new HashMap<String, TestFile>();
+ private final Map<String, TestFile> fTestFiles = new HashMap<>();
private int fCurrentTestCount;
private List<TestFile> fActiveTestFiles = Collections.emptyList();
@@ -129,10 +129,10 @@
// setup done; extract variables
fSetupVariables = getScriptEngine().getVariables();
- final ArrayList<TestFile> launchedTestFiles = new ArrayList<TestFile>();
+ final ArrayList<TestFile> launchedTestFiles = new ArrayList<>();
// main test execution loop
- final List<TestFile> filesUnderTest = new ArrayList<TestFile>(fActiveTestFiles);
+ final List<TestFile> filesUnderTest = new ArrayList<>(fActiveTestFiles);
synchronized (TestSuite.this) {
while ((!fTerminated) && ((fCurrentTestCount > 0) || (!filesUnderTest.isEmpty()))) {
@@ -189,6 +189,7 @@
getScriptEngine().terminate();
setScriptEngine(null);
+ fSetupVariables = null;
setStatus(TestStatus.PASS);
}
@@ -208,7 +209,7 @@
if (result.hasException()) {
// testFile setup failed
- final ArrayList<IScriptDebugFrame> trace = new ArrayList<IScriptDebugFrame>();
+ final ArrayList<IScriptDebugFrame> trace = new ArrayList<>();
// TODO eventually get the trace from the engine. Needs engine to keep traces on failures
trace.add(new ScriptDebugFrame(new Script("[" + identifier + "]", ""), 0, IScriptDebugFrame.TYPE_FILE));
@@ -280,7 +281,7 @@
public void run(final ITestSetFilter filter) {
// filter tests
- fActiveTestFiles = new LinkedList<TestFile>();
+ fActiveTestFiles = new LinkedList<>();
for (final TestFile testFile : fTestFiles.values()) {
if (filter.matches(testFile))
fActiveTestFiles.add(testFile);
@@ -337,7 +338,7 @@
}
public List<TestFile> getActiveTestFiles() {
- return new ArrayList<TestFile>(fActiveTestFiles);
+ return new ArrayList<>(fActiveTestFiles);
}
public void setErrorStream(final OutputStream errorStream) {