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
.keyboard
.Keyboard
;
22 import org
.eclipse
.swtbot
.swt
.finder
.keyboard
.KeyboardFactory
;
23 import org
.eclipse
.swtbot
.swt
.finder
.keyboard
.Keystrokes
;
24 import org
.eclipse
.swtbot
.swt
.finder
.matchers
.WidgetOfType
;
25 import org
.eclipse
.swtbot
.swt
.finder
.results
.VoidResult
;
26 import org
.eclipse
.swtbot
.swt
.finder
.widgets
.SWTBotTree
;
27 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfSelectionRangeUpdatedSignal
;
28 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfSignalManager
;
29 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfWindowRangeUpdatedSignal
;
30 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.ITmfTimestamp
;
31 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.TmfNanoTimestamp
;
32 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.TmfTimeRange
;
33 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.TmfTraceManager
;
34 import org
.eclipse
.tracecompass
.tmf
.ui
.swtbot
.tests
.shared
.ConditionHelpers
;
35 import org
.eclipse
.tracecompass
.tmf
.ui
.views
.timegraph
.AbstractTimeGraphView
;
36 import org
.eclipse
.tracecompass
.tmf
.ui
.widgets
.timegraph
.widgets
.TimeGraphControl
;
37 import org
.eclipse
.ui
.IWorkbenchPart
;
38 import org
.junit
.Before
;
39 import org
.junit
.Test
;
42 * SWTBot tests for Control Flow view
44 * @author Patrick Tasse
46 public class ControlFlowViewTest
extends KernelTest
{
48 private static final String FOLLOW_CPU_BACKWARD
= "Follow CPU Backward";
49 private static final String FOLLOW_CPU_FORWARD
= "Follow CPU Forward";
50 private static final String SELECT_PREVIOUS_EVENT
= "Select Previous Event";
51 private static final String SELECT_NEXT_EVENT
= "Select Next Event";
52 private static final Keyboard KEYBOARD
= KeyboardFactory
.getSWTKeyboard();
53 private static final @NonNull ITmfTimestamp START_TIME
= new TmfNanoTimestamp(1368000272650993664L);
54 private static final @NonNull ITmfTimestamp TID1_TIME1
= new TmfNanoTimestamp(1368000272651208412L);
55 private static final @NonNull ITmfTimestamp TID1_TIME2
= new TmfNanoTimestamp(1368000272656147616L);
56 private static final @NonNull ITmfTimestamp TID1_TIME3
= new TmfNanoTimestamp(1368000272656362364L);
57 private static final @NonNull ITmfTimestamp TID1_TIME4
= new TmfNanoTimestamp(1368000272663234300L);
58 private static final @NonNull ITmfTimestamp TID1_TIME5
= new TmfNanoTimestamp(1368000272663449048L);
59 private static final @NonNull ITmfTimestamp TID1_TIME6
= new TmfNanoTimestamp(1368000272665596528L);
60 private static final @NonNull ITmfTimestamp TID2_TIME1
= new TmfNanoTimestamp(1368000272651852656L);
61 private static final @NonNull ITmfTimestamp TID2_TIME2
= new TmfNanoTimestamp(1368000272652067404L);
62 private static final @NonNull ITmfTimestamp TID2_TIME3
= new TmfNanoTimestamp(1368000272652282152L);
63 private static final @NonNull ITmfTimestamp TID2_TIME4
= new TmfNanoTimestamp(1368000272652496900L);
64 private static final @NonNull ITmfTimestamp TID5_TIME1
= new TmfNanoTimestamp(1368000272652496900L);
66 private SWTBotView fViewBot
;
73 public void before() {
75 fViewBot
= fBot
.viewByTitle("Control Flow");
79 * Test keyboard navigation using ARROW_RIGHT and ARROW_LEFT
82 public void testKeyboardLeftRight() {
83 testNextPreviousEvent(() -> KEYBOARD
.pressShortcut(Keystrokes
.RIGHT
),
84 () -> KEYBOARD
.pressShortcut(Keystrokes
.SHIFT
, Keystrokes
.RIGHT
),
85 () -> KEYBOARD
.pressShortcut(Keystrokes
.LEFT
),
86 () -> KEYBOARD
.pressShortcut(Keystrokes
.SHIFT
, Keystrokes
.LEFT
));
90 * Test tool bar buttons "Select Next Event" and "Select Previous Event"
93 public void testToolBarSelectNextPreviousEvent() {
94 testNextPreviousEvent(() -> fViewBot
.toolbarButton(SELECT_NEXT_EVENT
).click(),
95 () -> fViewBot
.toolbarButton(SELECT_NEXT_EVENT
).click(SWT
.SHIFT
),
96 () -> fViewBot
.toolbarButton(SELECT_PREVIOUS_EVENT
).click(),
97 () -> fViewBot
.toolbarButton(SELECT_PREVIOUS_EVENT
).click(SWT
.SHIFT
));
100 private void testNextPreviousEvent(Runnable selectNext
, Runnable shiftSelectNext
, Runnable selectPrevious
, Runnable shiftSelectPrevious
) {
101 /* change window range to 10 ms */
102 TmfTimeRange range
= new TmfTimeRange(START_TIME
, START_TIME
.normalize(10000000L, ITmfTimestamp
.NANOSECOND_SCALE
));
103 TmfSignalManager
.dispatchSignal(new TmfWindowRangeUpdatedSignal(this, range
));
104 fBot
.waitUntil(ConditionHelpers
.windowRange(range
));
106 /* set selection to trace start time */
107 TmfSignalManager
.dispatchSignal(new TmfSelectionRangeUpdatedSignal(this, START_TIME
));
108 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
110 /* select first item */
111 final SWTBotTree tree
= fViewBot
.bot().tree();
112 tree
.pressShortcut(Keystrokes
.HOME
);
114 /* set focus on time graph */
115 final TimeGraphControl timegraph
= fViewBot
.bot().widget(WidgetOfType
.widgetOfType(TimeGraphControl
.class));
116 UIThreadRunnable
.syncExec(new VoidResult() {
119 timegraph
.setFocus();
123 /* click "Select Next Event" 3 times */
125 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1
, TID1_TIME1
));
127 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME2
, TID1_TIME2
));
129 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
));
130 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
)));
131 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME3
));
133 /* shift-click "Select Next Event" 3 times */
134 shiftSelectNext
.run();
135 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME4
));
136 shiftSelectNext
.run();
137 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME5
));
138 shiftSelectNext
.run();
139 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME6
));
140 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME3
, TID1_TIME6
)));
141 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME6
));
143 /* shift-click "Select Previous Event" 4 times */
144 shiftSelectPrevious
.run();
145 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME5
));
146 shiftSelectPrevious
.run();
147 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME4
));
148 shiftSelectPrevious
.run();
149 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
));
150 shiftSelectPrevious
.run();
151 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME2
));
152 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME3
, TID1_TIME2
)));
153 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME2
));
155 /* click "Select Next Event" 2 times */
157 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
));
159 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME4
));
160 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME4
, TID1_TIME4
)));
161 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME4
));
163 /* shift-click "Select Previous Event" 3 times */
164 shiftSelectPrevious
.run();
165 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME3
));
166 shiftSelectPrevious
.run();
167 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME2
));
168 shiftSelectPrevious
.run();
169 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME1
));
170 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME4
, TID1_TIME1
)));
171 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME1
));
173 /* shift-click "Select Next Event" 4 times */
174 shiftSelectNext
.run();
175 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME2
));
176 shiftSelectNext
.run();
177 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME3
));
178 shiftSelectNext
.run();
179 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME4
));
180 shiftSelectNext
.run();
181 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME5
));
182 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID1_TIME4
, TID1_TIME5
)));
183 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME5
));
185 /* click "Select Previous Event" 5 times */
186 selectPrevious
.run();
187 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME4
, TID1_TIME4
));
188 selectPrevious
.run();
189 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3
, TID1_TIME3
));
190 selectPrevious
.run();
191 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME2
, TID1_TIME2
));
192 selectPrevious
.run();
193 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1
, TID1_TIME1
));
194 selectPrevious
.run();
195 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
196 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(START_TIME
, START_TIME
)));
197 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(START_TIME
));
201 * Test tool bar buttons "Follow CPU Forward" and "Follow CPU Backward"
204 public void testToolBarFollowCPUForwardBackward() {
205 /* change window range to 10 ms */
206 TmfTimeRange range
= new TmfTimeRange(START_TIME
, START_TIME
.normalize(10000000L, ITmfTimestamp
.NANOSECOND_SCALE
));
207 TmfSignalManager
.dispatchSignal(new TmfWindowRangeUpdatedSignal(this, range
));
208 fBot
.waitUntil(ConditionHelpers
.windowRange(range
));
210 /* set selection to trace start time */
211 TmfSignalManager
.dispatchSignal(new TmfSelectionRangeUpdatedSignal(this, START_TIME
));
212 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(START_TIME
, START_TIME
)));
214 /* select first item */
215 final SWTBotTree tree
= fViewBot
.bot().tree();
216 tree
.pressShortcut(Keystrokes
.HOME
);
218 /* set focus on time graph */
219 final TimeGraphControl timegraph
= fViewBot
.bot().widget(WidgetOfType
.widgetOfType(TimeGraphControl
.class));
220 UIThreadRunnable
.syncExec(new VoidResult() {
223 timegraph
.setFocus();
227 /* click "Follow CPU Forward" 3 times */
228 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
229 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
230 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1
, TID1_TIME1
));
231 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
232 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME1
, TID2_TIME1
));
233 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
234 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
));
235 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
)));
236 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "2"));
237 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME2
));
239 /* shift-click "Follow CPU Forward" 3 times */
240 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
241 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME3
));
242 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
243 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME4
));
244 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
245 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME4
));
246 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME2
, TID5_TIME1
)));
247 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "5"));
248 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID5_TIME1
));
250 /* shift-click "Follow CPU Backward" 4 times */
251 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
252 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME4
));
253 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
254 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME3
));
255 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
256 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
));
257 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
258 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME1
));
259 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME2
, TID2_TIME1
)));
260 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "2"));
261 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME1
));
263 /* click "Follow CPU Forward" 2 times */
264 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
265 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
));
266 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click();
267 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME3
));
268 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME3
, TID2_TIME3
)));
269 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "2"));
270 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME3
));
272 /* shift-click "Follow CPU Backward" 3 times */
273 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
274 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME2
));
275 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
276 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME1
));
277 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click(SWT
.SHIFT
);
278 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID1_TIME1
));
279 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME3
, TID1_TIME1
)));
280 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "1"));
281 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID1_TIME1
));
283 /* shift-click "Follow CPU Forward" 4 times */
284 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
285 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME1
));
286 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
287 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME2
));
288 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
289 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME3
));
290 fViewBot
.toolbarButton(FOLLOW_CPU_FORWARD
).click(SWT
.SHIFT
);
291 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME4
));
292 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(TID2_TIME3
, TID2_TIME4
)));
293 fBot
.waitUntil(ConditionHelpers
.treeSelectionContains(tree
, 1, "2"));
294 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(TID2_TIME4
));
296 /* click "Follow CPU Backward" 5 times */
297 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
298 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME3
, TID2_TIME3
));
299 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
300 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME2
, TID2_TIME2
));
301 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
302 timeGraphIsReadyCondition(new TmfTimeRange(TID2_TIME1
, TID2_TIME1
));
303 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
304 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1
, TID1_TIME1
));
305 fViewBot
.toolbarButton(FOLLOW_CPU_BACKWARD
).click();
306 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME
, START_TIME
));
307 fBot
.waitUntil(ConditionHelpers
.selectionRange(new TmfTimeRange(START_TIME
, START_TIME
)));
308 assertTrue(TmfTraceManager
.getInstance().getCurrentTraceContext().getWindowRange().contains(START_TIME
));
311 private void timeGraphIsReadyCondition(@NonNull TmfTimeRange selectionRange
) {
312 IWorkbenchPart part
= fViewBot
.getViewReference().getPart(false);
313 fBot
.waitUntil(ConditionHelpers
.timeGraphIsReadyCondition((AbstractTimeGraphView
) part
, selectionRange
, selectionRange
.getEndTime()));