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 org
.eclipse
.jdt
.annotation
.NonNull
;
20 import org
.eclipse
.swt
.SWT
;
21 import org
.eclipse
.swtbot
.eclipse
.finder
.widgets
.SWTBotView
;
22 import org
.eclipse
.swtbot
.swt
.finder
.SWTBot
;
23 import org
.eclipse
.swtbot
.swt
.finder
.finders
.UIThreadRunnable
;
24 import org
.eclipse
.swtbot
.swt
.finder
.junit
.SWTBotJunit4ClassRunner
;
25 import org
.eclipse
.swtbot
.swt
.finder
.keyboard
.Keyboard
;
26 import org
.eclipse
.swtbot
.swt
.finder
.keyboard
.KeyboardFactory
;
27 import org
.eclipse
.swtbot
.swt
.finder
.keyboard
.Keystrokes
;
28 import org
.eclipse
.swtbot
.swt
.finder
.matchers
.WidgetOfType
;
29 import org
.eclipse
.swtbot
.swt
.finder
.results
.VoidResult
;
30 import org
.eclipse
.swtbot
.swt
.finder
.widgets
.SWTBotLabel
;
31 import org
.eclipse
.swtbot
.swt
.finder
.widgets
.SWTBotToolbarButton
;
32 import org
.eclipse
.swtbot
.swt
.finder
.widgets
.SWTBotTree
;
33 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfSelectionRangeUpdatedSignal
;
34 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfSignalManager
;
35 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfWindowRangeUpdatedSignal
;
36 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.ITmfTimestamp
;
37 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.TmfNanoTimestamp
;
38 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.TmfTimeRange
;
39 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.TmfTraceManager
;
40 import org
.eclipse
.tracecompass
.tmf
.ui
.swtbot
.tests
.shared
.ConditionHelpers
;
41 import org
.eclipse
.tracecompass
.tmf
.ui
.views
.timegraph
.AbstractTimeGraphView
;
42 import org
.eclipse
.tracecompass
.tmf
.ui
.widgets
.timegraph
.widgets
.TimeGraphControl
;
43 import org
.eclipse
.ui
.IWorkbenchPart
;
44 import org
.junit
.Before
;
45 import org
.junit
.Test
;
46 import org
.junit
.runner
.RunWith
;
49 * SWTBot tests for Control Flow view
51 * @author Patrick Tasse
53 @RunWith(SWTBotJunit4ClassRunner
.class)
54 public class ControlFlowViewTest
extends KernelTestBase
{
56 private static final String CHECK_SELECTED
= "Check selected";
57 private static final String CHECK_ALL
= "Check all";
58 private static final String CHECK_SUBTREE
= "Check subtree";
59 private static final String CHECK_ACTIVE
= "Check Active";
60 private static final String UNCHECK_SELECTED
= "Uncheck selected";
61 private static final String UNCHECK_ALL
= "Uncheck all";
62 private static final String UNCHECK_SUBTREE
= "Uncheck subtree";
63 private static final String UNCHECK_INACTIVE
= "Uncheck Inactive";
66 private static final String FOLLOW_CPU_BACKWARD
= "Follow CPU Backward";
67 private static final String FOLLOW_CPU_FORWARD
= "Follow CPU Forward";
68 private static final String SELECT_PREVIOUS_EVENT
= "Select Previous Event";
69 private static final String SELECT_NEXT_EVENT
= "Select Next Event";
70 private static final Keyboard KEYBOARD
= KeyboardFactory
.getSWTKeyboard();
71 private static final @NonNull ITmfTimestamp START_TIME
= new TmfNanoTimestamp(1368000272650993664L);
72 private static final @NonNull ITmfTimestamp TID1_TIME1
= new TmfNanoTimestamp(1368000272651208412L);
73 private static final @NonNull ITmfTimestamp TID1_TIME2
= new TmfNanoTimestamp(1368000272656147616L);
74 private static final @NonNull ITmfTimestamp TID1_TIME3
= new TmfNanoTimestamp(1368000272656362364L);
75 private static final @NonNull ITmfTimestamp TID1_TIME4
= new TmfNanoTimestamp(1368000272663234300L);
76 private static final @NonNull ITmfTimestamp TID1_TIME5
= new TmfNanoTimestamp(1368000272663449048L);
77 private static final @NonNull ITmfTimestamp TID1_TIME6
= new TmfNanoTimestamp(1368000272665596528L);
78 private static final @NonNull ITmfTimestamp TID2_TIME1
= new TmfNanoTimestamp(1368000272651852656L);
79 private static final @NonNull ITmfTimestamp TID2_TIME2
= new TmfNanoTimestamp(1368000272652067404L);
80 private static final @NonNull ITmfTimestamp TID2_TIME3
= new TmfNanoTimestamp(1368000272652282152L);
81 private static final @NonNull ITmfTimestamp TID2_TIME4
= new TmfNanoTimestamp(1368000272652496900L);
82 private static final @NonNull ITmfTimestamp TID5_TIME1
= new TmfNanoTimestamp(1368000272652496900L);
84 private SWTBotView fViewBot
;
91 public void before() {
93 fViewBot
= fBot
.viewByTitle("Control Flow");
99 * Test keyboard navigation using ARROW_RIGHT and ARROW_LEFT
102 public void testKeyboardLeftRight() {
103 testNextPreviousEvent(() -> KEYBOARD
.pressShortcut(Keystrokes
.RIGHT
),
104 () -> KEYBOARD
.pressShortcut(Keystrokes
.SHIFT
, Keystrokes
.RIGHT
),
105 () -> KEYBOARD
.pressShortcut(Keystrokes
.LEFT
),
106 () -> KEYBOARD
.pressShortcut(Keystrokes
.SHIFT
, Keystrokes
.LEFT
));
110 * Test tool bar buttons "Select Next Event" and "Select Previous Event"
113 public void testToolBarSelectNextPreviousEvent() {
114 testNextPreviousEvent(() -> fViewBot
.toolbarButton(SELECT_NEXT_EVENT
).click(),
115 () -> fViewBot
.toolbarButton(SELECT_NEXT_EVENT
).click(SWT
.SHIFT
),
116 () -> fViewBot
.toolbarButton(SELECT_PREVIOUS_EVENT
).click(),
117 () -> fViewBot
.toolbarButton(SELECT_PREVIOUS_EVENT
).click(SWT
.SHIFT
));
120 private void testNextPreviousEvent(Runnable selectNext
, Runnable shiftSelectNext
, Runnable selectPrevious
, Runnable shiftSelectPrevious
) {
121 /* change window range to 10 ms */
122 TmfTimeRange range
= new TmfTimeRange(START_TIME
, START_TIME
.normalize(10000000L, ITmfTimestamp
.NANOSECOND_SCALE
));
123 TmfSignalManager
.dispatchSignal(new TmfWindowRangeUpdatedSignal(this, range
));
124 fBot
.waitUntil(ConditionHelpers
.windowRange(range
));
126 /* set selection to trace start time */
127 TmfSignalManager
.dispatchSignal(new TmfSelectionRangeUpdatedSignal(this, START_TIME
));
128 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
130 /* select first item */
131 final SWTBotTree tree
= fViewBot
.bot().tree();
132 tree
.pressShortcut(Keystrokes
.HOME
);
134 /* set focus on time graph */
135 final TimeGraphControl timegraph
= fViewBot
.bot().widget(WidgetOfType
.widgetOfType(TimeGraphControl
.class));
136 UIThreadRunnable
.syncExec(new VoidResult() {
139 timegraph
.setFocus();
143 /* click "Select Next Event" 3 times */
145 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1
, TID1_TIME1
));
147 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME2
, TID1_TIME2
));
149 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
));
150 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
)));
151 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME3
));
153 /* shift-click "Select Next Event" 3 times */
154 shiftSelectNext
.run();
155 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME4
));
156 shiftSelectNext
.run();
157 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME5
));
158 shiftSelectNext
.run();
159 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME6
));
160 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME3
, TID1_TIME6
)));
161 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME6
));
163 /* shift-click "Select Previous Event" 4 times */
164 shiftSelectPrevious
.run();
165 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME5
));
166 shiftSelectPrevious
.run();
167 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME4
));
168 shiftSelectPrevious
.run();
169 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
));
170 shiftSelectPrevious
.run();
171 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME2
));
172 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME3
, TID1_TIME2
)));
173 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME2
));
175 /* click "Select Next Event" 2 times */
177 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
));
179 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME4
));
180 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME4
, TID1_TIME4
)));
181 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME4
));
183 /* shift-click "Select Previous Event" 3 times */
184 shiftSelectPrevious
.run();
185 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME3
));
186 shiftSelectPrevious
.run();
187 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME2
));
188 shiftSelectPrevious
.run();
189 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME1
));
190 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME4
, TID1_TIME1
)));
191 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME1
));
193 /* shift-click "Select Next Event" 4 times */
194 shiftSelectNext
.run();
195 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME2
));
196 shiftSelectNext
.run();
197 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME3
));
198 shiftSelectNext
.run();
199 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME4
));
200 shiftSelectNext
.run();
201 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME5
));
202 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME4
, TID1_TIME5
)));
203 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME5
));
205 /* click "Select Previous Event" 5 times */
206 selectPrevious
.run();
207 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME4
));
208 selectPrevious
.run();
209 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
));
210 selectPrevious
.run();
211 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME2
, TID1_TIME2
));
212 selectPrevious
.run();
213 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1
, TID1_TIME1
));
214 selectPrevious
.run();
215 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
216 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(START_TIME
, START_TIME
)));
217 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(START_TIME
));
221 * Test the legend content
224 public void testLegend() {
225 String
[] labelValues
= { "UNKNOWN", "WAIT_UNKNOWN", "WAIT_BLOCKED", "WAIT_FOR_CPU", "USERMODE", "SYSCALL", "INTERRUPTED" };
226 SWTBotToolbarButton legendButton
= fViewBot
.toolbarButton("Show Legend");
227 legendButton
.click();
228 fBot
.waitUntil(org
.eclipse
.swtbot
.swt
.finder
.waits
.Conditions
.shellIsActive("States Transition Visualizer"));
229 SWTBot bot
= fBot
.activeShell().bot();
230 for (int i
= 1; i
< 8; i
++) {
231 SWTBotLabel label
= bot
.label(i
);
232 assertNotNull(label
);
233 assertEquals(labelValues
[i
- 1], label
.getText());
235 bot
.button("OK").click();
242 public void testFilter() {
243 /* change window range to 1 ms */
244 TmfTimeRange range
= new TmfTimeRange(START_TIME
, START_TIME
.normalize(1000000L, ITmfTimestamp
.NANOSECOND_SCALE
));
245 TmfSignalManager
.dispatchSignal(new TmfWindowRangeUpdatedSignal(this, range
));
246 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
248 SWTBotToolbarButton filterButton
= fViewBot
.toolbarButton("Show View Filters");
249 filterButton
.click();
250 fBot
.waitUntil(org
.eclipse
.swtbot
.swt
.finder
.waits
.Conditions
.shellIsActive("Filter"));
251 SWTBot bot
= fBot
.activeShell().bot();
252 SWTBotTree treeBot
= bot
.tree();
253 TreeCheckedCounter treeCheckCounter
= new TreeCheckedCounter(treeBot
);
254 // get how many items there are
255 Integer checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
256 assertEquals("default", 200, checked
.intValue());
257 // test "uncheck all button"
258 bot
.button(UNCHECK_ALL
).click();
259 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
260 assertEquals(0, checked
.intValue());
262 bot
.button(CHECK_ACTIVE
).click();
263 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
264 assertEquals(CHECK_ACTIVE
, 43, checked
.intValue());
266 bot
.button(CHECK_ALL
).click();
267 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
268 assertEquals(CHECK_ALL
, 200, checked
.intValue());
269 // test uncheck inactive
270 bot
.button(UNCHECK_INACTIVE
).click();
271 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
272 assertEquals(UNCHECK_INACTIVE
, 43, checked
.intValue());
273 // test check selected
275 bot
.button(UNCHECK_ALL
).click();
276 bot
.button(CHECK_SELECTED
).click();
277 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
278 assertEquals(CHECK_SELECTED
, 1, checked
.intValue());
279 // test check subtree
280 bot
.button(UNCHECK_ALL
).click();
281 bot
.button(CHECK_SUBTREE
).click();
282 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
283 assertEquals(CHECK_SUBTREE
, 1, checked
.intValue());
284 // test uncheck selected
285 bot
.button(CHECK_ALL
).click();
286 bot
.button(UNCHECK_SELECTED
).click();
287 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
288 assertEquals(UNCHECK_SELECTED
, 199, checked
.intValue());
289 // test uncheck subtree
290 bot
.button(CHECK_ALL
).click();
291 bot
.button(UNCHECK_SUBTREE
).click();
292 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
293 assertEquals(UNCHECK_SELECTED
, 199, checked
.intValue());
295 bot
.button(UNCHECK_ALL
).click();
296 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
297 assertEquals(0, checked
.intValue());
298 bot
.text().setText("half-life 3");
299 fBot
.waitUntil(org
.eclipse
.swtbot
.swt
.finder
.waits
.Conditions
.treeHasRows(treeBot
, 25));
300 bot
.button(CHECK_ALL
).click();
301 checked
= UIThreadRunnable
.syncExec(treeCheckCounter
);
302 assertEquals("Filtered", 25, checked
.intValue());
303 bot
.button("OK").click();
304 treeBot
= fViewBot
.bot().tree();
305 for (int i
= 0; i
< 25; i
++) {
306 assertEquals("Filtered Control flow view", "Half-life 3", treeBot
.cell(i
, 0));
311 * Test tool bar buttons "Follow CPU Forward" and "Follow CPU Backward"
314 public void testToolBarFollowCPUForwardBackward() {
315 /* change window range to 10 ms */
316 TmfTimeRange range
= new TmfTimeRange(START_TIME
, START_TIME
.normalize(10000000L, ITmfTimestamp
.NANOSECOND_SCALE
));
317 TmfSignalManager
.dispatchSignal(new TmfWindowRangeUpdatedSignal(this, range
));
318 fBot
.waitUntil(ConditionHelpers
.windowRange(range
));
320 /* set selection to trace start time */
321 TmfSignalManager
.dispatchSignal(new TmfSelectionRangeUpdatedSignal(this, START_TIME
));
322 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(START_TIME
, START_TIME
)));
324 /* select first item */
325 final SWTBotTree tree
= fViewBot
.bot().tree();
326 tree
.pressShortcut(Keystrokes
.HOME
);
328 /* set focus on time graph */
329 final TimeGraphControl timegraph
= fViewBot
.bot().widget(WidgetOfType
.widgetOfType(TimeGraphControl
.class));
330 UIThreadRunnable
.syncExec(new VoidResult() {
333 timegraph
.setFocus();
337 /* click "Follow CPU Forward" 3 times */
338 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
339 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
340 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1
, TID1_TIME1
));
341 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
342 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME1
, TID2_TIME1
));
343 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
344 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
));
345 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
)));
346 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "2"));
347 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME2
));
349 /* shift-click "Follow CPU Forward" 3 times */
350 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
351 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME3
));
352 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
353 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME4
));
354 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
355 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME4
));
356 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME2
, TID5_TIME1
)));
357 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "5"));
358 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID5_TIME1
));
360 /* shift-click "Follow CPU Backward" 4 times */
361 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
362 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME4
));
363 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
364 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME3
));
365 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
366 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
));
367 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
368 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME1
));
369 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME2
, TID2_TIME1
)));
370 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "2"));
371 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME1
));
373 /* click "Follow CPU Forward" 2 times */
374 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
375 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
));
376 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
377 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME3
));
378 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME3
, TID2_TIME3
)));
379 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "2"));
380 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME3
));
382 /* shift-click "Follow CPU Backward" 3 times */
383 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
384 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME2
));
385 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
386 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME1
));
387 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
388 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID1_TIME1
));
389 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME3
, TID1_TIME1
)));
390 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "1"));
391 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME1
));
393 /* shift-click "Follow CPU Forward" 4 times */
394 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
395 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME1
));
396 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
397 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME2
));
398 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
399 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME3
));
400 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
401 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME4
));
402 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME3
, TID2_TIME4
)));
403 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "2"));
404 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME4
));
406 /* click "Follow CPU Backward" 5 times */
407 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
408 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME3
));
409 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
410 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
));
411 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
412 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME1
, TID2_TIME1
));
413 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
414 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1
, TID1_TIME1
));
415 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
416 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
417 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(START_TIME
, START_TIME
)));
418 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(START_TIME
));
421 private void timeGraphIsReadyCondition(@NonNull TmfTimeRange selectionRange
) {
422 IWorkbenchPart part
= fViewBot
.getViewReference().getPart(false);
423 fBot
.waitUntil(ConditionHelpers
.timeGraphIsReadyCondition((AbstractTimeGraphView
) part
, selectionRange
, selectionRange
.getEndTime()));