/*******************************************************************************
* Copyright (c) 2004, 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
* Baltasar Belyavsky (Texas Instruments) - [279633] Custom command-generator support
*******************************************************************************/
package org.eclipse.cdt.managedbuilder.core.tests;
import java.util.ArrayList;
import junit.framework.TestCase;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo;
import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
import org.eclipse.cdt.managedbuilder.core.IProjectType;
import org.eclipse.cdt.managedbuilder.core.IConfiguration;
import org.eclipse.cdt.managedbuilder.core.ITool;
import org.eclipse.cdt.managedbuilder.core.IOption;
import org.eclipse.cdt.managedbuilder.core.IManagedCommandLineGenerator;
import org.eclipse.cdt.managedbuilder.core.IManagedCommandLineInfo;
import org.eclipse.cdt.managedbuilder.internal.core.ManagedCommandLineGenerator;
import org.eclipse.cdt.managedbuilder.makegen.IManagedBuilderMakefileGenerator;
import org.eclipse.cdt.managedbuilder.testplugin.ManagedBuildTestHelper;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
public class ManagedCommandLineGeneratorTest extends TestCase {
private static String[] testCommandLinePatterns = {
null,
"${COMMAND}",
"${COMMAND} ${FLAGS}",
"${COMMAND} ${FLAGS} ${OUTPUT_FLAG}",
"${COMMAND} ${FLAGS} ${OUTPUT_FLAG}${OUTPUT_PREFIX}",
"${COMMAND} ${FLAGS} ${OUTPUT_FLAG}${OUTPUT_PREFIX}${OUTPUT}",
"${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT}",
"${COMMAND} ${FLAGS} ${OUTPUT_FLAG}${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}",
"${command} ${flags} ${output_flag}${output_prefix}${output} ${WRONG_VAR_NAME}"
};
private static String COMMAND_VAL = "[command]";
private static String FLAGS_VAL = "[flags]";
private static String[] FLAGS_ARRAY_VAL = FLAGS_VAL.split( "\\s" );
private static String OUTPUT_FLAG_VAL = "[outputFlag]";
private static String OUTPUT_PREFIX_VAL = "[outputPrefix]";
private static String OUTPUT_VAL = "[output]";
private static String INPUTS_VAL = "[inputs]";
private static String[] INPUTS_ARRAY_VAL = INPUTS_VAL.split( "\\s" );
private static String[] commandLineEtalonesForPatterns = {
COMMAND_VAL + " " + FLAGS_VAL + " " + OUTPUT_FLAG_VAL + " " + OUTPUT_PREFIX_VAL + "\"" + OUTPUT_VAL + "\"" + " " + "\"" + INPUTS_VAL + "\"",
COMMAND_VAL,
COMMAND_VAL + " " + FLAGS_VAL,
COMMAND_VAL + " " + FLAGS_VAL + " " + OUTPUT_FLAG_VAL,
COMMAND_VAL + " " + FLAGS_VAL + " " + OUTPUT_FLAG_VAL + OUTPUT_PREFIX_VAL,
COMMAND_VAL + " " + FLAGS_VAL + " " + OUTPUT_FLAG_VAL + OUTPUT_PREFIX_VAL + "\"" + OUTPUT_VAL + "\"",
COMMAND_VAL + " " + FLAGS_VAL + " " + OUTPUT_FLAG_VAL + " " + OUTPUT_PREFIX_VAL + "\"" + OUTPUT_VAL + "\"",
COMMAND_VAL + " " + FLAGS_VAL + " " + OUTPUT_FLAG_VAL + OUTPUT_PREFIX_VAL + "\"" + OUTPUT_VAL + "\"" + " " + "\"" + INPUTS_VAL + "\"",
COMMAND_VAL + " " + FLAGS_VAL + " " + OUTPUT_FLAG_VAL + OUTPUT_PREFIX_VAL + "\"" + OUTPUT_VAL + "\"" + " " + "${WRONG_VAR_NAME}" };
public ManagedCommandLineGeneratorTest( String name ) {
super(name);
}
public static Test suite() {
return new TestSuite(ManagedCommandLineGeneratorTest.class);
}
public final void testGetCommandLineGenerator() {
IManagedCommandLineGenerator gen = ManagedCommandLineGenerator.getCommandLineGenerator();
assertNotNull( gen );
}
public final void testGenerateCommandLineInfoPatterns() {
IManagedCommandLineGenerator gen = ManagedCommandLineGenerator.getCommandLineGenerator();
IManagedCommandLineInfo info = null;
for( int i = 0; i < testCommandLinePatterns.length; i++ ) {
info = gen.generateCommandLineInfo( null, COMMAND_VAL, FLAGS_ARRAY_VAL, OUTPUT_FLAG_VAL, OUTPUT_PREFIX_VAL, OUTPUT_VAL, INPUTS_ARRAY_VAL,
testCommandLinePatterns[i] );
assertNotNull(info);
if( i < commandLineEtalonesForPatterns.length ) {
assertEquals("i="+i, commandLineEtalonesForPatterns[i], info.getCommandLine());
}
}
}
public final void testGenerateCommandLineInfoDoublePattern() {
IManagedCommandLineGenerator gen = ManagedCommandLineGenerator.getCommandLineGenerator();
IManagedCommandLineInfo info = gen.generateCommandLineInfo( null, COMMAND_VAL, FLAGS_ARRAY_VAL, OUTPUT_FLAG_VAL, OUTPUT_PREFIX_VAL, OUTPUT_VAL, INPUTS_ARRAY_VAL,
"${OUTPUT_FLAG} ${OUTPUT_FLAG}" );
assertNotNull(info);
assertEquals(OUTPUT_FLAG_VAL+" "+OUTPUT_FLAG_VAL, info.getCommandLine());
}
public final void testGenerateCommandLineInfoParameters() {
IManagedCommandLineGenerator gen = ManagedCommandLineGenerator.getCommandLineGenerator();
IManagedCommandLineInfo info = gen.generateCommandLineInfo( null, "", FLAGS_ARRAY_VAL, OUTPUT_FLAG_VAL, OUTPUT_PREFIX_VAL, OUTPUT_VAL, INPUTS_ARRAY_VAL, null );
assertNotNull(info);
assertEquals(FLAGS_VAL+" "+OUTPUT_FLAG_VAL+" "+OUTPUT_PREFIX_VAL + "\""+OUTPUT_VAL + "\""+" " + "\""+INPUTS_VAL + "\"", info.getCommandLine());
info = gen.generateCommandLineInfo( null, COMMAND_VAL, new String[0], OUTPUT_FLAG_VAL, OUTPUT_PREFIX_VAL, OUTPUT_VAL, INPUTS_ARRAY_VAL, null );
assertNotNull(info);
assertEquals(COMMAND_VAL+" "+OUTPUT_FLAG_VAL+" "+OUTPUT_PREFIX_VAL + "\""+OUTPUT_VAL + "\""+" " + "\""+INPUTS_VAL + "\"", info.getCommandLine());
info = gen.generateCommandLineInfo( null, COMMAND_VAL, FLAGS_ARRAY_VAL, "", OUTPUT_PREFIX_VAL, OUTPUT_VAL, INPUTS_ARRAY_VAL, null );
assertNotNull(info);
assertEquals(COMMAND_VAL+" "+FLAGS_VAL+" "+OUTPUT_PREFIX_VAL + "\""+OUTPUT_VAL + "\""+" " + "\""+INPUTS_VAL + "\"", info.getCommandLine());
info = gen.generateCommandLineInfo( null, COMMAND_VAL, FLAGS_ARRAY_VAL, OUTPUT_FLAG_VAL, "", OUTPUT_VAL, INPUTS_ARRAY_VAL, null );
assertNotNull(info);
assertEquals(COMMAND_VAL+" "+FLAGS_VAL+" "+OUTPUT_FLAG_VAL+" "+"\""+OUTPUT_VAL + "\""+" " + "\""+INPUTS_VAL + "\"", info.getCommandLine());
info = gen.generateCommandLineInfo( null, COMMAND_VAL, FLAGS_ARRAY_VAL, OUTPUT_FLAG_VAL, OUTPUT_PREFIX_VAL, "", INPUTS_ARRAY_VAL, null );
assertNotNull(info);
assertEquals(COMMAND_VAL+" "+FLAGS_VAL+" "+OUTPUT_FLAG_VAL+" "+OUTPUT_PREFIX_VAL+" " + "\""+INPUTS_VAL + "\"", info.getCommandLine());
info = gen.generateCommandLineInfo( null, COMMAND_VAL, FLAGS_ARRAY_VAL, OUTPUT_FLAG_VAL, OUTPUT_PREFIX_VAL, OUTPUT_VAL, new String[0], null );
assertNotNull(info);
assertEquals(COMMAND_VAL+" "+FLAGS_VAL+" "+OUTPUT_FLAG_VAL+" "+OUTPUT_PREFIX_VAL + "\""+OUTPUT_VAL + "\"", info.getCommandLine());
info = gen.generateCommandLineInfo( null, COMMAND_VAL, FLAGS_ARRAY_VAL, OUTPUT_FLAG_VAL, OUTPUT_PREFIX_VAL, OUTPUT_VAL, null, null );
assertNotNull(info);
assertEquals(COMMAND_VAL+" "+FLAGS_VAL+" "+OUTPUT_FLAG_VAL+" "+OUTPUT_PREFIX_VAL + "\""+OUTPUT_VAL + "\"", info.getCommandLine());
}
public final void testCustomGenerator() {
// First, verify the elements in the project type
IProjectType proj = ManagedBuildManager.getProjectType("cdt.managedbuild.test.java.attrs");
assertNotNull(proj);
IConfiguration[] configs = proj.getConfigurations();
assertEquals(1, configs.length);
IConfiguration config = proj.getConfiguration("cdt.managedbuild.test.java.attrs.config");
assertNotNull(config);
ITool[] tools = config.getTools();
assertEquals(1, tools.length);
ITool tool = config.getTool("cdt.managedbuild.test.java.attrs.tool");
assertNotNull(tool);
IOption[] options = tool.getOptions();
assertEquals(20, options.length);
IOption option = tool.getOption("testgnu.c.compiler.option.preprocessor.def.symbols.test");
assertNotNull(option);
Object val = option.getValue();
assertTrue(val instanceof ArrayList);
@SuppressWarnings("unchecked")
ArrayList<String> list = (ArrayList<String>)val;
assertEquals("foo", list.get(0));
assertEquals("bar", list.get(1));
// Next, invoke the commandLineGenerator for this tool
IManagedCommandLineGenerator gen = tool.getCommandLineGenerator();
String[] flags = {"-a", "-b", "-c"};
String[] inputs = {"xy.cpp", "ab.cpp", "lt.cpp", "c.cpp"};
IManagedCommandLineInfo info = gen.generateCommandLineInfo(tool, "MyName", flags, "-of", "opre", "TheOutput.exe", inputs, "[COMMAND] [FLAGS]");
assertEquals("compiler.gnu.cMyName", info.getCommandName());
assertEquals("-c -b -a", info.getFlags());
assertEquals("ab.cpp c.cpp foo.cpp lt.cpp xy.cpp", info.getInputs());
assertEquals("-0h", info.getOutputFlag());
assertEquals("", info.getOutputPrefix());
assertEquals("Testme", info.getOutput());
assertEquals("[COMMAND] [FLAGS]", info.getCommandLinePattern());
assertEquals("This is a test command line", info.getCommandLine());
// Next, invoke the build file generator for the tool chain
IManagedBuilderMakefileGenerator makeGen = ManagedBuildManager.getBuildfileGenerator(config);
String name = makeGen.getMakefileName();
assertEquals("TestBuildFile.mak", name);
}
public final void testCustomOptionCommandGenerator() {
try{
IProject project = ManagedBuildTestHelper.createProject("COCG", null, (IPath)null, "cdt.test.customOptionCommand.ProjectType");
IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project);
IConfiguration config = info.getDefaultConfiguration();
ITool[] tools = config.getToolsBySuperClassId("cdt.test.customOptionCommand.Tool");
assertEquals(tools.length, 1);
ITool tool = tools[0];
IOption option1 = tool.getOptionBySuperClassId("cdt.test.customOptionCommand.option1");
IOption option2 = tool.getOptionBySuperClassId("cdt.test.customOptionCommand.option2");
IOption option3 = tool.getOptionBySuperClassId("cdt.test.customOptionCommand.option3");
IOption option4 = tool.getOptionBySuperClassId("cdt.test.customOptionCommand.option4");
assertTrue(option1.getCommandGenerator() instanceof CustomOptionCommandGenerator);
assertTrue(option2.getCommandGenerator() instanceof CustomOptionCommandGenerator);
assertTrue(option3.getCommandGenerator() instanceof CustomOptionCommandGenerator);
assertNull(option4.getCommandGenerator());
option1 = config.setOption(tool, option1, new String[] {"val1", "val2", "${ProjName}"});
option2 = config.setOption(tool, option2, "${ProjName}");
option3 = config.setOption(tool, option3, "${ProjName}");
option4 = config.setOption(tool, option4, "${ProjName}");
/* Expected results
* option1: custom command-generator concatenates list-entries into quoted semicolon-separated list.
* option2/3: custom command-generator returns 'null' causing CDT to fall-back to default behaviour.
* option4: no custom command-generator contributed - CDT falls back to default behaviour.
*/
String command = tool.getToolCommandFlagsString(null, null);
assertEquals("-opt1=\"val1;val2;COCG;\" -opt2=COCG -opt3 COCG -opt4=COCG", command);
ManagedBuildTestHelper.removeProject("COCG");
}
catch(Exception e){
fail("Test failed on project creation: " + e.getLocalizedMessage());
}
}
public final void testDollarValue() {
try{
IProject project = ManagedBuildTestHelper.createProject("CDV", null, (IPath)null, "cdt.test.dollarValue.ProjectType");
IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project);
IConfiguration config = info.getDefaultConfiguration();
// Set values for the options
ITool[] tools = config.getToolsBySuperClassId("cdt.test.dollarValue.Tool");
assertEquals(tools.length, 1);
ITool tool = tools[0];
IOption option1 = tool.getOptionBySuperClassId("cdt.test.dollarValue.option1");
IOption option2 = tool.getOptionBySuperClassId("cdt.test.dollarValue.option2");
IOption option3 = tool.getOptionBySuperClassId("cdt.test.dollarValue.option3");
IOption option4 = tool.getOptionBySuperClassId("cdt.test.dollarValue.option4");
IOption option5 = tool.getOptionBySuperClassId("cdt.test.dollarValue.option5");
IOption option6 = tool.getOptionBySuperClassId("cdt.test.dollarValue.option6");
String command;
option1 = config.setOption(tool, option1, "OPT1VALUE");
option2 = config.setOption(tool, option2, "");
option3 = config.setOption(tool, option3, "X");
option4 = config.setOption(tool, option4, "opt4");
command = tool.getToolCommandFlagsString(null, null);
assertEquals("-opt1 OPT1VALUE X ${opt4}", command);
option1 = config.setOption(tool, option1, "");
option2 = config.setOption(tool, option2, "Opt2");
option3 = config.setOption(tool, option3, "All work and no play...");
option4 = config.setOption(tool, option4, "123456789");
option5 = config.setOption(tool, option5, "DollarValue");
command = tool.getToolCommandFlagsString(null, null);
assertEquals("-opt2Opt2suffix All work and no play... ${123456789} DollarValueDollarValue", command);
option1 = config.setOption(tool, option1, "0");
option2 = config.setOption(tool, option2, "LongValue");
option3 = config.setOption(tool, option3, "");
option4 = config.setOption(tool, option4, "");
option5 = config.setOption(tool, option5, "$");
option6 = config.setOption(tool, option6, "%%");
command = tool.getToolCommandFlagsString(null, null);
assertEquals("-opt1 0 -opt2LongValuesuffix $$ x%%yy%%z", command);
option1 = config.setOption(tool, option1, "1");
option2 = config.setOption(tool, option2, "2");
option3 = config.setOption(tool, option3, "3");
option4 = config.setOption(tool, option4, "4");
option5 = config.setOption(tool, option5, "");
option6 = config.setOption(tool, option6, "");
command = tool.getToolCommandFlagsString(null, null);
assertEquals("-opt1 1 -opt22suffix 3 ${4}", command);
ManagedBuildTestHelper.removeProject("CDV");
}
catch(Exception e){
fail("Test failed on project creation: " + e.getLocalizedMessage());
}
}
}