From 156e9ead613443a4bbb95a686df99dc818a596bf Mon Sep 17 00:00:00 2001 From: Marc-Andre Laperle Date: Mon, 7 Dec 2015 17:10:17 -0500 Subject: [PATCH] lttng: Make ControlFlowViewTest more robust Added a condition to wait on. Added the concept of the view being dirty so that we know if the view is ready or not. This required some rework of the zoom thread methods to make it less error prone in keeping the dirty flag consistent. Change-Id: Ib73d84363e90aae1ca046c101f2086e3840b5bc2 Signed-off-by: Marc-Andre Laperle Reviewed-on: https://git.eclipse.org/r/62154 Reviewed-by: Hudson CI Reviewed-by: Patrick Tasse Tested-by: Patrick Tasse --- .../ui/swtbot/tests/ControlFlowViewTest.java | 210 ++++++++---------- .../swtbot/tests/shared/ConditionHelpers.java | 50 +++++ .../AbstractStateSystemTimeGraphView.java | 2 +- .../timegraph/AbstractTimeGraphView.java | 37 ++- 4 files changed, 178 insertions(+), 121 deletions(-) diff --git a/lttng/org.eclipse.tracecompass.lttng2.kernel.ui.swtbot.tests/src/org/eclipse/tracecompass/lttng2/kernel/ui/swtbot/tests/ControlFlowViewTest.java b/lttng/org.eclipse.tracecompass.lttng2.kernel.ui.swtbot.tests/src/org/eclipse/tracecompass/lttng2/kernel/ui/swtbot/tests/ControlFlowViewTest.java index a84ad87c27..99415916fe 100644 --- a/lttng/org.eclipse.tracecompass.lttng2.kernel.ui.swtbot.tests/src/org/eclipse/tracecompass/lttng2/kernel/ui/swtbot/tests/ControlFlowViewTest.java +++ b/lttng/org.eclipse.tracecompass.lttng2.kernel.ui.swtbot.tests/src/org/eclipse/tracecompass/lttng2/kernel/ui/swtbot/tests/ControlFlowViewTest.java @@ -14,8 +14,6 @@ package org.eclipse.tracecompass.lttng2.kernel.ui.swtbot.tests; import static org.junit.Assert.assertTrue; -import java.util.List; - import org.eclipse.jdt.annotation.NonNull; import org.eclipse.swt.SWT; import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView; @@ -25,7 +23,6 @@ import org.eclipse.swtbot.swt.finder.keyboard.KeyboardFactory; import org.eclipse.swtbot.swt.finder.keyboard.Keystrokes; import org.eclipse.swtbot.swt.finder.matchers.WidgetOfType; import org.eclipse.swtbot.swt.finder.results.VoidResult; -import org.eclipse.swtbot.swt.finder.waits.DefaultCondition; import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree; import org.eclipse.tracecompass.tmf.core.signal.TmfSelectionRangeUpdatedSignal; import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager; @@ -35,8 +32,9 @@ import org.eclipse.tracecompass.tmf.core.timestamp.TmfNanoTimestamp; import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange; import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager; import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.ConditionHelpers; -import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ILinkEvent; +import org.eclipse.tracecompass.tmf.ui.views.timegraph.AbstractTimeGraphView; import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.TimeGraphControl; +import org.eclipse.ui.IWorkbenchPart; import org.junit.Before; import org.junit.Test; @@ -82,79 +80,10 @@ public class ControlFlowViewTest extends KernelTest { */ @Test public void testKeyboardLeftRight() { - /* change window range to 10 ms */ - TmfTimeRange range = new TmfTimeRange(START_TIME, START_TIME.normalize(10000000L, ITmfTimestamp.NANOSECOND_SCALE)); - TmfSignalManager.dispatchSignal(new TmfWindowRangeUpdatedSignal(this, range)); - fBot.waitUntil(ConditionHelpers.windowRange(range)); - - /* set selection to trace start time */ - TmfSignalManager.dispatchSignal(new TmfSelectionRangeUpdatedSignal(this, START_TIME)); - fBot.waitUntil(ConditionHelpers.selectionRange(new TmfTimeRange(START_TIME, START_TIME))); - - /* select first item */ - final SWTBotTree tree = fViewBot.bot().tree(); - tree.pressShortcut(Keystrokes.HOME); - - /* set focus on time graph */ - final TimeGraphControl timegraph = fViewBot.bot().widget(WidgetOfType.widgetOfType(TimeGraphControl.class)); - UIThreadRunnable.syncExec(new VoidResult() { - @Override - public void run() { - timegraph.setFocus(); - } - }); - - /* press ARROW_RIGHT 3 times */ - KEYBOARD.pressShortcut(Keystrokes.RIGHT); - KEYBOARD.pressShortcut(Keystrokes.RIGHT); - KEYBOARD.pressShortcut(Keystrokes.RIGHT); - fBot.waitUntil(ConditionHelpers.selectionRange(new TmfTimeRange(TID1_TIME3, TID1_TIME3))); - assertTrue(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME3)); - - /* press Shift-ARROW_RIGHT 3 times */ - KEYBOARD.pressShortcut(Keystrokes.SHIFT, Keystrokes.RIGHT); - KEYBOARD.pressShortcut(Keystrokes.SHIFT, Keystrokes.RIGHT); - KEYBOARD.pressShortcut(Keystrokes.SHIFT, Keystrokes.RIGHT); - fBot.waitUntil(ConditionHelpers.selectionRange(new TmfTimeRange(TID1_TIME3, TID1_TIME6))); - assertTrue(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME6)); - - /* press Shift-ARROW_LEFT 4 times */ - KEYBOARD.pressShortcut(Keystrokes.SHIFT, Keystrokes.LEFT); - KEYBOARD.pressShortcut(Keystrokes.SHIFT, Keystrokes.LEFT); - KEYBOARD.pressShortcut(Keystrokes.SHIFT, Keystrokes.LEFT); - KEYBOARD.pressShortcut(Keystrokes.SHIFT, Keystrokes.LEFT); - fBot.waitUntil(ConditionHelpers.selectionRange(new TmfTimeRange(TID1_TIME3, TID1_TIME2))); - assertTrue(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME2)); - - /* press ARROW_RIGHT 2 times */ - KEYBOARD.pressShortcut(Keystrokes.RIGHT); - KEYBOARD.pressShortcut(Keystrokes.RIGHT); - fBot.waitUntil(ConditionHelpers.selectionRange(new TmfTimeRange(TID1_TIME4, TID1_TIME4))); - assertTrue(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME4)); - - /* press Shift-ARROW_LEFT 3 times */ - KEYBOARD.pressShortcut(Keystrokes.SHIFT, Keystrokes.LEFT); - KEYBOARD.pressShortcut(Keystrokes.SHIFT, Keystrokes.LEFT); - KEYBOARD.pressShortcut(Keystrokes.SHIFT, Keystrokes.LEFT); - fBot.waitUntil(ConditionHelpers.selectionRange(new TmfTimeRange(TID1_TIME4, TID1_TIME1))); - assertTrue(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME1)); - - /* press Shift-ARROW_RIGHT 4 times */ - KEYBOARD.pressShortcut(Keystrokes.SHIFT, Keystrokes.RIGHT); - KEYBOARD.pressShortcut(Keystrokes.SHIFT, Keystrokes.RIGHT); - KEYBOARD.pressShortcut(Keystrokes.SHIFT, Keystrokes.RIGHT); - KEYBOARD.pressShortcut(Keystrokes.SHIFT, Keystrokes.RIGHT); - fBot.waitUntil(ConditionHelpers.selectionRange(new TmfTimeRange(TID1_TIME4, TID1_TIME5))); - assertTrue(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME5)); - - /* press ARROW_LEFT 5 times */ - KEYBOARD.pressShortcut(Keystrokes.LEFT); - KEYBOARD.pressShortcut(Keystrokes.LEFT); - KEYBOARD.pressShortcut(Keystrokes.LEFT); - KEYBOARD.pressShortcut(Keystrokes.LEFT); - KEYBOARD.pressShortcut(Keystrokes.LEFT); - fBot.waitUntil(ConditionHelpers.selectionRange(new TmfTimeRange(START_TIME, START_TIME))); - assertTrue(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange().contains(START_TIME)); + testNextPreviousEvent(() -> KEYBOARD.pressShortcut(Keystrokes.RIGHT), + () -> KEYBOARD.pressShortcut(Keystrokes.SHIFT, Keystrokes.RIGHT), + () -> KEYBOARD.pressShortcut(Keystrokes.LEFT), + () -> KEYBOARD.pressShortcut(Keystrokes.SHIFT, Keystrokes.LEFT)); } /** @@ -162,6 +91,13 @@ public class ControlFlowViewTest extends KernelTest { */ @Test public void testToolBarSelectNextPreviousEvent() { + testNextPreviousEvent(() -> fViewBot.toolbarButton(SELECT_NEXT_EVENT).click(), + () -> fViewBot.toolbarButton(SELECT_NEXT_EVENT).click(SWT.SHIFT), + () -> fViewBot.toolbarButton(SELECT_PREVIOUS_EVENT).click(), + () -> fViewBot.toolbarButton(SELECT_PREVIOUS_EVENT).click(SWT.SHIFT)); + } + + private void testNextPreviousEvent(Runnable selectNext, Runnable shiftSelectNext, Runnable selectPrevious, Runnable shiftSelectPrevious) { /* change window range to 10 ms */ TmfTimeRange range = new TmfTimeRange(START_TIME, START_TIME.normalize(10000000L, ITmfTimestamp.NANOSECOND_SCALE)); TmfSignalManager.dispatchSignal(new TmfWindowRangeUpdatedSignal(this, range)); @@ -169,7 +105,7 @@ public class ControlFlowViewTest extends KernelTest { /* set selection to trace start time */ TmfSignalManager.dispatchSignal(new TmfSelectionRangeUpdatedSignal(this, START_TIME)); - fBot.waitUntil(ConditionHelpers.selectionRange(new TmfTimeRange(START_TIME, START_TIME))); + timeGraphIsReadyCondition(new TmfTimeRange(START_TIME, START_TIME)); /* select first item */ final SWTBotTree tree = fViewBot.bot().tree(); @@ -185,54 +121,78 @@ public class ControlFlowViewTest extends KernelTest { }); /* click "Select Next Event" 3 times */ - fViewBot.toolbarButton(SELECT_NEXT_EVENT).click(); - fViewBot.toolbarButton(SELECT_NEXT_EVENT).click(); - fViewBot.toolbarButton(SELECT_NEXT_EVENT).click(); + selectNext.run(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1, TID1_TIME1)); + selectNext.run(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME2, TID1_TIME2)); + selectNext.run(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3, TID1_TIME3)); fBot.waitUntil(ConditionHelpers.selectionRange(new TmfTimeRange(TID1_TIME3, TID1_TIME3))); assertTrue(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME3)); /* shift-click "Select Next Event" 3 times */ - fViewBot.toolbarButton(SELECT_NEXT_EVENT).click(SWT.SHIFT); - fViewBot.toolbarButton(SELECT_NEXT_EVENT).click(SWT.SHIFT); - fViewBot.toolbarButton(SELECT_NEXT_EVENT).click(SWT.SHIFT); + shiftSelectNext.run(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3, TID1_TIME4)); + shiftSelectNext.run(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3, TID1_TIME5)); + shiftSelectNext.run(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3, TID1_TIME6)); fBot.waitUntil(ConditionHelpers.selectionRange(new TmfTimeRange(TID1_TIME3, TID1_TIME6))); assertTrue(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME6)); /* shift-click "Select Previous Event" 4 times */ - fViewBot.toolbarButton(SELECT_PREVIOUS_EVENT).click(SWT.SHIFT); - fViewBot.toolbarButton(SELECT_PREVIOUS_EVENT).click(SWT.SHIFT); - fViewBot.toolbarButton(SELECT_PREVIOUS_EVENT).click(SWT.SHIFT); - fViewBot.toolbarButton(SELECT_PREVIOUS_EVENT).click(SWT.SHIFT); + shiftSelectPrevious.run(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3, TID1_TIME5)); + shiftSelectPrevious.run(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3, TID1_TIME4)); + shiftSelectPrevious.run(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3, TID1_TIME3)); + shiftSelectPrevious.run(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3, TID1_TIME2)); fBot.waitUntil(ConditionHelpers.selectionRange(new TmfTimeRange(TID1_TIME3, TID1_TIME2))); assertTrue(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME2)); /* click "Select Next Event" 2 times */ - fViewBot.toolbarButton(SELECT_NEXT_EVENT).click(); - fViewBot.toolbarButton(SELECT_NEXT_EVENT).click(); + selectNext.run(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3, TID1_TIME3)); + selectNext.run(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4, TID1_TIME4)); fBot.waitUntil(ConditionHelpers.selectionRange(new TmfTimeRange(TID1_TIME4, TID1_TIME4))); assertTrue(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME4)); /* shift-click "Select Previous Event" 3 times */ - fViewBot.toolbarButton(SELECT_PREVIOUS_EVENT).click(SWT.SHIFT); - fViewBot.toolbarButton(SELECT_PREVIOUS_EVENT).click(SWT.SHIFT); - fViewBot.toolbarButton(SELECT_PREVIOUS_EVENT).click(SWT.SHIFT); + shiftSelectPrevious.run(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4, TID1_TIME3)); + shiftSelectPrevious.run(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4, TID1_TIME2)); + shiftSelectPrevious.run(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4, TID1_TIME1)); fBot.waitUntil(ConditionHelpers.selectionRange(new TmfTimeRange(TID1_TIME4, TID1_TIME1))); assertTrue(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME1)); /* shift-click "Select Next Event" 4 times */ - fViewBot.toolbarButton(SELECT_NEXT_EVENT).click(SWT.SHIFT); - fViewBot.toolbarButton(SELECT_NEXT_EVENT).click(SWT.SHIFT); - fViewBot.toolbarButton(SELECT_NEXT_EVENT).click(SWT.SHIFT); - fViewBot.toolbarButton(SELECT_NEXT_EVENT).click(SWT.SHIFT); + shiftSelectNext.run(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4, TID1_TIME2)); + shiftSelectNext.run(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4, TID1_TIME3)); + shiftSelectNext.run(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4, TID1_TIME4)); + shiftSelectNext.run(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4, TID1_TIME5)); fBot.waitUntil(ConditionHelpers.selectionRange(new TmfTimeRange(TID1_TIME4, TID1_TIME5))); assertTrue(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME5)); /* click "Select Previous Event" 5 times */ - fViewBot.toolbarButton(SELECT_PREVIOUS_EVENT).click(); - fViewBot.toolbarButton(SELECT_PREVIOUS_EVENT).click(); - fViewBot.toolbarButton(SELECT_PREVIOUS_EVENT).click(); - fViewBot.toolbarButton(SELECT_PREVIOUS_EVENT).click(); - fViewBot.toolbarButton(SELECT_PREVIOUS_EVENT).click(); + selectPrevious.run(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4, TID1_TIME4)); + selectPrevious.run(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3, TID1_TIME3)); + selectPrevious.run(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME2, TID1_TIME2)); + selectPrevious.run(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1, TID1_TIME1)); + selectPrevious.run(); + timeGraphIsReadyCondition(new TmfTimeRange(START_TIME, START_TIME)); fBot.waitUntil(ConditionHelpers.selectionRange(new TmfTimeRange(START_TIME, START_TIME))); assertTrue(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange().contains(START_TIME)); } @@ -264,78 +224,92 @@ public class ControlFlowViewTest extends KernelTest { } }); - /* make sure arrows have been computed */ - fBot.waitUntil(new DefaultCondition() { - @Override - public boolean test() throws Exception { - List arrows = timegraph.getArrows(); - return arrows.size() >= 3 && - arrows.get(0).getTime() == TID1_TIME1.getValue() && - arrows.get(1).getTime() == TID2_TIME2.getValue() && - arrows.get(2).getTime() == TID2_TIME4.getValue(); - } - @Override - public String getFailureMessage() { - return "Arrows not found"; - } - }); - /* click "Follow CPU Forward" 3 times */ + timeGraphIsReadyCondition(new TmfTimeRange(START_TIME, START_TIME)); fViewBot.toolbarButton(FOLLOW_CPU_FORWARD).click(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1, TID1_TIME1)); fViewBot.toolbarButton(FOLLOW_CPU_FORWARD).click(); + timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME1, TID2_TIME1)); fViewBot.toolbarButton(FOLLOW_CPU_FORWARD).click(); + timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2, TID2_TIME2)); fBot.waitUntil(ConditionHelpers.selectionRange(new TmfTimeRange(TID2_TIME2, TID2_TIME2))); fBot.waitUntil(ConditionHelpers.treeSelectionContains(tree, 1, "2")); assertTrue(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME2)); /* shift-click "Follow CPU Forward" 3 times */ fViewBot.toolbarButton(FOLLOW_CPU_FORWARD).click(SWT.SHIFT); + timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2, TID2_TIME3)); fViewBot.toolbarButton(FOLLOW_CPU_FORWARD).click(SWT.SHIFT); + timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2, TID2_TIME4)); fViewBot.toolbarButton(FOLLOW_CPU_FORWARD).click(SWT.SHIFT); + timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2, TID2_TIME4)); fBot.waitUntil(ConditionHelpers.selectionRange(new TmfTimeRange(TID2_TIME2, TID5_TIME1))); fBot.waitUntil(ConditionHelpers.treeSelectionContains(tree, 1, "5")); assertTrue(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange().contains(TID5_TIME1)); /* shift-click "Follow CPU Backward" 4 times */ fViewBot.toolbarButton(FOLLOW_CPU_BACKWARD).click(SWT.SHIFT); + timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2, TID2_TIME4)); fViewBot.toolbarButton(FOLLOW_CPU_BACKWARD).click(SWT.SHIFT); + timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2, TID2_TIME3)); fViewBot.toolbarButton(FOLLOW_CPU_BACKWARD).click(SWT.SHIFT); + timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2, TID2_TIME2)); fViewBot.toolbarButton(FOLLOW_CPU_BACKWARD).click(SWT.SHIFT); + timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2, TID2_TIME1)); fBot.waitUntil(ConditionHelpers.selectionRange(new TmfTimeRange(TID2_TIME2, TID2_TIME1))); fBot.waitUntil(ConditionHelpers.treeSelectionContains(tree, 1, "2")); assertTrue(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME1)); /* click "Follow CPU Forward" 2 times */ fViewBot.toolbarButton(FOLLOW_CPU_FORWARD).click(); + timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2, TID2_TIME2)); fViewBot.toolbarButton(FOLLOW_CPU_FORWARD).click(); + timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3, TID2_TIME3)); fBot.waitUntil(ConditionHelpers.selectionRange(new TmfTimeRange(TID2_TIME3, TID2_TIME3))); fBot.waitUntil(ConditionHelpers.treeSelectionContains(tree, 1, "2")); assertTrue(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME3)); /* shift-click "Follow CPU Backward" 3 times */ fViewBot.toolbarButton(FOLLOW_CPU_BACKWARD).click(SWT.SHIFT); + timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3, TID2_TIME2)); fViewBot.toolbarButton(FOLLOW_CPU_BACKWARD).click(SWT.SHIFT); + timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3, TID2_TIME1)); fViewBot.toolbarButton(FOLLOW_CPU_BACKWARD).click(SWT.SHIFT); + timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3, TID1_TIME1)); fBot.waitUntil(ConditionHelpers.selectionRange(new TmfTimeRange(TID2_TIME3, TID1_TIME1))); fBot.waitUntil(ConditionHelpers.treeSelectionContains(tree, 1, "1")); assertTrue(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME1)); /* shift-click "Follow CPU Forward" 4 times */ fViewBot.toolbarButton(FOLLOW_CPU_FORWARD).click(SWT.SHIFT); + timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3, TID2_TIME1)); fViewBot.toolbarButton(FOLLOW_CPU_FORWARD).click(SWT.SHIFT); + timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3, TID2_TIME2)); fViewBot.toolbarButton(FOLLOW_CPU_FORWARD).click(SWT.SHIFT); + timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3, TID2_TIME3)); fViewBot.toolbarButton(FOLLOW_CPU_FORWARD).click(SWT.SHIFT); + timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3, TID2_TIME4)); fBot.waitUntil(ConditionHelpers.selectionRange(new TmfTimeRange(TID2_TIME3, TID2_TIME4))); fBot.waitUntil(ConditionHelpers.treeSelectionContains(tree, 1, "2")); assertTrue(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME4)); /* click "Follow CPU Backward" 5 times */ fViewBot.toolbarButton(FOLLOW_CPU_BACKWARD).click(); + timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3, TID2_TIME3)); fViewBot.toolbarButton(FOLLOW_CPU_BACKWARD).click(); + timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2, TID2_TIME2)); fViewBot.toolbarButton(FOLLOW_CPU_BACKWARD).click(); + timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME1, TID2_TIME1)); fViewBot.toolbarButton(FOLLOW_CPU_BACKWARD).click(); + timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1, TID1_TIME1)); fViewBot.toolbarButton(FOLLOW_CPU_BACKWARD).click(); + timeGraphIsReadyCondition(new TmfTimeRange(START_TIME, START_TIME)); fBot.waitUntil(ConditionHelpers.selectionRange(new TmfTimeRange(START_TIME, START_TIME))); assertTrue(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange().contains(START_TIME)); } + + private void timeGraphIsReadyCondition(@NonNull TmfTimeRange selectionRange) { + IWorkbenchPart part = fViewBot.getViewReference().getPart(false); + fBot.waitUntil(ConditionHelpers.timeGraphIsReadyCondition((AbstractTimeGraphView) part, selectionRange, selectionRange.getEndTime())); + } } diff --git a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/shared/org/eclipse/tracecompass/tmf/ui/swtbot/tests/shared/ConditionHelpers.java b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/shared/org/eclipse/tracecompass/tmf/ui/swtbot/tests/shared/ConditionHelpers.java index ace7f1bff9..a58c17ad9a 100644 --- a/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/shared/org/eclipse/tracecompass/tmf/ui/swtbot/tests/shared/ConditionHelpers.java +++ b/tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/shared/org/eclipse/tracecompass/tmf/ui/swtbot/tests/shared/ConditionHelpers.java @@ -18,6 +18,7 @@ import static org.eclipse.swtbot.eclipse.finder.matchers.WidgetMatcherFactory.wi import java.util.Arrays; +import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.wizard.IWizardContainer; import org.eclipse.jface.wizard.IWizardPage; @@ -36,9 +37,11 @@ import org.eclipse.swtbot.swt.finder.widgets.SWTBotTable; import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree; import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem; import org.eclipse.tracecompass.tmf.core.event.ITmfEvent; +import org.eclipse.tracecompass.tmf.core.timestamp.ITmfTimestamp; import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange; import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager; import org.eclipse.tracecompass.tmf.ui.editors.TmfEventsEditor; +import org.eclipse.tracecompass.tmf.ui.views.timegraph.AbstractTimeGraphView; import org.eclipse.ui.IEditorReference; import org.hamcrest.Matcher; @@ -450,4 +453,51 @@ public final class ConditionHelpers { public static ICondition selectionInEventsTable(final SWTWorkbenchBot bot, long selectionTime) { return new EventsTableSelectionCondition(bot, selectionTime); } + + private static class TimeGraphIsReadyCondition extends DefaultCondition { + + private @NonNull TmfTimeRange fSelectionRange; + private @NonNull ITmfTimestamp fVisibleTime; + private AbstractTimeGraphView fView; + + private TimeGraphIsReadyCondition(AbstractTimeGraphView view, @NonNull TmfTimeRange selectionRange, @NonNull ITmfTimestamp visibleTime) { + fView = view; + fSelectionRange = selectionRange; + fVisibleTime = visibleTime; + } + + @Override + public boolean test() throws Exception { + if (!ConditionHelpers.selectionRange(fSelectionRange).test()) { + return false; + } + if (!TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange().contains(fVisibleTime)) { + return false; + } + return !fView.isDirty(); + } + + @Override + public String getFailureMessage() { + return "Time graph is not ready"; + } + } + + /** + * + * Wait until the Time Graph view is ready. The Time Graph view is + * considered ready if the selectionRange is selected, the visibleTime is + * visible and the view is not dirty (its model is done updating). + * + * @param view + * the time graph view + * @param selectionRange + * the selection that the time graph should have + * @param visibleTime + * the visible time that the time graph should have + * @return ICondition for verification + */ + public static ICondition timeGraphIsReadyCondition(AbstractTimeGraphView view, @NonNull TmfTimeRange selectionRange, @NonNull ITmfTimestamp visibleTime) { + return new TimeGraphIsReadyCondition(view, selectionRange, visibleTime); + } } diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/timegraph/AbstractStateSystemTimeGraphView.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/timegraph/AbstractStateSystemTimeGraphView.java index 7f8835b0c0..10b2b619e0 100644 --- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/timegraph/AbstractStateSystemTimeGraphView.java +++ b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/timegraph/AbstractStateSystemTimeGraphView.java @@ -98,7 +98,7 @@ public abstract class AbstractStateSystemTimeGraphView extends AbstractTimeGraph } @Override - public void run() { + public void doRun() { final List links = new ArrayList<>(); final List markers = new ArrayList<>(); if (fClearZoomedLists) { diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/timegraph/AbstractTimeGraphView.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/timegraph/AbstractTimeGraphView.java index c22734ab43..f5236e86ef 100644 --- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/timegraph/AbstractTimeGraphView.java +++ b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/timegraph/AbstractTimeGraphView.java @@ -27,6 +27,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicInteger; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -134,6 +135,8 @@ public abstract class AbstractTimeGraphView extends TmfView implements ITmfTimeA /** The timegraph wrapper */ private ITimeGraphWrapper fTimeGraphWrapper; + private AtomicInteger fDirty = new AtomicInteger(); + /** The selected trace */ private ITmfTrace fTrace; @@ -647,6 +650,17 @@ public abstract class AbstractTimeGraphView extends TmfView implements ITmfTimeA public void cancel() { fMonitor.setCanceled(true); } + + @Override + public final void run() { + doRun(); + fDirty.decrementAndGet(); + } + + /** + * Run the zoom operation. + */ + public abstract void doRun(); } private class ZoomThreadByEntry extends ZoomThread { @@ -658,7 +672,7 @@ public abstract class AbstractTimeGraphView extends TmfView implements ITmfTimeA } @Override - public void run() { + public void doRun() { for (TimeGraphEntry entry : fZoomEntryList) { if (getMonitor().isCanceled()) { return; @@ -1714,7 +1728,8 @@ public abstract class AbstractTimeGraphView extends TmfView implements ITmfTimeA * the zoom end time * @since 2.0 */ - protected void startZoomThread(long startTime, long endTime) { + protected final void startZoomThread(long startTime, long endTime) { + fDirty.incrementAndGet(); boolean restart = false; if (fZoomThread != null) { fZoomThread.cancel(); @@ -1726,6 +1741,8 @@ public abstract class AbstractTimeGraphView extends TmfView implements ITmfTimeA fZoomThread = createZoomThread(startTime, endTime, resolution, restart); if (fZoomThread != null) { fZoomThread.start(); + } else { + fDirty.decrementAndGet(); } } @@ -1833,4 +1850,20 @@ public abstract class AbstractTimeGraphView extends TmfView implements ITmfTimeA fTimeGraphWrapper.performAlign(offset, width); } } + + /** + * Returns whether or not the time graph view is dirty. The time graph view + * is considered dirty if it has yet to completely update its model. + * + * @return true if the time graph view has yet to completely update its + * model, false otherwise + * @since 2.0 + */ + public boolean isDirty() { + if (fZoomThread == null) { + return false; + } + return fDirty.get() != 0 || fZoomThread.getZoomStartTime() != fTimeGraphWrapper.getTimeGraphViewer().getTime0() || fZoomThread.getZoomEndTime() != fTimeGraphWrapper.getTimeGraphViewer().getTime1(); + } + } -- 2.34.1