blob: 61f893f388761214f4d6d93e564eee4a6ac2923b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2018 Red Hat, Inc.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Elliott Baron <ebaron@redhat.com> - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.valgrind.tests;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.core.Launch;
import org.eclipse.debug.ui.ILaunchConfigurationTab;
import org.eclipse.linuxtools.internal.valgrind.core.ValgrindCommand;
import org.eclipse.linuxtools.internal.valgrind.launch.LaunchConfigurationConstants;
import org.eclipse.linuxtools.internal.valgrind.launch.ValgrindLaunchPlugin;
import org.eclipse.linuxtools.internal.valgrind.launch.ValgrindOptionsTab;
import org.eclipse.linuxtools.profiling.tests.AbstractTest;
import org.junit.After;
import org.junit.Before;
import org.osgi.framework.Bundle;
import org.osgi.framework.FrameworkUtil;
public abstract class AbstractValgrindTest extends AbstractTest {
private static final String TEMPLATE_PREFIX = "template_"; //$NON-NLS-1$
private static final FileFilter TEMPLATE_FILTER = pathname -> pathname.getName().startsWith(TEMPLATE_PREFIX)
&& !pathname.isHidden();
private static final FileFilter NOT_TEMPLATE_FILTER = pathname -> !pathname.getName().startsWith(TEMPLATE_PREFIX)
&& !pathname.isHidden();
private static final String SEARCH_STRING_WS = "XXXXXXXXXXXX"; //$NON-NLS-1$
private static final String SEARCH_STRING_BL = "YYYYYYYYYYYY"; //$NON-NLS-1$
private List<ILaunch> launches;
@Before
public void setUp() {
launches = new ArrayList<>();
// Substitute Valgrind command line interaction
ValgrindLaunchPlugin.getDefault().setValgrindCommand(getValgrindCommand());
}
@After
public void tearDown() throws CoreException {
ILaunchManager lm = DebugPlugin.getDefault().getLaunchManager();
if (launches.size() > 0) {
lm.removeLaunches(launches.toArray(new ILaunch[launches.size()]));
launches.clear();
}
// Delete the Launch Configurations
ILaunchConfiguration[] configs = lm.getLaunchConfigurations();
for (ILaunchConfiguration config : configs) {
config.delete();
}
}
@Override
protected ILaunchConfigurationType getLaunchConfigType() {
return getLaunchManager().getLaunchConfigurationType(ValgrindLaunchPlugin.LAUNCH_ID);
}
protected ILaunch doLaunch(ILaunchConfiguration config, String testName)
throws URISyntaxException, IOException, CoreException {
ILaunch launch;
IPath pathToFiles = getPathToFiles(testName);
if (!ValgrindTestsPlugin.RUN_VALGRIND) {
bindLocation(pathToFiles);
}
ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy();
wc.setAttribute(LaunchConfigurationConstants.ATTR_INTERNAL_OUTPUT_DIR, pathToFiles.toOSString());
wc.doSave();
ValgrindTestLaunchDelegate delegate = new ValgrindTestLaunchDelegate();
launch = new Launch(config, ILaunchManager.PROFILE_MODE, null);
DebugPlugin.getDefault().getLaunchManager().addLaunch(launch);
launches.add(launch);
delegate.launch(config, ILaunchManager.PROFILE_MODE, launch, null);
if (ValgrindTestsPlugin.RUN_VALGRIND) {
unbindLocation(pathToFiles);
}
return launch;
}
private IPath getPathToFiles(String testName) throws URISyntaxException, IOException {
URL location = FileLocator.find(getBundle(), new Path("valgrindFiles"), null); //$NON-NLS-1$
File file = new File(FileLocator.toFileURL(location).toURI());
IPath pathToFiles = new Path(file.getCanonicalPath()).append(testName);
return pathToFiles;
}
private void unbindLocation(IPath pathToFiles) throws IOException {
String bundleLoc = FileLocator.getBundleFile(getBundle()).getCanonicalPath();
String workspaceLoc = ResourcesPlugin.getWorkspace().getRoot().getLocation().toOSString();
File testDir = pathToFiles.toFile();
for (File log : testDir.listFiles(NOT_TEMPLATE_FILTER)) {
File template = new File(testDir, TEMPLATE_PREFIX + log.getName());
replaceLocation(log, template, new String[] { bundleLoc, workspaceLoc },
new String[] { SEARCH_STRING_BL, SEARCH_STRING_WS });
}
}
private void bindLocation(IPath pathToFiles) throws IOException {
String bundleLoc = FileLocator.getBundleFile(getBundle()).getCanonicalPath();
String workspaceLoc = ResourcesPlugin.getWorkspace().getRoot().getLocation().toOSString();
File testDir = pathToFiles.toFile();
for (File template : testDir.listFiles(TEMPLATE_FILTER)) {
String name = template.getName().replace(TEMPLATE_PREFIX, ""); //$NON-NLS-1$
File log = new File(testDir, name.substring(name.indexOf(TEMPLATE_PREFIX) + 1));
replaceLocation(template, log, new String[] { SEARCH_STRING_BL, SEARCH_STRING_WS },
new String[] { bundleLoc, workspaceLoc });
}
}
private void replaceLocation(File oldFile, File newFile, String[] from, String[] to) {
if (oldFile.isFile()) {
try (BufferedReader br = new BufferedReader(new FileReader(oldFile));
PrintWriter pw = new PrintWriter(new FileWriter(newFile))) {
String line;
while ((line = br.readLine()) != null) {
for (int i = 0; i < from.length; i++) {
line = line.replaceAll(from[i], to[i]);
}
pw.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
protected void setProfileAttributes(ILaunchConfigurationWorkingCopy wc) throws CoreException {
ILaunchConfigurationTab tab = new ValgrindOptionsTab();
tab.setDefaults(wc);
tab = ValgrindLaunchPlugin.getDefault().getToolPage(getToolID());
tab.setDefaults(wc);
wc.setAttribute(LaunchConfigurationConstants.ATTR_TOOL, getToolID());
wc.setAttribute(LaunchConfigurationConstants.ATTR_FULLPATH_AFTER, false);
}
protected ICProject createProjectAndBuild(String projname) throws Exception {
return createProjectAndBuild(getBundle(), projname);
}
protected Bundle getBundle() {
return FrameworkUtil.getBundle(this.getClass());
}
protected abstract String getToolID();
private ValgrindCommand getValgrindCommand() {
if (!ValgrindTestsPlugin.RUN_VALGRIND) {
return new ValgrindStubCommand();
} else {
return new ValgrindCommand();
}
}
}