/******************************************************************************* * Copyright (c) 2007, 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 * James Blackburn (Broadcom Corp.) * Christian Walther (Indel AG) - [335344] test for changing language IDs *******************************************************************************/ package org.eclipse.cdt.core.settings.model; import java.util.Arrays; import java.util.HashMap; import junit.framework.TestSuite; 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.core.settings.model.util.CDataUtil; import org.eclipse.cdt.core.testplugin.CProjectHelper; import org.eclipse.cdt.core.testplugin.CTestPlugin; import org.eclipse.cdt.core.testplugin.util.BaseTestCase; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Path; public class ExternalSettingsProviderTests extends BaseTestCase{ private static final String PROJ_NAME_PREFIX = "espt_"; ICProject p1, p2, p3, p4, p5; public static TestSuite suite() { return suite(ExternalSettingsProviderTests.class, "_"); } protected void setUp() throws Exception { p1 = CProjectHelper.createNewStileCProject(PROJ_NAME_PREFIX + "a", IPDOMManager.ID_NO_INDEXER); p2 = CProjectHelper.createNewStileCProject(PROJ_NAME_PREFIX + "b", IPDOMManager.ID_NO_INDEXER); p3 = CProjectHelper.createNewStileCProject(PROJ_NAME_PREFIX + "c", IPDOMManager.ID_NO_INDEXER); p4 = CProjectHelper.createNewStileCProject(PROJ_NAME_PREFIX + "d", IPDOMManager.ID_NO_INDEXER); p5 = CProjectHelper.createNewStileCProject(PROJ_NAME_PREFIX + "e", IPDOMManager.ID_NO_INDEXER); } /** * Test adding a external setting provider to p1 -- the contributed paths should appear * @throws Exception */ public void testRefs() throws Exception { TestExtSettingsProvider.setVariantNum(0); CoreModel model = CoreModel.getDefault(); IProject project = p1.getProject(); ICProjectDescription des = model.getProjectDescription(project); ICConfigurationDescription cfgDes = des.getConfigurations()[0]; ICLanguageSetting ls = cfgDes.getLanguageSettingForFile(new Path("a.c"), true); ICLanguageSettingEntry[] entries = ls.getSettingEntries(ICSettingEntry.INCLUDE_PATH); assertEquals(0, entries.length); ICSourceEntry[] sourceEntries = cfgDes.getSourceEntries(); ICSourceEntry[] expectedSourceEntries = new ICSourceEntry[]{ new CSourceEntry(project.getFullPath(), null, ICSettingEntry.RESOLVED) }; assertEquals(1, sourceEntries.length); assertTrue(Arrays.equals(expectedSourceEntries, sourceEntries)); String[] extPIds = new String[]{CTestPlugin.PLUGIN_ID + ".testExtSettingsProvider"}; cfgDes.setExternalSettingsProviderIds(extPIds); assertEquals(extPIds.length, cfgDes.getExternalSettingsProviderIds().length); assertTrue(Arrays.equals(extPIds, cfgDes.getExternalSettingsProviderIds())); entries = ls.getSettingEntries(ICSettingEntry.INCLUDE_PATH); assertEquals(2, entries.length); ICLanguageSettingEntry[] expectedEntries = new ICLanguageSettingEntry[]{ new CIncludePathEntry("ip_a", 0), new CIncludePathEntry("ip_b", 0), }; assertTrue(Arrays.equals(expectedEntries, entries)); sourceEntries = cfgDes.getSourceEntries(); assertEquals(2, sourceEntries.length); ICSourceEntry[] newExpectedSourceEntries = new ICSourceEntry[]{ new CSourceEntry(project.getFullPath().append("sp_a"), null, 0), new CSourceEntry(project.getFullPath().append("sp_b"), null, 0), }; assertTrue(Arrays.equals(newExpectedSourceEntries, sourceEntries)); // insert entry into the mix; check that the new entry appears ICLanguageSettingEntry[] newEntries = new ICLanguageSettingEntry[3]; newEntries[0] = expectedEntries[1]; newEntries[1] = new CIncludePathEntry("added", 0); newEntries[2] = expectedEntries[0]; ls.setSettingEntries(ICSettingEntry.INCLUDE_PATH, newEntries); entries = ls.getSettingEntries(ICSettingEntry.INCLUDE_PATH); assertEquals(3, entries.length); assertTrue(Arrays.equals(newEntries, entries)); newEntries = new ICLanguageSettingEntry[1]; newEntries[0] = expectedEntries[0]; ls.setSettingEntries(ICSettingEntry.INCLUDE_PATH, newEntries); entries = ls.getSettingEntries(ICSettingEntry.INCLUDE_PATH); assertEquals(1, entries.length); assertTrue(Arrays.equals(newEntries, entries)); newEntries = new ICLanguageSettingEntry[0]; ls.setSettingEntries(ICSettingEntry.INCLUDE_PATH, newEntries); entries = ls.getSettingEntries(ICSettingEntry.INCLUDE_PATH); assertEquals(0, entries.length); ls.setSettingEntries(ICSettingEntry.INCLUDE_PATH, (ICLanguageSettingEntry[])null); entries = ls.getSettingEntries(ICSettingEntry.INCLUDE_PATH); assertEquals(2, entries.length); assertTrue(Arrays.equals(expectedEntries, entries)); } public void testCreateCfg() throws Exception { TestExtSettingsProvider.setVariantNum(0); CoreModel model = CoreModel.getDefault(); IProject project = p2.getProject(); ICProjectDescription des = model.getProjectDescription(project); ICConfigurationDescription cfgDes = des.getConfigurations()[0]; ICLanguageSetting ls = cfgDes.getLanguageSettingForFile(new Path("a.c"), true); ICLanguageSettingEntry[] entries = ls.getSettingEntries(ICSettingEntry.INCLUDE_PATH); assertEquals(0, entries.length); ICSourceEntry[] sourceEntries = cfgDes.getSourceEntries(); ICSourceEntry[] expectedSourceEntries = new ICSourceEntry[]{ new CSourceEntry(project.getFullPath(), null, ICSettingEntry.RESOLVED) }; assertEquals(1, sourceEntries.length); assertTrue(Arrays.equals(expectedSourceEntries, sourceEntries)); String[] extPIds = new String[]{CTestPlugin.PLUGIN_ID + ".testExtSettingsProvider"}; cfgDes.setExternalSettingsProviderIds(extPIds); model.setProjectDescription(project, des); des = model.getProjectDescription(project, false); cfgDes = des.getConfigurations()[0]; assertEquals(extPIds.length, cfgDes.getExternalSettingsProviderIds().length); assertTrue(Arrays.equals(extPIds, cfgDes.getExternalSettingsProviderIds())); des = model.getProjectDescription(project); cfgDes = des.getConfigurations()[0]; assertEquals(extPIds.length, cfgDes.getExternalSettingsProviderIds().length); assertTrue(Arrays.equals(extPIds, cfgDes.getExternalSettingsProviderIds())); String newCfgId = CDataUtil.genId(null); ICConfigurationDescription cfgDes2 = des.createConfiguration(newCfgId, "cfg2", cfgDes); assertEquals(extPIds.length, cfgDes2.getExternalSettingsProviderIds().length); assertTrue(Arrays.equals(extPIds, cfgDes2.getExternalSettingsProviderIds())); ls = cfgDes2.getLanguageSettingForFile(new Path("a.c"), true); entries = ls.getSettingEntries(ICSettingEntry.INCLUDE_PATH); ICLanguageSettingEntry[] expectedEntries = new ICLanguageSettingEntry[]{ new CIncludePathEntry("ip_a", 0), new CIncludePathEntry("ip_b", 0), }; assertTrue(Arrays.equals(expectedEntries, entries)); } public void testProviderUpdate() throws Exception { TestExtSettingsProvider.setVariantNum(0); CoreModel model = CoreModel.getDefault(); ICProjectDescriptionManager mngr = model.getProjectDescriptionManager(); IProject project = p2.getProject(); ICProjectDescription des = model.getProjectDescription(project); ICConfigurationDescription cfgDes = des.getConfigurations()[0]; ICLanguageSetting ls = cfgDes.getLanguageSettingForFile(new Path("a.c"), true); ICLanguageSettingEntry[] entries = ls.getSettingEntries(ICSettingEntry.INCLUDE_PATH); assertEquals(0, entries.length); ICSourceEntry[] sourceEntries = cfgDes.getSourceEntries(); ICSourceEntry[] expectedSourceEntries = new ICSourceEntry[]{ new CSourceEntry(project.getFullPath(), null, ICSettingEntry.RESOLVED) }; assertEquals(1, sourceEntries.length); assertTrue(Arrays.equals(expectedSourceEntries, sourceEntries)); String[] extPIds = new String[]{CTestPlugin.PLUGIN_ID + ".testExtSettingsProvider"}; cfgDes.setExternalSettingsProviderIds(extPIds); ls = cfgDes.getLanguageSettingForFile(new Path("a.c"), true); entries = ls.getSettingEntries(ICSettingEntry.INCLUDE_PATH); ICLanguageSettingEntry[] expectedEntries = new ICLanguageSettingEntry[]{ new CIncludePathEntry("ip_a", 0), new CIncludePathEntry("ip_b", 0), }; assertTrue(Arrays.equals(expectedEntries, entries)); model.setProjectDescription(project, des); des = model.getProjectDescription(project); cfgDes = des.getConfigurations()[0]; ls = cfgDes.getLanguageSettingForFile(new Path("a.c"), true); entries = ls.getSettingEntries(ICSettingEntry.INCLUDE_PATH); assertTrue(Arrays.equals(expectedEntries, entries)); ICLanguageSettingEntry[] expectedEntries2 = new ICLanguageSettingEntry[]{ new CIncludePathEntry("ip_a2", 0), new CIncludePathEntry("ip_b2", 0), }; TestExtSettingsProvider.setVariantNum(1); mngr.updateExternalSettingsProviders(extPIds, null); des = model.getProjectDescription(project); cfgDes = des.getConfigurations()[0]; ls = cfgDes.getLanguageSettingForFile(new Path("a.c"), true); entries = ls.getSettingEntries(ICSettingEntry.INCLUDE_PATH); assertTrue(Arrays.equals(expectedEntries2, entries)); } public void testRestoreDefaults() throws Exception { TestExtSettingsProvider.setVariantNum(0); CoreModel model = CoreModel.getDefault(); ICProjectDescriptionManager mngr = model.getProjectDescriptionManager(); IProject project = p4.getProject(); ICProjectDescription des = model.getProjectDescription(project); ICConfigurationDescription cfgDes = des.getConfigurations()[0]; ICLanguageSetting ls = cfgDes.getLanguageSettingForFile(new Path("a.c"), true); ICLanguageSettingEntry[] entries = ls.getSettingEntries(ICSettingEntry.INCLUDE_PATH); assertEquals(0, entries.length); ICSourceEntry[] sourceEntries = cfgDes.getSourceEntries(); ICSourceEntry[] expectedSourceEntries = new ICSourceEntry[]{ new CSourceEntry(project.getFullPath(), null, ICSettingEntry.RESOLVED) }; assertEquals(1, sourceEntries.length); assertTrue(Arrays.equals(expectedSourceEntries, sourceEntries)); String[] extPIds = new String[]{CTestPlugin.PLUGIN_ID + ".testExtSettingsProvider"}; cfgDes.setExternalSettingsProviderIds(extPIds); ls = cfgDes.getLanguageSettingForFile(new Path("a.c"), true); entries = ls.getSettingEntries(ICSettingEntry.INCLUDE_PATH); ICLanguageSettingEntry[] expectedEntries = new ICLanguageSettingEntry[]{ new CIncludePathEntry("ip_a", 0), new CIncludePathEntry("ip_b", 0), }; assertTrue(Arrays.equals(expectedEntries, entries)); model.setProjectDescription(project, des); des = model.getProjectDescription(project); cfgDes = des.getConfigurations()[0]; ls = cfgDes.getLanguageSettingForFile(new Path("a.c"), true); entries = ls.getSettingEntries(ICSettingEntry.INCLUDE_PATH); assertTrue(Arrays.equals(expectedEntries, entries)); ls.setSettingEntries(ICSettingEntry.INCLUDE_PATH, (ICLanguageSettingEntry[])null); entries = ls.getSettingEntries(ICSettingEntry.INCLUDE_PATH); assertTrue(Arrays.equals(expectedEntries, entries)); cfgDes.setSourceEntries(null); expectedSourceEntries = new ICSourceEntry[]{ new CSourceEntry(project.getFullPath().append("sp_a"), null, 0), new CSourceEntry(project.getFullPath().append("sp_b"), null, 0), }; sourceEntries = cfgDes.getSourceEntries(); assertEquals(2, sourceEntries.length); assertTrue(Arrays.equals(expectedSourceEntries, sourceEntries)); cfgDes.getBuildSetting().setOutputDirectories(null); ICOutputEntry[] expectedOutputEntries = new ICOutputEntry[]{ new COutputEntry(project.getFullPath().append("op_a"), null, 0), new COutputEntry(project.getFullPath().append("op_b"), null, 0), }; ICOutputEntry[] outputEntries = cfgDes.getBuildSetting().getOutputDirectories(); assertEquals(2, outputEntries.length); assertTrue(Arrays.equals(expectedOutputEntries, outputEntries)); } private static final int[] ENTRY_KINDS = { ICSettingEntry.INCLUDE_PATH, ICSettingEntry.INCLUDE_FILE, ICSettingEntry.MACRO, ICSettingEntry.MACRO_FILE, ICSettingEntry.LIBRARY_PATH, ICSettingEntry.LIBRARY_FILE, ICSettingEntry.OUTPUT_PATH , ICSettingEntry.SOURCE_PATH , }; /** * Test that all entries are present */ public void testCheckAllProvidedSettingTypes() throws CoreException { TestExtSettingsProvider.setVariantNum(0); CoreModel model = CoreModel.getDefault(); IProject project = p3.getProject(); ICProjectDescription des = model.getProjectDescription(project); ICConfigurationDescription cfgDes = des.getConfigurations()[0]; TestExtSettingsProvider.setVariantNum(0); String[] extPIds = new String[]{TestExtSettingsProvider.TEST_EXTERNAL_PROVIDER_ID}; cfgDes.setExternalSettingsProviderIds(extPIds); assertEquals(extPIds.length, cfgDes.getExternalSettingsProviderIds().length); assertTrue(Arrays.equals(extPIds, cfgDes.getExternalSettingsProviderIds())); ICLanguageSetting langSettings = cfgDes.getRootFolderDescription().getLanguageSettings()[0]; for (int kind : ENTRY_KINDS) { ICSettingEntry[] provided = TestExtSettingsProvider.SETTINGS_VARIANTS[0][0].getEntries(kind); switch (kind) { // Language setting kinds: see KindBasedStore case ICSettingEntry.INCLUDE_PATH : case ICSettingEntry.INCLUDE_FILE : case ICSettingEntry.LIBRARY_PATH : case ICSettingEntry.LIBRARY_FILE : case ICSettingEntry.MACRO : case ICSettingEntry.MACRO_FILE : assertTrue(Arrays.equals(langSettings.getSettingEntries(kind), provided)); break; // All settings kind case ICSettingEntry.OUTPUT_PATH : assertTrue(Arrays.equals(cfgDes.getBuildSetting().getOutputDirectories(), makeProjectRelativePath(project, provided))); break; case ICSettingEntry.SOURCE_PATH : assertTrue(Arrays.equals(cfgDes.getSourceEntries(), makeProjectRelativePath(project, provided))); break; default: fail("Unhandled entry_kind: " + kind); } } } /** * converts an array of project relative source / output entries to be full path based * @param project * @param input * @return */ private ICSettingEntry[] makeProjectRelativePath(IProject project, ICSettingEntry[] input) { ICSettingEntry[] out = new ICSettingEntry[input.length]; for (int i = 0; i < input.length; i ++) { switch (input[i].getKind()) { case ICSettingEntry.OUTPUT_PATH: out[i] = new COutputEntry(project.getFullPath().append(input[i].getValue()), ((ICOutputEntry)input[i]).getExclusionPatterns(), input[i].getFlags()); break; case ICSettingEntry.SOURCE_PATH: out[i] = new CSourceEntry(project.getFullPath().append(input[i].getValue()), ((ICSourceEntry)input[i]).getExclusionPatterns(), input[i].getFlags()); break; } } return out; } /** * Test if changing only the language IDs of an external setting works */ public void testChangeLanguageSet() throws CoreException { TestExtSettingsProvider.setVariantNum(2); CoreModel model = CoreModel.getDefault(); ICProjectDescriptionManager mngr = model.getProjectDescriptionManager(); IProject project = p5.getProject(); // add external settings provider ICProjectDescription des = model.getProjectDescription(project); ICConfigurationDescription cfgDes = des.getConfigurations()[0]; String[] extPIds = new String[]{TestExtSettingsProvider.TEST_EXTERNAL_PROVIDER_ID}; cfgDes.setExternalSettingsProviderIds(extPIds); model.setProjectDescription(project, des); // read out the settings it caused des = model.getProjectDescription(project, false); cfgDes = des.getConfigurations()[0]; ICFolderDescription root = cfgDes.getRootFolderDescription(); HashMap<String, ICLanguageSetting> languageSettingsById = new HashMap<String, ICLanguageSetting>(); for (ICLanguageSetting s: root.getLanguageSettings()) { languageSettingsById.put(s.getLanguageId(), s); } ICLanguageSetting ls; ICLanguageSettingEntry[] entries; ICLanguageSettingEntry[] expectedEntriesSet = new ICLanguageSettingEntry[]{ new CMacroEntry("m_c", "mv_c", 0) }; ICLanguageSettingEntry[] expectedEntriesUnset = new ICLanguageSettingEntry[] {}; // setting should be present for assembly but not for C ls = languageSettingsById.get("org.eclipse.cdt.core.assembly"); assertNotNull(ls); entries = ls.getSettingEntries(ICSettingEntry.MACRO); assertEquals(1, entries.length); assertTrue(Arrays.equals(expectedEntriesSet, entries)); ls = languageSettingsById.get("org.eclipse.cdt.core.gcc"); assertNotNull(ls); entries = ls.getSettingEntries(ICSettingEntry.MACRO); assertEquals(0, entries.length); assertTrue(Arrays.equals(expectedEntriesUnset, entries)); // update settings provider TestExtSettingsProvider.setVariantNum(3); mngr.updateExternalSettingsProviders(extPIds, null); // read out the settings it caused des = model.getProjectDescription(project, false); cfgDes = des.getConfigurations()[0]; root = cfgDes.getRootFolderDescription(); languageSettingsById = new HashMap<String, ICLanguageSetting>(); for (ICLanguageSetting s: root.getLanguageSettings()) { languageSettingsById.put(s.getLanguageId(), s); } // setting should be present for both now ls = languageSettingsById.get("org.eclipse.cdt.core.gcc"); assertNotNull(ls); entries = ls.getSettingEntries(ICSettingEntry.MACRO); assertEquals(1, entries.length); assertTrue(Arrays.equals(expectedEntriesSet, entries)); ls = languageSettingsById.get("org.eclipse.cdt.core.assembly"); assertNotNull(ls); entries = ls.getSettingEntries(ICSettingEntry.MACRO); assertEquals(1, entries.length); assertTrue(Arrays.equals(expectedEntriesSet, entries)); } protected void tearDown() throws Exception { try { p1.getProject().delete(true, null); } catch (CoreException e){ } try { p2.getProject().delete(true, null); } catch (CoreException e){ } try { p3.getProject().delete(true, null); } catch (CoreException e){ } try { p4.getProject().delete(true, null); } catch (CoreException e){ } try { p5.getProject().delete(true, null); } catch (CoreException e){ } } }