From: Marc-Andre Laperle Date: Wed, 12 Oct 2016 17:45:33 +0000 (-0400) Subject: tmf: Fix intermittent fail in ProjectModelOutputTest.testListOutputs X-Git-Url: http://git.efficios.com/?p=deliverable%2Ftracecompass.git;a=commitdiff_plain;h=6db82092b514421a6dd57645f9aadac8bac4a3e0 tmf: Fix intermittent fail in ProjectModelOutputTest.testListOutputs This adds a waitUntil/condition that waits until there is the correct number of children under the analysis. To reproduce the issue, in TmfAnalysisElement.refreshChildren, add a Thread.sleep(1000); at the beginning. Bug: 491823 Change-Id: Iaae81093d90f26403cc58b7286c8691db7db3644 Signed-off-by: Marc-Andre Laperle Reviewed-on: https://git.eclipse.org/r/83052 Reviewed-by: Hudson CI Reviewed-by: Patrick Tasse Tested-by: Patrick Tasse --- diff --git a/tmf/org.eclipse.tracecompass.tmf.ui.tests/shared/org/eclipse/tracecompass/tmf/ui/tests/shared/ProjectModelTestData.java b/tmf/org.eclipse.tracecompass.tmf.ui.tests/shared/org/eclipse/tracecompass/tmf/ui/tests/shared/ProjectModelTestData.java index a04f31d549..ec61a61ac7 100644 --- a/tmf/org.eclipse.tracecompass.tmf.ui.tests/shared/org/eclipse/tracecompass/tmf/ui/tests/shared/ProjectModelTestData.java +++ b/tmf/org.eclipse.tracecompass.tmf.ui.tests/shared/org/eclipse/tracecompass/tmf/ui/tests/shared/ProjectModelTestData.java @@ -14,7 +14,6 @@ package org.eclipse.tracecompass.tmf.ui.tests.shared; import java.io.File; import java.lang.reflect.InvocationTargetException; -import java.util.concurrent.TimeoutException; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; @@ -46,11 +45,6 @@ import org.eclipse.ui.actions.WorkspaceModifyOperation; */ public class ProjectModelTestData { - /* Maximum number of thread delays the main thread will do before timing out */ - private static final int DELAY_COUNTER = 1000; - /* Default delay time when having the main thread sleep. */ - private static final long DEFAULT_DELAY = 500; - /** Default test project name */ public static final String PROJECT_NAME = "Test_Project"; @@ -238,28 +232,28 @@ public class ProjectModelTestData { * longer delays in those cases, it is preferable to use the * {@link ProjectModelTestData#delayThread(long)} instead. * - * Timeout is DELAY_COUNTER * DEFAULT_DELAY ms - * * @param projectElement * The trace element we are waiting for. If the element if not of * type TmfTraceElement, the thread is delayed only once. - * @throws TimeoutException + * @throws WaitTimeoutException * If after the maximum number of delays the trace is still * null, we throw a timeout exception, the trace has not opened. */ - public static void delayUntilTraceOpened(final ITmfProjectModelElement projectElement) throws TimeoutException { + public static void delayUntilTraceOpened(final ITmfProjectModelElement projectElement) throws WaitTimeoutException { if (projectElement instanceof TmfCommonProjectElement) { TmfCommonProjectElement traceElement = (TmfCommonProjectElement) projectElement; - final long deadline = System.nanoTime() + (DELAY_COUNTER * DEFAULT_DELAY * 1000000L); - do { - delayThread(DEFAULT_DELAY); - if (traceElement.getTrace() != null) { - return; + WaitUtils.waitUntil(new IWaitCondition() { + @Override + public boolean test() throws Exception { + return traceElement.getTrace() != null; + } + + @Override + public String getFailureMessage() { + return "Timeout while waiting for " + traceElement; } - } while (System.nanoTime() < deadline); - throw new TimeoutException("Timeout while waiting for " + traceElement); + }); } - delayThread(DEFAULT_DELAY); - } + } } diff --git a/tmf/org.eclipse.tracecompass.tmf.ui.tests/src/org/eclipse/tracecompass/tmf/ui/tests/project/model/ProjectModelAnalysisTest.java b/tmf/org.eclipse.tracecompass.tmf.ui.tests/src/org/eclipse/tracecompass/tmf/ui/tests/project/model/ProjectModelAnalysisTest.java index bb907db14c..a4fc448c01 100644 --- a/tmf/org.eclipse.tracecompass.tmf.ui.tests/src/org/eclipse/tracecompass/tmf/ui/tests/project/model/ProjectModelAnalysisTest.java +++ b/tmf/org.eclipse.tracecompass.tmf.ui.tests/src/org/eclipse/tracecompass/tmf/ui/tests/project/model/ProjectModelAnalysisTest.java @@ -20,7 +20,6 @@ import static org.junit.Assert.fail; import java.util.List; import java.util.Optional; -import java.util.concurrent.TimeoutException; import org.eclipse.core.runtime.CoreException; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; @@ -30,6 +29,7 @@ import org.eclipse.tracecompass.tmf.ui.project.model.TmfProjectElement; import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceElement; import org.eclipse.tracecompass.tmf.ui.project.model.TmfViewsElement; import org.eclipse.tracecompass.tmf.ui.tests.shared.ProjectModelTestData; +import org.eclipse.tracecompass.tmf.ui.tests.shared.WaitTimeoutException; import org.eclipse.tracecompass.tmf.ui.tests.stubs.analysis.TestAnalysisUi; import org.junit.After; import org.junit.Before; @@ -147,7 +147,7 @@ public class ProjectModelAnalysisTest { try { ProjectModelTestData.delayUntilTraceOpened(traceElement); - } catch (TimeoutException e) { + } catch (WaitTimeoutException e) { fail("The analysis parent did not open in a reasonable time"); } ITmfTrace trace = traceElement.getTrace(); diff --git a/tmf/org.eclipse.tracecompass.tmf.ui.tests/src/org/eclipse/tracecompass/tmf/ui/tests/project/model/ProjectModelOutputTest.java b/tmf/org.eclipse.tracecompass.tmf.ui.tests/src/org/eclipse/tracecompass/tmf/ui/tests/project/model/ProjectModelOutputTest.java index 157b07f337..f83c4bcaf6 100644 --- a/tmf/org.eclipse.tracecompass.tmf.ui.tests/src/org/eclipse/tracecompass/tmf/ui/tests/project/model/ProjectModelOutputTest.java +++ b/tmf/org.eclipse.tracecompass.tmf.ui.tests/src/org/eclipse/tracecompass/tmf/ui/tests/project/model/ProjectModelOutputTest.java @@ -18,7 +18,6 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.List; -import java.util.concurrent.TimeoutException; import org.eclipse.core.runtime.CoreException; import org.eclipse.tracecompass.tmf.ui.project.model.ITmfProjectModelElement; @@ -26,7 +25,10 @@ import org.eclipse.tracecompass.tmf.ui.project.model.TmfAnalysisElement; import org.eclipse.tracecompass.tmf.ui.project.model.TmfAnalysisOutputElement; import org.eclipse.tracecompass.tmf.ui.project.model.TmfProjectElement; import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceElement; +import org.eclipse.tracecompass.tmf.ui.tests.shared.IWaitCondition; import org.eclipse.tracecompass.tmf.ui.tests.shared.ProjectModelTestData; +import org.eclipse.tracecompass.tmf.ui.tests.shared.WaitTimeoutException; +import org.eclipse.tracecompass.tmf.ui.tests.shared.WaitUtils; import org.eclipse.tracecompass.tmf.ui.tests.stubs.analysis.TestAnalysisUi; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbench; @@ -108,11 +110,12 @@ public class ProjectModelOutputTest { analysis.activateParentTrace(); try { ProjectModelTestData.delayUntilTraceOpened(analysis.getParent()); - } catch (TimeoutException e) { + } catch (WaitTimeoutException e) { fail("The analysis parent did not open in a reasonable time"); } /* Make sure the output list is not empty */ + WaitUtils.waitUntil(new ConditionTraceChildrenElements(analysis, 1)); List outputList = analysis.getAvailableOutputs(); assertFalse(outputList.isEmpty()); boolean found = false; @@ -137,10 +140,11 @@ public class ProjectModelOutputTest { analysis.activateParentTrace(); try { ProjectModelTestData.delayUntilTraceOpened(analysis.getParent()); - } catch (TimeoutException e) { + } catch (WaitTimeoutException e) { fail("The analysis parent did not open in a reasonable time"); } + WaitUtils.waitUntil(new ConditionTraceChildrenElements(analysis, 1)); List outputList = analysis.getAvailableOutputs(); assertFalse(outputList.isEmpty()); @@ -168,4 +172,26 @@ public class ProjectModelOutputTest { view = activePage.findView(TestAnalysisUi.VIEW_ID); assertNotNull(view); } + + private static final class ConditionTraceChildrenElements implements IWaitCondition { + private final ITmfProjectModelElement fProjectElement; + private int fCurNumChildren; + private int fExpectedChildNum; + + private ConditionTraceChildrenElements(ITmfProjectModelElement projectElement, int childNum) { + fProjectElement = projectElement; + fExpectedChildNum = childNum; + } + + @Override + public boolean test() throws Exception { + fCurNumChildren = fProjectElement.getChildren().size(); + return fCurNumChildren == fExpectedChildNum; + } + + @Override + public String getFailureMessage() { + return "Timeout while waiting for " + fProjectElement + " to have number of children. Expected: " + fExpectedChildNum + " Actual: " + fCurNumChildren; + } + } } diff --git a/tmf/org.eclipse.tracecompass.tmf.ui.tests/src/org/eclipse/tracecompass/tmf/ui/tests/project/model/ProjectModelTraceTest.java b/tmf/org.eclipse.tracecompass.tmf.ui.tests/src/org/eclipse/tracecompass/tmf/ui/tests/project/model/ProjectModelTraceTest.java index 7365e7e265..d046185f68 100644 --- a/tmf/org.eclipse.tracecompass.tmf.ui.tests/src/org/eclipse/tracecompass/tmf/ui/tests/project/model/ProjectModelTraceTest.java +++ b/tmf/org.eclipse.tracecompass.tmf.ui.tests/src/org/eclipse/tracecompass/tmf/ui/tests/project/model/ProjectModelTraceTest.java @@ -17,8 +17,6 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import java.util.concurrent.TimeoutException; - import org.eclipse.core.runtime.CoreException; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager; @@ -26,6 +24,7 @@ import org.eclipse.tracecompass.tmf.ui.project.model.TmfOpenTraceHelper; import org.eclipse.tracecompass.tmf.ui.project.model.TmfProjectElement; import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceElement; import org.eclipse.tracecompass.tmf.ui.tests.shared.ProjectModelTestData; +import org.eclipse.tracecompass.tmf.ui.tests.shared.WaitTimeoutException; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -79,7 +78,7 @@ public class ProjectModelTraceTest { /* Give the trace a chance to open */ try { ProjectModelTestData.delayUntilTraceOpened(traceElement); - } catch (TimeoutException e) { + } catch (WaitTimeoutException e) { fail("The trace did not open in a reasonable delay"); } @@ -93,7 +92,7 @@ public class ProjectModelTraceTest { TmfOpenTraceHelper.openTraceFromElement(traceElement); try { ProjectModelTestData.delayUntilTraceOpened(traceElement); - } catch (TimeoutException e) { + } catch (WaitTimeoutException e) { fail("The trace did not open in a reasonable delay"); } diff --git a/tmf/org.eclipse.tracecompass.tmf.ui.tests/src/org/eclipse/tracecompass/tmf/ui/tests/project/model/TraceAndExperimentTypeTest.java b/tmf/org.eclipse.tracecompass.tmf.ui.tests/src/org/eclipse/tracecompass/tmf/ui/tests/project/model/TraceAndExperimentTypeTest.java index 183879349f..3e168c2e1e 100644 --- a/tmf/org.eclipse.tracecompass.tmf.ui.tests/src/org/eclipse/tracecompass/tmf/ui/tests/project/model/TraceAndExperimentTypeTest.java +++ b/tmf/org.eclipse.tracecompass.tmf.ui.tests/src/org/eclipse/tracecompass/tmf/ui/tests/project/model/TraceAndExperimentTypeTest.java @@ -18,8 +18,6 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import java.util.concurrent.TimeoutException; - import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.tracecompass.tmf.core.TmfCommonConstants; @@ -106,11 +104,7 @@ public class TraceAndExperimentTypeTest { } TmfOpenTraceHelper.openTraceFromElement(fExperiment); - try { - ProjectModelTestData.delayUntilTraceOpened(fExperiment); - } catch (TimeoutException e1) { - fail (e1.getMessage()); - } + ProjectModelTestData.delayUntilTraceOpened(fExperiment); ITmfTrace trace = fExperiment.getTrace(); assertTrue(trace instanceof TmfExperimentStub); @@ -124,11 +118,7 @@ public class TraceAndExperimentTypeTest { public void testNoExperimentTypeChildren() { TmfOpenTraceHelper.openTraceFromElement(fExperiment); - try { - ProjectModelTestData.delayUntilTraceOpened(fExperiment); - } catch (TimeoutException e1) { - fail (e1.getMessage()); - } + ProjectModelTestData.delayUntilTraceOpened(fExperiment); final IWorkbench wb = PlatformUI.getWorkbench(); final IWorkbenchPage activePage = wb.getActiveWorkbenchWindow().getActivePage();