tmf: Add SWTBot tests for manually refresh of traces
[deliverable/tracecompass.git] / lttng / org.eclipse.tracecompass.lttng2.ust.ui.swtbot.tests / src / org / eclipse / tracecompass / lttng2 / ust / ui / swtbot / tests / CallStackViewTest.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 * Matthew Khouzam - Initial API and implementation
11 *******************************************************************************/
12
13 package org.eclipse.tracecompass.lttng2.ust.ui.swtbot.tests;
14
15 import static org.junit.Assert.assertArrayEquals;
16 import static org.junit.Assert.assertEquals;
17 import static org.junit.Assert.assertNotNull;
18 import static org.junit.Assume.assumeTrue;
19
20 import java.io.File;
21 import java.util.ArrayList;
22 import java.util.List;
23
24 import org.apache.log4j.ConsoleAppender;
25 import org.apache.log4j.Logger;
26 import org.apache.log4j.SimpleLayout;
27 import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
28 import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
29 import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
30 import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
31 import org.eclipse.swtbot.swt.finder.widgets.SWTBotTable;
32 import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarButton;
33 import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
34 import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem;
35 import org.eclipse.tracecompass.tmf.core.signal.TmfSelectionRangeUpdatedSignal;
36 import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager;
37 import org.eclipse.tracecompass.tmf.core.timestamp.TmfNanoTimestamp;
38 import org.eclipse.tracecompass.tmf.ctf.core.tests.shared.CtfTmfTestTrace;
39 import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.ConditionHelpers;
40 import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.SWTBotUtils;
41 import org.eclipse.tracecompass.tmf.ui.views.callstack.CallStackView;
42 import org.junit.After;
43 import org.junit.Before;
44 import org.junit.BeforeClass;
45 import org.junit.Ignore;
46 import org.junit.Test;
47 import org.junit.runner.RunWith;
48
49 import com.google.common.collect.ImmutableList;
50
51 /**
52 * Test for the Call Stack view in trace compass
53 */
54 @RunWith(SWTBotJunit4ClassRunner.class)
55 public class CallStackViewTest {
56
57 private static final String UST_ID = "org.eclipse.linuxtools.lttng2.ust.tracetype";
58
59 private static final String PROJECT_NAME = "TestForCallstack";
60
61 /** The Log4j logger instance. */
62 private static final Logger fLogger = Logger.getRootLogger();
63 private static SWTWorkbenchBot fBot;
64
65 /**
66 * Timestamps of consecutive events in the trace
67 */
68 private static final long TIMESTAMPS[] = new long[] {
69 1378850463804898643l,
70 1378850463804899057l,
71 1378850463804900219l,
72 1378850463804900678l,
73 1378850463804901308l,
74 1378850463804901909l,
75 1378850463804902763l,
76 1378850463804903168l,
77 1378850463804903766l,
78 1378850463804904165l,
79 1378850463804904970l,
80 };
81
82 /**
83 * Stack frames of consecutive events in the trace
84 */
85 private static final String[] STACK_FRAMES[] = new String[][] {
86 {"40472b", "4045c8", "404412", "", ""},
87 {"40472b", "4045c8", "404412", "40392b", ""},
88 {"40472b", "4045c8", "404412", "", ""},
89 {"40472b", "4045c8", "", "", ""},
90 {"40472b", "4045c8", "404412", "", ""},
91 {"40472b", "4045c8", "404412", "40392b", ""},
92 {"40472b", "4045c8", "404412", "", ""},
93 {"40472b", "4045c8", "", "", ""},
94 {"40472b", "4045c8", "404412", "", ""},
95 {"40472b", "4045c8", "404412", "40392b", ""},
96 {"40472b", "4045c8", "404412", "", ""},
97 };
98
99 /** Tooltips of the toolbar buttons */
100
101 private static final String ALIGN_VIEWS = "Align Views";
102 private static final String IMPORT_BINARY = "Import a binary file containing debugging symbols";
103 private static final String IMPORT_TEXT = "Import a text file containing the mapping between addresses and function names";
104 // Separator
105 private static final String SORT_BY_NAME = "Sort threads by thread name";
106 private static final String SORT_BY_ID = "Sort threads by thread id";
107 private static final String SORT_BY_START = "Sort threads by start time";
108 // Separator
109 private static final String RESET_TIME_SCALE = "Reset the Time Scale to Default";
110 private static final String SELECT_PREVIOUS_EVENT = "Select Previous Event";
111 private static final String SELECT_NEXT_EVENT = "Select Next Event";
112 private static final String SELECT_PREVIOUS_ITEM = "Select Previous Item";
113 private static final String SELECT_NEXT_ITEM = "Select Next Item";
114 private static final String ZOOM_IN = "Zoom In";
115 private static final String ZOOM_OUT = "Zoom Out";
116 // Separator
117 private static final String PIN_VIEW = "Pin View";
118 private static final List<String> TOOLBAR_BUTTONS_TOOLTIPS = ImmutableList.of(
119 ALIGN_VIEWS, IMPORT_BINARY, IMPORT_TEXT,
120 "",
121 SORT_BY_NAME, SORT_BY_ID, SORT_BY_START,
122 "",
123 RESET_TIME_SCALE, SELECT_PREVIOUS_EVENT, SELECT_NEXT_EVENT,
124 SELECT_PREVIOUS_ITEM, SELECT_NEXT_ITEM, ZOOM_IN, ZOOM_OUT,
125 "",
126 PIN_VIEW);
127
128 /**
129 * Initialization
130 */
131 @BeforeClass
132 public static void init() {
133 SWTBotUtils.failIfUIThread();
134
135 Thread.currentThread().setName("SWTBot Thread"); // for the debugger
136 /* set up for swtbot */
137 SWTBotPreferences.TIMEOUT = 20000; /* 20 second timeout */
138 fLogger.addAppender(new ConsoleAppender(new SimpleLayout()));
139 fBot = new SWTWorkbenchBot();
140
141 SWTBotUtils.closeView("welcome", fBot);
142
143 SWTBotUtils.switchToTracingPerspective();
144 /* finish waiting for eclipse to load */
145 SWTBotUtils.waitForJobs();
146 }
147
148 /**
149 * Open a trace in an editor
150 */
151 @Before
152 public void beforeTest() {
153 SWTBotUtils.createProject(PROJECT_NAME);
154 SWTBotTreeItem treeItem = SWTBotUtils.selectTracesFolder(fBot, PROJECT_NAME);
155 assertNotNull(treeItem);
156 final CtfTmfTestTrace cygProfile = CtfTmfTestTrace.CYG_PROFILE;
157 assumeTrue(cygProfile.exists());
158 final File file = new File(cygProfile.getTrace().getPath());
159 SWTBotUtils.openTrace(PROJECT_NAME, file.getAbsolutePath(), UST_ID);
160 SWTBotUtils.openView(CallStackView.ID);
161 SWTBotUtils.waitForJobs();
162 }
163
164 /**
165 * Close the editor
166 */
167 @After
168 public void tearDown() {
169 fBot.closeAllEditors();
170 SWTBotUtils.deleteProject(PROJECT_NAME, fBot);
171 }
172
173 /**
174 * Test if callstack is populated
175 */
176 @Test
177 public void testOpenCallstack() {
178 String node = "glxgears-cyg-profile";
179 String childName = "glxgears-16073";
180 List<String> expected = ImmutableList.of("40472b", "", "", "", "");
181
182 SWTBotView viewBot = fBot.viewById(CallStackView.ID);
183 viewBot.setFocus();
184 final SWTBotView viewBot1 = viewBot;
185 SWTBotTree tree = viewBot1.bot().tree();
186 SWTBotTreeItem treeItem = tree.getTreeItem(node);
187 assertEquals(childName, treeItem.getNodes().get(0));
188 List<String> names = treeItem.getNode(childName).getNodes();
189 assertEquals(expected, names);
190 }
191
192 /**
193 * Test check callstack at a time
194 */
195 @Test
196 public void testGoToTimeAndCheckStack() {
197 goToTime(TIMESTAMPS[0]);
198
199 final SWTBotView viewBot = fBot.viewById(CallStackView.ID);
200 viewBot.setFocus();
201 SWTBotUtils.waitForJobs();
202 List<String> names = getVisibleStackFrames(viewBot);
203 assertArrayEquals(STACK_FRAMES[0], names.toArray());
204 }
205
206 /**
207 * Test check callstack at a time after navigating
208 */
209 @Test
210 public void testGoToTimeGoBackAndForthAndCheckStack() {
211 int currentEventOffset = 0;
212 goToTime(TIMESTAMPS[currentEventOffset]);
213
214 final SWTBotView viewBot = fBot.viewById(CallStackView.ID);
215 // forward 10 times
216 for (int i = 0; i < 10; i++) {
217 viewBot.toolbarPushButton(SELECT_NEXT_EVENT).click();
218 currentEventOffset++;
219 fBot.waitUntil(ConditionHelpers.selectionInEventsTable(fBot, TIMESTAMPS[currentEventOffset]));
220 SWTBotUtils.waitForJobs();
221 assertArrayEquals(STACK_FRAMES[currentEventOffset], getVisibleStackFrames(viewBot).toArray());
222
223 }
224 // back twice
225 for (int i = 0; i < 2; i++) {
226 viewBot.toolbarPushButton(SELECT_PREVIOUS_EVENT).click();
227 currentEventOffset--;
228 fBot.waitUntil(ConditionHelpers.selectionInEventsTable(fBot, TIMESTAMPS[currentEventOffset]));
229 SWTBotUtils.waitForJobs();
230 assertArrayEquals(STACK_FRAMES[currentEventOffset], getVisibleStackFrames(viewBot).toArray());
231 }
232 // move up and down once to make sure it doesn't explode
233 viewBot.toolbarPushButton(SELECT_PREVIOUS_ITEM).click();
234 SWTBotUtils.waitForJobs();
235 viewBot.toolbarPushButton(SELECT_NEXT_ITEM).click();
236 SWTBotUtils.waitForJobs();
237
238 // Zoom in and out too
239 viewBot.toolbarPushButton(ZOOM_IN).click();
240 SWTBotUtils.waitForJobs();
241 viewBot.toolbarPushButton(ZOOM_OUT).click();
242 SWTBotUtils.waitForJobs();
243 }
244
245 /**
246 * Test check callstack at a time with sorting, the trace is not sortable,
247 * this is a smoke test
248 */
249 @Test
250 public void testGoToTimeSortAndCheckStack() {
251 goToTime(TIMESTAMPS[0]);
252 final SWTBotView viewBot = fBot.viewById(CallStackView.ID);
253 viewBot.setFocus();
254 viewBot.toolbarToggleButton(SORT_BY_NAME).click();
255 viewBot.toolbarToggleButton(SORT_BY_ID).click();
256 viewBot.toolbarToggleButton(SORT_BY_START).click();
257 viewBot.setFocus();
258 SWTBotUtils.waitForJobs();
259 List<String> names = getVisibleStackFrames(viewBot);
260 assertArrayEquals(STACK_FRAMES[0], names.toArray());
261 }
262
263 private static List<String> getVisibleStackFrames(final SWTBotView viewBot) {
264 SWTBotTree tree = viewBot.bot().tree();
265 List<String> names = new ArrayList<>();
266 for (SWTBotTreeItem swtBotTreeItem : tree.getAllItems()) {
267 for (SWTBotTreeItem items : swtBotTreeItem.getItems()) {
268 for (SWTBotTreeItem item : items.getItems()) {
269 names.add(item.cell(0));
270 }
271 }
272 }
273 return names;
274 }
275
276 private static void goToTime(long timestamp) {
277 SWTBotTable table = fBot.activeEditor().bot().table();
278 table.setFocus();
279 TmfSignalManager.dispatchSignal(new TmfSelectionRangeUpdatedSignal(table.widget, new TmfNanoTimestamp(timestamp)));
280 fBot.waitUntil(ConditionHelpers.selectionInEventsTable(fBot, timestamp));
281 }
282
283 /**
284 * Test check callstack at a time with function map
285 */
286 @Ignore
287 @Test
288 public void testGoToTimeAndCheckStackWithNames() {
289 goToTime(TIMESTAMPS[0]);
290 final SWTBotView viewBot = fBot.viewById(CallStackView.ID);
291 viewBot.setFocus();
292 // no way to load mappings yet! :(
293 SWTBotTree tree = viewBot.bot().tree();
294 SWTBotUtils.waitForJobs();
295 List<String> names = new ArrayList<>();
296 for (SWTBotTreeItem swtBotTreeItem : tree.getAllItems()) {
297 for (SWTBotTreeItem items : swtBotTreeItem.getItems()) {
298 for (SWTBotTreeItem item : items.getItems()) {
299 names.add(item.cell(0));
300 }
301 }
302 }
303 }
304
305 /**
306 * Test check callstack toolbar buttons
307 */
308 @Test
309 public void testCallstackNavigation() {
310 SWTBotView viewBot = fBot.viewById(CallStackView.ID);
311 viewBot.setFocus();
312 List<String> buttons = new ArrayList<>();
313 for (SWTBotToolbarButton swtBotToolbarButton : viewBot.getToolbarButtons()) {
314 buttons.add(swtBotToolbarButton.getToolTipText());
315 }
316 assertEquals(TOOLBAR_BUTTONS_TOOLTIPS, buttons);
317 }
318 }
This page took 0.038219 seconds and 5 git commands to generate.