blob: 1d291ef6ad1c43eb7a5a723f3e86ab57ec98329a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014, 2015 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Matthew Khouzam - Initial API and implementation
*******************************************************************************/
package org.eclipse.tracecompass.tmf.pcap.ui.swtbot.tests;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import static org.junit.Assume.assumeTrue;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.SimpleLayout;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
import org.eclipse.swtbot.swt.finder.results.VoidResult;
import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
import org.eclipse.tracecompass.internal.tmf.pcap.core.trace.PcapTrace;
import org.eclipse.tracecompass.internal.tmf.pcap.ui.NetworkingPerspectiveFactory;
import org.eclipse.tracecompass.internal.tmf.pcap.ui.stream.StreamListView;
import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
import org.eclipse.tracecompass.tmf.core.signal.TmfSelectionRangeUpdatedSignal;
import org.eclipse.tracecompass.tmf.core.trace.ITmfContext;
import org.eclipse.tracecompass.tmf.pcap.core.tests.shared.PcapTmfTestTrace;
import org.eclipse.tracecompass.tmf.ui.editors.TmfEventsEditor;
import org.eclipse.tracecompass.tmf.ui.project.model.TmfOpenTraceHelper;
import org.eclipse.tracecompass.tmf.ui.project.model.TmfProjectRegistry;
import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceFolder;
import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.SWTBotUtils;
import org.eclipse.tracecompass.tmf.ui.tests.shared.WaitUtils;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.PlatformUI;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* SWTBot Smoke test for Pcap UI.
*
* @author Matthew Khouzam
*/
@RunWith(SWTBotJunit4ClassRunner.class)
public class ImportAndReadPcapTest {
private static final String NETWORK_PERSPECTIVE_ID = NetworkingPerspectiveFactory.ID;
private static final String TRACE_PROJECT_NAME = "test";
private static SWTWorkbenchBot fBot;
private ITmfEvent fDesired1;
private static PcapTmfTestTrace pttt = PcapTmfTestTrace.BENCHMARK_TRACE;
/** The Log4j logger instance. */
private static final Logger fLogger = Logger.getRootLogger();
/**
* Test Class setup
*/
@BeforeClass
public static void init() {
SWTBotUtils.initialize();
/* set up for swtbot */
SWTBotPreferences.TIMEOUT = 300000; /* 300 second timeout */
fLogger.removeAllAppenders();
fLogger.addAppender(new ConsoleAppender(new SimpleLayout(), ConsoleAppender.SYSTEM_OUT));
fBot = new SWTWorkbenchBot();
SWTBotUtils.closeView("welcome", fBot);
/* Switch perspectives */
SWTBotUtils.switchToPerspective(NETWORK_PERSPECTIVE_ID);
/* Finish waiting for eclipse to load */
WaitUtils.waitForJobs();
}
/**
* Test Class teardown
*/
@AfterClass
public static void terminate() {
fLogger.removeAllAppenders();
}
/**
* Main test case
*/
@Test
public void test() {
assumeTrue(pttt.exists());
SWTBotUtils.createProject(TRACE_PROJECT_NAME);
openTrace();
openEditor();
testHV(getViewPart("Histogram"));
testStreamView(getViewPartRef("Stream List"));
fBot.closeAllEditors();
SWTBotUtils.deleteProject(TRACE_PROJECT_NAME, fBot);
}
private void testStreamView(IViewReference viewPart) {
SWTBotView botView = new SWTBotView(viewPart, fBot);
StreamListView slv = (StreamListView) getViewPart("Stream List");
botView.setFocus();
SWTBotTree botTree = fBot.tree();
assertNotNull(botTree);
final TmfSelectionRangeUpdatedSignal signal = new TmfSelectionRangeUpdatedSignal(slv, fDesired1.getTimestamp());
slv.broadcast(signal);
WaitUtils.waitForJobs();
// FIXME This is a race condition:
// TmfEventsTable launches an async exec that may be run after the wait
// for jobs. This last delay catches it.
SWTBotUtils.delay(1000);
}
private static void openTrace() {
final Exception exception[] = new Exception[1];
exception[0] = null;
UIThreadRunnable.syncExec(new VoidResult() {
@Override
public void run() {
try {
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(TRACE_PROJECT_NAME);
TmfTraceFolder destinationFolder = TmfProjectRegistry.getProject(project, true).getTracesFolder();
String absolutePath = (new File(pttt.getTrace().getPath())).getAbsolutePath();
TmfOpenTraceHelper.openTraceFromPath(destinationFolder, absolutePath, PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "org.eclipse.linuxtools.tmf.pcap.core.pcaptrace");
} catch (CoreException e) {
exception[0] = e;
}
}
});
if (exception[0] != null) {
fail(exception[0].getMessage());
}
SWTBotUtils.delay(1000);
WaitUtils.waitForJobs();
}
private void openEditor() {
final List<IEditorReference> editorRefs = new ArrayList<>();
UIThreadRunnable.syncExec(new VoidResult() {
@Override
public void run() {
IEditorReference[] ieds = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getEditorReferences();
editorRefs.addAll(Arrays.asList(ieds));
}
});
assertFalse(editorRefs.isEmpty());
IEditorPart iep = null;
for (IEditorReference ied : editorRefs) {
if (ied.getTitle().equals(pttt.getTrace().getName())) {
iep = ied.getEditor(true);
break;
}
}
assertNotNull(iep);
fDesired1 = getEvent(100);
final TmfEventsEditor tmfEd = (TmfEventsEditor) iep;
UIThreadRunnable.syncExec(new VoidResult() {
@Override
public void run() {
tmfEd.setFocus();
tmfEd.selectionChanged(new SelectionChangedEvent(tmfEd, new StructuredSelection(fDesired1)));
}
});
WaitUtils.waitForJobs();
SWTBotUtils.delay(1000);
assertNotNull(tmfEd);
}
private static void testHV(IViewPart vp) {
assertNotNull(vp);
}
private static ITmfEvent getEvent(int rank) {
PcapTrace trace = pttt.getTrace();
ITmfContext ctx = trace.seekEvent(0);
for (int i = 0; i < rank; i++) {
trace.getNext(ctx);
}
ITmfEvent ret = trace.getNext(ctx);
trace.dispose();
return ret;
}
private static IViewPart getViewPart(final String viewTile) {
final IViewPart[] vps = new IViewPart[1];
UIThreadRunnable.syncExec(new VoidResult() {
@Override
public void run() {
IViewReference[] viewRefs = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getViewReferences();
for (IViewReference viewRef : viewRefs) {
IViewPart vp = viewRef.getView(true);
if (vp.getTitle().equals(viewTile)) {
vps[0] = vp;
return;
}
}
}
});
return vps[0];
}
private static IViewReference getViewPartRef(final String viewTile) {
final IViewReference[] vrs = new IViewReference[1];
UIThreadRunnable.syncExec(new VoidResult() {
@Override
public void run() {
IViewReference[] viewRefs = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getViewReferences();
for (IViewReference viewRef : viewRefs) {
IViewPart vp = viewRef.getView(true);
if (vp.getTitle().equals(viewTile)) {
vrs[0] = viewRef;
return;
}
}
}
});
return vrs[0];
}
}