/******************************************************************************* * Copyright (c) 2009, 2016 Red Hat, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * 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(); } } }