99415916fecc0a5cca14063efd761827bbb433df
[deliverable/tracecompass.git] / lttng / org.eclipse.tracecompass.lttng2.kernel.ui.swtbot.tests / src / org / eclipse / tracecompass / lttng2 / kernel / ui / swtbot / tests / ControlFlowViewTest.java
1 /*******************************************************************************
2 * Copyright (c) 2015 Ericsson
3 *
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
8 *
9 * Contributors:
10 * Patrick Tasse - Initial API and implementation
11 *******************************************************************************/
12
13 package org.eclipse.tracecompass.lttng2.kernel.ui.swtbot.tests;
14
15 import static org.junit.Assert.assertTrue;
16
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;
40
41 /**
42 * SWTBot tests for Control Flow view
43 *
44 * @author Patrick Tasse
45 */
46 public class ControlFlowViewTest extends KernelTest {
47
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);
65
66 private SWTBotView fViewBot;
67
68 /**
69 * Before Test
70 */
71 @Override
72 @Before
73 public void before() {
74 super.before();
75 fViewBot = fBot.viewByTitle("Control Flow");
76 }
77
78 /**
79 * Test keyboard navigation using ARROW_RIGHT and ARROW_LEFT
80 */
81 @Test
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));
87 }
88
89 /**
90 * Test tool bar buttons "Select Next Event" and "Select Previous Event"
91 */
92 @Test
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));
98 }
99
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));
105
106 /* set selection to trace start time */
107 TmfSignalManager.dispatchSignal(new TmfSelectionRangeUpdatedSignal(this, START_TIME));
108 timeGraphIsReadyCondition(new TmfTimeRange(START_TIME, START_TIME));
109
110 /* select first item */
111 final SWTBotTree tree = fViewBot.bot().tree();
112 tree.pressShortcut(Keystrokes.HOME);
113
114 /* set focus on time graph */
115 final TimeGraphControl timegraph = fViewBot.bot().widget(WidgetOfType.widgetOfType(TimeGraphControl.class));
116 UIThreadRunnable.syncExec(new VoidResult() {
117 @Override
118 public void run() {
119 timegraph.setFocus();
120 }
121 });
122
123 /* click "Select Next Event" 3 times */
124 selectNext.run();
125 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME1, TID1_TIME1));
126 selectNext.run();
127 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME2, TID1_TIME2));
128 selectNext.run();
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));
132
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));
142
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));
154
155 /* click "Select Next Event" 2 times */
156 selectNext.run();
157 timeGraphIsReadyCondition(new TmfTimeRange(TID1_TIME3, TID1_TIME3));
158 selectNext.run();
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));
162
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));
172
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));
184
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));
198 }
199
200 /**
201 * Test tool bar buttons "Follow CPU Forward" and "Follow CPU Backward"
202 */
203 @Test
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));
209
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)));
213
214 /* select first item */
215 final SWTBotTree tree = fViewBot.bot().tree();
216 tree.pressShortcut(Keystrokes.HOME);
217
218 /* set focus on time graph */
219 final TimeGraphControl timegraph = fViewBot.bot().widget(WidgetOfType.widgetOfType(TimeGraphControl.class));
220 UIThreadRunnable.syncExec(new VoidResult() {
221 @Override
222 public void run() {
223 timegraph.setFocus();
224 }
225 });
226
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));
238
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));
249
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));
262
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));
271
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));
282
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));
295
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));
309 }
310
311 private void timeGraphIsReadyCondition(@NonNull TmfTimeRange selectionRange) {
312 IWorkbenchPart part = fViewBot.getViewReference().getPart(false);
313 fBot.waitUntil(ConditionHelpers.timeGraphIsReadyCondition((AbstractTimeGraphView) part, selectionRange, selectionRange.getEndTime()));
314 }
315 }
This page took 0.069571 seconds and 5 git commands to generate.