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
.assertTrue
;
17 import org
.eclipse
.jdt
.annotation
.NonNull
;
18 import org
.eclipse
.swt
.SWT
;
19 import org
.eclipse
.swtbot
.eclipse
.finder
.widgets
.SWTBotView
;
20 import org
.eclipse
.swtbot
.swt
.finder
.finders
.UIThreadRunnable
;
21 import org
.eclipse
.swtbot
.swt
.finder
.junit
.SWTBotJunit4ClassRunner
;
22 import org
.eclipse
.swtbot
.swt
.finder
.keyboard
.Keyboard
;
23 import org
.eclipse
.swtbot
.swt
.finder
.keyboard
.KeyboardFactory
;
24 import org
.eclipse
.swtbot
.swt
.finder
.keyboard
.Keystrokes
;
25 import org
.eclipse
.swtbot
.swt
.finder
.matchers
.WidgetOfType
;
26 import org
.eclipse
.swtbot
.swt
.finder
.results
.VoidResult
;
27 import org
.eclipse
.swtbot
.swt
.finder
.widgets
.SWTBotTree
;
28 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfSelectionRangeUpdatedSignal
;
29 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfSignalManager
;
30 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfWindowRangeUpdatedSignal
;
31 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.ITmfTimestamp
;
32 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.TmfNanoTimestamp
;
33 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.TmfTimeRange
;
34 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.TmfTraceManager
;
35 import org
.eclipse
.tracecompass
.tmf
.ui
.swtbot
.tests
.shared
.ConditionHelpers
;
36 import org
.eclipse
.tracecompass
.tmf
.ui
.views
.timegraph
.AbstractTimeGraphView
;
37 import org
.eclipse
.tracecompass
.tmf
.ui
.widgets
.timegraph
.widgets
.TimeGraphControl
;
38 import org
.eclipse
.ui
.IWorkbenchPart
;
39 import org
.junit
.Before
;
40 import org
.junit
.Test
;
41 import org
.junit
.runner
.RunWith
;
44 * SWTBot tests for Control Flow view
46 * @author Patrick Tasse
48 @RunWith(SWTBotJunit4ClassRunner
.class)
49 public class ControlFlowViewTest
extends KernelTestBase
{
51 private static final String FOLLOW_CPU_BACKWARD
= "Follow CPU Backward";
52 private static final String FOLLOW_CPU_FORWARD
= "Follow CPU Forward";
53 private static final String SELECT_PREVIOUS_EVENT
= "Select Previous Event";
54 private static final String SELECT_NEXT_EVENT
= "Select Next Event";
55 private static final Keyboard KEYBOARD
= KeyboardFactory
.getSWTKeyboard();
56 private static final @NonNull ITmfTimestamp START_TIME
= new TmfNanoTimestamp(1368000272650993664L);
57 private static final @NonNull ITmfTimestamp TID1_TIME1
= new TmfNanoTimestamp(1368000272651208412L);
58 private static final @NonNull ITmfTimestamp TID1_TIME2
= new TmfNanoTimestamp(1368000272656147616L);
59 private static final @NonNull ITmfTimestamp TID1_TIME3
= new TmfNanoTimestamp(1368000272656362364L);
60 private static final @NonNull ITmfTimestamp TID1_TIME4
= new TmfNanoTimestamp(1368000272663234300L);
61 private static final @NonNull ITmfTimestamp TID1_TIME5
= new TmfNanoTimestamp(1368000272663449048L);
62 private static final @NonNull ITmfTimestamp TID1_TIME6
= new TmfNanoTimestamp(1368000272665596528L);
63 private static final @NonNull ITmfTimestamp TID2_TIME1
= new TmfNanoTimestamp(1368000272651852656L);
64 private static final @NonNull ITmfTimestamp TID2_TIME2
= new TmfNanoTimestamp(1368000272652067404L);
65 private static final @NonNull ITmfTimestamp TID2_TIME3
= new TmfNanoTimestamp(1368000272652282152L);
66 private static final @NonNull ITmfTimestamp TID2_TIME4
= new TmfNanoTimestamp(1368000272652496900L);
67 private static final @NonNull ITmfTimestamp TID5_TIME1
= new TmfNanoTimestamp(1368000272652496900L);
69 private SWTBotView fViewBot
;
76 public void before() {
78 fViewBot
= fBot
.viewByTitle("Control Flow");
84 * Test keyboard navigation using ARROW_RIGHT and ARROW_LEFT
87 public void testKeyboardLeftRight() {
88 testNextPreviousEvent(() -> KEYBOARD
.pressShortcut(Keystrokes
.RIGHT
),
89 () -> KEYBOARD
.pressShortcut(Keystrokes
.SHIFT
, Keystrokes
.RIGHT
),
90 () -> KEYBOARD
.pressShortcut(Keystrokes
.LEFT
),
91 () -> KEYBOARD
.pressShortcut(Keystrokes
.SHIFT
, Keystrokes
.LEFT
));
95 * Test tool bar buttons "Select Next Event" and "Select Previous Event"
98 public void testToolBarSelectNextPreviousEvent() {
99 testNextPreviousEvent(() -> fViewBot
.toolbarButton(SELECT_NEXT_EVENT
).click(),
100 () -> fViewBot
.toolbarButton(SELECT_NEXT_EVENT
).click(SWT
.SHIFT
),
101 () -> fViewBot
.toolbarButton(SELECT_PREVIOUS_EVENT
).click(),
102 () -> fViewBot
.toolbarButton(SELECT_PREVIOUS_EVENT
).click(SWT
.SHIFT
));
105 private void testNextPreviousEvent(Runnable selectNext
, Runnable shiftSelectNext
, Runnable selectPrevious
, Runnable shiftSelectPrevious
) {
106 /* change window range to 10 ms */
107 TmfTimeRange range
= new TmfTimeRange(START_TIME
, START_TIME
.normalize(10000000L, ITmfTimestamp
.NANOSECOND_SCALE
));
108 TmfSignalManager
.dispatchSignal(new TmfWindowRangeUpdatedSignal(this, range
));
109 fBot
.waitUntil(ConditionHelpers
.windowRange(range
));
111 /* set selection to trace start time */
112 TmfSignalManager
.dispatchSignal(new TmfSelectionRangeUpdatedSignal(this, START_TIME
));
113 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
115 /* select first item */
116 final SWTBotTree tree
= fViewBot
.bot().tree();
117 tree
.pressShortcut(Keystrokes
.HOME
);
119 /* set focus on time graph */
120 final TimeGraphControl timegraph
= fViewBot
.bot().widget(WidgetOfType
.widgetOfType(TimeGraphControl
.class));
121 UIThreadRunnable
.syncExec(new VoidResult() {
124 timegraph
.setFocus();
128 /* click "Select Next Event" 3 times */
130 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1
, TID1_TIME1
));
132 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME2
, TID1_TIME2
));
134 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
));
135 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
)));
136 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME3
));
138 /* shift-click "Select Next Event" 3 times */
139 shiftSelectNext
.run();
140 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME4
));
141 shiftSelectNext
.run();
142 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME5
));
143 shiftSelectNext
.run();
144 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME6
));
145 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME3
, TID1_TIME6
)));
146 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME6
));
148 /* shift-click "Select Previous Event" 4 times */
149 shiftSelectPrevious
.run();
150 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME5
));
151 shiftSelectPrevious
.run();
152 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME4
));
153 shiftSelectPrevious
.run();
154 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
));
155 shiftSelectPrevious
.run();
156 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME2
));
157 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME3
, TID1_TIME2
)));
158 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME2
));
160 /* click "Select Next Event" 2 times */
162 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
));
164 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME4
));
165 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME4
, TID1_TIME4
)));
166 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME4
));
168 /* shift-click "Select Previous Event" 3 times */
169 shiftSelectPrevious
.run();
170 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME3
));
171 shiftSelectPrevious
.run();
172 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME2
));
173 shiftSelectPrevious
.run();
174 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME1
));
175 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME4
, TID1_TIME1
)));
176 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME1
));
178 /* shift-click "Select Next Event" 4 times */
179 shiftSelectNext
.run();
180 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME2
));
181 shiftSelectNext
.run();
182 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME3
));
183 shiftSelectNext
.run();
184 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME4
));
185 shiftSelectNext
.run();
186 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME5
));
187 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME4
, TID1_TIME5
)));
188 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME5
));
190 /* click "Select Previous Event" 5 times */
191 selectPrevious
.run();
192 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME4
));
193 selectPrevious
.run();
194 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
));
195 selectPrevious
.run();
196 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME2
, TID1_TIME2
));
197 selectPrevious
.run();
198 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1
, TID1_TIME1
));
199 selectPrevious
.run();
200 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
201 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(START_TIME
, START_TIME
)));
202 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(START_TIME
));
206 * Test tool bar buttons "Follow CPU Forward" and "Follow CPU Backward"
209 public void testToolBarFollowCPUForwardBackward() {
210 /* change window range to 10 ms */
211 TmfTimeRange range
= new TmfTimeRange(START_TIME
, START_TIME
.normalize(10000000L, ITmfTimestamp
.NANOSECOND_SCALE
));
212 TmfSignalManager
.dispatchSignal(new TmfWindowRangeUpdatedSignal(this, range
));
213 fBot
.waitUntil(ConditionHelpers
.windowRange(range
));
215 /* set selection to trace start time */
216 TmfSignalManager
.dispatchSignal(new TmfSelectionRangeUpdatedSignal(this, START_TIME
));
217 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(START_TIME
, START_TIME
)));
219 /* select first item */
220 final SWTBotTree tree
= fViewBot
.bot().tree();
221 tree
.pressShortcut(Keystrokes
.HOME
);
223 /* set focus on time graph */
224 final TimeGraphControl timegraph
= fViewBot
.bot().widget(WidgetOfType
.widgetOfType(TimeGraphControl
.class));
225 UIThreadRunnable
.syncExec(new VoidResult() {
228 timegraph
.setFocus();
232 /* click "Follow CPU Forward" 3 times */
233 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
234 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
235 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1
, TID1_TIME1
));
236 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
237 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME1
, TID2_TIME1
));
238 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
239 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
));
240 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
)));
241 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "2"));
242 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME2
));
244 /* shift-click "Follow CPU Forward" 3 times */
245 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
246 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME3
));
247 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
248 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME4
));
249 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
250 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME4
));
251 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME2
, TID5_TIME1
)));
252 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "5"));
253 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID5_TIME1
));
255 /* shift-click "Follow CPU Backward" 4 times */
256 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
257 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME4
));
258 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
259 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME3
));
260 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
261 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
));
262 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
263 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME1
));
264 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME2
, TID2_TIME1
)));
265 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "2"));
266 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME1
));
268 /* click "Follow CPU Forward" 2 times */
269 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
270 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
));
271 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
272 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME3
));
273 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME3
, TID2_TIME3
)));
274 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "2"));
275 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME3
));
277 /* shift-click "Follow CPU Backward" 3 times */
278 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
279 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME2
));
280 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
281 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME1
));
282 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
283 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID1_TIME1
));
284 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME3
, TID1_TIME1
)));
285 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "1"));
286 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME1
));
288 /* shift-click "Follow CPU Forward" 4 times */
289 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
290 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME1
));
291 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
292 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME2
));
293 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
294 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME3
));
295 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
296 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME4
));
297 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME3
, TID2_TIME4
)));
298 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "2"));
299 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME4
));
301 /* click "Follow CPU Backward" 5 times */
302 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
303 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME3
));
304 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
305 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
));
306 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
307 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME1
, TID2_TIME1
));
308 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
309 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1
, TID1_TIME1
));
310 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
311 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
312 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(START_TIME
, START_TIME
)));
313 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(START_TIME
));
316 private void timeGraphIsReadyCondition(@NonNull TmfTimeRange selectionRange
) {
317 IWorkbenchPart part
= fViewBot
.getViewReference().getPart(false);
318 fBot
.waitUntil(ConditionHelpers
.timeGraphIsReadyCondition((AbstractTimeGraphView
) part
, selectionRange
, selectionRange
.getEndTime()));