/******************************************************************************* * Copyright (c) 2006, 2010 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.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; 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.dom.IPDOMManager; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.managedbuilder.buildmodel.BuildDescriptionManager; import org.eclipse.cdt.managedbuilder.buildmodel.IBuildDescription; import org.eclipse.cdt.managedbuilder.buildmodel.IBuildIOType; import org.eclipse.cdt.managedbuilder.buildmodel.IBuildResource; import org.eclipse.cdt.managedbuilder.buildmodel.IBuildStep; import org.eclipse.cdt.managedbuilder.core.BuildException; import org.eclipse.cdt.managedbuilder.core.IAdditionalInput; import org.eclipse.cdt.managedbuilder.core.IBuildObject; import org.eclipse.cdt.managedbuilder.core.IConfiguration; import org.eclipse.cdt.managedbuilder.core.IHoldsOptions; import org.eclipse.cdt.managedbuilder.core.IInputType; import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; import org.eclipse.cdt.managedbuilder.core.IManagedProject; import org.eclipse.cdt.managedbuilder.core.IOption; import org.eclipse.cdt.managedbuilder.core.IOutputType; import org.eclipse.cdt.managedbuilder.core.IResourceConfiguration; 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.internal.buildmodel.BuildDescription; import org.eclipse.cdt.managedbuilder.internal.buildmodel.BuildIOType; import org.eclipse.cdt.managedbuilder.internal.buildmodel.BuildResource; import org.eclipse.cdt.managedbuilder.internal.buildmodel.BuildStep; import org.eclipse.cdt.managedbuilder.internal.buildmodel.DbgUtil; import org.eclipse.cdt.managedbuilder.internal.core.Configuration; import org.eclipse.cdt.managedbuilder.macros.BuildMacroException; import org.eclipse.cdt.managedbuilder.macros.IBuildMacroProvider; import org.eclipse.cdt.managedbuilder.testplugin.ManagedBuildTestHelper; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; public class BuildDescriptionModelTests extends TestCase { private static final String PREFIX = "BuildDescription_"; private static final String PROJ_PATH = "testBuildDescriptionProjects"; private CompositeCleaner fCompositeCleaner = new CompositeCleaner(); private Runnable fCleaner = fCompositeCleaner; private class CompositeCleaner implements Runnable{ private List<Runnable> fRunnables = new ArrayList<Runnable>(); public void addRunnable(Runnable r){ fRunnables.add(r); } public void run() { for(Iterator<Runnable> iter = fRunnables.iterator(); iter.hasNext();){ Runnable r = iter.next(); r.run(); } fRunnables.clear(); } } private class ProjectCleaner implements Runnable{ List<String> fProjList = new ArrayList<String>(); public ProjectCleaner(IProject project){ addProject(project); } public void addProject(IProject project){ addProject(project.getName()); } public void addProject(String name){ fProjList.add(name); } public void run() { for(Iterator<String> iter = fProjList.iterator(); iter.hasNext();){ String name = iter.next(); ManagedBuildTestHelper.removeProject(name); } fProjList.clear(); } } public static Test suite() { return new TestSuite(BuildDescriptionModelTests.class); } public void testDes_Model(){ IProject project = createProject(PREFIX + "1", "test30_2.tar"); IFile aAsm = ManagedBuildTestHelper.createFile(project, "a.asm"); ManagedBuildTestHelper.createFile(project, "b.asm"); ManagedBuildTestHelper.createFile(project, "c.cpp"); ManagedBuildTestHelper.createFile(project, "d.cpp"); IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); IManagedProject mProj = info.getManagedProject(); IConfiguration cfg = mProj.getConfigurations()[0]; cfg.setArtifactExtension("tmp"); BuildDescription des = new BuildDescription(cfg); BuildResource aAsmRc = des.createResource("a.asm"); assertNotNull("failed to create resource a.asm", aAsmRc); if(aAsmRc != des.createResource(aAsm)) fail("new build resource created for the same resource"); if(aAsmRc != des.createResource("a.asm")) fail("new build resource created for the same resource"); if(aAsmRc != des.createResource(aAsm.getLocation(), aAsm.getLocationURI())) fail("new build resource created for the same resource"); assertEquals(aAsmRc.getProducerIOType(), null); assertEquals(aAsmRc.getDependentIOTypes().length, 0); BuildStep inStep = (BuildStep)des.getInputStep(); assertEquals("input step has inputs", inStep.getInputIOTypes().length, 0); assertEquals("initial input step has outputs", inStep.getOutputIOTypes().length, 0); BuildIOType type = inStep.createIOType(false, true, null); if(type == null) fail("failed to create output type"); assertNotNull(type); assertEquals(type.getStep(), inStep); type.addResource(aAsmRc); assertEquals(aAsmRc.getProducerIOType(), type); assertEquals(aAsmRc.getDependentIOTypes().length, 0); assertEquals("input step has inputs", inStep.getInputIOTypes().length, 0); assertEquals(inStep.getOutputIOTypes().length, 1); assertEquals(inStep.getOutputIOTypes()[0], type); assertEquals(type.getResources().length, 1); assertEquals(type.getResources()[0], aAsmRc); BuildResource bAsmRc = des.createResource("b.asm"); assertEquals(bAsmRc.getProducerIOType(), null); assertEquals(bAsmRc.getDependentIOTypes().length, 0); type.addResource(bAsmRc); assertEquals(bAsmRc.getProducerIOType(), type); assertEquals(bAsmRc.getDependentIOTypes().length, 0); assertEquals("input step has inputs", inStep.getInputIOTypes().length, 0); assertEquals(inStep.getOutputIOTypes().length, 1); assertEquals(inStep.getOutputIOTypes()[0], type); assertEquals(type.getResources().length, 2); BuildStep step = des.createStep(null, null); assertEquals("new step has inputs", inStep.getInputIOTypes().length, 0); assertEquals("new step has outputs", inStep.getOutputIOTypes().length, 1); BuildIOType iType = step.createIOType(true, true, null); if(iType == null) fail("failed to create in type"); assertEquals(iType.getStep(), step); assertEquals(aAsmRc.getProducerIOType(), type); assertEquals(aAsmRc.getDependentIOTypes().length, 0); iType.addResource(aAsmRc); assertEquals(aAsmRc.getProducerIOType(), type); assertEquals(aAsmRc.getDependentIOTypes().length, 1); assertEquals(aAsmRc.getDependentIOTypes()[0], iType); assertEquals("input step has inputs", inStep.getInputIOTypes().length, 0); assertEquals(inStep.getOutputIOTypes().length, 1); assertEquals(inStep.getOutputIOTypes()[0], type); assertEquals(iType.getResources().length, 1); assertEquals(iType.getResources()[0], aAsmRc); assertEquals(bAsmRc.getProducerIOType(), type); assertEquals(bAsmRc.getDependentIOTypes().length, 0); iType.addResource(bAsmRc); assertEquals(bAsmRc.getProducerIOType(), type); assertEquals(bAsmRc.getDependentIOTypes().length, 1); assertEquals(bAsmRc.getDependentIOTypes()[0], iType); assertEquals("input step has inputs", inStep.getInputIOTypes().length, 0); assertEquals(inStep.getOutputIOTypes().length, 1); assertEquals(inStep.getOutputIOTypes()[0], type); assertEquals(type.getResources().length, 2); // ManagedBuildTestHelper.removeProject(PREFIX + "1"); } public void testDesTest30_2_asm_only(){ IProject project = createProject(PREFIX + "1", "test30_2.tar"); ManagedBuildTestHelper.createFile(project, "a.asm"); ManagedBuildTestHelper.createFile(project, "b.asm"); IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); IManagedProject mProj = info.getManagedProject(); IConfiguration cfg = mProj.getConfigurations()[0]; cfg.setArtifactExtension("tmp"); BuildDescription tDes = new BuildDescription(cfg); IBuildDescription des = null; try { des = BuildDescriptionManager.createBuildDescription(cfg, null, BuildDescriptionManager.REBUILD | BuildDescriptionManager.REMOVED | BuildDescriptionManager.DEPS); } catch (CoreException e) { fail("build description creation failed: " + e.getLocalizedMessage()); } doTestBuildDescription(des, tDes); // ManagedBuildTestHelper.removeProject(PREFIX + "1"); } public void testDesTest30_2_empty(){ IProject project = createProject(PREFIX + "1", "test30_2.tar"); IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); IManagedProject mProj = info.getManagedProject(); IConfiguration cfg = mProj.getConfigurations()[0]; cfg.setArtifactExtension("tmp"); BuildDescription tDes = new BuildDescription(cfg); IBuildDescription des = null; try { des = BuildDescriptionManager.createBuildDescription(cfg, null, BuildDescriptionManager.REBUILD | BuildDescriptionManager.REMOVED | BuildDescriptionManager.DEPS); } catch (CoreException e) { fail("build description creation failed: " + e.getLocalizedMessage()); } doTestBuildDescription(des, tDes); // ManagedBuildTestHelper.removeProject(PREFIX + "1"); } public void testDesDesTest30_2_cpp_only(){ IProject project = createProject(PREFIX + "1", "test30_2.tar"); ManagedBuildTestHelper.createFile(project, "c.cpp"); ManagedBuildTestHelper.createFile(project, "d.cpp"); IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); IManagedProject mProj = info.getManagedProject(); IConfiguration cfg = mProj.getConfigurations()[0]; String cName = cfg.getName(); String artifactName=null; try { artifactName = ManagedBuildManager.getBuildMacroProvider().resolveValue(cfg.getArtifactName(), "", " ", IBuildMacroProvider.CONTEXT_CONFIGURATION, cfg); } catch (BuildMacroException e1) { fail("Cannot expand artifact name=["+cfg.getArtifactName()+"]"); } cfg.setArtifactExtension("tmp"); BuildDescription tDes = new BuildDescription(cfg); BuildStep step; BuildIOType type; // step = (BuildStep)tDes.getInputStep(); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("c.cpp")); type.addResource(tDes.createResource("d.cpp")); // // step = tDes.createStep(null, null); type = step.createIOType(true, true, null); type.addResource(tDes.createResource("c.cpp")); type.addResource(tDes.createResource("d.cpp")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/new.tar")); // // step = tDes.createStep(null, null); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(cName + "/new.tar")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/new.log")); // // step = tDes.createStep(null, null); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(cName + "/new.log")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/" + artifactName + ".tmp")); // // step = (BuildStep)tDes.getOutputStep(); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(cName + "/" + artifactName + ".tmp")); // IBuildDescription des = null; try { des = BuildDescriptionManager.createBuildDescription(cfg, null, BuildDescriptionManager.REBUILD | BuildDescriptionManager.REMOVED | BuildDescriptionManager.DEPS); } catch (CoreException e) { fail("build description creation failed: " + e.getLocalizedMessage()); } doTestBuildDescription(des, tDes); // ManagedBuildTestHelper.removeProject(PREFIX + "1"); } public void testDesTest30_1(){ IProject project = loadProject("test30_1"); IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); IConfiguration cfg = info.getDefaultConfiguration(); String out = cfg.getName() + "/"; BuildDescription tDes = new BuildDescription(cfg); BuildStep step; BuildIOType type; // step = (BuildStep)tDes.getOutputStep(); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(out + "Test30_1.so.4.5.6")); type = step.createIOType(true, false, null); type.addResource(tDes.createResource(out + "CDT.jpeg")); // // step = tDes.createStep(null, null); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(out + "CDT.jpeg")); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(out + "CDT.bmp")); // // step = tDes.createStep(null, null); type = step.createIOType(false, false, null); type.addResource(tDes.createResource(out + "f1.c")); type.addResource(tDes.createResource(out + "f2.c")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource(out + "test_ar.h")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource(out + "CDT.bmp")); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("test.tar")); // // step = tDes.createStep(null, null); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(out + "Test30_1.so.4.5.6")); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(out + "test30_1.so.1.2.3")); // // step = tDes.createStep(null, null); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(out + "test30_1.so.1.2.3")); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(out + "f1.o")); type.addResource(tDes.createResource(out + "f2.o")); // // step = tDes.createStep(null, null); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(out + "f1.o")); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(out + "f1.oprestripped")); // // step = tDes.createStep(null, null); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(out + "f2.o")); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(out + "f2.oprestripped")); // // step = tDes.createStep(null, null); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(out + "f1.oprestripped")); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(out + "f1.c")); // // step = tDes.createStep(null, null); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(out + "f2.oprestripped")); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(out + "f2.c")); // // step = (BuildStep)tDes.getInputStep(); type = step.createIOType(false, true, null); type.addResource(tDes.createResource("test.tar")); // // IBuildDescription des = null; try { des = BuildDescriptionManager.createBuildDescription(cfg, null, BuildDescriptionManager.REBUILD | BuildDescriptionManager.REMOVED | BuildDescriptionManager.DEPS); } catch (CoreException e) { fail("build description creation failed: " + e.getLocalizedMessage()); } doTestBuildDescription(des, tDes); } public void testDesTest30_2(){ IProject project = createProject(PREFIX + "1", "test30_2.tar"); ManagedBuildTestHelper.createFile(project, "a.asm"); ManagedBuildTestHelper.createFile(project, "b.asm"); ManagedBuildTestHelper.createFile(project, "c.cpp"); ManagedBuildTestHelper.createFile(project, "d.cpp"); IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); IManagedProject mProj = info.getManagedProject(); IConfiguration cfg = mProj.getConfigurations()[0]; String cName = cfg.getName(); String artifactName=null; try { artifactName = ManagedBuildManager.getBuildMacroProvider().resolveValue(cfg.getArtifactName(), "", " ", IBuildMacroProvider.CONTEXT_CONFIGURATION, cfg); } catch (BuildMacroException e1) { fail("Cannot expand artifact name=["+cfg.getArtifactName()+"]"); } cfg.setArtifactExtension("tmp"); BuildDescription tDes = new BuildDescription(cfg); BuildStep step; BuildIOType type; // step = (BuildStep)tDes.getInputStep(); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("a.asm")); type.addResource(tDes.createResource("b.asm")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("c.cpp")); type.addResource(tDes.createResource("d.cpp")); // // step = tDes.createStep(null, null); type = step.createIOType(true, true, null); type.addResource(tDes.createResource("c.cpp")); type.addResource(tDes.createResource("d.cpp")); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("a.asm")); type.addResource(tDes.createResource("b.asm")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/new.tar")); // // step = tDes.createStep(null, null); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(cName + "/new.tar")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/new.log")); // // step = tDes.createStep(null, null); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(cName + "/new.log")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/" + artifactName + ".tmp")); // // step = (BuildStep)tDes.getOutputStep(); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(cName + "/" + artifactName + ".tmp")); // IBuildDescription des = null; try { des = BuildDescriptionManager.createBuildDescription(cfg, null, BuildDescriptionManager.REBUILD | BuildDescriptionManager.REMOVED | BuildDescriptionManager.DEPS); } catch (CoreException e) { fail("build description creation failed: " + e.getLocalizedMessage()); } doTestBuildDescription(des, tDes); // ManagedBuildTestHelper.removeProject(PREFIX + "1"); } /* private void doTestStep(IBuildStep step, StepDes testStep){ IBuildIOType iTs[] = step.getInputIOTypes(); TypeDes tITs[] = testStep.fInTypes; IBuildIOType oTs[] = step.getOutputIOTypes(); TypeDes tOTs[] = testStep.fOutTypes; assertEquals(iTs.length, tITs.length); assertEquals(oTs.length, tOTs.length); } */ private void doTestStep(IBuildStep step, IBuildStep oStep, boolean up){ Map<IBuildIOType, IBuildIOType> inMap = new HashMap<IBuildIOType, IBuildIOType>(); Map<IBuildIOType, IBuildIOType> outMap = new HashMap<IBuildIOType, IBuildIOType>(); stepsMatch(step, oStep, inMap, outMap, true); Map<IBuildIOType, IBuildIOType> map = up ? outMap : inMap; for (Entry<IBuildIOType, IBuildIOType> entry : map.entrySet()) { doTestType(entry.getKey(), entry.getValue()); } } private void doTestType(IBuildIOType type, IBuildIOType oType){ Map<IBuildResource, IBuildResource> map = new HashMap<IBuildResource, IBuildResource>(); typesMatch(type, oType, map, true); for (Entry<IBuildResource, IBuildResource> entry : map.entrySet()) { doTestResource(entry.getKey(), entry.getValue(), !type.isInput()); } } private void doTestResource(IBuildResource rc, IBuildResource oRc, boolean up){ Map<IBuildIOType, IBuildIOType> outMap = new HashMap<IBuildIOType, IBuildIOType>(); doTestResourceMatch(rc, oRc, outMap); if(!up){ typesMatch(rc.getProducerIOType(), oRc.getProducerIOType(), null, true); doTestStep(rc.getProducerIOType().getStep(), oRc.getProducerIOType().getStep(), up); } else { Set<IBuildStep> stepSet = new HashSet<IBuildStep>(); for (Entry<IBuildIOType, IBuildIOType> entry : outMap.entrySet()) { IBuildIOType type = entry.getKey(); IBuildStep step = type.getStep(); if(stepSet.add(step)){ IBuildIOType oType = entry.getValue(); typesMatch(type, oType, null, true); doTestStep(step, oType.getStep(), up); } } } } private void doTestResourceMatch(IBuildResource rc, IBuildResource oRc, Map<IBuildIOType, IBuildIOType> outTypeMap){ doTrace("matching resource " + DbgUtil.resourceName(rc)); if(!rc.getLocation().equals(oRc.getLocation())) doFail("different resource locsations", rc, oRc); IBuildIOType inType = rc.getProducerIOType(); IBuildIOType oInType = oRc.getProducerIOType(); typesMatch(inType, oInType, null, true); IBuildIOType outTypes[] = rc.getDependentIOTypes(); IBuildIOType oOutTypes[] = oRc.getDependentIOTypes(); if(outTypes.length != oOutTypes.length) doFail("resources do not match: different number of output types", rc, oRc); for(int i = 0; i < outTypes.length; i++){ IBuildIOType oType = getCorType(outTypes[i], oOutTypes); if(oType == null) doFail("resources not match: no cor dep type found", rc, oRc); Object obj = outTypeMap.put(outTypes[i], oType); if(obj != null){ doFail("there was corresponding type",rc, oRc); } } doTrace("end matching resource"); } private boolean stepsMatch(IBuildStep step, IBuildStep oStep, Map<IBuildIOType, IBuildIOType> inTypeMap, Map<IBuildIOType, IBuildIOType> outTypeMap, boolean failOnErr){ return stepsMatch(step, oStep, inTypeMap, outTypeMap, true, failOnErr); } private boolean stepsMatch(IBuildStep step, IBuildStep oStep, Map<IBuildIOType, IBuildIOType> inTypeMap, Map<IBuildIOType, IBuildIOType> outTypeMap, boolean checkSteps, boolean failOnErr){ IBuildIOType inTypes[] = step.getInputIOTypes(); IBuildIOType oInTypes[] = oStep.getInputIOTypes(); doTrace("matching step " + DbgUtil.stepName(step)); if(inTypes.length != oInTypes.length){ if(failOnErr) doFail("steps do not match: different number of input types",step, oStep); return false; } for(int i = 0; i < inTypes.length; i++){ IBuildIOType oType = getCorType(inTypes[i], oInTypes, null, checkSteps); if(oType == null){ if(failOnErr) doFail("steps not match, no corresponding input type found", step, oStep); return false; } Object obj = inTypeMap.put(inTypes[i], oType); if(obj != null){ if(failOnErr) doFail("there was already corresponding input type", step, oStep); return false; } } IBuildIOType outTypes[] = step.getOutputIOTypes(); IBuildIOType oOutTypes[] = oStep.getOutputIOTypes(); if(outTypes.length != oOutTypes.length){ if(failOnErr) doFail("steps do not match: different number of output types", step, oStep); return false; } for(int i = 0; i < outTypes.length; i++){ IBuildIOType oType = getCorType(outTypes[i], oOutTypes, null, checkSteps); if(oType == null){ if(failOnErr) doFail("steps not match, no corresponding output type found", step, oStep); return false; } Object obj = outTypeMap.put(outTypes[i], oType); if(obj != null){ if(failOnErr) doFail("there was already corresponding output type", step, oStep); return false; } } doTrace("end matching step"); return true; } private IBuildIOType getCorType(IBuildIOType type, IBuildIOType oTypes[]){ return getCorType(type, oTypes, null, true); } private IBuildIOType getCorType(IBuildIOType type, IBuildIOType oTypes[], Map<IBuildResource, IBuildResource> rcMap, boolean checkSteps){ for(int i = 0; i < oTypes.length; i++){ if(typesMatch(type, oTypes[i], rcMap, checkSteps, false)) return oTypes[i]; if(rcMap != null) rcMap.clear(); } return null; /* IBuildStep step = type.getStep(); IBuildResource rcs[] = type.getResources(); for(int i = 0; i < oTypes.length; i++){ if(type.isInput() != oTypes[i].isInput()) continue; IBuildResource oRcs[] = oTypes[i].getResources(); if(rcs.length != oRcs.length) continue; if(resourcesMatch(rcs, oRcs, null)){ if(!checkSteps) return oTypes[i]; IBuildIOType oType = oTypes[i]; IBuildStep step = type.getStep(); IBuildStep oStep = oType.getStep(); if(typesMatch(step.get)) for(int j = 0; j < ) } } return null; */ } private boolean typesMatch(IBuildIOType type, IBuildIOType oType, Map<IBuildResource, IBuildResource> rcMap, boolean failOnError){ return typesMatch(type, oType, rcMap, true, failOnError); } private boolean typesMatch(IBuildIOType type, IBuildIOType oType, Map<IBuildResource, IBuildResource> rcMap, boolean checkStep, boolean failOnError){ // doTrace("matching io type"); if(type.isInput() != oType.isInput()){ if(failOnError){ doFail("types have different I/O property", type, oType); } return false; } IBuildResource rcs[] = type.getResources(); IBuildResource oRcs[] = oType.getResources(); if(rcs.length != oRcs.length) return false; if(resourcesMatch(rcs, oRcs, rcMap)){ Map<IBuildIOType, IBuildIOType> inMap = new HashMap<IBuildIOType, IBuildIOType>(); Map<IBuildIOType, IBuildIOType> outMap = new HashMap<IBuildIOType, IBuildIOType>(); if(!checkStep) return true; return stepsMatch(type.getStep(), oType.getStep(), inMap, outMap, false, failOnError); } else if(failOnError) { doFail("resources not match", type, oType); } // doTrace("end matching io type"); return false; } private boolean resourcesMatch(IBuildResource rcs[], IBuildResource oRcs[], Map<IBuildResource, IBuildResource> rcMap){ if(rcs.length != oRcs.length) return false; for(int j = 0; j < rcs.length; j++){ IPath location = rcs[j].getLocation(); int k; for(k = 0; k < oRcs.length; k++){ if(oRcs[k].getLocation().equals(location)){ if(rcMap != null) rcMap.put(rcs[j], oRcs[k]); break; } } if(k == oRcs.length) return false; } return true; } private void doFail(String dump, IBuildIOType type, IBuildIOType oType){ doFail(dump, "\nType:\n" + DbgUtil.dumpType(type) + "\noType:\n" + DbgUtil.dumpType(oType)); } private void doFail(String dump, IBuildResource rc, IBuildResource oRc){ doFail(dump, "\nRc:\n" + DbgUtil.dumpResource(rc) + "\noRc:\n" + DbgUtil.dumpResource(oRc)); } private void doFail(String dump, IBuildStep step, IBuildStep oStep){ doFail(dump, "\nStep:\n" + DbgUtil.dumpStep(step) + "\noStep:\n" + DbgUtil.dumpStep(oStep)); } private void doFail(String message, String dump){ DbgUtil.trace(getClass().getSimpleName()+'.'+getName()+ ": "+ message+dump); fail(message+" (see console output)"); } private void doTrace(String str){ if(DbgUtil.DEBUG) DbgUtil.trace(str); } private void doTestBuildDescription(IBuildDescription des, IBuildDescription tDes){ assertEquals(des.getConfiguration(), tDes.getConfiguration()); assertNotNull(des.getConfiguration()); IBuildStep inStep = des.getInputStep(); IBuildStep outStep = des.getOutputStep(); if(inStep.getInputIOTypes().length != 0){ doFail("input step contains unexpected inputs", DbgUtil.dumpStep(inStep)); } if(outStep.getOutputIOTypes().length != 0){ doFail("output step contains unexpected outputs", DbgUtil.dumpStep(outStep)); } IBuildStep tInStep = tDes.getInputStep(); IBuildStep tOutStep = tDes.getOutputStep(); doTrace("*****testing down to up.."); doTestStep(inStep, tInStep, true); doTrace("*****down to up passed"); doTrace("*****testing up to down.."); doTestStep(outStep, tOutStep, false); doTrace("*****up to down passed"); } @Override protected void tearDown() throws Exception { fCleaner.run(); if(DbgUtil.DEBUG) DbgUtil.flush(); } private IProject createProject(String name, String id){ IProject proj = ManagedBuildTestHelper.createProject(name, id); if(proj != null) fCompositeCleaner.addRunnable(new ProjectCleaner(proj)); return proj; } private IProject loadProject(String name){ IProject proj = ManagedBuildTestHelper.loadProject(name, PROJ_PATH); if(proj != null) fCompositeCleaner.addRunnable(new ProjectCleaner(proj)); return proj; } public void testDes_gnu30_exe(){ IProject project = createProject(PREFIX + "1", "cdt.managedbuild.target.gnu30.exe"); try { CCProjectNature.addCCNature(project, null); } catch (CoreException e1) { fail("fail to add CC nature"); } ManagedBuildTestHelper.createFile(project, "a.c"); ManagedBuildTestHelper.createFile(project, "b.c"); ManagedBuildTestHelper.createFile(project, "c.cpp"); ManagedBuildTestHelper.createFile(project, "d.cpp"); IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); IManagedProject mProj = info.getManagedProject(); IConfiguration cfg = mProj.getConfigurations()[0]; String artifactName=null; try { artifactName = ManagedBuildManager.getBuildMacroProvider().resolveValue(cfg.getArtifactName(), "", " ", IBuildMacroProvider.CONTEXT_CONFIGURATION, cfg); } catch (BuildMacroException e1) { fail("Cannot expand artifact name=["+cfg.getArtifactName()+"]"); } String ext = cfg.getArtifactExtension(); if(ext != null && ext.length() > 0) artifactName = artifactName + "." + ext; String cName = cfg.getName(); BuildDescription tDes = new BuildDescription(cfg); BuildStep step; BuildIOType type; // step = (BuildStep)tDes.getInputStep(); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("c.cpp")); type.addResource(tDes.createResource("d.cpp")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("a.c")); type.addResource(tDes.createResource("b.c")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("a.c")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/a.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("b.c")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/b.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("c.cpp")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/c.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("d.cpp")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/d.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(cName + "/a.o")); type.addResource(tDes.createResource(cName + "/b.o")); type.addResource(tDes.createResource(cName + "/c.o")); type.addResource(tDes.createResource(cName + "/d.o")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource(cName + "/" + artifactName)); // // step = (BuildStep)tDes.getOutputStep(); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(cName + "/" + artifactName)); // IBuildDescription des = null; try { des = BuildDescriptionManager.createBuildDescription(cfg, null, BuildDescriptionManager.REBUILD | BuildDescriptionManager.REMOVED | BuildDescriptionManager.DEPS); } catch (CoreException e) { fail("build description creation failed: " + e.getLocalizedMessage()); } doTestBuildDescription(des, tDes); } public void testDes_gnu30_exe_deps(){ IProject project = createProject(PREFIX + "gnu30_exe_deps", "cdt.managedbuild.target.gnu30.exe"); try { CCProjectNature.addCCNature(project, null); } catch (CoreException e1) { fail("fail to add CC nature"); } ManagedBuildTestHelper.createFile(project, "a.c", "\n#include \"a.h\"\n#include \"d.h\"\n"); ManagedBuildTestHelper.createFile(project, "b.c"); ManagedBuildTestHelper.createFile(project, "c.cpp", "\n#include \"b.h\"\n#include \"e.h\"\n"); ManagedBuildTestHelper.createFile(project, "d.cpp"); ManagedBuildTestHelper.createFile(project, "a.h", "\n#include \"b.h\"\n"); ManagedBuildTestHelper.createFile(project, "b.h", "\n#include \"c.h\"\n"); ManagedBuildTestHelper.createFile(project, "c.h", "\n"); ManagedBuildTestHelper.createFile(project, "d.h", "\n"); ManagedBuildTestHelper.createFile(project, "e.h", "\n"); ManagedBuildTestHelper.createFile(project, "f.h", "\n"); ICProject cProject = CoreModel.getDefault().create(project); CCorePlugin.getIndexManager().setIndexerId(cProject, IPDOMManager.ID_FAST_INDEXER); IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); IManagedProject mProj = info.getManagedProject(); IConfiguration cfg = mProj.getConfigurations()[0]; String artifactName=null; try { artifactName = ManagedBuildManager.getBuildMacroProvider().resolveValue(cfg.getArtifactName(), "", " ", IBuildMacroProvider.CONTEXT_CONFIGURATION, cfg); } catch (BuildMacroException e1) { fail("Cannot expand artifact name=["+cfg.getArtifactName()+"]"); } String ext = cfg.getArtifactExtension(); if(ext != null && ext.length() > 0) artifactName = artifactName + "." + ext; String cName = cfg.getName(); BuildDescription tDes = new BuildDescription(cfg); BuildStep step; BuildIOType type; // step = (BuildStep)tDes.getInputStep(); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("c.cpp")); type.addResource(tDes.createResource("d.cpp")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("a.c")); type.addResource(tDes.createResource("b.c")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("a.h")); type.addResource(tDes.createResource("b.h")); type.addResource(tDes.createResource("c.h")); type.addResource(tDes.createResource("d.h")); type.addResource(tDes.createResource("e.h")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("a.c")); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("a.h")); type.addResource(tDes.createResource("b.h")); type.addResource(tDes.createResource("c.h")); type.addResource(tDes.createResource("d.h")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/a.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("b.c")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/b.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("c.cpp")); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("b.h")); type.addResource(tDes.createResource("c.h")); type.addResource(tDes.createResource("e.h")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/c.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("d.cpp")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/d.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(cName + "/a.o")); type.addResource(tDes.createResource(cName + "/b.o")); type.addResource(tDes.createResource(cName + "/c.o")); type.addResource(tDes.createResource(cName + "/d.o")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource(cName + "/" + artifactName)); // // step = (BuildStep)tDes.getOutputStep(); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(cName + "/" + artifactName)); // // TODO: more testing needed, may still need a sleep here because: // the legacy project creation mechanism is used for this test //the IManagedBuildInfo gets created/cached when the project contains only C nature //thus C++ settings are initialy not taken into the account //after that the CC nature is added //in this the build system is initiating the core settings update (ICProjectDescription cache refresh) //the refresh is scheduled as a job, so in case we do not wait here the job may not be completed by the time //the test is run try { Thread.sleep(5000); } catch (InterruptedException e) { } CCorePlugin.getIndexManager().joinIndexer(-1, new NullProgressMonitor()); CCorePlugin.getIndexManager().reindex(cProject); CCorePlugin.getIndexManager().joinIndexer(-1, new NullProgressMonitor()); IBuildDescription des = null; try { des = BuildDescriptionManager.createBuildDescription(cfg, null, BuildDescriptionManager.REBUILD | BuildDescriptionManager.REMOVED | BuildDescriptionManager.DEPS); } catch (CoreException e) { fail("build description creation failed: " + e.getLocalizedMessage()); } doTestBuildDescription(des, tDes); } public void testDesTestgnu21_exe(){ IProject project = createProject(PREFIX + "1", "cdt.managedbuild.target.testgnu21.exe"); try { CCProjectNature.addCCNature(project, null); } catch (CoreException e1) { fail("fail to add CC nature"); } ManagedBuildTestHelper.createFile(project, "a.c"); ManagedBuildTestHelper.createFile(project, "b.c"); ManagedBuildTestHelper.createFile(project, "c.cpp"); ManagedBuildTestHelper.createFile(project, "d.cpp"); IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); IManagedProject mProj = info.getManagedProject(); IConfiguration cfg = mProj.getConfigurations()[0]; String artifactName=null; try { artifactName = ManagedBuildManager.getBuildMacroProvider().resolveValue(cfg.getArtifactName(), "", " ", IBuildMacroProvider.CONTEXT_CONFIGURATION, cfg); } catch (BuildMacroException e1) { fail("Cannot expand artifact name=["+cfg.getArtifactName()+"]"); } String ext = cfg.getArtifactExtension(); if(ext != null && ext.length() > 0) artifactName = artifactName + "." + ext; String cName = cfg.getName(); BuildDescription tDes = new BuildDescription(cfg); BuildStep step; BuildIOType type; // step = (BuildStep)tDes.getInputStep(); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("c.cpp")); type.addResource(tDes.createResource("d.cpp")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("a.c")); type.addResource(tDes.createResource("b.c")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("a.c")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/a.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("b.c")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/b.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("c.cpp")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/c.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("d.cpp")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/d.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(cName + "/a.o")); type.addResource(tDes.createResource(cName + "/b.o")); type.addResource(tDes.createResource(cName + "/c.o")); type.addResource(tDes.createResource(cName + "/d.o")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource(cName + "/" + artifactName)); // // step = (BuildStep)tDes.getOutputStep(); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(cName + "/" + artifactName)); // IBuildDescription des = null; try { des = BuildDescriptionManager.createBuildDescription(cfg, null, BuildDescriptionManager.REBUILD | BuildDescriptionManager.REMOVED | BuildDescriptionManager.DEPS); } catch (CoreException e) { fail("build description creation failed: " + e.getLocalizedMessage()); } doTestBuildDescription(des, tDes); } public void testDesRcCfg(){ IProject project = createProject(PREFIX + "1", "cdt.managedbuild.target.gnu30.exe"); try { CCProjectNature.addCCNature(project, null); } catch (CoreException e1) { fail("fail to add CC nature"); } IFile ac = ManagedBuildTestHelper.createFile(project, "a.c"); ManagedBuildTestHelper.createFile(project, "b.c"); IFile ccpp = ManagedBuildTestHelper.createFile(project, "c.cpp"); ManagedBuildTestHelper.createFile(project, "d.cpp"); IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); IManagedProject mProj = info.getManagedProject(); IConfiguration cfg = mProj.getConfigurations()[0]; String artifactName=null; try { artifactName = ManagedBuildManager.getBuildMacroProvider().resolveValue(cfg.getArtifactName(), "", " ", IBuildMacroProvider.CONTEXT_CONFIGURATION, cfg); } catch (BuildMacroException e1) { fail("Cannot expand artifact name=["+cfg.getArtifactName()+"]"); } String ext = cfg.getArtifactExtension(); if(ext != null && ext.length() > 0) artifactName = artifactName + "." + ext; String cName = cfg.getName(); IResourceConfiguration rcCfg = cfg.createResourceConfiguration(ac); assertNotNull(rcCfg); rcCfg = cfg.createResourceConfiguration(ccpp); assertNotNull(rcCfg); BuildDescription tDes = new BuildDescription(cfg); BuildStep step; BuildIOType type; // step = (BuildStep)tDes.getInputStep(); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("c.cpp")); type.addResource(tDes.createResource("d.cpp")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("a.c")); type.addResource(tDes.createResource("b.c")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("a.c")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/a.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("b.c")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/b.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("c.cpp")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/c.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("d.cpp")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/d.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(cName + "/a.o")); type.addResource(tDes.createResource(cName + "/b.o")); type.addResource(tDes.createResource(cName + "/c.o")); type.addResource(tDes.createResource(cName + "/d.o")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource(cName + "/" + artifactName)); // // step = (BuildStep)tDes.getOutputStep(); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(cName + "/" + artifactName)); // IBuildDescription des = null; try { des = BuildDescriptionManager.createBuildDescription(cfg, null, BuildDescriptionManager.REBUILD | BuildDescriptionManager.REMOVED | BuildDescriptionManager.DEPS); } catch (CoreException e) { fail("build description creation failed: " + e.getLocalizedMessage()); } doTestBuildDescription(des, tDes); } public void testDesRcbs(){ IProject project = createProject(PREFIX + "1", "cdt.managedbuild.target.gnu30.exe"); try { CCProjectNature.addCCNature(project, null); } catch (CoreException e1) { fail("fail to add CC nature"); } ManagedBuildTestHelper.createFile(project, "a.c"); ManagedBuildTestHelper.createFile(project, "b.c"); IFile ccpp = ManagedBuildTestHelper.createFile(project, "c.cpp"); ManagedBuildTestHelper.createFile(project, "d.cpp"); IFile er = ManagedBuildTestHelper.createFile(project, "e.r"); ManagedBuildTestHelper.createFile(project, "f.r"); ManagedBuildTestHelper.createFile(project, "dir1/g.r"); ManagedBuildTestHelper.createFile(project, "dir2/h.r"); ManagedBuildTestHelper.createFile(project, "dir2/i.r"); IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); IManagedProject mProj = info.getManagedProject(); IConfiguration cfg = mProj.getConfigurations()[0]; String artifactName=null; try { artifactName = ManagedBuildManager.getBuildMacroProvider().resolveValue(cfg.getArtifactName(), "", " ", IBuildMacroProvider.CONTEXT_CONFIGURATION, cfg); } catch (BuildMacroException e1) { fail("Cannot expand artifact name=["+cfg.getArtifactName()+"]"); } String ext = cfg.getArtifactExtension(); if(ext != null && ext.length() > 0) artifactName = artifactName + "." + ext; String cName = cfg.getName(); String out = cName + "/"; ManagedBuildTestHelper.createRcbsTool(cfg, ccpp, "f.r;dir1/g.r;dir2/h.r", "q.o;w.o;e.o", "a;b;c"); ManagedBuildTestHelper.createRcbsTool(cfg, er, "f.r;dir1/g.r;dir2/h.r;dir2/i.r", "z.cpp;x.c", "d;e;f"); // IResourceConfiguration rcCfg = cfg.createResourceConfiguration(ac); // assertNotNull(rcCfg); // rcCfg = cfg.createResourceConfiguration(ccpp); // assertNotNull(rcCfg); BuildDescription tDes = new BuildDescription(cfg); BuildStep step; BuildIOType type; // step = (BuildStep)tDes.getInputStep(); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("c.cpp")); type.addResource(tDes.createResource("d.cpp")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("a.c")); type.addResource(tDes.createResource("b.c")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("e.r")); type.addResource(tDes.createResource("f.r")); type.addResource(tDes.createResource("dir1/g.r")); type.addResource(tDes.createResource("dir2/h.r")); type.addResource(tDes.createResource("dir2/i.r")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("a.c")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/a.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("b.c")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/b.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("c.cpp")); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("f.r")); type.addResource(tDes.createResource("dir1/g.r")); type.addResource(tDes.createResource("dir2/h.r")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/q.o")); type.addResource(tDes.createResource(cName + "/w.o")); type.addResource(tDes.createResource(cName + "/e.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("d.cpp")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/d.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("e.r")); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("f.r")); type.addResource(tDes.createResource("dir1/g.r")); type.addResource(tDes.createResource("dir2/h.r")); type.addResource(tDes.createResource("dir2/i.r")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(out + "z.cpp")); type.addResource(tDes.createResource(out + "x.c")); // type.addResource(tDes.createResource(out + "r.o")); // type.addResource(tDes.createResource(out + "t.o")); // type.addResource(tDes.createResource(out + "y.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource(out + "z.cpp")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/z.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource(out + "x.c")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/x.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(cName + "/a.o")); type.addResource(tDes.createResource(cName + "/b.o")); // type.addResource(tDes.createResource(cName + "/c.o")); type.addResource(tDes.createResource(cName + "/d.o")); type.addResource(tDes.createResource(cName + "/q.o")); type.addResource(tDes.createResource(cName + "/w.o")); type.addResource(tDes.createResource(cName + "/e.o")); type.addResource(tDes.createResource(cName + "/z.o")); type.addResource(tDes.createResource(cName + "/x.o")); // type.addResource(tDes.createResource(cName + "/r.o")); // type.addResource(tDes.createResource(cName + "/t.o")); // type.addResource(tDes.createResource(cName + "/y.o")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource(cName + "/" + artifactName)); // // step = (BuildStep)tDes.getOutputStep(); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(cName + "/" + artifactName)); // IBuildDescription des = null; try { des = BuildDescriptionManager.createBuildDescription(cfg, null, BuildDescriptionManager.REBUILD | BuildDescriptionManager.REMOVED | BuildDescriptionManager.DEPS); } catch (CoreException e) { fail("build description creation failed: " + e.getLocalizedMessage()); } doTestBuildDescription(des, tDes); } public void testDesAddlInVarUserObjs(){ IProject project = createProject(PREFIX + "1", "cdt.managedbuild.target.gnu30.exe"); try { CCProjectNature.addCCNature(project, null); } catch (CoreException e1) { fail("fail to add CC nature"); } ManagedBuildTestHelper.createFile(project, "a.c"); ManagedBuildTestHelper.createFile(project, "b.c"); IFile ccpp = ManagedBuildTestHelper.createFile(project, "c.cpp"); ManagedBuildTestHelper.createFile(project, "d.cpp"); IFile er = ManagedBuildTestHelper.createFile(project, "e.r"); ManagedBuildTestHelper.createFile(project, "f.r"); ManagedBuildTestHelper.createFile(project, "dir1/g.r"); ManagedBuildTestHelper.createFile(project, "dir2/h.r"); ManagedBuildTestHelper.createFile(project, "dir2/i.r"); ManagedBuildTestHelper.createFile(project, "o1.o"); ManagedBuildTestHelper.createFile(project, "dir3/o2.o"); IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); IManagedProject mProj = info.getManagedProject(); IConfiguration cfg = mProj.getConfigurations()[0]; String artifactName=null; try { artifactName = ManagedBuildManager.getBuildMacroProvider().resolveValue(cfg.getArtifactName(), "", " ", IBuildMacroProvider.CONTEXT_CONFIGURATION, cfg); } catch (BuildMacroException e1) { fail("Cannot expand artifact name=["+cfg.getArtifactName()+"]"); } String ext = cfg.getArtifactExtension(); if(ext != null && ext.length() > 0) artifactName = artifactName + "." + ext; String cName = cfg.getName(); String out = cName + "/"; ManagedBuildTestHelper.setObjs(cfg, new String[]{"o1.o", "dir3/o2.o", "dir4/d/o3.o"}); ManagedBuildTestHelper.createRcbsTool(cfg, ccpp, "f.r;dir1/g.r;dir2/h.r", "q.o;w.o;e.o", "a;b;c"); ManagedBuildTestHelper.createRcbsTool(cfg, er, "f.r;dir1/g.r;dir2/h.r;dir2/i.r", "z.cpp;x.c", "d;e;f"); // IResourceConfiguration rcCfg = cfg.createResourceConfiguration(ac); // assertNotNull(rcCfg); // rcCfg = cfg.createResourceConfiguration(ccpp); // assertNotNull(rcCfg); BuildDescription tDes = new BuildDescription(cfg); BuildStep step; BuildIOType type; // step = (BuildStep)tDes.getInputStep(); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("c.cpp")); type.addResource(tDes.createResource("d.cpp")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("a.c")); type.addResource(tDes.createResource("b.c")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("e.r")); type.addResource(tDes.createResource("f.r")); type.addResource(tDes.createResource("dir1/g.r")); type.addResource(tDes.createResource("dir2/h.r")); type.addResource(tDes.createResource("dir2/i.r")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("o1.o")); type.addResource(tDes.createResource("dir3/o2.o")); type.addResource(tDes.createResource("dir4/d/o3.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("a.c")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/a.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("b.c")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/b.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("c.cpp")); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("f.r")); type.addResource(tDes.createResource("dir1/g.r")); type.addResource(tDes.createResource("dir2/h.r")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/q.o")); type.addResource(tDes.createResource(cName + "/w.o")); type.addResource(tDes.createResource(cName + "/e.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("d.cpp")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/d.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("e.r")); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("f.r")); type.addResource(tDes.createResource("dir1/g.r")); type.addResource(tDes.createResource("dir2/h.r")); type.addResource(tDes.createResource("dir2/i.r")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(out + "z.cpp")); type.addResource(tDes.createResource(out + "x.c")); // type.addResource(tDes.createResource(out + "r.o")); // type.addResource(tDes.createResource(out + "t.o")); // type.addResource(tDes.createResource(out + "y.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource(out + "z.cpp")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/z.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource(out + "x.c")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/x.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(cName + "/a.o")); type.addResource(tDes.createResource(cName + "/b.o")); // type.addResource(tDes.createResource(cName + "/c.o")); type.addResource(tDes.createResource(cName + "/d.o")); type.addResource(tDes.createResource(cName + "/q.o")); type.addResource(tDes.createResource(cName + "/w.o")); type.addResource(tDes.createResource(cName + "/e.o")); type.addResource(tDes.createResource(cName + "/z.o")); type.addResource(tDes.createResource(cName + "/x.o")); // type.addResource(tDes.createResource(cName + "/r.o")); // type.addResource(tDes.createResource(cName + "/t.o")); // type.addResource(tDes.createResource(cName + "/y.o")); // type = step.createIOType(true, false, null); type.addResource(tDes.createResource("o1.o")); type.addResource(tDes.createResource("dir3/o2.o")); type.addResource(tDes.createResource("dir4/d/o3.o")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource(cName + "/" + artifactName)); // // step = (BuildStep)tDes.getOutputStep(); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(cName + "/" + artifactName)); // IBuildDescription des = null; try { des = BuildDescriptionManager.createBuildDescription(cfg, null, BuildDescriptionManager.REBUILD | BuildDescriptionManager.REMOVED | BuildDescriptionManager.DEPS); } catch (CoreException e) { fail("build description creation failed: " + e.getLocalizedMessage()); } doTestBuildDescription(des, tDes); } public void testDesAddlInVar(){ IProject project = createProject(PREFIX + "1", "cdt.managedbuild.target.bdm.exe"); try { CCProjectNature.addCCNature(project, null); } catch (CoreException e1) { fail("fail to add CC nature"); } ManagedBuildTestHelper.createFile(project, "a.c"); ManagedBuildTestHelper.createFile(project, "b.c"); ManagedBuildTestHelper.createFile(project, "c.cpp"); ManagedBuildTestHelper.createFile(project, "d.cpp"); ManagedBuildTestHelper.createFile(project, "e.s1"); ManagedBuildTestHelper.createFile(project, "dir/f.s1"); ManagedBuildTestHelper.createFile(project, "g.s2"); ManagedBuildTestHelper.createFile(project, "dir/h.s2"); IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); IManagedProject mProj = info.getManagedProject(); IConfiguration cfg = mProj.getConfigurations()[0]; String artifactName=null; try { artifactName = ManagedBuildManager.getBuildMacroProvider().resolveValue(cfg.getArtifactName(), "", " ", IBuildMacroProvider.CONTEXT_CONFIGURATION, cfg); } catch (BuildMacroException e1) { fail("Cannot expand artifact name=["+cfg.getArtifactName()+"]"); } String ext = cfg.getArtifactExtension(); if(ext != null && ext.length() > 0) artifactName = artifactName + "." + ext; String cName = cfg.getName(); String out = cName + "/"; BuildDescription tDes = new BuildDescription(cfg); BuildStep step; BuildIOType type; // step = (BuildStep)tDes.getInputStep(); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("c.cpp")); type.addResource(tDes.createResource("d.cpp")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("a.c")); type.addResource(tDes.createResource("b.c")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("e.s1")); type.addResource(tDes.createResource("dir/f.s1")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("g.s2")); type.addResource(tDes.createResource("dir/h.s2")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("e.s1")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(out + "e.o1")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("dir/f.s1")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(out + "dir/f.o1")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("g.s2")); type = step.createIOType(true, false, null); type.addResource(tDes.createResource(out + "e.o1")); type.addResource(tDes.createResource(out + "dir/f.o1")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(out + "g.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("dir/h.s2")); type = step.createIOType(true, false, null); type.addResource(tDes.createResource(out + "e.o1")); type.addResource(tDes.createResource(out + "dir/f.o1")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(out + "dir/h.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("a.c")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/a.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("b.c")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/b.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("c.cpp")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/c.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("d.cpp")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/d.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(cName + "/a.o")); type.addResource(tDes.createResource(cName + "/b.o")); type.addResource(tDes.createResource(cName + "/c.o")); type.addResource(tDes.createResource(cName + "/d.o")); type.addResource(tDes.createResource(out + "g.o")); type.addResource(tDes.createResource(out + "dir/h.o")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource(cName + "/" + artifactName)); // // step = (BuildStep)tDes.getOutputStep(); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(cName + "/" + artifactName)); // IBuildDescription des = null; try { des = BuildDescriptionManager.createBuildDescription(cfg, null, BuildDescriptionManager.REBUILD | BuildDescriptionManager.REMOVED | BuildDescriptionManager.DEPS); } catch (CoreException e) { fail("build description creation failed: " + e.getLocalizedMessage()); } doTestBuildDescription(des, tDes); } public void testDes_gnu30_exe_objsInProj(){ IProject project = createProject(PREFIX + "1", "cdt.managedbuild.target.gnu30.exe"); try { CCProjectNature.addCCNature(project, null); } catch (CoreException e1) { fail("fail to add CC nature"); } ManagedBuildTestHelper.createFile(project, "a.c"); ManagedBuildTestHelper.createFile(project, "b.c"); ManagedBuildTestHelper.createFile(project, "c.cpp"); ManagedBuildTestHelper.createFile(project, "d.cpp"); ManagedBuildTestHelper.createFile(project, "e.o"); ManagedBuildTestHelper.createFile(project, "dir/f.o"); IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); IManagedProject mProj = info.getManagedProject(); IConfiguration cfg = mProj.getConfigurations()[0]; String artifactName=null; try { artifactName = ManagedBuildManager.getBuildMacroProvider().resolveValue(cfg.getArtifactName(), "", " ", IBuildMacroProvider.CONTEXT_CONFIGURATION, cfg); } catch (BuildMacroException e1) { fail("Cannot expand artifact name=["+cfg.getArtifactName()+"]"); } String ext = cfg.getArtifactExtension(); if(ext != null && ext.length() > 0) artifactName = artifactName + "." + ext; String cName = cfg.getName(); BuildDescription tDes = new BuildDescription(cfg); BuildStep step; BuildIOType type; // step = (BuildStep)tDes.getInputStep(); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("c.cpp")); type.addResource(tDes.createResource("d.cpp")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource("a.c")); type.addResource(tDes.createResource("b.c")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("a.c")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/a.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("b.c")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/b.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("c.cpp")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/c.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, false, null); type.addResource(tDes.createResource("d.cpp")); type = step.createIOType(false, true, null); type.addResource(tDes.createResource(cName + "/d.o")); // // step = tDes.createStep(null, null); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(cName + "/a.o")); type.addResource(tDes.createResource(cName + "/b.o")); type.addResource(tDes.createResource(cName + "/c.o")); type.addResource(tDes.createResource(cName + "/d.o")); type = step.createIOType(false, false, null); type.addResource(tDes.createResource(cName + "/" + artifactName)); // // step = (BuildStep)tDes.getOutputStep(); type = step.createIOType(true, true, null); type.addResource(tDes.createResource(cName + "/" + artifactName)); // IBuildDescription des = null; try { des = BuildDescriptionManager.createBuildDescription(cfg, null, BuildDescriptionManager.REBUILD | BuildDescriptionManager.REMOVED | BuildDescriptionManager.DEPS); } catch (CoreException e) { fail("build description creation failed: " + e.getLocalizedMessage()); } doTestBuildDescription(des, tDes); } public void testDesRebuildState(){ IProject project = createProject(PREFIX + "1", "cdt.managedbuild.target.gnu30.exe"); try { CCProjectNature.addCCNature(project, null); } catch (CoreException e1) { fail("fail to add CC nature"); } ManagedBuildTestHelper.createFile(project, "a.c"); ManagedBuildTestHelper.createFile(project, "b.c"); ManagedBuildTestHelper.createFile(project, "c.cpp"); ManagedBuildTestHelper.createFile(project, "d.cpp"); ManagedBuildTestHelper.createFile(project, "e.o"); ManagedBuildTestHelper.createFile(project, "dir/f.o"); IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); IManagedProject mProj = info.getManagedProject(); IConfiguration cfg = mProj.getConfigurations()[0]; cfg.setRebuildState(false); assertFalse(cfg.needsRebuild()); ITool targetTool = ((Configuration)cfg).calculateTargetTool(); cfg.setArtifactName("asdafasdfasdfasdfasdf"); assertTrue(targetTool.needsRebuild()); assertTrue(cfg.needsRebuild()); targetTool.setRebuildState(false); assertFalse(targetTool.needsRebuild()); assertFalse(cfg.needsRebuild()); cfg.setBuildArguments("-fgsdfg -sdfg -sdfg -sfdg"); // assertFalse(targetTool.needsRebuild()); // assertTrue(cfg.needsRebuild()); // cfg.setRebuildState(false); // assertFalse(targetTool.needsRebuild()); assertFalse(cfg.needsRebuild()); cfg.setBuildCommand("fdgsdfbvvcbsdfvcx"); assertFalse(cfg.needsRebuild()); cfg.setCleanCommand("sadgvfcxvsdfgvxc"); assertFalse(cfg.needsRebuild()); cfg.setDescription("sfgsdfgsdfcxbvxcbxcvb"); assertFalse(cfg.needsRebuild()); cfg.setErrorParserIds("fgdsfgsdfgsdfgsdfgsdfgdfs;sdfg;sdfg;sdg;g;sdg"); assertFalse(cfg.needsRebuild()); cfg.setName("sdfgsdfgsdfgsdfgsdfgdsfgsdf"); // assertFalse(targetTool.needsRebuild()); // assertTrue(cfg.needsRebuild()); // cfg.setRebuildState(false); assertFalse(targetTool.needsRebuild()); assertFalse(cfg.needsRebuild()); cfg.setPostannouncebuildStep("sdfasdfasdfsdfadfasf"); assertFalse(cfg.needsRebuild()); cfg.setPostbuildStep("asdf;asdf;asdf;asdf;asdf"); assertFalse(cfg.needsRebuild()); cfg.setPreannouncebuildStep("sdfgsdgsdhnbvxcvbxcv"); assertFalse(cfg.needsRebuild()); cfg.setPrebuildStep("sdfg;sdfg;sdfg;sdfgvnbcvbn"); assertFalse(cfg.needsRebuild()); ITool tools[] = cfg.getFilteredTools(); ITool tool = null; for(int i = 0; i < tools.length; i++){ tool = tools[i]; if(tool != targetTool) break; } cfg.setToolCommand(tool, "sdgsdcxvzcxvzxc"); assertTrue(tool.needsRebuild()); assertTrue(cfg.needsRebuild()); tool.setRebuildState(false); assertFalse(tool.needsRebuild()); assertFalse(cfg.needsRebuild()); cfg.setArtifactExtension("adsfasdfasdfasdfasdf"); assertTrue(targetTool.needsRebuild()); assertTrue(cfg.needsRebuild()); targetTool.setRebuildState(false); assertFalse(targetTool.needsRebuild()); assertFalse(cfg.needsRebuild()); // public static final int BOOLEAN = 0; // public static final int ENUMERATED = 1; // public static final int STRING = 2; // public static final int STRING_LIST = 3; // public static final int INCLUDE_PATH = 4; // public static final int PREPROCESSOR_SYMBOLS = 5; // public static final int LIBRARIES = 6; // public static final int OBJECTS = 7; IBuildObject obj[] = ManagedBuildTestHelper.getOption(cfg, IOption.BOOLEAN); if(obj != null){ IHoldsOptions ho = (IHoldsOptions)obj[0]; IOption o = (IOption)obj[1]; assertFalse(ho.needsRebuild()); assertFalse(cfg.needsRebuild()); try { cfg.setOption(ho, o, !o.getBooleanValue()); } catch (BuildException e) { fail("failed to set the option: " + e.getLocalizedMessage()); } assertTrue(ho.needsRebuild()); assertTrue(cfg.needsRebuild()); ho.setRebuildState(false); assertFalse(ho.needsRebuild()); assertFalse(cfg.needsRebuild()); } obj = ManagedBuildTestHelper.getOption(cfg, IOption.ENUMERATED); if(obj != null){ IHoldsOptions ho = (IHoldsOptions)obj[0]; IOption o = (IOption)obj[1]; assertFalse(ho.needsRebuild()); assertFalse(cfg.needsRebuild()); try { cfg.setOption(ho, o, "sdfgsdfcvsdfgvxcsdf"); } catch (BuildException e) { fail("failed to set the option: " + e.getLocalizedMessage()); } assertTrue(ho.needsRebuild()); assertTrue(cfg.needsRebuild()); ho.setRebuildState(false); assertFalse(ho.needsRebuild()); assertFalse(cfg.needsRebuild()); } obj = ManagedBuildTestHelper.getOption(cfg, IOption.STRING); if(obj != null){ IHoldsOptions ho = (IHoldsOptions)obj[0]; IOption o = (IOption)obj[1]; assertFalse(ho.needsRebuild()); assertFalse(cfg.needsRebuild()); try { cfg.setOption(ho, o, "sdfgsdfcvsdfgvxcfdgvsdf"); } catch (BuildException e) { fail("failed to set the option: " + e.getLocalizedMessage()); } assertTrue(ho.needsRebuild()); assertTrue(cfg.needsRebuild()); ho.setRebuildState(false); assertFalse(ho.needsRebuild()); assertFalse(cfg.needsRebuild()); } obj = ManagedBuildTestHelper.getOption(cfg, IOption.STRING_LIST); if(obj != null){ IHoldsOptions ho = (IHoldsOptions)obj[0]; IOption o = (IOption)obj[1]; assertFalse(ho.needsRebuild()); assertFalse(cfg.needsRebuild()); try { cfg.setOption(ho, o, new String[]{"sdfgsd","fcvsdfgvxcfdgvsdf"}); } catch (BuildException e) { fail("failed to set the option: " + e.getLocalizedMessage()); } assertTrue(ho.needsRebuild()); assertTrue(cfg.needsRebuild()); ho.setRebuildState(false); assertFalse(ho.needsRebuild()); assertFalse(cfg.needsRebuild()); } obj = ManagedBuildTestHelper.getOption(cfg, IOption.INCLUDE_PATH); if(obj != null){ IHoldsOptions ho = (IHoldsOptions)obj[0]; IOption o = (IOption)obj[1]; assertFalse(ho.needsRebuild()); assertFalse(cfg.needsRebuild()); try { cfg.setOption(ho, o, new String[]{"sdfgsd","fcvsdfgvxcfdgvsdf"}); } catch (BuildException e) { fail("failed to set the option: " + e.getLocalizedMessage()); } assertTrue(ho.needsRebuild()); assertTrue(cfg.needsRebuild()); ho.setRebuildState(false); assertFalse(ho.needsRebuild()); assertFalse(cfg.needsRebuild()); } obj = ManagedBuildTestHelper.getOption(cfg, IOption.PREPROCESSOR_SYMBOLS); if(obj != null){ IHoldsOptions ho = (IHoldsOptions)obj[0]; IOption o = (IOption)obj[1]; assertFalse(ho.needsRebuild()); assertFalse(cfg.needsRebuild()); try { cfg.setOption(ho, o, new String[]{"sdfgsd","fcvsdfgvxcfdgvsdf"}); } catch (BuildException e) { fail("failed to set the option: " + e.getLocalizedMessage()); } assertTrue(ho.needsRebuild()); assertTrue(cfg.needsRebuild()); ho.setRebuildState(false); assertFalse(ho.needsRebuild()); assertFalse(cfg.needsRebuild()); } obj = ManagedBuildTestHelper.getOption(cfg, IOption.LIBRARIES); if(obj != null){ IHoldsOptions ho = (IHoldsOptions)obj[0]; IOption o = (IOption)obj[1]; assertFalse(ho.needsRebuild()); assertFalse(cfg.needsRebuild()); try { cfg.setOption(ho, o, new String[]{"sdfgsd","fcvsdfgvxcfdgvsdf"}); } catch (BuildException e) { fail("failed to set the option: " + e.getLocalizedMessage()); } assertTrue(ho.needsRebuild()); assertTrue(cfg.needsRebuild()); ho.setRebuildState(false); assertFalse(ho.needsRebuild()); assertFalse(cfg.needsRebuild()); } obj = ManagedBuildTestHelper.getOption(cfg, IOption.OBJECTS); if(obj != null){ IHoldsOptions ho = (IHoldsOptions)obj[0]; IOption o = (IOption)obj[1]; assertFalse(ho.needsRebuild()); assertFalse(cfg.needsRebuild()); try { cfg.setOption(ho, o, new String[]{"sdfgsd","fcvsdfgvxcfdgvsdf"}); } catch (BuildException e) { fail("failed to set the option: " + e.getLocalizedMessage()); } assertTrue(ho.needsRebuild()); assertTrue(cfg.needsRebuild()); ho.setRebuildState(false); assertFalse(ho.needsRebuild()); assertFalse(cfg.needsRebuild()); } IToolChain tch = cfg.getToolChain(); tch.setRebuildState(true); assertTrue(tch.needsRebuild()); assertTrue(cfg.needsRebuild()); tch.setRebuildState(false); assertFalse(tch.needsRebuild()); assertFalse(cfg.needsRebuild()); for(int i = 0; i < tools.length; i++){ doTestTool(tools[i]); } IResourceConfiguration rcCfgs[] = cfg.getResourceConfigurations(); for(int i = 0; i < rcCfgs.length; i++){ IResourceConfiguration rcCfg = rcCfgs[i]; assertFalse(rcCfg.needsRebuild()); assertFalse(cfg.needsRebuild()); rcCfg.setRebuildState(true); assertTrue(rcCfg.needsRebuild()); assertTrue(cfg.needsRebuild()); rcCfg.setRebuildState(false); assertFalse(rcCfg.needsRebuild()); assertFalse(cfg.needsRebuild()); rcCfg.setExclude(!rcCfg.isExcluded()); assertTrue(rcCfg.needsRebuild()); assertTrue(cfg.needsRebuild()); rcCfg.setRebuildState(false); assertFalse(rcCfg.needsRebuild()); assertFalse(cfg.needsRebuild()); rcCfg.setExclude(rcCfg.isExcluded()); assertFalse(rcCfg.needsRebuild()); assertFalse(cfg.needsRebuild()); int appl = rcCfg.getRcbsApplicability() + 1; if(appl > 4) appl = 1; rcCfg.setRcbsApplicability(appl); assertTrue(rcCfg.needsRebuild()); assertTrue(cfg.needsRebuild()); rcCfg.setRebuildState(false); assertFalse(rcCfg.needsRebuild()); assertFalse(cfg.needsRebuild()); rcCfg.setRcbsApplicability(rcCfg.getRcbsApplicability()); assertFalse(rcCfg.needsRebuild()); assertFalse(cfg.needsRebuild()); ITool t = rcCfg.getToolsToInvoke()[0]; assertFalse(t.needsRebuild()); rcCfg.setToolCommand(t, "sdsdcdsffewffdvcx"); assertTrue(t.needsRebuild()); assertTrue(rcCfg.needsRebuild()); assertTrue(cfg.needsRebuild()); t.setRebuildState(false); assertFalse(t.needsRebuild()); assertFalse(rcCfg.needsRebuild()); assertFalse(cfg.needsRebuild()); rcCfg.setToolCommand(t, t.getToolCommand()); assertFalse(t.needsRebuild()); assertFalse(rcCfg.needsRebuild()); assertFalse(cfg.needsRebuild()); } } private void doTestTool(ITool tool){ IBuildObject obj = tool.getParent(); IConfiguration cfg; if(obj instanceof IResourceConfiguration) cfg = ((IResourceConfiguration)obj).getParent(); else cfg = ((IToolChain)obj).getParent(); cfg.setRebuildState(false); assertFalse(tool.needsRebuild()); tool.setRebuildState(true); assertTrue(tool.needsRebuild()); assertTrue(cfg.needsRebuild()); cfg.setRebuildState(false); assertFalse(tool.needsRebuild()); assertFalse(cfg.needsRebuild()); tool.setRebuildState(true); assertTrue(tool.needsRebuild()); assertTrue(cfg.needsRebuild()); tool.setRebuildState(false); assertFalse(tool.needsRebuild()); assertFalse(cfg.needsRebuild()); tool.setCommandLinePattern("asdfasdfasdfasdfasdfasdsdfghdsfg"); assertTrue(tool.needsRebuild()); assertTrue(cfg.needsRebuild()); tool.setRebuildState(false); assertFalse(tool.needsRebuild()); assertFalse(cfg.needsRebuild()); tool.setOutputFlag("asdfasdfasdfasdgsdf"); assertTrue(tool.needsRebuild()); assertTrue(cfg.needsRebuild()); tool.setRebuildState(false); assertFalse(tool.needsRebuild()); assertFalse(cfg.needsRebuild()); tool.setOutputPrefix("afgsdfgfadcvwerfdvsdczxv"); assertTrue(tool.needsRebuild()); assertTrue(cfg.needsRebuild()); tool.setRebuildState(false); assertFalse(tool.needsRebuild()); assertFalse(cfg.needsRebuild()); tool.setRebuildState(true); assertTrue(tool.needsRebuild()); assertTrue(cfg.needsRebuild()); tool.setRebuildState(false); assertFalse(tool.needsRebuild()); assertFalse(cfg.needsRebuild()); tool.setToolCommand("dfacvzxcgrsedfxcvsdfcgv"); assertTrue(tool.needsRebuild()); assertTrue(cfg.needsRebuild()); tool.setRebuildState(false); assertFalse(tool.needsRebuild()); assertFalse(cfg.needsRebuild()); IInputType iTypes[] = tool.getInputTypes(); for(int i = 0; i < iTypes.length; i++){ IInputType iType = iTypes[i]; if(iType.isExtensionElement()) continue; iType.setAssignToOptionId("qwertyuiop"); assertTrue(tool.needsRebuild()); assertTrue(cfg.needsRebuild()); tool.setRebuildState(false); assertFalse(tool.needsRebuild()); assertFalse(cfg.needsRebuild()); iType.setBuildVariable("asdfghjkl"); assertTrue(tool.needsRebuild()); assertTrue(cfg.needsRebuild()); tool.setRebuildState(false); assertFalse(tool.needsRebuild()); assertFalse(cfg.needsRebuild()); iType.setMultipleOfType(!iType.getMultipleOfType()); assertTrue(tool.needsRebuild()); assertTrue(cfg.needsRebuild()); tool.setRebuildState(false); assertFalse(tool.needsRebuild()); assertFalse(cfg.needsRebuild()); iType.setOptionId("zxcvbnm"); assertTrue(tool.needsRebuild()); assertTrue(cfg.needsRebuild()); tool.setRebuildState(false); assertFalse(tool.needsRebuild()); assertFalse(cfg.needsRebuild()); iType.setPrimaryInput(!iType.getPrimaryInput()); assertTrue(tool.needsRebuild()); assertTrue(cfg.needsRebuild()); tool.setRebuildState(false); assertFalse(tool.needsRebuild()); assertFalse(cfg.needsRebuild()); IAdditionalInput addlIns[] = iType.getAdditionalInputs(); for(int j = 0; j < addlIns.length; j++){ IAdditionalInput a = addlIns[j]; a.setPaths("as;sd;fgl;fg;qw;er;ty;ui;op"); assertTrue(tool.needsRebuild()); assertTrue(cfg.needsRebuild()); tool.setRebuildState(false); assertFalse(tool.needsRebuild()); assertFalse(cfg.needsRebuild()); } } IOutputType oTypes[] = tool.getOutputTypes(); for(int i = 0; i < oTypes.length; i++){ IOutputType oType = oTypes[i]; if(oType.isExtensionElement()) continue; oType.setBuildVariable("qwertyuiop"); assertTrue(tool.needsRebuild()); assertTrue(cfg.needsRebuild()); tool.setRebuildState(false); assertFalse(tool.needsRebuild()); assertFalse(cfg.needsRebuild()); oType.setMultipleOfType(!oType.getMultipleOfType()); assertTrue(tool.needsRebuild()); assertTrue(cfg.needsRebuild()); tool.setRebuildState(false); assertFalse(tool.needsRebuild()); assertFalse(cfg.needsRebuild()); oType.setNamePattern("qwerytuuioioyuioghjgfd"); assertTrue(tool.needsRebuild()); assertTrue(cfg.needsRebuild()); tool.setRebuildState(false); assertFalse(tool.needsRebuild()); assertFalse(cfg.needsRebuild()); oType.setOptionId("asdfghjklkxcvx"); assertTrue(tool.needsRebuild()); assertTrue(cfg.needsRebuild()); tool.setRebuildState(false); assertFalse(tool.needsRebuild()); assertFalse(cfg.needsRebuild()); oType.setOutputNames("asdf;dfgh;hj;jk;ghjk;fgg;sdaf;asdf"); assertTrue(tool.needsRebuild()); assertTrue(cfg.needsRebuild()); tool.setRebuildState(false); assertFalse(tool.needsRebuild()); assertFalse(cfg.needsRebuild()); oType.setOutputPrefix("asdfscvbdfgsdfgsdfvcx"); assertTrue(tool.needsRebuild()); assertTrue(cfg.needsRebuild()); tool.setRebuildState(false); assertFalse(tool.needsRebuild()); assertFalse(cfg.needsRebuild()); oType.setPrimaryOutput(!oType.getPrimaryOutput()); assertTrue(tool.needsRebuild()); assertTrue(cfg.needsRebuild()); tool.setRebuildState(false); assertFalse(tool.needsRebuild()); assertFalse(cfg.needsRebuild()); } } public void testDesRebuildStateInDescription(){ IProject project = createProject(PREFIX + "1", "cdt.managedbuild.target.bdm.exe"); try { CCProjectNature.addCCNature(project, null); } catch (CoreException e1) { fail("fail to add CC nature"); } ManagedBuildTestHelper.createFile(project, "a.c"); ManagedBuildTestHelper.createFile(project, "b.c"); ManagedBuildTestHelper.createFile(project, "c.cpp"); ManagedBuildTestHelper.createFile(project, "d/d.cpp"); ManagedBuildTestHelper.createFile(project, "d2/e.s2"); ManagedBuildTestHelper.createFile(project, "f.s2"); ManagedBuildTestHelper.createFile(project, "e.o"); ManagedBuildTestHelper.createFile(project, "dir/f.o"); IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); IManagedProject mProj = info.getManagedProject(); Configuration cfg = (Configuration)mProj.getConfigurations()[0]; String out = cfg.getName() + "/"; cfg.setRebuildState(false); IBuildDescription des = null; try { des = BuildDescriptionManager.createBuildDescription(cfg, null, BuildDescriptionManager.REBUILD | BuildDescriptionManager.REMOVED | BuildDescriptionManager.DEPS); } catch (CoreException e) { fail("build description creation failed: " + e.getLocalizedMessage()); } IBuildResource rcs[] = BuildDescriptionManager.filterGeneratedBuildResources(des.getResources(), BuildDescriptionManager.REBUILD); assertEquals(rcs.length, 0); rcs = BuildDescriptionManager.filterGeneratedBuildResources(des.getResources(), BuildDescriptionManager.REMOVED); assertEquals(rcs.length, 0); rcs = BuildDescriptionManager.filterGeneratedBuildResources(des.getResources(), BuildDescriptionManager.REBUILD | BuildDescriptionManager.REMOVED); assertEquals(rcs.length, 0); //target ITool tool = cfg.calculateTargetTool(); tool.setToolCommand("fgdfgcvbcbv"); try { des = BuildDescriptionManager.createBuildDescription(cfg, null, BuildDescriptionManager.REBUILD | BuildDescriptionManager.REMOVED); } catch (CoreException e) { fail("build description creation failed: " + e.getLocalizedMessage()); } rcs = BuildDescriptionManager.filterGeneratedBuildResources(des.getResources(), BuildDescriptionManager.REBUILD); IBuildResource oRcs[] = des.getOutputStep().getInputResources(); IBuildResource targetRc; assertEquals(rcs.length, 1); assertEquals(oRcs.length, 1); if(rcs[0] != oRcs[0]) fail("rebuild resources do not match"); targetRc = oRcs[0]; rcs = BuildDescriptionManager.filterGeneratedBuildResources(des.getResources(), BuildDescriptionManager.REMOVED); assertEquals(rcs.length, 0); rcs = BuildDescriptionManager.filterGeneratedBuildResources(des.getResources(), BuildDescriptionManager.REBUILD | BuildDescriptionManager.REMOVED); assertEquals(rcs.length, 1); assertEquals(oRcs.length, 1); if(rcs[0] != oRcs[0]) fail("rebuild resources do not match"); cfg.setRebuildState(false); //cpp tool = getToolForInExt(cfg, "cpp"); tool.setToolCommand("sdfgzxcvzxcvzxv"); try { des = BuildDescriptionManager.createBuildDescription(cfg, null, BuildDescriptionManager.REBUILD | BuildDescriptionManager.REMOVED); } catch (CoreException e) { fail("build description creation failed: " + e.getLocalizedMessage()); } rcs = BuildDescriptionManager.filterGeneratedBuildResources(des.getResources(), BuildDescriptionManager.REBUILD); oRcs = des.getOutputStep().getInputResources(); assertEquals(oRcs.length, 1); targetRc = oRcs[0]; oRcs = new IBuildResource[5]; oRcs[0] = getResourceForProjPath(des, out + "c.o"); assertNotNull(oRcs[0]); oRcs[1] = getResourceForProjPath(des, out + "d/d.o"); assertNotNull(oRcs[1]); oRcs[2] = targetRc; oRcs[3] = getResourceForProjPath(des, out + "a.o"); assertNotNull(oRcs[0]); oRcs[4] = getResourceForProjPath(des, out + "b.o"); assertNotNull(oRcs[1]); assertEquals(rcs.length, 5); assertEquals(oRcs.length, 5); if(!resourcesEqual(rcs, oRcs)) fail("rebuild resources do not match"); rcs = BuildDescriptionManager.filterGeneratedBuildResources(des.getResources(), BuildDescriptionManager.REMOVED); assertEquals(rcs.length, 0); rcs = BuildDescriptionManager.filterGeneratedBuildResources(des.getResources(), BuildDescriptionManager.REBUILD | BuildDescriptionManager.REMOVED); assertEquals(rcs.length, 5); if(!resourcesEqual(rcs, oRcs)) fail("rebuild resources do not match"); cfg.setRebuildState(false); //s2 tool = getToolForInExt(cfg, "s2"); tool.setToolCommand("sdfgzxcvzxcvzxv"); try { des = BuildDescriptionManager.createBuildDescription(cfg, null, BuildDescriptionManager.REBUILD | BuildDescriptionManager.REMOVED); } catch (CoreException e) { fail("build description creation failed: " + e.getLocalizedMessage()); } rcs = BuildDescriptionManager.filterGeneratedBuildResources(des.getResources(), BuildDescriptionManager.REBUILD); oRcs = des.getOutputStep().getInputResources(); assertEquals(oRcs.length, 1); targetRc = oRcs[0]; oRcs = new IBuildResource[3]; oRcs[0] = getResourceForProjPath(des, out + "d2/e.o"); assertNotNull(oRcs[0]); oRcs[1] = getResourceForProjPath(des, out + "f.o"); assertNotNull(oRcs[1]); oRcs[2] = targetRc; assertEquals(rcs.length, 3); assertEquals(oRcs.length, 3); if(!resourcesEqual(rcs, oRcs)) fail("rebuild resources do not match"); rcs = BuildDescriptionManager.filterGeneratedBuildResources(des.getResources(), BuildDescriptionManager.REMOVED); assertEquals(rcs.length, 0); rcs = BuildDescriptionManager.filterGeneratedBuildResources(des.getResources(), BuildDescriptionManager.REBUILD | BuildDescriptionManager.REMOVED); assertEquals(rcs.length, 3); if(!resourcesEqual(rcs, oRcs)) fail("rebuild resources do not match"); cfg.setRebuildState(false); } private IBuildResource getResourceForProjPath(IBuildDescription des, String path){ return getResourceForProjPath(des, new Path(path)); } private IBuildResource getResourceForProjPath(IBuildDescription des, IPath path){ IPath location = des.getConfiguration().getOwner().getProject().getLocation().append(path); return des.getBuildResource(location); } private ITool getToolForInExt(IConfiguration cfg, String ext){ ITool tools[] = cfg.getFilteredTools(); for(int i = 0; i < tools.length; i++){ if(tools[i].buildsFileType(ext)) return tools[i]; } return null; } private boolean resourcesEqual(IBuildResource rcs[], IBuildResource oRcs[]){ if(rcs.length != oRcs.length) return false; for(int j = 0; j < rcs.length; j++){ int k; for(k = 0; k < oRcs.length; k++){ if(oRcs[k] == rcs[j]){ break; } } if(k == oRcs.length) return false; } return true; } }