/*******************************************************************************
* Copyright (c) 2005, 2011 Intel Corporation and others.
* 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:
* Intel Corporation - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.managedbuilder.core.tests;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICDescriptor;
import org.eclipse.cdt.managedbuilder.core.BuildException;
import org.eclipse.cdt.managedbuilder.core.IBuilder;
import org.eclipse.cdt.managedbuilder.core.IConfiguration;
import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo;
import org.eclipse.cdt.managedbuilder.core.IManagedProject;
import org.eclipse.cdt.managedbuilder.core.IProjectType;
import org.eclipse.cdt.managedbuilder.core.ITool;
import org.eclipse.cdt.managedbuilder.core.IToolChain;
import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin;
import org.eclipse.cdt.managedbuilder.core.ManagedCProjectNature;
import org.eclipse.cdt.managedbuilder.projectconverter.UpdateManagedProjectManager;
import org.eclipse.cdt.managedbuilder.testplugin.CTestPlugin;
import org.eclipse.cdt.managedbuilder.testplugin.ManagedBuildTestHelper;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceDescription;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.ui.dialogs.IOverwriteQuery;
public class MultiVersionSupportTests extends TestCase {
static IProject proj = null;
static IManagedProject mproj = null;
IConfiguration[] cfgs = null;
private IWorkspace worksp;
public MultiVersionSupportTests() { super(); }
public MultiVersionSupportTests(String name) { super(name); }
public static Test suite() {
TestSuite suite = new TestSuite(MultiVersionSupportTests.class.getName());
//$JUnit-BEGIN$
suite.addTest(new MultiVersionSupportTests("testProjectConverterConvenienceRoutines")); //$NON-NLS-1$
suite.addTest(new MultiVersionSupportTests("testConfigurationNameProvider")); //$NON-NLS-1$
suite.addTest(new MultiVersionSupportTests("testConfigurationDescription")); //$NON-NLS-1$
suite.addTest(new MultiVersionSupportTests("testVersionInfo")); //$NON-NLS-1$
suite.addTest(new MultiVersionSupportTests("testVersionsSupportedAttribute")); //$NON-NLS-1$
//the test is invalid, disabling for now (see bug# 193831)
// suite.addTest(new MultiVersionSupportTests("testToolChainConversion_CDT20")); //$NON-NLS-1$
suite.addTest(new MultiVersionSupportTests("testToolChainConversion_CDT21")); //$NON-NLS-1$
suite.addTest(new MultiVersionSupportTests("testProjectConversion")); //$NON-NLS-1$
//$JUnit-END$
return suite;
}
/*
* This function tests the functionality of Project converter convenience routines
* defined in ManagedBuildManager class. These convenience routines are generic routines
* anyone can use them
* i) To find out whether any converters are available for a given Build Object,
* ii) To get a list of converters
* iii) To convert a Build Object
*/
public void testProjectConverterConvenienceRoutines() throws Exception {
String projectName = "TestProjectConverterConvenienceRoutines"; //$NON-NLS-1$
String projectTypeId = "testProjectConverterConvenienceRoutines.exe"; //$NON-NLS-1$
doInit(projectName, projectTypeId);
// It should contain only one configuration.
assertEquals(cfgs.length, 1);
IToolChain toolChain = cfgs[0].getToolChain();
// Check whether this tool chain has converters using generic convenience routine.
boolean hasConverters = ManagedBuildManager.hasTargetConversionElements(toolChain);
// Expected value is 'true'
assertEquals(hasConverters, true);
// Get the list of available converters for ths tool chain using generic convenience routine
Map<String, IConfigurationElement> converters = ManagedBuildManager.getConversionElements(toolChain);
// Expected value for the number of converters available is '1'
assertEquals(converters.size(), 1);
return;
}
/*
* This function tests the functionality of configuration name provider.
* Using this functionality, Tool Integrator can provide configuration names dynamically
* based on the OS, architecture.
*
* In plugin manifest file, there are 4 configurations defined for the project type
* "cdt.managedbuild.target.testMultipleVersions.exe". Two configurations are defined with "Debug"
* as their name and other two are defined with "Release" as their name. But user will see the
* configuration names as "Debug", "Release", "Debug_ia64" and "Release_ia64" while creating a project.
*
*/
public void testConfigurationNameProvider()throws Exception {
String [] expectedConfigNames = { "Debug","Release","Debug_ia64","Release_ia64" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
String [] actualConfigNames = new String[4];
// create managed project
String projectName = "TestConfigurationNameProvider"; //$NON-NLS-1$
String projectTypeId = "cdt.managedbuild.target.testMultipleVersions.exe"; //$NON-NLS-1$
doInit(projectName, projectTypeId);
// Check the configuration names
cfgs = mproj.getConfigurations();
// Get the actual configuration names
for (int i = 0; i < cfgs.length; i++) {
actualConfigNames[i] = cfgs[i].getName();
}
// Compare the expected and actual,
for (int i = 0; i < expectedConfigNames.length; i++) {
assertTrue( isArrayContains(actualConfigNames, expectedConfigNames[i]) );
}
return;
}
/*
* This function tests whether the newly added attribute 'description' is retrived from plugin
* manifest file correctly or not. There are 4 configurations defined with different description
* each configuration. This function checks the description of each configuration against
* expected description after creating a project.
*/
public void testConfigurationDescription()throws Exception {
String [] expectedConfigDescriptions = { "debug configuration for IA32 windows","release configuration for IA32 windows","debug configuration for IA64 windows","release configuration for IA64 windows" }; //$NON-NLS-1$
String [] actualConfigDescriptions = new String[4];
// create managed project
String projectName = "TestConfigurationDescription"; //$NON-NLS-1$
String projectTypeId = "cdt.managedbuild.target.testMultipleVersions.exe"; //$NON-NLS-1$
doInit(projectName, projectTypeId);
// Check the configuration descriptions
cfgs = mproj.getConfigurations();
// Get the actual configuration names
for (int i = 0; i < cfgs.length; i++) {
actualConfigDescriptions[i] = cfgs[i].getDescription();
}
// Compare the expected and actual,
for (int i = 0; i < expectedConfigDescriptions.length; i++) {
assertTrue( isArrayContains(actualConfigDescriptions, expectedConfigDescriptions[i]) );
}
return;
}
/*
* This function tests whether the version information stored with in the 'id' of ToolChain/Tool/Builder
* is retrived from plugin manifest file correctly or not.
*/
public void testVersionInfo()throws Exception {
String projectName = "TestVersionInfo"; //$NON-NLS-1$
String projectTypeId = "cdt.managedbuild.target.testMultipleVersions.exe"; //$NON-NLS-1$
// create managed project
doInit(projectName, projectTypeId);
// Check the configuration descriptions
cfgs = mproj.getConfigurations();
// Check the version information of ToolChain/Tool/Builder defined under 'Release' Configuration.
// It should return the version as '0.0.4' as there is no version information defined
// for ToolChain/Tool/Builder. The version '0.0.4' is the default version for CDT3.0
// Release configuration 'id' : "cdt.managedbuild.config.testMultipleVersions.exe.release.1"
IConfiguration releaseConfig = mproj.getConfiguration("cdt.managedbuild.config.testMultipleVersions.exe.release.1"); //$NON-NLS-1$
// the toolchain version should be '0.0.4' as this is default value
assertEquals(releaseConfig.getToolChain().getVersion().toString(), "0.0.4"); //$NON-NLS-1$
// Get the tools of this toolChain and verify the version of each tool
// Each tool version in release configuration should be "0.0.4"
ITool [] tools = releaseConfig.getToolChain().getTools();
for (int i = 0; i < tools.length; i++) {
ITool tool = tools[i];
assertEquals(tool.getVersion().toString(),"0.0.4"); //$NON-NLS-1$
}
// check the builder version
IBuilder builder = releaseConfig.getToolChain().getBuilder();
assertEquals(builder.getVersion().toString(),"0.0.4"); //$NON-NLS-1$
// Check the versions of ToolChain/Tool/Builder in Debug Configuration
// Expected version: "1.1.0" for all ToolChain/Tool(s)/Builder.
// Get the 'Debug' Configuration
// Debug configuration 'id' : "cdt.managedbuild.config.testMultipleVersions.exe.debug.0"
IConfiguration debugConfig = mproj.getConfiguration("cdt.managedbuild.config.testMultipleVersions.exe.debug.0"); //$NON-NLS-1$
// the toolchain version should be '1.1.0' as that's what defined in plugin manifest file
assertEquals(debugConfig.getToolChain().getVersion().toString(), "1.1.0"); //$NON-NLS-1$
// Get the tools of this toolChain and verify the version of each tool
// Each tool version in debug configuration should be "1.1.0"
tools = debugConfig.getToolChain().getTools();
for (int i = 0; i < tools.length; i++) {
ITool tool = tools[i];
assertEquals(tool.getVersion().toString(),"1.1.0"); //$NON-NLS-1$
}
// check the builder version
builder = debugConfig.getToolChain().getBuilder();
assertEquals(builder.getVersion().toString(),"1.1.0"); //$NON-NLS-1$
// Get the 'Debug64' Configuration
// Debug configuration 'id' : "cdt.managedbuild.config.testMultipleVersions.exe.debug.0"
IConfiguration debug64Config = mproj.getConfiguration("cdt.managedbuild.config.testMultipleVersions.exe.debug64.2"); //$NON-NLS-1$
// the toolchain version should be '2.2.0' as that's what defined in plugin manifest file
assertEquals(debug64Config.getToolChain().getVersion().toString(), "2.2.0"); //$NON-NLS-1$
// Get the tools of this toolChain and verify the version of each tool
// Each tool version in debug64 configuration should be "5.0.9" (defined in plugin manifest file)
tools = debug64Config.getToolChain().getTools();
for (int i = 0; i < tools.length; i++) {
ITool tool = tools[i];
assertEquals(tool.getVersion().toString(),"5.0.9"); //$NON-NLS-1$
}
// check the builder version , expected value : "3.2.1" defined in plugin manifest file
builder = debug64Config.getToolChain().getBuilder();
assertEquals(builder.getVersion().toString(),"3.2.1"); //$NON-NLS-1$
return;
}
/*
* This function tests whether the attribute 'versionsSupported' of
* ToolChain/Tool/Builder elements is retrived from plugin manifest file correctly or not.
*/
public void testVersionsSupportedAttribute() throws Exception {
// create managed project
String projectName = "TestVersionSupportAttribute"; //$NON-NLS-1$
String projectTypeId = "cdt.managedbuild.target.testMultipleVersions.exe"; //$NON-NLS-1$
doInit(projectName, projectTypeId);
// Check the configuration descriptions
cfgs = mproj.getConfigurations();
// Check the version information of ToolChain/Tool/Builder defined under 'Release' Configuration.
// It should return the version as '0.0.4' as there is no version information defined
// for ToolChain/Tool/Builder. The version '0.0.4' is the default version for CDT3.0
// Release configuration 'id' : "cdt.managedbuild.config.testMultipleVersions.exe.release64.3"
IConfiguration releaseConfig = mproj.getConfiguration("cdt.managedbuild.config.testMultipleVersions.exe.release64.3"); //$NON-NLS-1$
// Get the tool chain
IToolChain toolChain = releaseConfig.getToolChain();
//Get the 'versionsSupported' attribute of toolChain
String toolChainVersionsSupported = toolChain.getVersionsSupported();
// Compare with the expected value "1.2.0,2.0.0,2.1.3"
assertEquals(toolChainVersionsSupported,"1.2.0,2.0.0,2.1.3"); //$NON-NLS-1$
// Get the builder
IBuilder builder = releaseConfig.getToolChain().getBuilder();
// Get the 'versionsSupported' attribute of builder
String versionsSupported = builder.getVersionsSupported();
// Compare with expected value "2.0.0,2.1.1,3.0.3"
assertEquals(versionsSupported,"2.0.0,2.1.1,3.0.3"); //$NON-NLS-1$
}
static void createManagedProject(String name, String projectTypeId) {
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
proj = root.getProject(name);
if (proj.exists()) {
mproj = ManagedBuildManager.getBuildInfo(proj).getManagedProject();
} else {
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceDescription workspaceDesc = workspace.getDescription();
workspaceDesc.setAutoBuilding(false);
try {
workspace.setDescription(workspaceDesc);
proj = CCorePlugin.getDefault().createCProject(workspace.newProjectDescription(proj.getName()),
proj, new NullProgressMonitor(), ManagedBuilderCorePlugin.MANAGED_MAKE_PROJECT_ID);
// add ManagedBuildNature
IManagedBuildInfo info = ManagedBuildManager.createBuildInfo(proj);
info.setValid(true);
ManagedCProjectNature.addManagedNature(proj, null);
ManagedCProjectNature.addManagedBuilder(proj, null);
ICDescriptor desc = CCorePlugin.getDefault().getCProjectDescription(proj, true);
desc.remove(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID);
desc.create(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID, ManagedBuildManager.INTERFACE_IDENTITY);
desc.saveProjectData();
} catch (CoreException e) {
fail("Cannot create project: " + e.getLocalizedMessage()); //$NON-NLS-1$
}
// Call this function just to avoid init problems in getProjectType();
ManagedBuildManager.getDefinedProjectTypes();
IProjectType projType = ManagedBuildManager.getProjectType(projectTypeId);
assertNotNull(projType);
try {
mproj = ManagedBuildManager.createManagedProject(proj, projType);
} catch (BuildException e) {}
ManagedBuildManager.setNewProjectVersion(proj);
IConfiguration[] cfgs = projType.getConfigurations();
for (int i = 0; i < cfgs.length; i++) { // sic ! from 1
mproj.createConfiguration(cfgs[i], cfgs[i].getId() + "." + i); //$NON-NLS-1$
}
if( cfgs.length > 0)
ManagedBuildManager.setDefaultConfiguration(proj, cfgs[0]);
else
ManagedBuildManager.setDefaultConfiguration(proj, null);
}
// open project w/o progress monitor; no action performed if it's opened
try {
proj.open(null);
} catch (CoreException e) {}
}
/*
* isArrayContains()
*/
private boolean isArrayContains(String[] actualConfigNames, String name) {
if (actualConfigNames != null) {
for (int i = 0; i < actualConfigNames.length; i++) {
if ( ( actualConfigNames[i] != null) && (actualConfigNames[i].equals(name)) ) {
return true;
}
}
}
return false;
}
/**
* doInit() - call it at the beginning of every test
*
*/
private void doInit(String projectName, String projectTypeId) {
createManagedProject(projectName, projectTypeId);
assertNotNull(proj);
assertNotNull(mproj);
worksp = proj.getWorkspace();
assertNotNull(worksp);
cfgs = mproj.getConfigurations();
assertNotNull(cfgs);
}
public void testToolChainConversion_CDT20() throws Exception {
// Pass projDirName as 'test20', and 'true' to update Project
doTestProjectUpdate("test20", true); //$NON-NLS-1$
String tmpDir = System.getProperty("java.io.tmpdir"); //$NON-NLS-1$
File inputFile = new File(tmpDir + "/converterOutput20.txt"); //$NON-NLS-1$
try {
assertTrue(inputFile.exists());
String expectedContent = "Converter for CDT 2.0 Project is invoked"; //$NON-NLS-1$
BufferedReader data = new BufferedReader(new FileReader(inputFile));
String actualContent;
if ((actualContent = data.readLine()) != null) {
assertEquals(actualContent,expectedContent);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void testToolChainConversion_CDT21() throws Exception {
// Pass projDirName as 'test21', and 'true' to update Project
doTestProjectUpdate("test21", true); //$NON-NLS-1$
String tmpDir = System.getProperty("java.io.tmpdir"); //$NON-NLS-1$
File inputFile = new File(tmpDir + "/converterOutput21.txt"); //$NON-NLS-1$
try {
assertTrue(inputFile.exists());
String expectedContent = "Converter for CDT 2.1 Project is invoked"; //$NON-NLS-1$
BufferedReader data = new BufferedReader(new FileReader(inputFile));
String actualContent;
if ((actualContent = data.readLine()) != null) {
assertEquals(actualContent,expectedContent);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void testProjectConversion() throws Exception {
// Pass the 'projDirName' as 'testProjectConversion', and 'true' to update Project
doTestProjectUpdate("testProjectConversion", true); //$NON-NLS-1$
String tmpDir = System.getProperty("java.io.tmpdir"); //$NON-NLS-1$
File inputFile = new File(tmpDir + "/testProjectConverterOutput.txt"); //$NON-NLS-1$
try {
assertTrue(inputFile.exists());
String expectedContent = "The converter for the projectType testProject_1.0.0 is invoked"; //$NON-NLS-1$
BufferedReader data = new BufferedReader(new FileReader(inputFile));
String actualContent;
if ((actualContent = data.readLine()) != null) {
assertEquals(actualContent,expectedContent);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private IProject getCDT_TestProject(String projDirName) {
IProject project = null;
File file = null;
if (projDirName.equalsIgnoreCase("test20")) { //$NON-NLS-1$
file = CTestPlugin.getFileInPlugin(new Path(
"resources/toolChainConversionProjects/test20")); //$NON-NLS-1$
} else if (projDirName.equals("test21")) { //$NON-NLS-1$
file = CTestPlugin.getFileInPlugin(new Path(
"resources/toolChainConversionProjects/test21")); //$NON-NLS-1$
} else if (projDirName.equals("testProjectConversion")) { //$NON-NLS-1$
file = CTestPlugin.getFileInPlugin(new Path(
"resources/toolChainConversionProjects/testProjectConversion")); //$NON-NLS-1$
}
if (file == null) {
fail("Test project directory " //$NON-NLS-1$
+ " is missing."); //$NON-NLS-1$
return null;
}
File projectZips[] = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if (pathname.isDirectory())
return false;
return true;
}
});
ArrayList<IProject> projectList = new ArrayList<IProject>(projectZips.length);
assertEquals(projectZips.length, 1);
try {
String projectName = projectZips[0].getName();
if (!projectName.endsWith(".zip"))
fail("No projects found in test 'toolChainConversionProjects' project directory " //$NON-NLS-1$
+ file.getName()
+ ". The .zip file may be missing or corrupt."); //$NON-NLS-1$
projectName = projectName.substring(0, projectName.length()
- ".zip".length()); //$NON-NLS-1$
if (projectName.length() == 0)
fail("No projects found in test 'toolChainConversionProjects' project directory " //$NON-NLS-1$
+ file.getName()
+ ". The .zip file may be missing or corrupt."); //$NON-NLS-1$
// IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
// Path path = (Path) root.getLocation();
// IPath location = new Path( root.getLocation().toString() );
project = ManagedBuildTestHelper.createProject(
projectName, projectZips[0], null, null);
if (project != null)
projectList.add(project);
} catch (Exception e) {
System.out.println("Exception Occured."); //$NON-NLS-1$
}
if (projectList.size() == 0) {
fail("No projects found in test project directory " //$NON-NLS-1$
+ file.getName()
+ ". The .zip file may be missing or corrupt."); //$NON-NLS-1$
return null;
}
return project;
}
private void doTestProjectUpdate(String projDirName, boolean updateProject) {
IOverwriteQuery queryALL = new IOverwriteQuery(){
@Override
public String queryOverwrite(String file) {
return ALL;
}};
IOverwriteQuery queryNOALL = new IOverwriteQuery(){
@Override
public String queryOverwrite(String file) {
return NO_ALL;
}};
UpdateManagedProjectManager.setUpdateProjectQuery(updateProject ? queryALL : queryNOALL);
final IProject project = getCDT_TestProject(projDirName);
if (project == null)
return;
// the project conversion occurs the first time
// ManagedBuildManager.getBuildInfo gets called
// If requires it also invokes converters for the project.
IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project);
// check whether the managed build info is converted
boolean isCompatible = UpdateManagedProjectManager
.isCompatibleProject(info);
assertTrue(isCompatible);
if (isCompatible) {
// check for correct update
if (!updateProject) {
// TODO: if the user has chosen not to update the
// project the
// .cdtbuild file should not change
} else {
// Make sure that we have a valid project
if (info == null || info.getManagedProject() == null
|| info.getManagedProject().isValid() == false) {
fail("the project \"" + project.getName() //$NON-NLS-1$
+ "\" was not properly converted"); //$NON-NLS-1$
}
}
}
ManagedBuildTestHelper.removeProject(project.getName());
}
}