blob: 18978d67728238a44e06b14c5dbd3a02b37de2d4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2014 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
*******************************************************************************/
package org.eclipse.tracecompass.tmf.ui.tests.views.uml2sd.loader;
import static org.junit.Assert.assertNotNull;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Path;
import org.eclipse.swt.widgets.Display;
import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
import org.eclipse.tracecompass.tmf.core.signal.TmfTraceClosedSignal;
import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal;
import org.eclipse.tracecompass.tmf.core.signal.TmfTraceSelectedSignal;
import org.eclipse.tracecompass.tmf.core.trace.ITmfEventParser;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import org.eclipse.tracecompass.tmf.core.trace.experiment.TmfExperiment;
import org.eclipse.tracecompass.tmf.core.trace.indexer.ITmfTraceIndexer;
import org.eclipse.tracecompass.tmf.core.trace.indexer.checkpoint.TmfCheckpointIndexer;
import org.eclipse.tracecompass.tmf.tests.stubs.trace.TmfTraceStub;
import org.eclipse.tracecompass.tmf.ui.tests.shared.WaitUtils;
import org.eclipse.tracecompass.tmf.ui.tests.uml2sd.trace.TmfUml2SDTestTrace;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.SDView;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.dialogs.Criteria;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.dialogs.FilterCriteria;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.dialogs.FilterListDialog;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.load.LoadersManager;
import org.eclipse.tracecompass.tmf.ui.views.uml2sd.loader.TmfUml2SDSyncLoader;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.osgi.framework.FrameworkUtil;
/**
* Singleton class to facilitate the test cases. Creates UML2SD view and loader objects as well as provides
* utility methods for interacting with the loader/view.
*
* @author Bernd Hufmann
*/
public class Uml2SDTestFacility {
// ------------------------------------------------------------------------
// Constants
// ------------------------------------------------------------------------
private static final String SD_VIEW_ID = "org.eclipse.linuxtools.tmf.ui.tmfUml2SDSyncView";
// ------------------------------------------------------------------------
// Attributes
// ------------------------------------------------------------------------
private static Uml2SDTestFacility fInstance = null;
private TmfUml2SDSyncLoader fLoader;
private SDView fSdView;
private TmfTraceStub fTrace = null;
private TmfUml2SDTestTrace fParser = null;
private TmfExperiment fExperiment = null;
private volatile boolean fIsInitialized = false;
// ------------------------------------------------------------------------
// Constructors
// ------------------------------------------------------------------------
private Uml2SDTestFacility() {
fParser = new TmfUml2SDTestTrace();
fTrace = setupTrace(fParser);
fParser.setTrace(fTrace);
}
// ------------------------------------------------------------------------
// Operations
// ------------------------------------------------------------------------
/**
* @return the singleton instance.
*/
public synchronized static Uml2SDTestFacility getInstance() {
if (fInstance == null) {
fInstance = new Uml2SDTestFacility();
}
return fInstance;
}
/**
* Initial the test facility.
*/
public void init() {
if (!fIsInitialized) {
IViewPart view;
try {
// Remove welcome view to avoid interference during test execution
hideView("org.eclipse.ui.internal.introview");
view = showView(SD_VIEW_ID);
} catch (final PartInitException e) {
throw new RuntimeException(e);
}
fSdView = (SDView) view;
fLoader = (TmfUml2SDSyncLoader) LoadersManager.getInstance().createLoader(
"org.eclipse.tracecompass.tmf.ui.views.uml2sd.loader.TmfUml2SDSyncLoader", fSdView);
fIsInitialized = true;
}
}
private TmfTraceStub setupTrace(final ITmfEventParser parser) {
try {
// Create test trace object
final URL location = FileLocator.find(FrameworkUtil.getBundle(this.getClass()), new Path("tracesets/sdEvents"), null);
final File test = new File(FileLocator.toFileURL(location).toURI());
return new TmfTraceStub(test.getPath(), 500, true, parser);
} catch (final TmfTraceException e) {
e.printStackTrace();
throw new RuntimeException(e);
} catch (final URISyntaxException e) {
e.printStackTrace();
throw new RuntimeException(e);
} catch (final IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
/**
* Dispose the resource
*/
public void dispose() {
if (fIsInitialized) {
// Wait for all Eclipse jobs to finish
waitForJobs();
hideView(SD_VIEW_ID);
delay(200);
fIsInitialized = false;
}
if (fTrace != null) {
fTrace.dispose();
}
}
/**
* Sleeps current thread or GUI thread for a given time.
* @param waitTimeMillis time in milliseconds to wait
*/
public void delay(final long waitTimeMillis) {
final Display display = Display.getCurrent();
if (display != null) {
final long endTimeMillis = System.currentTimeMillis() + waitTimeMillis;
while(System.currentTimeMillis() < endTimeMillis) {
if (!display.readAndDispatch()) {
// We do not use Display.sleep because it might never wake up
// if there is no user interaction
try {
Thread.sleep(Math.min(waitTimeMillis, 10));
} catch (final InterruptedException e) {
// Ignored
}
}
display.update();
}
} else {
try {
Thread.sleep(waitTimeMillis);
} catch (final InterruptedException e) {
// Ignored
}
}
}
/**
* Waits for a view to be closed
*
* @param viewId
* a view id
*/
public void waitForViewClosed(String viewId) {
for (int i = 1; i < 5000 && (getViewPart(viewId) != null); i *= 2) {
delay(i);
}
}
/**
* Waits for a view to be opened
*
* @param viewId
* a view id
*/
public void waitForViewOpened(String viewId) {
for (int i = 1; i < 5000 && (getViewPart(viewId) == null); i *= 2) {
delay(i);
}
}
private IViewPart showView(String viewId) throws PartInitException {
IViewPart view = getViewPart(viewId);
if (view == null) {
view = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow()
.getActivePage().showView(viewId);
waitForViewOpened(viewId);
}
assertNotNull(view);
return view;
}
private void hideView(String viewId) {
IViewPart view = getViewPart(viewId);
if (view != null) {
PlatformUI.getWorkbench()
.getActiveWorkbenchWindow()
.getActivePage().hideView(view);
}
waitForViewClosed(viewId);
}
private static IViewPart getViewPart(String viewId) {
return PlatformUI.getWorkbench()
.getActiveWorkbenchWindow()
.getActivePage()
.findView(viewId);
}
/**
* Waits for all Eclipse jobs to finish
*/
public void waitForJobs() {
WaitUtils.waitForJobs();
}
/**
* @return current UML2SD loader
*/
public TmfUml2SDSyncLoader getLoader() {
return fLoader;
}
/**
* @return current SD view
*/
public SDView getSdView() {
return fSdView;
}
/**
* @return current trace
*/
public TmfTraceStub getTrace() {
return fTrace;
}
/**
* @return Trace parser
*/
public TmfUml2SDTestTrace getParser() {
return fParser;
}
/**
* @return current experiment.
*/
public TmfExperiment getExperiment() {
return fExperiment;
}
/**
* Go to next page;
*/
public void nextPage() {
fLoader.nextPage();
fLoader.waitForCompletion();
delay(IUml2SDTestConstants.GUI_REFESH_DELAY);
}
/**
* Go to previous page.
*/
public void prevPage() {
fLoader.prevPage();
fLoader.waitForCompletion();
delay(IUml2SDTestConstants.GUI_REFESH_DELAY);
}
/**
* Go to last page.
*/
public void lastPage() {
fLoader.lastPage();
fLoader.waitForCompletion();
delay(IUml2SDTestConstants.GUI_REFESH_DELAY);
}
/**
* Go to first page.
*/
public void firstPage() {
fLoader.firstPage();
fLoader.waitForCompletion();
delay(IUml2SDTestConstants.GUI_REFESH_DELAY);
}
/**
* @param page number to set
*/
public void setPage(final int page) {
fLoader.pageNumberChanged(page);
fLoader.waitForCompletion();
delay(IUml2SDTestConstants.GUI_REFESH_DELAY);
}
/**
* @see org.eclipse.tracecompass.tmf.ui.tests.views.uml2sd.loader.Uml2SDTestFacility#selectExperiment(boolean)
*/
public void selectExperiment() {
this.selectExperiment(true);
}
/**
* Selects the experiment.
* @param wait true to wait for indexing to finish else false
*/
public void selectExperiment(final boolean wait) {
TmfUml2SDTestTrace parser = new TmfUml2SDTestTrace();
ITmfTrace trace = setupTrace(parser);
parser.setTrace(trace);
final ITmfTrace traces[] = new ITmfTrace[] { trace };
fExperiment = new TmfExperiment(ITmfEvent.class, "TestExperiment",
traces, TmfExperiment.DEFAULT_INDEX_PAGE_SIZE, null) {
@Override
protected ITmfTraceIndexer createIndexer(int interval) {
return new TmfCheckpointIndexer(this, interval);
}
};
trace.broadcast(new TmfTraceOpenedSignal(this, fExperiment, null));
trace.broadcast(new TmfTraceSelectedSignal(this, fExperiment));
if (wait) {
while (fExperiment.getNbEvents() == 0) {
delay(IUml2SDTestConstants.GUI_REFESH_DELAY);
}
waitForJobs();
delay(IUml2SDTestConstants.GUI_REFESH_DELAY);
}
}
/**
* Disposes the experiment.
*/
public void disposeExperiment() {
TmfExperiment experiment = fExperiment;
if (experiment == null) {
throw new IllegalStateException();
}
experiment.broadcast(new TmfTraceClosedSignal(this, experiment));
experiment.dispose();
delay(IUml2SDTestConstants.GUI_REFESH_DELAY);
}
/**
* Creates some global filter criteria and saves them to disk.
*/
public void createFilterCriteria() {
// Create Filter Criteria and save tme
final List<FilterCriteria> filterToSave = new ArrayList<>();
Criteria criteria = new Criteria();
criteria.setLifeLineSelected(true);
criteria.setExpression(IUml2SDTestConstants.FIRST_PLAYER_NAME);
filterToSave.add(new FilterCriteria(criteria, true, false));
criteria = new Criteria();
criteria.setSyncMessageSelected(true);
criteria.setExpression("BALL_.*");
filterToSave.add(new FilterCriteria(criteria, true, false));
FilterListDialog.saveFiltersCriteria(filterToSave);
}
}