1 /*******************************************************************************
2 * Copyright (c) 2015 Ericsson
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Patrick Tasse - Initial API and implementation
11 *******************************************************************************/
13 package org
.eclipse
.tracecompass
.lttng2
.kernel
.ui
.swtbot
.tests
;
15 import static org
.junit
.Assert
.assertEquals
;
16 import static org
.junit
.Assert
.assertTrue
;
18 import java
.util
.Arrays
;
19 import java
.util
.List
;
21 import org
.eclipse
.jdt
.annotation
.NonNull
;
22 import org
.eclipse
.swt
.SWT
;
23 import org
.eclipse
.swtbot
.eclipse
.finder
.widgets
.SWTBotView
;
24 import org
.eclipse
.swtbot
.swt
.finder
.SWTBot
;
25 import org
.eclipse
.swtbot
.swt
.finder
.finders
.UIThreadRunnable
;
26 import org
.eclipse
.swtbot
.swt
.finder
.junit
.SWTBotJunit4ClassRunner
;
27 import org
.eclipse
.swtbot
.swt
.finder
.keyboard
.Keyboard
;
28 import org
.eclipse
.swtbot
.swt
.finder
.keyboard
.KeyboardFactory
;
29 import org
.eclipse
.swtbot
.swt
.finder
.keyboard
.Keystrokes
;
30 import org
.eclipse
.swtbot
.swt
.finder
.matchers
.WidgetOfType
;
31 import org
.eclipse
.swtbot
.swt
.finder
.results
.VoidResult
;
32 import org
.eclipse
.swtbot
.swt
.finder
.widgets
.SWTBotToolbarButton
;
33 import org
.eclipse
.swtbot
.swt
.finder
.widgets
.SWTBotTree
;
34 import org
.eclipse
.swtbot
.swt
.finder
.widgets
.SWTBotTreeItem
;
35 import org
.eclipse
.tracecompass
.ctf
.core
.tests
.shared
.LttngTraceGenerator
;
36 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfSelectionRangeUpdatedSignal
;
37 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfSignalManager
;
38 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfWindowRangeUpdatedSignal
;
39 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.ITmfTimestamp
;
40 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.TmfTimeRange
;
41 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.TmfTimestamp
;
42 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.TmfTraceManager
;
43 import org
.eclipse
.tracecompass
.tmf
.ui
.swtbot
.tests
.shared
.ConditionHelpers
;
44 import org
.eclipse
.tracecompass
.tmf
.ui
.swtbot
.tests
.shared
.SWTBotUtils
;
45 import org
.eclipse
.tracecompass
.tmf
.ui
.views
.timegraph
.AbstractTimeGraphView
;
46 import org
.eclipse
.tracecompass
.tmf
.ui
.widgets
.timegraph
.widgets
.TimeGraphControl
;
47 import org
.eclipse
.ui
.IWorkbenchPart
;
48 import org
.junit
.Before
;
49 import org
.junit
.Test
;
50 import org
.junit
.runner
.RunWith
;
53 * SWTBot tests for Control Flow view
55 * @author Patrick Tasse
57 @RunWith(SWTBotJunit4ClassRunner
.class)
58 public class ControlFlowViewTest
extends KernelTimeGraphViewTestBase
{
60 private static final String CHECK_SELECTED
= "Check selected";
61 private static final String CHECK_ALL
= "Check all";
62 private static final String CHECK_SUBTREE
= "Check subtree";
63 private static final String CHECK_ACTIVE
= "Check Active";
64 private static final String UNCHECK_SELECTED
= "Uncheck selected";
65 private static final String UNCHECK_ALL
= "Uncheck all";
66 private static final String UNCHECK_SUBTREE
= "Uncheck subtree";
67 private static final String UNCHECK_INACTIVE
= "Uncheck Inactive";
69 private static final String FOLLOW_CPU_BACKWARD
= "Follow CPU Backward";
70 private static final String FOLLOW_CPU_FORWARD
= "Follow CPU Forward";
71 private static final String SELECT_PREVIOUS_STATE_CHANGE
= "Select Previous State Change";
72 private static final String SELECT_NEXT_STATE_CHANGE
= "Select Next State Change";
73 private static final String SELECT_NEXT_PROCESS
= "Select Next Process";
74 private static final Keyboard KEYBOARD
= KeyboardFactory
.getSWTKeyboard();
75 private static final @NonNull ITmfTimestamp START_TIME
= TmfTimestamp
.fromNanos(1368000272650993664L);
76 private static final @NonNull ITmfTimestamp TID1_TIME1
= TmfTimestamp
.fromNanos(1368000272651208412L);
77 private static final @NonNull ITmfTimestamp TID1_TIME2
= TmfTimestamp
.fromNanos(1368000272656147616L);
78 private static final @NonNull ITmfTimestamp TID1_TIME3
= TmfTimestamp
.fromNanos(1368000272656362364L);
79 private static final @NonNull ITmfTimestamp TID1_TIME4
= TmfTimestamp
.fromNanos(1368000272663234300L);
80 private static final @NonNull ITmfTimestamp TID1_TIME5
= TmfTimestamp
.fromNanos(1368000272663449048L);
81 private static final @NonNull ITmfTimestamp TID1_TIME6
= TmfTimestamp
.fromNanos(1368000272665596528L);
82 private static final @NonNull ITmfTimestamp TID2_TIME1
= TmfTimestamp
.fromNanos(1368000272651852656L);
83 private static final @NonNull ITmfTimestamp TID2_TIME2
= TmfTimestamp
.fromNanos(1368000272652067404L);
84 private static final @NonNull ITmfTimestamp TID2_TIME3
= TmfTimestamp
.fromNanos(1368000272652282152L);
85 private static final @NonNull ITmfTimestamp TID2_TIME4
= TmfTimestamp
.fromNanos(1368000272652496900L);
86 private static final @NonNull ITmfTimestamp TID5_TIME1
= TmfTimestamp
.fromNanos(1368000272652496900L);
88 private SWTBotView fViewBot
;
91 protected SWTBotView
getViewBot() {
96 protected List
<String
> getLegendValues() {
97 return Arrays
.asList("UNKNOWN", "WAIT_UNKNOWN", "WAIT_BLOCKED", "WAIT_FOR_CPU", "USERMODE", "SYSCALL", "INTERRUPTED");
101 protected List
<String
> getToolbarTooltips() {
102 return Arrays
.asList("Align Views", "Optimize", SEPARATOR
,
103 "Show View Filters", "Show Legend", SEPARATOR
,
104 "Reset the Time Scale to Default", "Select Previous State Change", "Select Next State Change", SEPARATOR
,
105 "Add Bookmark...", "Previous Marker", "Next Marker", SEPARATOR
,
106 "Select Previous Process", "Select Next Process", "Zoom In", "Zoom Out", SEPARATOR
,
107 "Hide Arrows", "Follow CPU Backward", "Follow CPU Forward",
108 "Go to previous event of the selected thread", "Go to next event of the selected thread" );
116 public void before() {
118 fViewBot
= fBot
.viewByTitle("Control Flow");
124 * Test keyboard navigation using ARROW_RIGHT and ARROW_LEFT
127 public void testKeyboardLeftRight() {
128 testNextPreviousEvent(() -> KEYBOARD
.pressShortcut(Keystrokes
.RIGHT
),
129 () -> KEYBOARD
.pressShortcut(Keystrokes
.SHIFT
, Keystrokes
.RIGHT
),
130 () -> KEYBOARD
.pressShortcut(Keystrokes
.LEFT
),
131 () -> KEYBOARD
.pressShortcut(Keystrokes
.SHIFT
, Keystrokes
.LEFT
));
135 * Test tool bar buttons "Select Next State Change" and "Select Previous
139 public void testToolBarSelectNextPreviousStateChange() {
140 testNextPreviousEvent(() -> fViewBot
.toolbarButton(SELECT_NEXT_STATE_CHANGE
).click(),
141 () -> fViewBot
.toolbarButton(SELECT_NEXT_STATE_CHANGE
).click(SWT
.SHIFT
),
142 () -> fViewBot
.toolbarButton(SELECT_PREVIOUS_STATE_CHANGE
).click(),
143 () -> fViewBot
.toolbarButton(SELECT_PREVIOUS_STATE_CHANGE
).click(SWT
.SHIFT
));
146 private void testNextPreviousEvent(Runnable selectNext
, Runnable shiftSelectNext
, Runnable selectPrevious
, Runnable shiftSelectPrevious
) {
147 /* change window range to 10 ms */
148 TmfTimeRange range
= new TmfTimeRange(START_TIME
, START_TIME
.normalize(10000000L, ITmfTimestamp
.NANOSECOND_SCALE
));
149 TmfSignalManager
.dispatchSignal(new TmfWindowRangeUpdatedSignal(this, range
));
150 fBot
.waitUntil(ConditionHelpers
.windowRange(range
));
152 /* set selection to trace start time */
153 TmfSignalManager
.dispatchSignal(new TmfSelectionRangeUpdatedSignal(this, START_TIME
));
154 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
156 /* select first item */
157 SWTBotUtils
.pressShortcutGoToTreeTop(KEYBOARD
);
158 fViewBot
.toolbarButton(SELECT_NEXT_PROCESS
).click();
160 /* set focus on time graph */
161 final TimeGraphControl timegraph
= fViewBot
.bot().widget(WidgetOfType
.widgetOfType(TimeGraphControl
.class));
162 UIThreadRunnable
.syncExec(new VoidResult() {
165 timegraph
.setFocus();
169 /* click "Select Next State Change" 3 times */
171 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1
, TID1_TIME1
));
173 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME2
, TID1_TIME2
));
175 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
));
176 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
)));
177 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME3
));
179 /* shift-click "Select Next State Change" 3 times */
180 shiftSelectNext
.run();
181 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME4
));
182 shiftSelectNext
.run();
183 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME5
));
184 shiftSelectNext
.run();
185 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME6
));
186 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME3
, TID1_TIME6
)));
187 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME6
));
189 /* shift-click "Select Previous State Change" 4 times */
190 shiftSelectPrevious
.run();
191 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME5
));
192 shiftSelectPrevious
.run();
193 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME4
));
194 shiftSelectPrevious
.run();
195 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
));
196 shiftSelectPrevious
.run();
197 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME2
));
198 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME3
, TID1_TIME2
)));
199 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME2
));
201 /* click "Select Next State Change" 2 times */
203 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
));
205 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME4
));
206 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME4
, TID1_TIME4
)));
207 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME4
));
209 /* shift-click "Select Previous State Change" 3 times */
210 shiftSelectPrevious
.run();
211 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME3
));
212 shiftSelectPrevious
.run();
213 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME2
));
214 shiftSelectPrevious
.run();
215 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME1
));
216 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME4
, TID1_TIME1
)));
217 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME1
));
219 /* shift-click "Select Next State Change" 4 times */
220 shiftSelectNext
.run();
221 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME2
));
222 shiftSelectNext
.run();
223 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME3
));
224 shiftSelectNext
.run();
225 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME4
));
226 shiftSelectNext
.run();
227 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME5
));
228 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME4
, TID1_TIME5
)));
229 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME5
));
231 /* click "Select Previous State Change" 5 times */
232 selectPrevious
.run();
233 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME4
));
234 selectPrevious
.run();
235 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
));
236 selectPrevious
.run();
237 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME2
, TID1_TIME2
));
238 selectPrevious
.run();
239 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1
, TID1_TIME1
));
240 selectPrevious
.run();
241 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
242 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(START_TIME
, START_TIME
)));
243 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(START_TIME
));
250 public void testFilter() {
251 /* change window range to 1 ms */
252 TmfTimeRange range
= new TmfTimeRange(START_TIME
, START_TIME
.normalize(1000000L, ITmfTimestamp
.NANOSECOND_SCALE
));
253 TmfSignalManager
.dispatchSignal(new TmfWindowRangeUpdatedSignal(this, range
));
254 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
256 SWTBotToolbarButton filterButton
= fViewBot
.toolbarButton("Show View Filters");
257 filterButton
.click();
258 fBot
.waitUntil(org
.eclipse
.swtbot
.swt
.finder
.waits
.Conditions
.shellIsActive("Filter"));
259 SWTBot bot
= fBot
.activeShell().bot();
260 SWTBotTree treeBot
= bot
.tree();
261 TreeCheckedCounter treeCheckCounter
= new TreeCheckedCounter(treeBot
);
262 // get how many items there are
263 Integer checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
264 assertEquals("default", 226, checked
.intValue());
265 // test "uncheck all button"
266 bot
.button(UNCHECK_ALL
).click();
267 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
268 assertEquals(0, checked
.intValue());
270 bot
.button(CHECK_ACTIVE
).click();
271 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
272 assertEquals(CHECK_ACTIVE
, 69, checked
.intValue());
274 bot
.button(CHECK_ALL
).click();
275 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
276 assertEquals(CHECK_ALL
, 226, checked
.intValue());
277 // test uncheck inactive
278 bot
.button(UNCHECK_INACTIVE
).click();
279 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
280 assertEquals(UNCHECK_INACTIVE
, 69, checked
.intValue());
281 // test check selected
282 treeBot
.getTreeItem(LttngTraceGenerator
.getName()).select("gnuplot");
283 bot
.button(UNCHECK_ALL
).click();
284 bot
.button(CHECK_SELECTED
).click();
285 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
286 assertEquals(CHECK_SELECTED
, 2, checked
.intValue());
287 // test check subtree
288 bot
.button(UNCHECK_ALL
).click();
289 bot
.button(CHECK_SUBTREE
).click();
290 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
291 assertEquals(CHECK_SUBTREE
, 2, checked
.intValue());
292 // test uncheck selected
293 bot
.button(CHECK_ALL
).click();
294 bot
.button(UNCHECK_SELECTED
).click();
295 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
296 assertEquals(UNCHECK_SELECTED
, 225, checked
.intValue());
297 // test uncheck subtree
298 bot
.button(CHECK_ALL
).click();
299 bot
.button(UNCHECK_SUBTREE
).click();
300 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
301 assertEquals(UNCHECK_SELECTED
, 225, checked
.intValue());
303 bot
.button(UNCHECK_ALL
).click();
304 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
305 assertEquals(0, checked
.intValue());
306 bot
.text().setText("half-life 3");
307 SWTBotTreeItem treeItem
= treeBot
.getTreeItem(LttngTraceGenerator
.getName());
309 fBot
.waitUntil(ConditionHelpers
.treeItemCount(treeItem
, 25));
310 bot
.button(CHECK_ALL
).click();
311 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
312 assertEquals("Filtered", 26, checked
.intValue());
313 bot
.button("OK").click();
314 treeBot
= fViewBot
.bot().tree();
315 treeItem
= treeBot
.getTreeItem(LttngTraceGenerator
.getName());
316 for (int i
= 0; i
< 25; i
++) {
317 assertEquals("Filtered Control flow view", "Half-life 3", treeItem
.cell(i
, 0));
322 * Test tool bar buttons "Follow CPU Forward" and "Follow CPU Backward"
325 public void testToolBarFollowCPUForwardBackward() {
326 /* change window range to 10 ms */
327 TmfTimeRange range
= new TmfTimeRange(START_TIME
, START_TIME
.normalize(10000000L, ITmfTimestamp
.NANOSECOND_SCALE
));
328 TmfSignalManager
.dispatchSignal(new TmfWindowRangeUpdatedSignal(this, range
));
329 fBot
.waitUntil(ConditionHelpers
.windowRange(range
));
331 /* set selection to trace start time */
332 TmfSignalManager
.dispatchSignal(new TmfSelectionRangeUpdatedSignal(this, START_TIME
));
333 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(START_TIME
, START_TIME
)));
335 /* select first item */
336 final SWTBotTree tree
= fViewBot
.bot().tree();
337 SWTBotUtils
.pressShortcutGoToTreeTop(KEYBOARD
);
338 fViewBot
.toolbarButton(SELECT_NEXT_PROCESS
).click();
340 /* set focus on time graph */
341 final TimeGraphControl timegraph
= fViewBot
.bot().widget(WidgetOfType
.widgetOfType(TimeGraphControl
.class));
342 UIThreadRunnable
.syncExec(new VoidResult() {
345 timegraph
.setFocus();
349 /* click "Follow CPU Forward" 3 times */
350 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
351 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
352 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1
, TID1_TIME1
));
353 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
354 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME1
, TID2_TIME1
));
355 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
356 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
));
357 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
)));
358 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "2"));
359 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME2
));
361 /* shift-click "Follow CPU Forward" 3 times */
362 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
363 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME3
));
364 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
365 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME4
));
366 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
367 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME4
));
368 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME2
, TID5_TIME1
)));
369 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "5"));
370 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID5_TIME1
));
372 /* shift-click "Follow CPU Backward" 4 times */
373 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
374 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME4
));
375 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
376 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME3
));
377 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
378 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
));
379 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
380 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME1
));
381 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME2
, TID2_TIME1
)));
382 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "2"));
383 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME1
));
385 /* click "Follow CPU Forward" 2 times */
386 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
387 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
));
388 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
389 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME3
));
390 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME3
, TID2_TIME3
)));
391 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "2"));
392 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME3
));
394 /* shift-click "Follow CPU Backward" 3 times */
395 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
396 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME2
));
397 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
398 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME1
));
399 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
400 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID1_TIME1
));
401 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME3
, TID1_TIME1
)));
402 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "1"));
403 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME1
));
405 /* shift-click "Follow CPU Forward" 4 times */
406 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
407 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME1
));
408 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
409 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME2
));
410 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
411 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME3
));
412 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
413 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME4
));
414 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME3
, TID2_TIME4
)));
415 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "2"));
416 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME4
));
418 /* click "Follow CPU Backward" 5 times */
419 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
420 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME3
));
421 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
422 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
));
423 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
424 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME1
, TID2_TIME1
));
425 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
426 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1
, TID1_TIME1
));
427 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
428 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
429 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(START_TIME
, START_TIME
)));
430 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(START_TIME
));
433 private void timeGraphIsReadyCondition(@NonNull TmfTimeRange selectionRange
) {
434 IWorkbenchPart part
= fViewBot
.getViewReference().getPart(false);
435 fBot
.waitUntil(ConditionHelpers
.timeGraphIsReadyCondition((AbstractTimeGraphView
) part
, selectionRange
, selectionRange
.getEndTime()));