blob: 4033f06f7c225467ed735199a70963b2514b72eb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013, 2018 École Polytechnique de Montréal and others
*
* 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:
* Geneviève Bastien - Initial API and implementation
*******************************************************************************/
package org.eclipse.tracecompass.tmf.ui.tests.shared;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.swt.widgets.Display;
import org.eclipse.tracecompass.internal.tmf.ui.Activator;
import org.eclipse.tracecompass.internal.tmf.ui.project.model.TmfImportHelper;
import org.eclipse.tracecompass.tmf.core.TmfCommonConstants;
import org.eclipse.tracecompass.tmf.core.tests.shared.TmfTestTrace;
import org.eclipse.tracecompass.tmf.ui.project.model.ITmfProjectModelElement;
import org.eclipse.tracecompass.tmf.ui.project.model.TmfCommonProjectElement;
import org.eclipse.tracecompass.tmf.ui.project.model.TmfExperimentElement;
import org.eclipse.tracecompass.tmf.ui.project.model.TmfExperimentFolder;
import org.eclipse.tracecompass.tmf.ui.project.model.TmfProjectElement;
import org.eclipse.tracecompass.tmf.ui.project.model.TmfProjectRegistry;
import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceElement;
import org.eclipse.tracecompass.tmf.ui.project.model.TmfTraceFolder;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
/**
* Creates objects used for this package's testing purposes
*
* @author Geneviève Bastien
*/
public class ProjectModelTestData {
/** Default test project name */
public static final String PROJECT_NAME = "Test_Project";
private static final TmfTestTrace testTrace = TmfTestTrace.A_TEST_10K;
/**
* Gets a project element with traces all initialized
*
* @return A project stub element
* @throws CoreException
* If something happened with the project creation
*/
public static TmfProjectElement getFilledProject() throws CoreException {
IProject project = TmfProjectRegistry.createProject(PROJECT_NAME, null, null);
final TmfProjectElement projectElement = TmfProjectRegistry.getProject(project, true);
TmfTraceFolder tracesFolder = projectElement.getTracesFolder();
if (tracesFolder != null) {
IFolder traceFolder = tracesFolder.getResource();
/* Create a trace, if it exist, it will be replaced */
final IPath pathString = new Path(testTrace.getFullPath());
IResource linkedTrace = TmfImportHelper.createLink(traceFolder, pathString, pathString.lastSegment());
if (!(linkedTrace != null && linkedTrace.exists())) {
return null;
}
linkedTrace.setPersistentProperty(TmfCommonConstants.TRACETYPE,
"org.eclipse.linuxtools.tmf.core.tests.tracetype");
// Refresh the project model
tracesFolder.refresh();
TmfTraceElement traceElement = tracesFolder.getTraces().get(0);
traceElement.refreshTraceType();
}
projectElement.refresh();
return projectElement;
}
/**
* Adds a new experiment to the project
*
* @param projectElement
* The project to add to
* @param experimentName
* Name of the experiment
* @return The newly created experiment
*/
public static TmfExperimentElement addExperiment(TmfProjectElement projectElement, String experimentName) {
TmfExperimentFolder experimentsFolder = projectElement.getExperimentsFolder();
if (experimentsFolder != null) {
IFolder experimentFolder = experimentsFolder.getResource();
final IFolder folder = experimentFolder.getFolder(experimentName);
WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
@Override
public void execute(IProgressMonitor monitor) throws CoreException {
monitor.beginTask("", 1000);
folder.create(false, true, monitor);
monitor.done();
}
};
try {
PlatformUI.getWorkbench().getProgressService().busyCursorWhile(operation);
} catch (InterruptedException | InvocationTargetException | RuntimeException exception) {
exception.printStackTrace();
}
experimentsFolder.refresh();
for (ITmfProjectModelElement el : experimentsFolder.getChildren()) {
if (el.getName().equals(experimentName) && (el instanceof TmfExperimentElement)) {
return (TmfExperimentElement) el;
}
}
}
return null;
}
/**
* Get the name of the test trace element
*
* @return The trace name
*/
public static String getTraceName() {
File file = new File(testTrace.getPath());
String path = file.getAbsolutePath();
final IPath pathString = Path.fromOSString(path);
return pathString.lastSegment();
}
/**
* Deletes a project
*
* @param project
* Project to delete
*/
public static void deleteProject(TmfProjectElement project) {
/* Delete experiments */
TmfExperimentFolder experimentsFolder = project.getExperimentsFolder();
if (experimentsFolder != null) {
ITmfProjectModelElement[] experiments = experimentsFolder.getChildren().toArray(new ITmfProjectModelElement[0]);
for (ITmfProjectModelElement element : experiments) {
if (element instanceof TmfExperimentElement) {
TmfExperimentElement experiment = (TmfExperimentElement) element;
IResource resource = experiment.getResource();
/* Close the experiment if open */
experiment.closeEditors();
IPath path = resource.getLocation();
if (path != null) {
/* Delete supplementary files */
experiment.deleteSupplementaryFolder();
}
/* Finally, delete the experiment */
try {
resource.delete(true, null);
} catch (CoreException e) {
Activator.getDefault().logError("Error deleting experiment element", e);
}
}
}
}
/* Delete traces */
TmfTraceFolder tracesFolder = project.getTracesFolder();
if (tracesFolder != null) {
ITmfProjectModelElement[] traces = tracesFolder.getChildren().toArray(new ITmfProjectModelElement[0]);
for (ITmfProjectModelElement element : traces) {
if (element instanceof TmfTraceElement) {
TmfTraceElement trace = (TmfTraceElement) element;
IResource resource = trace.getResource();
/* Close the trace if open */
trace.closeEditors();
IPath path = resource.getLocation();
if (path != null) {
/* Delete supplementary files */
trace.deleteSupplementaryFolder();
}
/* Finally, delete the trace */
try {
resource.delete(true, new NullProgressMonitor());
} catch (CoreException e) {
Activator.getDefault().logError("Error deleting trace element", e);
}
}
}
}
/* Delete the project itself */
try {
project.getResource().delete(true, null);
} catch (CoreException e) {
Activator.getDefault().logError("Error deleting project", e);
}
}
/**
* Makes the main display thread sleep, so it gives a chance to other
* threads needing the main display to execute
*
* @param waitTimeMillis
* time to wait in millisecond
*/
public static void delayThread(final long waitTimeMillis) {
final Display display = Display.getCurrent();
if (display != null) {
final long endTimeMillis = System.currentTimeMillis() + waitTimeMillis;
while (System.currentTimeMillis() < endTimeMillis) {
if (!display.readAndDispatch()) {
display.sleep();
}
display.update();
}
} else {
try {
Thread.sleep(waitTimeMillis);
} catch (final InterruptedException e) {
// Ignored
}
}
}
/**
* Makes the main display thread sleep to give a chance to other threads to
* execute. It sleeps until the a trace element's corresponding trace is
* available (opened) or returns after a timeout. It allows to set short
* delays, while still not failing tests when it randomly takes a bit more
* time for the trace to open.
*
* @param traceElement
* The trace element we are waiting for.
* @throws WaitTimeoutException
* If after the maximum number of delays the trace is still
* null, we throw a timeout exception, the trace has not opened.
*/
public static void delayUntilTraceOpened(final TmfCommonProjectElement traceElement) throws WaitTimeoutException {
WaitUtils.waitUntil(new IWaitCondition() {
@Override
public boolean test() throws Exception {
return traceElement.getTrace() != null;
}
@Override
public String getFailureMessage() {
return "Timeout while waiting for " + traceElement;
}
});
}
}