blob: 99b4967cf72c2376d33713effbc509d4454e463a [file] [log] [blame]
package org.eclipse.cdt.core.build.managed.tests;
import java.util.Arrays;
import java.util.Map;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.CCProjectNature;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.CProjectNature;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.core.parser.IScannerInfoChangeListener;
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
import org.eclipse.cdt.make.core.IMakeBuilderInfo;
import org.eclipse.cdt.make.core.MakeBuilder;
import org.eclipse.cdt.make.core.MakeCorePlugin;
import org.eclipse.cdt.make.core.MakeProjectNature;
import org.eclipse.cdt.make.core.MakeScannerInfo;
import org.eclipse.cdt.make.core.MakeScannerProvider;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
/**********************************************************************
* Copyright (c) 2002,2003 Rational Software Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v0.5
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v05.html
*
* Contributors:
* IBM Rational Software - Initial API and implementation
***********************************************************************/
public class StandardBuildTests extends TestCase {
private static final String DEFAULT_BUILD_COMMAND = "make";
private static final String EMPTY_STRING = "";
private static final boolean OFF = false;
private static final boolean ON = true;
private static final String OVR_BUILD_ARGS = "-f";
private static final String OVR_BUILD_COMMAND = "/home/tester/bin/nmake";
private static final String OVR_BUILD_LOCATION = "src";
private static final String[] OVR_INC_PATHS = {"/test", "C:\\windows", "//dev/home/include"};
private static final String[] OVR_PREPROC_SYMS = {"_RELEASE", "NO ", " YES=1"};
private static final String PROJECT_NAME = "StandardBuildTest";
private class ScannerListener implements IScannerInfoChangeListener {
private final String[] expectedPaths = {"/usr/include", "/home/tester/include", "/opt/gnome/include"};
private final String[] expectedSymbols = {"_DEBUG", "TRUE=1", "FALSE ", ""};
private boolean bNotified = false;
public void changeNotification(IResource project, IScannerInfo info) {
// Are there any symbols
Map definedSymbols = info.getDefinedSymbols();
if (!definedSymbols.isEmpty()) {
assertTrue(definedSymbols.containsKey(expectedSymbols[0]));
assertEquals(EMPTY_STRING, (String)definedSymbols.get(expectedSymbols[0]));
assertTrue(definedSymbols.containsKey("TRUE"));
assertEquals("1", (String)definedSymbols.get("TRUE"));
assertFalse(definedSymbols.containsKey(expectedSymbols[2]));
assertTrue(definedSymbols.containsKey(expectedSymbols[2].trim()));
assertEquals(EMPTY_STRING, (String)definedSymbols.get(expectedSymbols[2].trim()));
// We should have discarded the empty string
assertFalse(definedSymbols.containsKey(""));
}
// What paths have been set
String[] paths = info.getIncludePaths();
if (paths.length > 0) {
assertTrue(Arrays.equals(expectedPaths, paths));
}
bNotified = true;
}
/**
* @return
*/
public String[] getExpectedPaths() {
return expectedPaths;
}
public boolean triggedNotification() {
return bNotified;
}
/**
* @return
*/
public String[] getExpectedSymbols() {
return expectedSymbols;
}
}
/**
* @param name
*/
public StandardBuildTests(String name) {
super(name);
}
public static Test suite() {
TestSuite suite = new TestSuite(StandardBuildTests.class.getName());
// Add the relevant tests to the suite
suite.addTest(new StandardBuildTests("testProjectCreation"));
suite.addTest(new StandardBuildTests("testProjectSettings"));
suite.addTest(new StandardBuildTests("testProjectConversion"));
suite.addTest(new StandardBuildTests("testScannerListenerInterface"));
suite.addTest(new StandardBuildTests("testProjectCleanup"));
return suite;
}
private void checkDefaultProjectSettings(IProject project) throws Exception {
assertNotNull(project);
// There should not be any include path or defined symbols for the project
MakeScannerInfo scannerInfo = MakeScannerProvider.getDefault().getMakeScannerInfo(project, true);
assertNotNull(scannerInfo);
String[] includePaths = scannerInfo.getIncludePaths();
assertNotNull(includePaths);
assertEquals(0, includePaths.length);
String[] definedSymbols = scannerInfo.getPreprocessorSymbols();
assertNotNull(definedSymbols);
assertEquals(0, definedSymbols.length);
IMakeBuilderInfo builderInfo = MakeCorePlugin.createBuildInfo(project, MakeBuilder.BUILDER_ID);
// Check the rest of the project information
assertEquals(ON, builderInfo.isDefaultBuildCmd());
assertEquals(OFF,builderInfo.isStopOnError());
assertEquals(new Path(DEFAULT_BUILD_COMMAND), builderInfo.getBuildCommand());
assertEquals(EMPTY_STRING, builderInfo.getBuildArguments());
assertEquals(false, builderInfo.isAutoBuildEnable());
assertEquals("all", builderInfo.getAutoBuildTarget());
assertEquals(true, builderInfo.isIncrementalBuildEnabled());
assertEquals("all", builderInfo.getIncrementalBuildTarget());
assertEquals(true, builderInfo.isFullBuildEnabled());
assertEquals("clean all", builderInfo.getFullBuildTarget());
}
private void checkOverriddenProjectSettings(IProject project) throws Exception {
assertNotNull(project);
MakeScannerInfo scannerInfo = MakeScannerProvider.getDefault().getMakeScannerInfo(project, true);
assertNotNull(scannerInfo);
String[] includePaths = scannerInfo.getIncludePaths();
assertNotNull(includePaths);
assertEquals(3, includePaths.length);
assertTrue(Arrays.equals(includePaths, OVR_INC_PATHS));
String[] definedSymbols = scannerInfo.getPreprocessorSymbols();
assertNotNull(definedSymbols);
assertEquals(3, definedSymbols.length);
assertTrue(Arrays.equals(definedSymbols, OVR_PREPROC_SYMS));
// Check the rest of the project information
IMakeBuilderInfo builderInfo = MakeCorePlugin.createBuildInfo(project, MakeBuilder.BUILDER_ID);
assertEquals(OFF, builderInfo.isDefaultBuildCmd());
assertEquals(ON, builderInfo.isStopOnError());
assertEquals(new Path(OVR_BUILD_COMMAND), builderInfo.getBuildCommand());
assertEquals(OVR_BUILD_ARGS, builderInfo.getBuildArguments());
assertEquals(new Path(OVR_BUILD_LOCATION), builderInfo.getBuildLocation());
}
/**
* Create a new project named <code>name</code> or return the project in
* the workspace of the same name if it exists.
*
* @param name The name of the project to create or retrieve.
* @return
* @throws CoreException
*/
private IProject createProject(String name) throws CoreException {
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IProject project = root.getProject(name);
if (!project.exists()) {
project.create(null);
} else {
project.refreshLocal(IResource.DEPTH_INFINITE, null);
}
if (!project.isOpen()) {
project.open(null);
}
return project;
}
/**
* Remove the <code>IProject</code> with the name specified in the argument from the
* receiver's workspace.
*
* @param name
*/
private void removeProject(String name) {
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IProject project = root.getProject(name);
if (project.exists()) {
try {
project.delete(true, false, null);
} catch (CoreException e) {
assertTrue(false);
}
}
}
/**
* Remove all the project information associated with the project used during test.
*/
public void testProjectCleanup() {
removeProject(PROJECT_NAME);
}
public void testProjectConversion() throws Exception {
// Open the project
IProject project = null;
try {
project = createProject(PROJECT_NAME);
} catch (CoreException e) {
fail("StandardBuildTest testProjectConversion failed opening project: " + e.getLocalizedMessage());
}
assertNotNull(project);
// Check the settings (they should be the override values)
checkOverriddenProjectSettings(project);
// Now convert the project
try {
CCorePlugin.getDefault().convertProjectFromCtoCC(project, new NullProgressMonitor());
} catch (CoreException e) {
fail("StandardBuildTest testProjectConversion failed to convert project: " + e.getLocalizedMessage());
}
// Close, and Reopen the project
try {
project.close(new NullProgressMonitor());
} catch (CoreException e) {
fail("StandardBuildTest testProjectConversion failed to close project " + e.getLocalizedMessage());
}
try {
project.open(new NullProgressMonitor());
} catch (CoreException e) {
fail ("StandardBuildTest testProjectConversion failed to open project " + e.getLocalizedMessage());
}
// Make sure it has a CCNature
try {
project.hasNature(CCProjectNature.CC_NATURE_ID);
} catch (CoreException e) {
fail("StandardBuildTest testProjectConversion failed getting nature: " + e.getLocalizedMessage());
}
// Nothing should have changed in the settings
checkOverriddenProjectSettings(project);
}
/**
*
*/
public void testProjectCreation() throws Exception {
// Create a new project
IProject project = null;
try {
project = createProject(PROJECT_NAME);
// Convert the new project to a standard make project
CCorePlugin.getDefault().convertProjectToCC(project, new NullProgressMonitor(), MakeCorePlugin.MAKE_PROJECT_ID);
MakeProjectNature.addNature(project, null);
} catch (CoreException e) {
fail("StandardBuildTest testProjectCreation failed creating project: " + e.getLocalizedMessage());
}
assertNotNull(project);
// Make sure it has a CNature
try {
project.hasNature(CProjectNature.C_NATURE_ID);
} catch (CoreException e) {
fail("StandardBuildTest testProjectCreation failed getting nature: " + e.getLocalizedMessage());
}
// Make sure it has a MakeNature
try {
project.hasNature(MakeProjectNature.NATURE_ID);
} catch (CoreException e) {
fail("StandardBuildTest testProjectCreation failed getting nature: " + e.getLocalizedMessage());
}
// Check the default settings
checkDefaultProjectSettings(project);
}
public void testProjectSettings() throws Exception {
// Get the project
IProject project = null;
try {
project = createProject(PROJECT_NAME);
} catch (CoreException e) {
fail("StandardBuildTest testProjectSettings failed opening project: " + e.getLocalizedMessage());
}
assertNotNull(project);
// Change the settings
MakeScannerInfo scannerInfo = MakeScannerProvider.getDefault().getMakeScannerInfo(project, false);
scannerInfo.setIncludePaths(OVR_INC_PATHS);
scannerInfo.setPreprocessorSymbols(OVR_PREPROC_SYMS);
scannerInfo.update();
// Use the build info for the rest of the settings
IMakeBuilderInfo builderInfo = MakeCorePlugin.createBuildInfo(project, MakeBuilder.BUILDER_ID);
builderInfo.setStopOnError(ON);
builderInfo.setUseDefaultBuildCmd(OFF);
builderInfo.setBuildCommand(new Path(OVR_BUILD_COMMAND));
builderInfo.setBuildArguments(OVR_BUILD_ARGS);
builderInfo.setBuildLocation(new Path(OVR_BUILD_LOCATION));
try {
project.close(new NullProgressMonitor());
} catch (CoreException e) {
fail("StandardBuildTest testProjectSettings failed to close project " + e.getLocalizedMessage());
}
try {
project.open(new NullProgressMonitor());
} catch (CoreException e) {
fail ("StandardBuildTest testProjectSettings failed to open project " + e.getLocalizedMessage());
}
// Retest
checkOverriddenProjectSettings(project);
}
public void testScannerListenerInterface() throws Exception {
// Get the project
IProject project = null;
try {
project = createProject(PROJECT_NAME);
} catch (CoreException e) {
fail("StandardBuildTest testScannerListernerInterface failed opening project: " + e.getLocalizedMessage());
}
assertNotNull(project);
// Find the scanner info provider for this project
IScannerInfoProvider provider = CCorePlugin.getDefault().getScannerInfoProvider(project);
assertNotNull(provider);
// Check out the information we can get through the interface
IScannerInfo currentSettings = provider.getScannerInformation(project);
Map currentSymbols = currentSettings.getDefinedSymbols();
assertTrue(currentSymbols.containsKey("_RELEASE"));
assertEquals("", currentSymbols.get("_RELEASE"));
assertTrue(currentSymbols.containsKey("YES"));
assertEquals("1", currentSymbols.get("YES"));
assertTrue(currentSymbols.containsKey("NO"));
assertEquals("", currentSymbols.get("NO"));
String[] currentPaths = currentSettings.getIncludePaths();
assertTrue(Arrays.equals(OVR_INC_PATHS, currentPaths));
// Remove what's there
MakeScannerInfo info = MakeScannerProvider.getDefault().getMakeScannerInfo(project, false);
info.setIncludePaths(new String[0]);
info.setPreprocessorSymbols(new String[0]);
info.update();
// Subscribe
ScannerListener listener = new ScannerListener();
provider.subscribe(project, listener);
// Change the settings
info.setIncludePaths(listener.getExpectedPaths());
info.setPreprocessorSymbols(listener.getExpectedSymbols());
info.update();
assertEquals(true, listener.triggedNotification());
// Unsubscribe
provider.unsubscribe(project, listener);
}
}