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) {