/*******************************************************************************
* Copyright (c) 2009 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.memcheck.tests;
import static org.junit.Assert.*;
import java.util.Arrays;
import org.eclipse.cdt.debug.core.CDebugUtils;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.debug.ui.ILaunchConfigurationTab;
import org.eclipse.linuxtools.internal.valgrind.launch.ValgrindLaunchPlugin;
import org.eclipse.linuxtools.internal.valgrind.launch.ValgrindOptionsTab;
import org.eclipse.linuxtools.internal.valgrind.memcheck.MemcheckLaunchConstants;
import org.eclipse.linuxtools.internal.valgrind.memcheck.MemcheckPlugin;
import org.eclipse.linuxtools.internal.valgrind.memcheck.MemcheckToolPage;
import org.eclipse.linuxtools.internal.valgrind.ui.ValgrindUIPlugin;
import org.eclipse.linuxtools.internal.valgrind.ui.ValgrindViewPart;
import org.eclipse.linuxtools.valgrind.core.IValgrindMessage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.Version;
public class LaunchConfigTabTest extends AbstractMemcheckTest {
private ValgrindOptionsTab tab;
private MemcheckToolPage dynamicTab;
private ILaunchConfiguration config;
private Shell testShell;
@Before
public void setUpProject() throws Exception {
proj = createProjectAndBuild("basicTest"); //$NON-NLS-1$
config = createConfiguration(proj.getProject());
testShell = new Shell(Display.getDefault());
testShell.setLayout(new GridLayout());
tab = new ValgrindOptionsTab();
}
@After
public void cleanup() throws Exception {
tab.dispose();
testShell.dispose();
deleteProject(proj);
super.tearDown();
}
private ILaunchConfigurationWorkingCopy initConfig() throws CoreException {
ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy();
tab.setDefaults(wc);
tab.createControl(testShell);
tab.initializeFrom(config);
int ix = Arrays.asList(tab.getTools()).indexOf(MemcheckPlugin.TOOL_ID);
tab.getToolsCombo().select(ix);
ILaunchConfigurationTab dynamicTab = tab.getDynamicTab();
this.dynamicTab = (MemcheckToolPage) dynamicTab;
return wc;
}
private ILaunch saveAndLaunch(ILaunchConfigurationWorkingCopy wc,
String testName) throws Exception {
tab.performApply(wc);
config = wc.doSave();
return doLaunch(config, testName);
}
@Test
public void testDefaults() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
ILaunch launch = saveAndLaunch(wc, "testDefaults"); //$NON-NLS-1$
IProcess[] p = launch.getProcesses();
assertTrue(p.length > 0);
String cmd = p[0].getAttribute(IProcess.ATTR_CMDLINE);
assertEquals(0, p[0].getExitValue());
assertTrue(cmd.contains("--tool=memcheck")); //$NON-NLS-1$
assertTrue(cmd.contains("-q")); //$NON-NLS-1$
assertTrue(cmd.contains("--trace-children=no")); //$NON-NLS-1$
assertTrue(cmd.contains("--child-silent-after-fork=yes")); //$NON-NLS-1$
assertTrue(cmd.contains("--demangle=yes")); //$NON-NLS-1$
assertTrue(cmd.contains("--num-callers=12")); //$NON-NLS-1$
assertTrue(cmd.contains("--error-limit=yes")); //$NON-NLS-1$
assertTrue(cmd.contains("--show-below-main=no")); //$NON-NLS-1$
assertFalse(cmd.contains("--suppressions=")); //$NON-NLS-1$
assertTrue(cmd.contains("--max-stackframe=2000000")); //$NON-NLS-1$
assertFalse(cmd.contains("--alignment=")); //$NON-NLS-1$
assertTrue(cmd.contains("--run-libc-freeres=yes")); //$NON-NLS-1$
assertTrue(cmd.contains("--leak-check=yes")); //$NON-NLS-1$
assertTrue(cmd.contains("--show-reachable=no")); //$NON-NLS-1$
assertTrue(cmd.contains("--leak-resolution=high")); //$NON-NLS-1$
assertTrue(cmd.contains("--freelist-vol=10000000")); //$NON-NLS-1$
assertTrue(cmd.contains("--workaround-gcc296-bugs=no")); //$NON-NLS-1$
assertTrue(cmd.contains("--partial-loads-ok=no")); //$NON-NLS-1$
assertTrue(cmd.contains("--undef-value-errors=yes")); //$NON-NLS-1$
// 3.4.0 specific
IProject project = CDebugUtils.verifyCProject(wc).getProject();
Version ver = ValgrindLaunchPlugin.getDefault().getValgrindVersion(
project);
if (ver.compareTo(ValgrindLaunchPlugin.VER_3_4_0) >= 0) {
assertFalse(cmd.contains("--track-origins")); //$NON-NLS-1$
}
assertFalse(cmd.contains("--main-stacksize")); //$NON-NLS-1$
}
@Test
public void testWSSuppresions() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
String text = "${workspace_loc:/basicTest/testsuppfile.supp}"; //$NON-NLS-1$
tab.getSuppFileList().add(text);
ILaunch launch = saveAndLaunch(wc, "testWSSuppresions"); //$NON-NLS-1$
IProcess[] p = launch.getProcesses();
assertTrue(p.length > 0);
String cmd = p[0].getAttribute(IProcess.ATTR_CMDLINE);
assertEquals(0, p[0].getExitValue());
IPath suppPath = ResourcesPlugin
.getWorkspace()
.getRoot()
.findMember(new Path("basicTest/testsuppfile.supp")).getLocation(); //$NON-NLS-1$
assertTrue(cmd.contains("--suppressions=" + suppPath.toOSString())); //$NON-NLS-1$
}
@Test
public void testSuppressions() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
IPath suppPath = ResourcesPlugin
.getWorkspace()
.getRoot()
.findMember(new Path("basicTest/testsuppfile.supp")).getLocation(); //$NON-NLS-1$
tab.getSuppFileList().add(suppPath.toOSString());
ILaunch launch = saveAndLaunch(wc, "testSuppressions"); //$NON-NLS-1$
IProcess[] p = launch.getProcesses();
assertTrue(p.length > 0);
String cmd = p[0].getAttribute(IProcess.ATTR_CMDLINE);
assertEquals(0, p[0].getExitValue());
assertTrue(cmd.contains("--suppressions=" + suppPath.toOSString())); //$NON-NLS-1$
}
@Test
public void testSuppressionsMultiple() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
IPath suppPath = ResourcesPlugin
.getWorkspace()
.getRoot()
.findMember(new Path("basicTest/testsuppfile.supp")).getLocation(); //$NON-NLS-1$
IPath suppPath2 = ResourcesPlugin
.getWorkspace()
.getRoot()
.findMember(new Path("basicTest/testsuppfile2.supp")).getLocation(); //$NON-NLS-1$
tab.getSuppFileList().add(suppPath.toOSString());
tab.getSuppFileList().add(suppPath2.toOSString());
ILaunch launch = saveAndLaunch(wc, "testSuppressionsMultiple"); //$NON-NLS-1$
IProcess[] p = launch.getProcesses();
assertTrue(p.length > 0);
String cmd = p[0].getAttribute(IProcess.ATTR_CMDLINE);
assertEquals(0, p[0].getExitValue());
assertTrue(cmd.contains("--suppressions=" + suppPath.toOSString())); //$NON-NLS-1$
assertTrue(cmd.contains("--suppressions=" + suppPath2.toOSString())); //$NON-NLS-1$
}
@Test
public void testSuppressionsSpaces() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
IPath suppPath = ResourcesPlugin
.getWorkspace()
.getRoot()
.findMember(new Path("basicTest/test suppfile.supp")).getLocation(); //$NON-NLS-1$
tab.getSuppFileList().add(suppPath.toOSString());
ILaunch launch = saveAndLaunch(wc, "testSuppressionsSpaces"); //$NON-NLS-1$
IProcess[] p = launch.getProcesses();
assertTrue(p.length > 0);
String cmd = p[0].getAttribute(IProcess.ATTR_CMDLINE);
assertEquals(0, p[0].getExitValue());
assertTrue(cmd.contains("--suppressions=" + suppPath.toOSString())); //$NON-NLS-1$
}
@Test
public void testTraceChildren() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
tab.getTraceChildrenButton().setSelection(true);
ILaunch launch = saveAndLaunch(wc, "testTraceChildren"); //$NON-NLS-1$
IProcess[] p = launch.getProcesses();
assertTrue(p.length > 0);
String cmd = p[0].getAttribute(IProcess.ATTR_CMDLINE);
assertEquals(0, p[0].getExitValue());
assertTrue(cmd.contains("--trace-children=yes")); //$NON-NLS-1$
}
@Test
public void testDemangle() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
tab.getDemangleButton().setSelection(false);
ILaunch launch = saveAndLaunch(wc, "testDemangle"); //$NON-NLS-1$
IProcess[] p = launch.getProcesses();
assertTrue(p.length > 0);
String cmd = p[0].getAttribute(IProcess.ATTR_CMDLINE);
assertEquals(0, p[0].getExitValue());
assertTrue(cmd.contains("--demangle=no")); //$NON-NLS-1$
}
@Test
public void testNumCallers() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
tab.getNumCallersSpinner().setSelection(24);
ILaunch launch = saveAndLaunch(wc, "testNumCallers"); //$NON-NLS-1$
IProcess[] p = launch.getProcesses();
assertTrue(p.length > 0);
String cmd = p[0].getAttribute(IProcess.ATTR_CMDLINE);
assertEquals(0, p[0].getExitValue());
assertTrue(cmd.contains("--num-callers=24")); //$NON-NLS-1$
}
@Test
public void testErrorLimit() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
tab.getErrorLimitButton().setSelection(false);
ILaunch launch = saveAndLaunch(wc, "testErrorLimit"); //$NON-NLS-1$
IProcess[] p = launch.getProcesses();
assertTrue(p.length > 0);
String cmd = p[0].getAttribute(IProcess.ATTR_CMDLINE);
assertEquals(0, p[0].getExitValue());
assertTrue(cmd.contains("--error-limit=no")); //$NON-NLS-1$
}
@Test
public void testShowBelowMain() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
tab.getShowBelowMainButton().setSelection(true);
ILaunch launch = saveAndLaunch(wc, "testShowBelowMain"); //$NON-NLS-1$
IProcess[] p = launch.getProcesses();
assertTrue(p.length > 0);
String cmd = p[0].getAttribute(IProcess.ATTR_CMDLINE);
assertEquals(0, p[0].getExitValue());
assertTrue(cmd.contains("--show-below-main=yes")); //$NON-NLS-1$
}
@Test
public void testMaxStackframe() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
tab.getMaxStackFrameSpinner().setSelection(50000000);
ILaunch launch = saveAndLaunch(wc, "testMaxStackframe"); //$NON-NLS-1$
IProcess[] p = launch.getProcesses();
assertTrue(p.length > 0);
String cmd = p[0].getAttribute(IProcess.ATTR_CMDLINE);
assertEquals(0, p[0].getExitValue());
assertTrue(cmd.contains("--max-stackframe=50000000")); //$NON-NLS-1$
}
@Test
public void testRunFreeRes() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
tab.getRunFreeresButton().setSelection(false);
ILaunch launch = saveAndLaunch(wc, "testRunFreeRes"); //$NON-NLS-1$
IProcess[] p = launch.getProcesses();
assertTrue(p.length > 0);
String cmd = p[0].getAttribute(IProcess.ATTR_CMDLINE);
assertEquals(0, p[0].getExitValue());
assertTrue(cmd.contains("--run-libc-freeres=no")); //$NON-NLS-1$
}
@Test
public void testAlignment() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
assertFalse(dynamicTab.getAlignmentSpinner().getEnabled());
dynamicTab.getAlignmentButton().setSelection(true);
dynamicTab.getAlignmentButton().notifyListeners(SWT.Selection, null);
assertTrue(dynamicTab.getAlignmentSpinner().getEnabled());
dynamicTab.getAlignmentSpinner().setSelection(512);
tab.performApply(wc);
config = wc.doSave();
assertTrue(tab.isValid(config));
ILaunch launch = doLaunch(config, "testAlignment"); //$NON-NLS-1$
IProcess[] p = launch.getProcesses();
assertTrue("process array should not be empty", p.length > 0);
String cmd = p[0].getAttribute(IProcess.ATTR_CMDLINE);
assertEquals(0, p[0].getExitValue());
assertTrue(cmd.contains("--alignment=512")); //$NON-NLS-1$
}
@Test
public void testAlignmentBad() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
assertFalse(dynamicTab.getAlignmentSpinner().getEnabled());
dynamicTab.getAlignmentButton().setSelection(true);
dynamicTab.getAlignmentButton().notifyListeners(SWT.Selection, null);
assertTrue(dynamicTab.getAlignmentSpinner().getEnabled());
dynamicTab.getAlignmentSpinner().setSelection(63);
tab.performApply(wc);
config = wc.doSave();
assertFalse(tab.isValid(config));
}
@Test
public void testNoLeakCheck() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
dynamicTab.getLeakCheckButton().setSelection(false);
ILaunch launch = saveAndLaunch(wc, "testNoLeakCheck"); //$NON-NLS-1$
IProcess[] p = launch.getProcesses();
assertTrue("process array should not be empty", p.length > 0);
String cmd = p[0].getAttribute(IProcess.ATTR_CMDLINE);
assertEquals(0, p[0].getExitValue());
assertTrue(cmd.contains("--leak-check=no")); //$NON-NLS-1$
}
@Test
public void testShowReachable() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
dynamicTab.getShowReachableButton().setSelection(true);
ILaunch launch = saveAndLaunch(wc, "testShowReachable"); //$NON-NLS-1$
IProcess[] p = launch.getProcesses();
assertTrue("process array should not be empty", p.length > 0);
String cmd = p[0].getAttribute(IProcess.ATTR_CMDLINE);
assertEquals(0, p[0].getExitValue());
assertTrue(cmd.contains("--show-reachable=yes")); //$NON-NLS-1$
}
@Test
public void testLeakResolutionMed() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
String[] opts = dynamicTab.getLeakResCombo().getItems();
int ix = Arrays.asList(opts).indexOf(
MemcheckLaunchConstants.LEAK_RES_MED);
dynamicTab.getLeakResCombo().select(ix);
ILaunch launch = saveAndLaunch(wc, "testLeakResolutionMed"); //$NON-NLS-1$
IProcess[] p = launch.getProcesses();
assertTrue("process array should not be empty", p.length > 0);
String cmd = p[0].getAttribute(IProcess.ATTR_CMDLINE);
assertEquals(0, p[0].getExitValue());
assertTrue(cmd.contains("--leak-resolution=med")); //$NON-NLS-1$
}
@Test
public void testLeakResolutionHigh() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
String[] opts = dynamicTab.getLeakResCombo().getItems();
int ix = Arrays.asList(opts).indexOf(
MemcheckLaunchConstants.LEAK_RES_HIGH);
dynamicTab.getLeakResCombo().select(ix);
ILaunch launch = saveAndLaunch(wc, "testLeakResolutionHigh"); //$NON-NLS-1$
IProcess[] p = launch.getProcesses();
assertTrue("process array should not be empty", p.length > 0);
String cmd = p[0].getAttribute(IProcess.ATTR_CMDLINE);
assertEquals(0, p[0].getExitValue());
assertTrue(cmd.contains("--leak-resolution=high")); //$NON-NLS-1$
}
@Test
public void testFreeListVol() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
dynamicTab.getFreelistSpinner().setSelection(2000000);
ILaunch launch = saveAndLaunch(wc, "testFreeListVol"); //$NON-NLS-1$
IProcess[] p = launch.getProcesses();
assertTrue("process array should not be empty", p.length > 0);
String cmd = p[0].getAttribute(IProcess.ATTR_CMDLINE);
assertEquals(0, p[0].getExitValue());
assertTrue(cmd.contains("--freelist-vol=2000000")); //$NON-NLS-1$
}
@Test
public void testWorkaroundGCCBugs() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
dynamicTab.getGccWorkaroundButton().setSelection(true);
ILaunch launch = saveAndLaunch(wc, "testWorkaroundGCCBugs"); //$NON-NLS-1$
IProcess[] p = launch.getProcesses();
assertTrue("process array should not be empty", p.length > 0);
String cmd = p[0].getAttribute(IProcess.ATTR_CMDLINE);
assertEquals(0, p[0].getExitValue());
assertTrue(cmd.contains("--workaround-gcc296-bugs=yes")); //$NON-NLS-1$
}
@Test
public void testPartialLoads() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
dynamicTab.getPartialLoadsButton().setSelection(true);
ILaunch launch = saveAndLaunch(wc, "testPartialLoads"); //$NON-NLS-1$
IProcess[] p = launch.getProcesses();
assertTrue("process array should not be empty", p.length > 0);
String cmd = p[0].getAttribute(IProcess.ATTR_CMDLINE);
assertEquals(0, p[0].getExitValue());
assertTrue(cmd.contains("--partial-loads-ok=yes")); //$NON-NLS-1$
}
@Test
public void testUndefValueErrors() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
dynamicTab.getUndefValueButton().setSelection(false);
ILaunch launch = saveAndLaunch(wc, "testUndefValueErrors"); //$NON-NLS-1$
IProcess[] p = launch.getProcesses();
assertTrue("process array should not be empty", p.length > 0);
String cmd = p[0].getAttribute(IProcess.ATTR_CMDLINE);
assertEquals(0, p[0].getExitValue());
assertTrue(cmd.contains("--undef-value-errors=no")); //$NON-NLS-1$
}
@Test
public void testMainStackSize() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
IProject project = CDebugUtils.verifyCProject(wc).getProject();
Version ver = ValgrindLaunchPlugin.getDefault().getValgrindVersion(
project);
if (ver.compareTo(ValgrindLaunchPlugin.VER_3_4_0) >= 0) {
assertFalse(tab.getMainStackSizeSpinner().isEnabled());
tab.getMainStackSizeButton().setSelection(true);
tab.getMainStackSizeButton().notifyListeners(SWT.Selection, null);
assertTrue(tab.getMainStackSizeSpinner().isEnabled());
tab.getMainStackSizeSpinner().setSelection(2048);
ILaunch launch = saveAndLaunch(wc, "testMainStackFrame"); //$NON-NLS-1$
IProcess[] p = launch.getProcesses();
assertTrue("process array should not be empty", p.length > 0);
String cmd = p[0].getAttribute(IProcess.ATTR_CMDLINE);
assertEquals(0, p[0].getExitValue());
assertTrue(cmd.contains("--main-stacksize=2048")); //$NON-NLS-1$
} else {
assertNull(tab.getMainStackSizeButton());
assertNull(tab.getMainStackSizeSpinner());
}
}
@Test
public void testTrackOrigins() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
IProject project = CDebugUtils.verifyCProject(config).getProject();
Version ver = ValgrindLaunchPlugin.getDefault().getValgrindVersion(
project);
if (ver.compareTo(ValgrindLaunchPlugin.VER_3_4_0) >= 0) {
dynamicTab.getTrackOriginsButton().setSelection(true);
ILaunch launch = saveAndLaunch(wc, "testTrackOrigins"); //$NON-NLS-1$
IProcess[] p = launch.getProcesses();
assertTrue("process array should not be empty", p.length > 0);
String cmd = p[0].getAttribute(IProcess.ATTR_CMDLINE);
assertEquals(0, p[0].getExitValue());
assertTrue(cmd.contains("--track-origins=yes")); //$NON-NLS-1$
} else {
assertNull(dynamicTab.getTrackOriginsButton());
}
}
@Test
public void testTrackOriginsValidity() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
IProject project = CDebugUtils.verifyCProject(config).getProject();
Version ver = ValgrindLaunchPlugin.getDefault().getValgrindVersion(
project);
if (ver.compareTo(ValgrindLaunchPlugin.VER_3_4_0) >= 0) {
dynamicTab.getTrackOriginsButton().setSelection(true);
tab.performApply(wc);
assertTrue(tab.isValid(wc));
dynamicTab.getUndefValueButton().setSelection(false);
tab.performApply(wc);
assertFalse(tab.isValid(wc));
}
}
@Test
public void testValgrindError() throws Exception {
String notExistentFile = "DOES NOT EXIST"; //$NON-NLS-1$
ILaunchConfigurationWorkingCopy wc = initConfig();
tab.getSuppFileList().add(notExistentFile);
tab.performApply(wc);
config = wc.doSave();
assertFalse(tab.isValid(config));
doLaunch(config, "testValgrindError"); //$NON-NLS-1$
ValgrindViewPart view = ValgrindUIPlugin.getDefault().getView();
IValgrindMessage[] messages = view.getMessages();
assertTrue(messages.length > 0);
String text = messages[0].getText();
assertTrue(text.contains(notExistentFile));
}
@Test
public void testExtraOptions() throws Exception {
ILaunchConfigurationWorkingCopy wc = initConfig();
tab.getExtraOptionsText().setText(" -v -v");
ILaunch launch = saveAndLaunch(wc, "testExtraOptions"); //$NON-NLS-1$
IProcess[] p = launch.getProcesses();
assertTrue("process array should not be empty", p.length > 0);
String cmd = p[0].getAttribute(IProcess.ATTR_CMDLINE);
assertEquals(0, p[0].getExitValue());
assertTrue(cmd.contains("-v -v")); //$NON-NLS-1$
}
}