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
.assertNotNull
;
17 import static org
.junit
.Assert
.assertTrue
;
19 import java
.util
.ArrayList
;
20 import java
.util
.Arrays
;
21 import java
.util
.List
;
23 import org
.eclipse
.jdt
.annotation
.NonNull
;
24 import org
.eclipse
.swt
.SWT
;
25 import org
.eclipse
.swtbot
.eclipse
.finder
.widgets
.SWTBotView
;
26 import org
.eclipse
.swtbot
.swt
.finder
.SWTBot
;
27 import org
.eclipse
.swtbot
.swt
.finder
.finders
.UIThreadRunnable
;
28 import org
.eclipse
.swtbot
.swt
.finder
.junit
.SWTBotJunit4ClassRunner
;
29 import org
.eclipse
.swtbot
.swt
.finder
.keyboard
.Keyboard
;
30 import org
.eclipse
.swtbot
.swt
.finder
.keyboard
.KeyboardFactory
;
31 import org
.eclipse
.swtbot
.swt
.finder
.keyboard
.Keystrokes
;
32 import org
.eclipse
.swtbot
.swt
.finder
.matchers
.WidgetOfType
;
33 import org
.eclipse
.swtbot
.swt
.finder
.results
.VoidResult
;
34 import org
.eclipse
.swtbot
.swt
.finder
.widgets
.SWTBotLabel
;
35 import org
.eclipse
.swtbot
.swt
.finder
.widgets
.SWTBotToolbarButton
;
36 import org
.eclipse
.swtbot
.swt
.finder
.widgets
.SWTBotTree
;
37 import org
.eclipse
.swtbot
.swt
.finder
.widgets
.SWTBotTreeItem
;
38 import org
.eclipse
.tracecompass
.ctf
.core
.tests
.shared
.LttngTraceGenerator
;
39 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfSelectionRangeUpdatedSignal
;
40 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfSignalManager
;
41 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfWindowRangeUpdatedSignal
;
42 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.ITmfTimestamp
;
43 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.TmfTimeRange
;
44 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.TmfTimestamp
;
45 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.TmfTraceManager
;
46 import org
.eclipse
.tracecompass
.tmf
.ui
.swtbot
.tests
.shared
.ConditionHelpers
;
47 import org
.eclipse
.tracecompass
.tmf
.ui
.swtbot
.tests
.shared
.SWTBotUtils
;
48 import org
.eclipse
.tracecompass
.tmf
.ui
.views
.timegraph
.AbstractTimeGraphView
;
49 import org
.eclipse
.tracecompass
.tmf
.ui
.widgets
.timegraph
.widgets
.TimeGraphControl
;
50 import org
.eclipse
.ui
.IWorkbenchPart
;
51 import org
.junit
.Before
;
52 import org
.junit
.Test
;
53 import org
.junit
.runner
.RunWith
;
56 * SWTBot tests for Control Flow view
58 * @author Patrick Tasse
60 @RunWith(SWTBotJunit4ClassRunner
.class)
61 public class ControlFlowViewTest
extends KernelTestBase
{
63 private static final String SEPARATOR
= "";
64 private static final String CHECK_SELECTED
= "Check selected";
65 private static final String CHECK_ALL
= "Check all";
66 private static final String CHECK_SUBTREE
= "Check subtree";
67 private static final String CHECK_ACTIVE
= "Check Active";
68 private static final String UNCHECK_SELECTED
= "Uncheck selected";
69 private static final String UNCHECK_ALL
= "Uncheck all";
70 private static final String UNCHECK_SUBTREE
= "Uncheck subtree";
71 private static final String UNCHECK_INACTIVE
= "Uncheck Inactive";
73 private static final String FOLLOW_CPU_BACKWARD
= "Follow CPU Backward";
74 private static final String FOLLOW_CPU_FORWARD
= "Follow CPU Forward";
75 private static final String SELECT_PREVIOUS_STATE_CHANGE
= "Select Previous State Change";
76 private static final String SELECT_NEXT_STATE_CHANGE
= "Select Next State Change";
77 private static final String SELECT_NEXT_PROCESS
= "Select Next Process";
78 private static final Keyboard KEYBOARD
= KeyboardFactory
.getSWTKeyboard();
79 private static final @NonNull ITmfTimestamp START_TIME
= TmfTimestamp
.fromNanos(1368000272650993664L);
80 private static final @NonNull ITmfTimestamp TID1_TIME1
= TmfTimestamp
.fromNanos(1368000272651208412L);
81 private static final @NonNull ITmfTimestamp TID1_TIME2
= TmfTimestamp
.fromNanos(1368000272656147616L);
82 private static final @NonNull ITmfTimestamp TID1_TIME3
= TmfTimestamp
.fromNanos(1368000272656362364L);
83 private static final @NonNull ITmfTimestamp TID1_TIME4
= TmfTimestamp
.fromNanos(1368000272663234300L);
84 private static final @NonNull ITmfTimestamp TID1_TIME5
= TmfTimestamp
.fromNanos(1368000272663449048L);
85 private static final @NonNull ITmfTimestamp TID1_TIME6
= TmfTimestamp
.fromNanos(1368000272665596528L);
86 private static final @NonNull ITmfTimestamp TID2_TIME1
= TmfTimestamp
.fromNanos(1368000272651852656L);
87 private static final @NonNull ITmfTimestamp TID2_TIME2
= TmfTimestamp
.fromNanos(1368000272652067404L);
88 private static final @NonNull ITmfTimestamp TID2_TIME3
= TmfTimestamp
.fromNanos(1368000272652282152L);
89 private static final @NonNull ITmfTimestamp TID2_TIME4
= TmfTimestamp
.fromNanos(1368000272652496900L);
90 private static final @NonNull ITmfTimestamp TID5_TIME1
= TmfTimestamp
.fromNanos(1368000272652496900L);
92 private SWTBotView fViewBot
;
95 * Get the legend text values in order (override if you subclass the test)
97 * @return the legend text values in order
99 protected List
<String
> getLegendValues() {
100 String
[] labelValues
= { "UNKNOWN", "WAIT_UNKNOWN", "WAIT_BLOCKED", "WAIT_FOR_CPU", "USERMODE", "SYSCALL", "INTERRUPTED" };
101 return Arrays
.asList(labelValues
);
105 * Get the tool bar tool tip text values in order (override if you subclass the test)
107 * @return the tool bar tool tip text values in order
109 protected List
<String
> getToolbarTooltips() {
110 String
[] tooltipsArray
= { "Align Views", "Optimize", SEPARATOR
,
111 "Show View Filters", "Show Legend", SEPARATOR
,
112 "Reset the Time Scale to Default", "Select Previous State Change", "Select Next State Change", SEPARATOR
,
113 "Add Bookmark...", "Previous Marker", "Next Marker", SEPARATOR
,
114 "Select Previous Process", "Select Next Process", "Zoom In", "Zoom Out", SEPARATOR
,
115 "Hide Arrows", "Follow CPU Backward", "Follow CPU Forward",
116 "Go to previous event of the selected thread", "Go to next event of the selected thread" };
117 return Arrays
.asList(tooltipsArray
);
125 public void before() {
127 fViewBot
= fBot
.viewByTitle("Control Flow");
133 * Test keyboard navigation using ARROW_RIGHT and ARROW_LEFT
136 public void testKeyboardLeftRight() {
137 testNextPreviousEvent(() -> KEYBOARD
.pressShortcut(Keystrokes
.RIGHT
),
138 () -> KEYBOARD
.pressShortcut(Keystrokes
.SHIFT
, Keystrokes
.RIGHT
),
139 () -> KEYBOARD
.pressShortcut(Keystrokes
.LEFT
),
140 () -> KEYBOARD
.pressShortcut(Keystrokes
.SHIFT
, Keystrokes
.LEFT
));
144 * Test tool bar buttons "Select Next State Change" and "Select Previous
148 public void testToolBarSelectNextPreviousStateChange() {
149 testNextPreviousEvent(() -> fViewBot
.toolbarButton(SELECT_NEXT_STATE_CHANGE
).click(),
150 () -> fViewBot
.toolbarButton(SELECT_NEXT_STATE_CHANGE
).click(SWT
.SHIFT
),
151 () -> fViewBot
.toolbarButton(SELECT_PREVIOUS_STATE_CHANGE
).click(),
152 () -> fViewBot
.toolbarButton(SELECT_PREVIOUS_STATE_CHANGE
).click(SWT
.SHIFT
));
155 private void testNextPreviousEvent(Runnable selectNext
, Runnable shiftSelectNext
, Runnable selectPrevious
, Runnable shiftSelectPrevious
) {
156 /* change window range to 10 ms */
157 TmfTimeRange range
= new TmfTimeRange(START_TIME
, START_TIME
.normalize(10000000L, ITmfTimestamp
.NANOSECOND_SCALE
));
158 TmfSignalManager
.dispatchSignal(new TmfWindowRangeUpdatedSignal(this, range
));
159 fBot
.waitUntil(ConditionHelpers
.windowRange(range
));
161 /* set selection to trace start time */
162 TmfSignalManager
.dispatchSignal(new TmfSelectionRangeUpdatedSignal(this, START_TIME
));
163 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
165 /* select first item */
166 SWTBotUtils
.pressShortcutGoToTreeTop(KEYBOARD
);
167 fViewBot
.toolbarButton(SELECT_NEXT_PROCESS
).click();
169 /* set focus on time graph */
170 final TimeGraphControl timegraph
= fViewBot
.bot().widget(WidgetOfType
.widgetOfType(TimeGraphControl
.class));
171 UIThreadRunnable
.syncExec(new VoidResult() {
174 timegraph
.setFocus();
178 /* click "Select Next State Change" 3 times */
180 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1
, TID1_TIME1
));
182 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME2
, TID1_TIME2
));
184 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
));
185 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
)));
186 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME3
));
188 /* shift-click "Select Next State Change" 3 times */
189 shiftSelectNext
.run();
190 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME4
));
191 shiftSelectNext
.run();
192 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME5
));
193 shiftSelectNext
.run();
194 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME6
));
195 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME3
, TID1_TIME6
)));
196 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME6
));
198 /* shift-click "Select Previous State Change" 4 times */
199 shiftSelectPrevious
.run();
200 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME5
));
201 shiftSelectPrevious
.run();
202 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME4
));
203 shiftSelectPrevious
.run();
204 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
));
205 shiftSelectPrevious
.run();
206 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME2
));
207 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME3
, TID1_TIME2
)));
208 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME2
));
210 /* click "Select Next State Change" 2 times */
212 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
));
214 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME4
));
215 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME4
, TID1_TIME4
)));
216 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME4
));
218 /* shift-click "Select Previous State Change" 3 times */
219 shiftSelectPrevious
.run();
220 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME3
));
221 shiftSelectPrevious
.run();
222 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME2
));
223 shiftSelectPrevious
.run();
224 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME1
));
225 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME4
, TID1_TIME1
)));
226 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME1
));
228 /* shift-click "Select Next State Change" 4 times */
229 shiftSelectNext
.run();
230 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME2
));
231 shiftSelectNext
.run();
232 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME3
));
233 shiftSelectNext
.run();
234 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME4
));
235 shiftSelectNext
.run();
236 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME5
));
237 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME4
, TID1_TIME5
)));
238 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME5
));
240 /* click "Select Previous State Change" 5 times */
241 selectPrevious
.run();
242 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME4
));
243 selectPrevious
.run();
244 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
));
245 selectPrevious
.run();
246 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME2
, TID1_TIME2
));
247 selectPrevious
.run();
248 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1
, TID1_TIME1
));
249 selectPrevious
.run();
250 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
251 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(START_TIME
, START_TIME
)));
252 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(START_TIME
));
256 * Test toolbar button order and that all buttons are enabled and visible
259 public void testToolbar() {
260 List
<SWTBotToolbarButton
> buttons
= fViewBot
.getToolbarButtons();
261 List
<String
> tooltipsExpected
= getToolbarTooltips();
262 List
<String
> tooltips
= new ArrayList
<>();
263 for (SWTBotToolbarButton button
: buttons
) {
264 tooltips
.add(button
.getToolTipText());
265 assertTrue(button
.getText() + " enabled", button
.isEnabled());
266 assertTrue(button
.getText() + " visible", button
.isVisible());
268 assertEquals(tooltipsExpected
, tooltips
);
272 * Test the legend content
275 public void testLegend() {
276 List
<String
> labelValues
= getLegendValues();
277 SWTBotToolbarButton legendButton
= fViewBot
.toolbarButton("Show Legend");
278 legendButton
.click();
279 fBot
.waitUntil(org
.eclipse
.swtbot
.swt
.finder
.waits
.Conditions
.shellIsActive("States Transition Visualizer"));
280 SWTBot bot
= fBot
.activeShell().bot();
281 for (int i
= 1; i
<= labelValues
.size(); i
++) {
282 SWTBotLabel label
= bot
.label(i
);
283 assertNotNull(label
);
284 assertEquals(labelValues
.get(i
- 1), label
.getText());
286 bot
.button("OK").click();
293 public void testFilter() {
294 /* change window range to 1 ms */
295 TmfTimeRange range
= new TmfTimeRange(START_TIME
, START_TIME
.normalize(1000000L, ITmfTimestamp
.NANOSECOND_SCALE
));
296 TmfSignalManager
.dispatchSignal(new TmfWindowRangeUpdatedSignal(this, range
));
297 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
299 SWTBotToolbarButton filterButton
= fViewBot
.toolbarButton("Show View Filters");
300 filterButton
.click();
301 fBot
.waitUntil(org
.eclipse
.swtbot
.swt
.finder
.waits
.Conditions
.shellIsActive("Filter"));
302 SWTBot bot
= fBot
.activeShell().bot();
303 SWTBotTree treeBot
= bot
.tree();
304 TreeCheckedCounter treeCheckCounter
= new TreeCheckedCounter(treeBot
);
305 // get how many items there are
306 Integer checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
307 assertEquals("default", 226, checked
.intValue());
308 // test "uncheck all button"
309 bot
.button(UNCHECK_ALL
).click();
310 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
311 assertEquals(0, checked
.intValue());
313 bot
.button(CHECK_ACTIVE
).click();
314 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
315 assertEquals(CHECK_ACTIVE
, 69, checked
.intValue());
317 bot
.button(CHECK_ALL
).click();
318 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
319 assertEquals(CHECK_ALL
, 226, checked
.intValue());
320 // test uncheck inactive
321 bot
.button(UNCHECK_INACTIVE
).click();
322 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
323 assertEquals(UNCHECK_INACTIVE
, 69, checked
.intValue());
324 // test check selected
325 treeBot
.getTreeItem(LttngTraceGenerator
.getName()).select("gnuplot");
326 bot
.button(UNCHECK_ALL
).click();
327 bot
.button(CHECK_SELECTED
).click();
328 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
329 assertEquals(CHECK_SELECTED
, 2, checked
.intValue());
330 // test check subtree
331 bot
.button(UNCHECK_ALL
).click();
332 bot
.button(CHECK_SUBTREE
).click();
333 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
334 assertEquals(CHECK_SUBTREE
, 2, checked
.intValue());
335 // test uncheck selected
336 bot
.button(CHECK_ALL
).click();
337 bot
.button(UNCHECK_SELECTED
).click();
338 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
339 assertEquals(UNCHECK_SELECTED
, 225, checked
.intValue());
340 // test uncheck subtree
341 bot
.button(CHECK_ALL
).click();
342 bot
.button(UNCHECK_SUBTREE
).click();
343 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
344 assertEquals(UNCHECK_SELECTED
, 225, checked
.intValue());
346 bot
.button(UNCHECK_ALL
).click();
347 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
348 assertEquals(0, checked
.intValue());
349 bot
.text().setText("half-life 3");
350 SWTBotTreeItem treeItem
= treeBot
.getTreeItem(LttngTraceGenerator
.getName());
352 fBot
.waitUntil(ConditionHelpers
.treeItemCount(treeItem
, 25));
353 bot
.button(CHECK_ALL
).click();
354 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
355 assertEquals("Filtered", 26, checked
.intValue());
356 bot
.button("OK").click();
357 treeBot
= fViewBot
.bot().tree();
358 treeItem
= treeBot
.getTreeItem(LttngTraceGenerator
.getName());
359 for (int i
= 0; i
< 25; i
++) {
360 assertEquals("Filtered Control flow view", "Half-life 3", treeItem
.cell(i
, 0));
365 * Test tool bar buttons "Follow CPU Forward" and "Follow CPU Backward"
368 public void testToolBarFollowCPUForwardBackward() {
369 /* change window range to 10 ms */
370 TmfTimeRange range
= new TmfTimeRange(START_TIME
, START_TIME
.normalize(10000000L, ITmfTimestamp
.NANOSECOND_SCALE
));
371 TmfSignalManager
.dispatchSignal(new TmfWindowRangeUpdatedSignal(this, range
));
372 fBot
.waitUntil(ConditionHelpers
.windowRange(range
));
374 /* set selection to trace start time */
375 TmfSignalManager
.dispatchSignal(new TmfSelectionRangeUpdatedSignal(this, START_TIME
));
376 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(START_TIME
, START_TIME
)));
378 /* select first item */
379 final SWTBotTree tree
= fViewBot
.bot().tree();
380 SWTBotUtils
.pressShortcutGoToTreeTop(KEYBOARD
);
381 fViewBot
.toolbarButton(SELECT_NEXT_PROCESS
).click();
383 /* set focus on time graph */
384 final TimeGraphControl timegraph
= fViewBot
.bot().widget(WidgetOfType
.widgetOfType(TimeGraphControl
.class));
385 UIThreadRunnable
.syncExec(new VoidResult() {
388 timegraph
.setFocus();
392 /* click "Follow CPU Forward" 3 times */
393 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
394 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
395 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1
, TID1_TIME1
));
396 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
397 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME1
, TID2_TIME1
));
398 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
399 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
));
400 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
)));
401 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "2"));
402 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME2
));
404 /* shift-click "Follow CPU Forward" 3 times */
405 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
406 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME3
));
407 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
408 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME4
));
409 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
410 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME4
));
411 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME2
, TID5_TIME1
)));
412 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "5"));
413 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID5_TIME1
));
415 /* shift-click "Follow CPU Backward" 4 times */
416 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
417 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME4
));
418 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
419 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME3
));
420 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
421 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
));
422 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
423 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME1
));
424 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME2
, TID2_TIME1
)));
425 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "2"));
426 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME1
));
428 /* click "Follow CPU Forward" 2 times */
429 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
430 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
));
431 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
432 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME3
));
433 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME3
, TID2_TIME3
)));
434 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "2"));
435 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME3
));
437 /* shift-click "Follow CPU Backward" 3 times */
438 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
439 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME2
));
440 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
441 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME1
));
442 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
443 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID1_TIME1
));
444 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME3
, TID1_TIME1
)));
445 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "1"));
446 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME1
));
448 /* shift-click "Follow CPU Forward" 4 times */
449 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
450 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME1
));
451 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
452 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME2
));
453 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
454 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME3
));
455 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
456 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME4
));
457 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME3
, TID2_TIME4
)));
458 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "2"));
459 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME4
));
461 /* click "Follow CPU Backward" 5 times */
462 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
463 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME3
));
464 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
465 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
));
466 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
467 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME1
, TID2_TIME1
));
468 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
469 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1
, TID1_TIME1
));
470 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
471 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
472 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(START_TIME
, START_TIME
)));
473 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(START_TIME
));
476 private void timeGraphIsReadyCondition(@NonNull TmfTimeRange selectionRange
) {
477 IWorkbenchPart part
= fViewBot
.getViewReference().getPart(false);
478 fBot
.waitUntil(ConditionHelpers
.timeGraphIsReadyCondition((AbstractTimeGraphView
) part
, selectionRange
, selectionRange
.getEndTime()));