blob: c7e3057d9cc77fba99a23d51b3a1c9def91ad2ff [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014, 2018 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:
* Bernd Hufmann - Initial API and implementation
* (Extracted from ImportAndReadSmokeTest.java)
*******************************************************************************/
package org.eclipse.tracecompass.tmf.ctf.ui.swtbot.tests;
import static org.junit.Assert.assertNotNull;
import java.util.List;
import org.apache.log4j.Logger;
import org.apache.log4j.varia.NullAppender;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.Wizard;
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.waits.Conditions;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotButton;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotText;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarButton;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem;
import org.eclipse.tracecompass.internal.tmf.ui.project.wizards.importtrace.ImportConfirmation;
import org.eclipse.tracecompass.internal.tmf.ui.views.statistics.TmfStatisticsViewImpl;
import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace;
import org.eclipse.tracecompass.tmf.core.signal.TmfSelectionRangeUpdatedSignal;
import org.eclipse.tracecompass.tmf.core.trace.ITmfContext;
import org.eclipse.tracecompass.tmf.ctf.core.event.CtfTmfEvent;
import org.eclipse.tracecompass.tmf.ctf.core.tests.shared.CtfTmfTestTraceUtils;
import org.eclipse.tracecompass.tmf.ctf.core.trace.CtfTmfTrace;
import org.eclipse.tracecompass.tmf.ui.editors.TmfEventsEditor;
import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.ConditionHelpers;
import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.SWTBotUtils;
import org.eclipse.tracecompass.tmf.ui.tests.shared.WaitUtils;
import org.eclipse.tracecompass.tmf.ui.views.histogram.HistogramView;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.views.properties.PropertySheet;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
/**
* Abstract SWTBot Smoke test class.
*
* @author Matthew Khouzam
* @author Bernd Hufmann
*/
@RunWith(SWTBotJunit4ClassRunner.class)
public abstract class AbstractImportAndReadSmokeTest {
/** Trace name */
protected static final String TRACE_NAME = "scp_dest";
/** Trace folder */
protected static final String TRACE_FOLDER = "synctraces";
/** Trace type name for generic CTF traces */
protected static final String TRACE_TYPE_NAME = "Generic CTF Trace";
/** A Generic CTF Trace */
protected static final @NonNull CtfTmfTrace fTrace = CtfTmfTestTraceUtils.getTrace(CtfTestTrace.SYNC_DEST);
/** SWT BOT workbench reference */
protected static SWTWorkbenchBot fBot;
/** Wizard to use */
protected static Wizard fWizard;
/** The Log4j logger instance. */
protected static final Logger fLogger = Logger.getRootLogger();
/** Timeout to wait for import operation */
protected static final long IMPORT_TIME_OUT = 180000L;
/** Test Class setup */
@BeforeClass
public static void init() {
SWTBotUtils.initialize();
/* set up for swtbot */
SWTBotPreferences.TIMEOUT = 50000; /* 50 second timeout */
fLogger.removeAllAppenders();
fLogger.addAppender(new NullAppender());
fBot = new SWTWorkbenchBot();
SWTBotUtils.switchToTracingPerspective();
/* finish waiting for eclipse to load */
WaitUtils.waitForJobs();
}
/**
* Test Class teardown
*/
@AfterClass
public static void terminate() {
CtfTmfTestTraceUtils.dispose(CtfTestTrace.SYNC_DEST);
fLogger.removeAllAppenders();
}
/**
* Creates a tracing projects
*
* @param traceProjectName
* the name of the test project
*/
protected static void createProject(String traceProjectName) {
SWTBotUtils.focusMainWindow(fBot.shells());
fBot.menu("File").menu("New").menu("Project...").click();
fBot.shell("New Project").activate();
SWTBotTree tree = fBot.tree();
assertNotNull(tree);
final String tracingKey = "Tracing";
fBot.waitUntil(ConditionHelpers.isTreeNodeAvailable(tracingKey, tree));
final SWTBotTreeItem tracingNode = tree.expandNode(tracingKey);
tracingNode.select();
final String projectKey = "Tracing Project";
fBot.waitUntil(ConditionHelpers.isTreeChildNodeAvailable(projectKey, tracingNode));
final SWTBotTreeItem tracingProject = tracingNode.getNode(projectKey);
assertNotNull(tracingProject);
tracingProject.select();
tracingProject.click();
SWTBotButton nextButton = fBot.button("Next >");
fBot.waitUntil(Conditions.widgetIsEnabled(nextButton));
nextButton.click();
fBot.shell("Tracing Project").activate();
final SWTBotText text = fBot.text();
text.setText(traceProjectName);
fBot.button("Finish").click();
WaitUtils.waitForJobs();
}
/**
* Finishes the wizard
*/
protected void importFinish() {
importFinish(ImportConfirmation.CONTINUE);
}
/**
* Finishes the wizard
*
* @param confirmationMode
* a confirmation value
* Note: Only {@link ImportConfirmation#RENAME_ALL},
* {@link ImportConfirmation#OVERWRITE_ALL},
* {@link ImportConfirmation#CONTINUE} are supported
*/
protected void importFinish(ImportConfirmation confirmationMode) {
SWTBotShell shell = fBot.activeShell();
final SWTBotButton finishButton = fBot.button("Finish");
finishButton.click();
if (confirmationMode == ImportConfirmation.RENAME_ALL) {
SWTBotShell shell2 = fBot.shell("Confirmation").activate();
SWTBotButton button = shell2.bot().button("Rename All");
button.click();
} else if (confirmationMode == ImportConfirmation.OVERWRITE_ALL) {
SWTBotShell shell2 = fBot.shell("Confirmation").activate();
SWTBotButton button = shell2.bot().button("Overwrite All");
button.click();
}
fBot.waitUntil(Conditions.shellCloses(shell), IMPORT_TIME_OUT);
WaitUtils.waitForJobs();
}
// ---------------------------------------------
// Helpers for testing views
// ---------------------------------------------
/**
* Verifies the properties view for a given view part
*
* @param vp
* a view part
*/
protected void testPropertyView(IViewPart vp) {
PropertySheet pv = (PropertySheet) vp;
assertNotNull(pv);
}
/**
* Verifies the Histogram View
*
* @param vp
* the view part
* @param tmfEd
* the events editor
*/
protected void testHistogramView(IViewPart vp, final TmfEventsEditor tmfEd) {
final CtfTmfEvent desiredEvent1 = getEvent(100);
UIThreadRunnable.syncExec(new VoidResult() {
@Override
public void run() {
tmfEd.setFocus();
tmfEd.selectionChanged(new SelectionChangedEvent(tmfEd, new StructuredSelection(desiredEvent1)));
}
});
WaitUtils.waitForJobs();
SWTBotUtils.delay(1000);
final CtfTmfEvent desiredEvent2 = getEvent(10000);
SWTBotView hvBot = fBot.viewById(HistogramView.ID);
List<SWTBotToolbarButton> hvTools = hvBot.getToolbarButtons();
for (SWTBotToolbarButton hvTool : hvTools) {
if (hvTool.getToolTipText().toLowerCase().contains("lost")) {
hvTool.click();
}
}
HistogramView hv = (HistogramView) vp;
final TmfSelectionRangeUpdatedSignal signal = new TmfSelectionRangeUpdatedSignal(hv, desiredEvent1.getTimestamp());
final TmfSelectionRangeUpdatedSignal signal2 = new TmfSelectionRangeUpdatedSignal(hv, desiredEvent2.getTimestamp());
hv.updateTimeRange(100000);
WaitUtils.waitForJobs();
hv.selectionRangeUpdated(signal);
hv.broadcast(signal);
WaitUtils.waitForJobs();
SWTBotUtils.delay(1000);
hv.updateTimeRange(1000000000);
WaitUtils.waitForJobs();
hv.selectionRangeUpdated(signal2);
hv.broadcast(signal2);
WaitUtils.waitForJobs();
SWTBotUtils.delay(1000);
assertNotNull(hv);
}
/**
* Verifies the statistics view
*
* @param vp
* the view part
*/
protected void testStatisticsView(IViewPart vp) {
TmfStatisticsViewImpl sv = (TmfStatisticsViewImpl) vp;
assertNotNull(sv);
}
// ---------------------------------------------
// Trace helpers
// ---------------------------------------------
/**
* Gets an event at a given rank
*
* @param rank
* a rank
* @return the event at given rank
*/
protected CtfTmfEvent getEvent(int rank) {
ITmfContext ctx = fTrace.seekEvent(rank);
CtfTmfEvent ret = fTrace.getNext(ctx);
ctx.dispose();
return ret;
}
/**
* Gets a view part based on view title
*
* @param viewTile
* a view title
* @return the view part
*/
protected 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];
}
}