lttng: Make ControlFlowViewTest more robust
authorMarc-Andre Laperle <marc-andre.laperle@ericsson.com>
Mon, 7 Dec 2015 22:10:17 +0000 (17:10 -0500)
committerMarc-Andre Laperle <marc-andre.laperle@ericsson.com>
Wed, 9 Dec 2015 07:08:16 +0000 (02:08 -0500)
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 <marc-andre.laperle@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/62154
Reviewed-by: Hudson CI
Reviewed-by: Patrick Tasse <patrick.tasse@gmail.com>
Tested-by: Patrick Tasse <patrick.tasse@gmail.com>
lttng/org.eclipse.tracecompass.lttng2.kernel.ui.swtbot.tests/src/org/eclipse/tracecompass/lttng2/kernel/ui/swtbot/tests/ControlFlowViewTest.java
tmf/org.eclipse.tracecompass.tmf.ui.swtbot.tests/shared/org/eclipse/tracecompass/tmf/ui/swtbot/tests/shared/ConditionHelpers.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/timegraph/AbstractStateSystemTimeGraphView.java
tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/views/timegraph/AbstractTimeGraphView.java

index a84ad87c27dedf1626350f8214a26a301c04d590..99415916fecc0a5cca14063efd761827bbb433df 100644 (file)
@@ -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<ILinkEvent> 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()));
+    }
 }
index ace7f1bff9adad98e311fb9dae6334786b0228e8..a58c17ad9a9012d8d11bd05d1694a8d9eb1e6a19 100644 (file)
@@ -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);
+    }
 }
index 7f8835b0c048d80acec9d4e605b793848936b103..10b2b619e0eb020a54833d7c9be3abb7bd86e3e2 100644 (file)
@@ -98,7 +98,7 @@ public abstract class AbstractStateSystemTimeGraphView extends AbstractTimeGraph
         }
 
         @Override
-        public void run() {
+        public void doRun() {
             final List<ILinkEvent> links = new ArrayList<>();
             final List<IMarkerEvent> markers = new ArrayList<>();
             if (fClearZoomedLists) {
index c22734ab4367c30b6bad4319779eac719dc61359..f5236e86ef564950359371d9e4da99a4f280590a 100644 (file)
@@ -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();
+    }
+
 }
This page took 0.039023 seconds and 5 git commands to generate.