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(PIN_VIEW_TOOLTIP
, SEPARATOR
,
103 ALIGN_VIEW_TOOLTIP
, "Optimize", SEPARATOR
,
104 "Show View Filters", "Show Legend", SEPARATOR
,
105 "Reset the Time Scale to Default", "Select Previous State Change", "Select Next State Change", SEPARATOR
,
106 "Add Bookmark...", "Previous Marker", "Next Marker", SEPARATOR
,
107 "Select Previous Process", "Select Next Process", "Zoom In", "Zoom Out", SEPARATOR
,
108 "Hide Arrows", "Follow CPU Backward", "Follow CPU Forward",
109 "Go to previous event of the selected thread", "Go to next event of the selected thread" );
117 public void before() {
119 fViewBot
= fBot
.viewByTitle("Control Flow");
125 * Test keyboard navigation using ARROW_RIGHT and ARROW_LEFT
128 public void testKeyboardLeftRight() {
129 testNextPreviousEvent(() -> KEYBOARD
.pressShortcut(Keystrokes
.RIGHT
),
130 () -> KEYBOARD
.pressShortcut(Keystrokes
.SHIFT
, Keystrokes
.RIGHT
),
131 () -> KEYBOARD
.pressShortcut(Keystrokes
.LEFT
),
132 () -> KEYBOARD
.pressShortcut(Keystrokes
.SHIFT
, Keystrokes
.LEFT
));
136 * Test tool bar buttons "Select Next State Change" and "Select Previous
140 public void testToolBarSelectNextPreviousStateChange() {
141 testNextPreviousEvent(() -> fViewBot
.toolbarButton(SELECT_NEXT_STATE_CHANGE
).click(),
142 () -> fViewBot
.toolbarButton(SELECT_NEXT_STATE_CHANGE
).click(SWT
.SHIFT
),
143 () -> fViewBot
.toolbarButton(SELECT_PREVIOUS_STATE_CHANGE
).click(),
144 () -> fViewBot
.toolbarButton(SELECT_PREVIOUS_STATE_CHANGE
).click(SWT
.SHIFT
));
147 private void testNextPreviousEvent(Runnable selectNext
, Runnable shiftSelectNext
, Runnable selectPrevious
, Runnable shiftSelectPrevious
) {
148 /* change window range to 10 ms */
149 TmfTimeRange range
= new TmfTimeRange(START_TIME
, START_TIME
.normalize(10000000L, ITmfTimestamp
.NANOSECOND_SCALE
));
150 TmfSignalManager
.dispatchSignal(new TmfWindowRangeUpdatedSignal(this, range
));
151 fBot
.waitUntil(ConditionHelpers
.windowRange(range
));
153 /* set selection to trace start time */
154 TmfSignalManager
.dispatchSignal(new TmfSelectionRangeUpdatedSignal(this, START_TIME
));
155 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
157 /* select first item */
158 SWTBotUtils
.pressShortcutGoToTreeTop(KEYBOARD
);
159 fViewBot
.toolbarButton(SELECT_NEXT_PROCESS
).click();
161 /* set focus on time graph */
162 final TimeGraphControl timegraph
= fViewBot
.bot().widget(WidgetOfType
.widgetOfType(TimeGraphControl
.class));
163 UIThreadRunnable
.syncExec(new VoidResult() {
166 timegraph
.setFocus();
170 /* click "Select Next State Change" 3 times */
172 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1
, TID1_TIME1
));
174 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME2
, TID1_TIME2
));
176 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
));
177 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
)));
178 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME3
));
180 /* shift-click "Select Next State Change" 3 times */
181 shiftSelectNext
.run();
182 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME4
));
183 shiftSelectNext
.run();
184 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME5
));
185 shiftSelectNext
.run();
186 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME6
));
187 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME3
, TID1_TIME6
)));
188 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME6
));
190 /* shift-click "Select Previous State Change" 4 times */
191 shiftSelectPrevious
.run();
192 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME5
));
193 shiftSelectPrevious
.run();
194 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME4
));
195 shiftSelectPrevious
.run();
196 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
));
197 shiftSelectPrevious
.run();
198 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME2
));
199 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME3
, TID1_TIME2
)));
200 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME2
));
202 /* click "Select Next State Change" 2 times */
204 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
));
206 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME4
));
207 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME4
, TID1_TIME4
)));
208 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME4
));
210 /* shift-click "Select Previous State Change" 3 times */
211 shiftSelectPrevious
.run();
212 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME3
));
213 shiftSelectPrevious
.run();
214 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME2
));
215 shiftSelectPrevious
.run();
216 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME1
));
217 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME4
, TID1_TIME1
)));
218 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME1
));
220 /* shift-click "Select Next State Change" 4 times */
221 shiftSelectNext
.run();
222 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME2
));
223 shiftSelectNext
.run();
224 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME3
));
225 shiftSelectNext
.run();
226 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME4
));
227 shiftSelectNext
.run();
228 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME5
));
229 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME4
, TID1_TIME5
)));
230 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME5
));
232 /* click "Select Previous State Change" 5 times */
233 selectPrevious
.run();
234 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME4
));
235 selectPrevious
.run();
236 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
));
237 selectPrevious
.run();
238 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME2
, TID1_TIME2
));
239 selectPrevious
.run();
240 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1
, TID1_TIME1
));
241 selectPrevious
.run();
242 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
243 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(START_TIME
, START_TIME
)));
244 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(START_TIME
));
251 public void testFilter() {
252 /* change window range to 1 ms */
253 TmfTimeRange range
= new TmfTimeRange(START_TIME
, START_TIME
.normalize(1000000L, ITmfTimestamp
.NANOSECOND_SCALE
));
254 TmfSignalManager
.dispatchSignal(new TmfWindowRangeUpdatedSignal(this, range
));
255 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
257 SWTBotToolbarButton filterButton
= fViewBot
.toolbarButton("Show View Filters");
258 filterButton
.click();
259 fBot
.waitUntil(org
.eclipse
.swtbot
.swt
.finder
.waits
.Conditions
.shellIsActive("Filter"));
260 SWTBot bot
= fBot
.activeShell().bot();
261 SWTBotTree treeBot
= bot
.tree();
262 TreeCheckedCounter treeCheckCounter
= new TreeCheckedCounter(treeBot
);
263 // get how many items there are
264 Integer checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
265 assertEquals("default", 226, checked
.intValue());
266 // test "uncheck all button"
267 bot
.button(UNCHECK_ALL
).click();
268 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
269 assertEquals(0, checked
.intValue());
271 bot
.button(CHECK_ACTIVE
).click();
272 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
273 assertEquals(CHECK_ACTIVE
, 69, checked
.intValue());
275 bot
.button(CHECK_ALL
).click();
276 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
277 assertEquals(CHECK_ALL
, 226, checked
.intValue());
278 // test uncheck inactive
279 bot
.button(UNCHECK_INACTIVE
).click();
280 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
281 assertEquals(UNCHECK_INACTIVE
, 69, checked
.intValue());
282 // test check selected
283 treeBot
.getTreeItem(LttngTraceGenerator
.getName()).select("gnuplot");
284 bot
.button(UNCHECK_ALL
).click();
285 bot
.button(CHECK_SELECTED
).click();
286 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
287 assertEquals(CHECK_SELECTED
, 2, checked
.intValue());
288 // test check subtree
289 bot
.button(UNCHECK_ALL
).click();
290 bot
.button(CHECK_SUBTREE
).click();
291 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
292 assertEquals(CHECK_SUBTREE
, 2, checked
.intValue());
293 // test uncheck selected
294 bot
.button(CHECK_ALL
).click();
295 bot
.button(UNCHECK_SELECTED
).click();
296 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
297 assertEquals(UNCHECK_SELECTED
, 225, checked
.intValue());
298 // test uncheck subtree
299 bot
.button(CHECK_ALL
).click();
300 bot
.button(UNCHECK_SUBTREE
).click();
301 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
302 assertEquals(UNCHECK_SELECTED
, 225, checked
.intValue());
304 bot
.button(UNCHECK_ALL
).click();
305 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
306 assertEquals(0, checked
.intValue());
307 bot
.text().setText("half-life 3");
308 SWTBotTreeItem treeItem
= treeBot
.getTreeItem(LttngTraceGenerator
.getName());
310 fBot
.waitUntil(ConditionHelpers
.treeItemCount(treeItem
, 25));
311 bot
.button(CHECK_ALL
).click();
312 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
313 assertEquals("Filtered", 26, checked
.intValue());
314 bot
.button("OK").click();
315 treeBot
= fViewBot
.bot().tree();
316 treeItem
= treeBot
.getTreeItem(LttngTraceGenerator
.getName());
317 for (int i
= 0; i
< 25; i
++) {
318 assertEquals("Filtered Control flow view", "Half-life 3", treeItem
.cell(i
, 0));
323 * Test tool bar buttons "Follow CPU Forward" and "Follow CPU Backward"
326 public void testToolBarFollowCPUForwardBackward() {
327 /* change window range to 10 ms */
328 TmfTimeRange range
= new TmfTimeRange(START_TIME
, START_TIME
.normalize(10000000L, ITmfTimestamp
.NANOSECOND_SCALE
));
329 TmfSignalManager
.dispatchSignal(new TmfWindowRangeUpdatedSignal(this, range
));
330 fBot
.waitUntil(ConditionHelpers
.windowRange(range
));
332 /* set selection to trace start time */
333 TmfSignalManager
.dispatchSignal(new TmfSelectionRangeUpdatedSignal(this, START_TIME
));
334 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(START_TIME
, START_TIME
)));
336 /* select first item */
337 final SWTBotTree tree
= fViewBot
.bot().tree();
338 SWTBotUtils
.pressShortcutGoToTreeTop(KEYBOARD
);
339 fViewBot
.toolbarButton(SELECT_NEXT_PROCESS
).click();
341 /* set focus on time graph */
342 final TimeGraphControl timegraph
= fViewBot
.bot().widget(WidgetOfType
.widgetOfType(TimeGraphControl
.class));
343 UIThreadRunnable
.syncExec(new VoidResult() {
346 timegraph
.setFocus();
350 /* click "Follow CPU Forward" 3 times */
351 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
352 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
353 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1
, TID1_TIME1
));
354 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
355 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME1
, TID2_TIME1
));
356 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
357 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
));
358 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
)));
359 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "2"));
360 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME2
));
362 /* shift-click "Follow CPU Forward" 3 times */
363 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
364 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME3
));
365 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
366 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME4
));
367 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
368 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME4
));
369 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME2
, TID5_TIME1
)));
370 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "5"));
371 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID5_TIME1
));
373 /* shift-click "Follow CPU Backward" 4 times */
374 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
375 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME4
));
376 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
377 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME3
));
378 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
379 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
));
380 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
381 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME1
));
382 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME2
, TID2_TIME1
)));
383 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "2"));
384 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME1
));
386 /* click "Follow CPU Forward" 2 times */
387 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
388 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
));
389 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
390 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME3
));
391 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME3
, TID2_TIME3
)));
392 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "2"));
393 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME3
));
395 /* shift-click "Follow CPU Backward" 3 times */
396 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
397 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME2
));
398 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
399 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME1
));
400 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
401 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID1_TIME1
));
402 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME3
, TID1_TIME1
)));
403 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "1"));
404 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME1
));
406 /* shift-click "Follow CPU Forward" 4 times */
407 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
408 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME1
));
409 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
410 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME2
));
411 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
412 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME3
));
413 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
414 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME4
));
415 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME3
, TID2_TIME4
)));
416 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "2"));
417 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME4
));
419 /* click "Follow CPU Backward" 5 times */
420 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
421 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME3
));
422 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
423 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
));
424 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
425 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME1
, TID2_TIME1
));
426 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
427 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1
, TID1_TIME1
));
428 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
429 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
430 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(START_TIME
, START_TIME
)));
431 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(START_TIME
));
434 private void timeGraphIsReadyCondition(@NonNull TmfTimeRange selectionRange
) {
435 IWorkbenchPart part
= fViewBot
.getViewReference().getPart(false);
436 fBot
.waitUntil(ConditionHelpers
.timeGraphIsReadyCondition((AbstractTimeGraphView
) part
, selectionRange
, selectionRange
.getEndTime()));