1 /*******************************************************************************
2 * Copyright (c) 2014, 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 * Matthew Khouzam - Initial API and implementation
11 *******************************************************************************/
13 package org
.eclipse
.tracecompass
.tmf
.pcap
.ui
.swtbot
.tests
;
15 import static org
.junit
.Assert
.assertFalse
;
16 import static org
.junit
.Assert
.assertNotNull
;
17 import static org
.junit
.Assert
.fail
;
18 import static org
.junit
.Assume
.assumeTrue
;
21 import java
.util
.ArrayList
;
22 import java
.util
.Arrays
;
23 import java
.util
.List
;
25 import org
.apache
.log4j
.ConsoleAppender
;
26 import org
.apache
.log4j
.Logger
;
27 import org
.apache
.log4j
.SimpleLayout
;
28 import org
.eclipse
.core
.resources
.IProject
;
29 import org
.eclipse
.core
.resources
.ResourcesPlugin
;
30 import org
.eclipse
.core
.runtime
.CoreException
;
31 import org
.eclipse
.jface
.viewers
.SelectionChangedEvent
;
32 import org
.eclipse
.jface
.viewers
.StructuredSelection
;
33 import org
.eclipse
.swtbot
.eclipse
.finder
.SWTWorkbenchBot
;
34 import org
.eclipse
.swtbot
.eclipse
.finder
.widgets
.SWTBotView
;
35 import org
.eclipse
.swtbot
.swt
.finder
.finders
.UIThreadRunnable
;
36 import org
.eclipse
.swtbot
.swt
.finder
.junit
.SWTBotJunit4ClassRunner
;
37 import org
.eclipse
.swtbot
.swt
.finder
.results
.BoolResult
;
38 import org
.eclipse
.swtbot
.swt
.finder
.results
.VoidResult
;
39 import org
.eclipse
.swtbot
.swt
.finder
.utils
.SWTBotPreferences
;
40 import org
.eclipse
.swtbot
.swt
.finder
.widgets
.SWTBotTree
;
41 import org
.eclipse
.tracecompass
.internal
.tmf
.pcap
.core
.trace
.PcapTrace
;
42 import org
.eclipse
.tracecompass
.internal
.tmf
.pcap
.ui
.NetworkingPerspectiveFactory
;
43 import org
.eclipse
.tracecompass
.internal
.tmf
.pcap
.ui
.stream
.StreamListView
;
44 import org
.eclipse
.tracecompass
.tmf
.core
.event
.ITmfEvent
;
45 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfSelectionRangeUpdatedSignal
;
46 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.ITmfContext
;
47 import org
.eclipse
.tracecompass
.tmf
.pcap
.core
.tests
.shared
.PcapTmfTestTrace
;
48 import org
.eclipse
.tracecompass
.tmf
.ui
.editors
.TmfEventsEditor
;
49 import org
.eclipse
.tracecompass
.tmf
.ui
.project
.model
.TmfOpenTraceHelper
;
50 import org
.eclipse
.tracecompass
.tmf
.ui
.project
.model
.TmfProjectRegistry
;
51 import org
.eclipse
.tracecompass
.tmf
.ui
.project
.model
.TmfTraceFolder
;
52 import org
.eclipse
.tracecompass
.tmf
.ui
.swtbot
.tests
.shared
.ConditionHelpers
;
53 import org
.eclipse
.tracecompass
.tmf
.ui
.swtbot
.tests
.shared
.SWTBotUtils
;
54 import org
.eclipse
.tracecompass
.tmf
.ui
.tests
.shared
.WaitUtils
;
55 import org
.eclipse
.ui
.IEditorPart
;
56 import org
.eclipse
.ui
.IEditorReference
;
57 import org
.eclipse
.ui
.IViewPart
;
58 import org
.eclipse
.ui
.IViewReference
;
59 import org
.eclipse
.ui
.PlatformUI
;
60 import org
.eclipse
.ui
.WorkbenchException
;
61 import org
.junit
.AfterClass
;
62 import org
.junit
.BeforeClass
;
63 import org
.junit
.Test
;
64 import org
.junit
.runner
.RunWith
;
67 * SWTBot Smoke test for Pcap UI.
69 * @author Matthew Khouzam
71 @RunWith(SWTBotJunit4ClassRunner
.class)
72 public class ImportAndReadPcapTest
{
74 private static final String NETWORK_PERSPECTIVE_ID
= NetworkingPerspectiveFactory
.ID
;
75 private static final String TRACE_PROJECT_NAME
= "test";
77 private static SWTWorkbenchBot fBot
;
78 private ITmfEvent fDesired1
;
79 private static PcapTmfTestTrace pttt
= PcapTmfTestTrace
.BENCHMARK_TRACE
;
81 /** The Log4j logger instance. */
82 private static final Logger fLogger
= Logger
.getRootLogger();
88 public static void init() {
90 SWTBotUtils
.initialize();
92 /* set up for swtbot */
93 SWTBotPreferences
.TIMEOUT
= 300000; /* 300 second timeout */
94 fLogger
.removeAllAppenders();
95 fLogger
.addAppender(new ConsoleAppender(new SimpleLayout(), ConsoleAppender
.SYSTEM_OUT
));
96 fBot
= new SWTWorkbenchBot();
98 final List
<SWTBotView
> openViews
= fBot
.views();
99 for (SWTBotView view
: openViews
) {
100 if (view
.getTitle().equals("Welcome")) {
102 fBot
.waitUntil(ConditionHelpers
.ViewIsClosed(view
));
105 /* Switch perspectives */
106 switchNetworkPerspective();
107 /* Finish waiting for eclipse to load */
108 WaitUtils
.waitForJobs();
112 * Test Class teardown
115 public static void terminate() {
116 fLogger
.removeAllAppenders();
119 private static void switchNetworkPerspective() {
120 final Exception retE
[] = new Exception
[1];
121 if (!UIThreadRunnable
.syncExec(new BoolResult() {
123 public Boolean
run() {
125 PlatformUI
.getWorkbench().showPerspective(NETWORK_PERSPECTIVE_ID
,
126 PlatformUI
.getWorkbench().getActiveWorkbenchWindow());
127 } catch (WorkbenchException e
) {
134 fail(retE
[0].getMessage());
144 assumeTrue(pttt
.exists());
145 SWTBotUtils
.createProject(TRACE_PROJECT_NAME
);
148 testHV(getViewPart("Histogram"));
149 testStreamView(getViewPartRef("Stream List"));
150 fBot
.closeAllEditors();
151 SWTBotUtils
.deleteProject(TRACE_PROJECT_NAME
, fBot
);
154 private void testStreamView(IViewReference viewPart
) {
155 SWTBotView botView
= new SWTBotView(viewPart
, fBot
);
156 StreamListView slv
= (StreamListView
) getViewPart("Stream List");
158 SWTBotTree botTree
= fBot
.tree();
159 assertNotNull(botTree
);
160 final TmfSelectionRangeUpdatedSignal signal
= new TmfSelectionRangeUpdatedSignal(slv
, fDesired1
.getTimestamp());
161 slv
.broadcast(signal
);
162 WaitUtils
.waitForJobs();
163 // FIXME This is a race condition:
164 // TmfEventsTable launches an async exec that may be run after the wait
165 // for jobs. This last delay catches it.
166 SWTBotUtils
.delay(1000);
170 private static void openTrace() {
171 final Exception exception
[] = new Exception
[1];
173 UIThreadRunnable
.syncExec(new VoidResult() {
177 IProject project
= ResourcesPlugin
.getWorkspace().getRoot().getProject(TRACE_PROJECT_NAME
);
178 TmfTraceFolder destinationFolder
= TmfProjectRegistry
.getProject(project
, true).getTracesFolder();
179 String absolutePath
= (new File(pttt
.getTrace().getPath())).getAbsolutePath();
180 TmfOpenTraceHelper
.openTraceFromPath(destinationFolder
, absolutePath
, PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getShell(), "org.eclipse.linuxtools.tmf.pcap.core.pcaptrace");
181 } catch (CoreException e
) {
186 if (exception
[0] != null) {
187 fail(exception
[0].getMessage());
190 SWTBotUtils
.delay(1000);
191 WaitUtils
.waitForJobs();
194 private void openEditor() {
195 final List
<IEditorReference
> editorRefs
= new ArrayList
<>();
196 UIThreadRunnable
.syncExec(new VoidResult() {
199 IEditorReference
[] ieds
= PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getActivePage().getEditorReferences();
200 editorRefs
.addAll(Arrays
.asList(ieds
));
204 assertFalse(editorRefs
.isEmpty());
205 IEditorPart iep
= null;
206 for (IEditorReference ied
: editorRefs
) {
207 if (ied
.getTitle().equals(pttt
.getTrace().getName())) {
208 iep
= ied
.getEditor(true);
213 fDesired1
= getEvent(100);
214 final TmfEventsEditor tmfEd
= (TmfEventsEditor
) iep
;
215 UIThreadRunnable
.syncExec(new VoidResult() {
219 tmfEd
.selectionChanged(new SelectionChangedEvent(tmfEd
, new StructuredSelection(fDesired1
)));
223 WaitUtils
.waitForJobs();
224 SWTBotUtils
.delay(1000);
225 assertNotNull(tmfEd
);
228 private static void testHV(IViewPart vp
) {
232 private static ITmfEvent
getEvent(int rank
) {
233 PcapTrace trace
= pttt
.getTrace();
234 ITmfContext ctx
= trace
.seekEvent(0);
235 for (int i
= 0; i
< rank
; i
++) {
238 ITmfEvent ret
= trace
.getNext(ctx
);
243 private static IViewPart
getViewPart(final String viewTile
) {
244 final IViewPart
[] vps
= new IViewPart
[1];
245 UIThreadRunnable
.syncExec(new VoidResult() {
248 IViewReference
[] viewRefs
= PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getActivePage().getViewReferences();
249 for (IViewReference viewRef
: viewRefs
) {
250 IViewPart vp
= viewRef
.getView(true);
251 if (vp
.getTitle().equals(viewTile
)) {
262 private static IViewReference
getViewPartRef(final String viewTile
) {
263 final IViewReference
[] vrs
= new IViewReference
[1];
264 UIThreadRunnable
.syncExec(new VoidResult() {
267 IViewReference
[] viewRefs
= PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getActivePage().getViewReferences();
268 for (IViewReference viewRef
: viewRefs
) {
269 IViewPart vp
= viewRef
.getView(true);
270 if (vp
.getTitle().equals(viewTile
)) {