/******************************************************************************* * Copyright (c) 2009, 2012 Andrew Gvozdev 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: * Andrew Gvozdev - Initial API and implementation *******************************************************************************/ package org.eclipse.cdt.core.language.settings.providers; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import junit.framework.TestSuite; import org.eclipse.cdt.core.settings.model.CIncludeFileEntry; import org.eclipse.cdt.core.settings.model.CIncludePathEntry; import org.eclipse.cdt.core.settings.model.CLibraryFileEntry; import org.eclipse.cdt.core.settings.model.CLibraryPathEntry; import org.eclipse.cdt.core.settings.model.CMacroEntry; import org.eclipse.cdt.core.settings.model.CMacroFileEntry; import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry; import org.eclipse.cdt.core.settings.model.ICSettingEntry; import org.eclipse.cdt.core.testplugin.util.BaseTestCase; import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsExtensionManager; import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsProvidersSerializer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.Path; /** * Test cases testing LanguageSettingsProvider extensions */ public class LanguageSettingsExtensionsTests extends BaseTestCase { // These should match corresponding entries defined in plugin.xml /*package*/ static final String EXTENSION_BASE_PROVIDER_ID = "org.eclipse.cdt.core.tests.language.settings.base.provider"; /*package*/ static final String EXTENSION_BASE_PROVIDER_NAME = "Test Plugin Mock Language Settings Base Provider"; /*package*/ static final String EXTENSION_BASE_PROVIDER_LANG_ID = "org.eclipse.cdt.core.tests.language.id"; /*package*/ static final String EXTENSION_BASE_PROVIDER_PARAMETER = "custom parameter"; /*package*/ static final String EXTENSION_BASE_PROVIDER_ATTR_PARAMETER = "parameter"; /*package*/ static final String EXTENSION_CUSTOM_PROVIDER_ID = "org.eclipse.cdt.core.tests.custom.language.settings.provider"; /*package*/ static final String EXTENSION_CUSTOM_PROVIDER_NAME = "Test Plugin Mock Language Settings Provider"; /*package*/ static final String EXTENSION_BASE_SUBCLASS_PROVIDER_ID = "org.eclipse.cdt.core.tests.language.settings.base.provider.subclass"; /*package*/ static final String EXTENSION_BASE_SUBCLASS_PROVIDER_PARAMETER = "custom parameter subclass"; /*package*/ static final String EXTENSION_SERIALIZABLE_PROVIDER_ID = "org.eclipse.cdt.core.tests.custom.serializable.language.settings.provider"; /*package*/ static final String EXTENSION_SERIALIZABLE_PROVIDER_NAME = "Test Plugin Mock Serializable Language Settings Provider"; /*package*/ static final String EXTENSION_SERIALIZABLE_PROVIDER_MISSING_PARAMETER = "parameter"; /*package*/ static final String EXTENSION_EDITABLE_PROVIDER_ID = "org.eclipse.cdt.core.tests.custom.editable.language.settings.provider"; /*package*/ static final String EXTENSION_EDITABLE_PROVIDER_NAME = "Test Plugin Mock Editable Language Settings Provider"; /*package*/ static final ICLanguageSettingEntry EXTENSION_SERIALIZABLE_PROVIDER_ENTRY = new CMacroEntry("MACRO", "value", 0); /*package*/ static final ICLanguageSettingEntry EXTENSION_EDITABLE_PROVIDER_ENTRY = new CMacroEntry("MACRO", "value", 0); /*package*/ static final String EXTENSION_REGISTERER_PROVIDER_ID = "org.eclipse.cdt.core.tests.language.settings.listener.registerer.provider"; // Arbitrary sample parameters used by the test private static final String PROVIDER_0 = "test.provider.0.id"; private static final String PROVIDER_NAME_0 = "test.provider.0.name"; private static final String LANG_ID = "test.lang.id"; private static final IFile FILE_0 = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path("/project/path0")); // Constants used in LanguageSettingsSerializableProvider private static final String ATTR_ID = LanguageSettingsProvidersSerializer.ATTR_ID; private static final String ATTR_NAME = LanguageSettingsProvidersSerializer.ATTR_NAME; private static final String ATTR_CLASS = LanguageSettingsProvidersSerializer.ATTR_CLASS; /** * Constructor. * @param name - name of the test. */ public LanguageSettingsExtensionsTests(String name) { super(name); } @Override protected void setUp() throws Exception { super.setUp(); } @Override protected void tearDown() throws Exception { super.tearDown(); } /** * @return - new TestSuite. */ public static TestSuite suite() { return new TestSuite(LanguageSettingsExtensionsTests.class); } /** * main function of the class. * * @param args - arguments */ public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } /** * Check that regular {@link ICLanguageSettingsProvider} extension defined in plugin.xml is accessible. */ public void testExtension() throws Exception { { // test provider defined as an extension List<ILanguageSettingsProvider> providers = LanguageSettingsManager.getWorkspaceProviders(); List<String> ids = new ArrayList<String>(); for (ILanguageSettingsProvider provider : providers) { ids.add(provider.getId()); } assertTrue("extension " + EXTENSION_BASE_PROVIDER_ID + " not found", ids.contains(EXTENSION_BASE_PROVIDER_ID)); } { // test provider that is not in the list ILanguageSettingsProvider providerExt = LanguageSettingsManager.getExtensionProviderCopy("missing.povider", true); assertNull(providerExt); } // this extension provider is not copyable ILanguageSettingsProvider providerExtCopy = LanguageSettingsManager.getExtensionProviderCopy(EXTENSION_BASE_PROVIDER_ID, true); assertNull(providerExtCopy); // test raw workspace provider defined as an extension ILanguageSettingsProvider providerExt = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_BASE_PROVIDER_ID); assertTrue(LanguageSettingsManager.isWorkspaceProvider(providerExt)); ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(providerExt); assertTrue(rawProvider instanceof LanguageSettingsBaseProvider); LanguageSettingsBaseProvider provider = (LanguageSettingsBaseProvider)rawProvider; assertEquals(EXTENSION_BASE_PROVIDER_ID, provider.getId()); assertEquals(EXTENSION_BASE_PROVIDER_NAME, provider.getName()); assertEquals(EXTENSION_BASE_PROVIDER_PARAMETER, provider.getProperty(EXTENSION_BASE_PROVIDER_ATTR_PARAMETER)); // these attributes are not exposed as properties assertEquals("", provider.getProperty(ATTR_ID)); assertEquals("", provider.getProperty(ATTR_NAME)); assertEquals("", provider.getProperty(ATTR_CLASS)); // attempt to get entries for wrong language assertNull(provider.getSettingEntries(null, FILE_0, LANG_ID)); // benchmarks matching extension point definition List<ICLanguageSettingEntry> entriesExt = new ArrayList<ICLanguageSettingEntry>(); entriesExt.add(new CIncludePathEntry("/usr/include/", ICSettingEntry.BUILTIN | ICSettingEntry.LOCAL | ICSettingEntry.RESOLVED | ICSettingEntry.VALUE_WORKSPACE_PATH | ICSettingEntry.UNDEFINED )); entriesExt.add(new CMacroEntry("TEST_DEFINE", "100", 0)); entriesExt.add(new CIncludeFileEntry("/include/file.inc", 0)); entriesExt.add(new CLibraryPathEntry("/usr/lib/", 0)); entriesExt.add(new CLibraryFileEntry("libdomain.a", 0)); entriesExt.add(new CMacroFileEntry("/macro/file.mac", 0)); // retrieve entries from extension point List<ICLanguageSettingEntry> actual = provider.getSettingEntries(null, FILE_0, EXTENSION_BASE_PROVIDER_LANG_ID); for (int i=0;i<entriesExt.size();i++) { assertEquals("i="+i, entriesExt.get(i), actual.get(i)); } assertEquals(entriesExt.size(), actual.size()); } /** * Check that subclassed {@link LanguageSettingsBaseProvider} extension defined in plugin.xml is accessible. */ public void testExtensionBaseProviderSubclass() throws Exception { // get test plugin extension provider ILanguageSettingsProvider providerExtCopy = LanguageSettingsManager.getExtensionProviderCopy(EXTENSION_BASE_SUBCLASS_PROVIDER_ID, true); assertNull(providerExtCopy); ILanguageSettingsProvider providerExt = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_BASE_SUBCLASS_PROVIDER_ID); assertTrue(LanguageSettingsManager.isWorkspaceProvider(providerExt)); // get raw extension provider ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(providerExt); assertTrue(rawProvider instanceof MockLanguageSettingsBaseProvider); MockLanguageSettingsBaseProvider provider = (MockLanguageSettingsBaseProvider)rawProvider; assertEquals(EXTENSION_BASE_SUBCLASS_PROVIDER_ID, provider.getId()); assertEquals(EXTENSION_BASE_SUBCLASS_PROVIDER_PARAMETER, provider.getCustomParameter()); // Test for null languages assertNull(provider.getLanguageScope()); // benchmarks matching extension point definition List<ICLanguageSettingEntry> entriesExt = new ArrayList<ICLanguageSettingEntry>(); entriesExt.add(new CIncludePathEntry("/usr/include/", ICSettingEntry.BUILTIN)); // retrieve entries from extension point List<ICLanguageSettingEntry> actual = provider.getSettingEntries(null, FILE_0, LANG_ID); for (int i=0;i<entriesExt.size();i++) { assertEquals("i="+i, entriesExt.get(i), actual.get(i)); } assertEquals(entriesExt.size(), actual.size()); } /** * Make sure extensions contributed through extension point created with proper ID/name. */ public void testExtensionCustomProvider() throws Exception { // get test plugin extension non-default provider ILanguageSettingsProvider providerExtCopy = LanguageSettingsManager.getExtensionProviderCopy(EXTENSION_CUSTOM_PROVIDER_ID, true); assertNull(providerExtCopy); ILanguageSettingsProvider providerExt = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_CUSTOM_PROVIDER_ID); assertTrue(LanguageSettingsManager.isWorkspaceProvider(providerExt)); // get raw extension provider ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(providerExt); assertTrue(rawProvider instanceof MockLanguageSettingsProvider); assertEquals(EXTENSION_CUSTOM_PROVIDER_ID, rawProvider.getId()); assertEquals(EXTENSION_CUSTOM_PROVIDER_NAME, rawProvider.getName()); } /** * Basic test for {@link LanguageSettingsBaseProvider}. */ public void testBaseProvider() throws Exception { // define benchmarks List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); entries.add(new CIncludePathEntry("path0", 0)); List<String> languages = new ArrayList<String>(2); languages.add("bogus.language.id"); languages.add(LANG_ID); // create base provider LanguageSettingsBaseProvider provider = new LanguageSettingsBaseProvider(PROVIDER_0, PROVIDER_NAME_0, languages, entries); { // attempt to get entries for wrong language List<ICLanguageSettingEntry> actual = provider.getSettingEntries(null, FILE_0, "wrong.lang.id"); assertNull(actual); } { // retrieve the entries List<ICLanguageSettingEntry> actual = provider.getSettingEntries(null, FILE_0, LANG_ID); assertEquals(entries.get(0), actual.get(0)); assertNotSame(entries, actual); // retrieve languages List<String> actualLanguageIds = provider.getLanguageScope(); for (String languageId: languages) { assertTrue(actualLanguageIds.contains(languageId)); } assertEquals(languages.size(), actualLanguageIds.size()); } } /** * Test ability to configure {@link LanguageSettingsBaseProvider}. */ public void testBaseProviderConfigure() throws Exception { // sample entries List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); entries.add(new CIncludePathEntry("/usr/include/", 0)); List<String> languages = new ArrayList<String>(); languages.add(LANG_ID); // create LanguageSettingsBaseProvider LanguageSettingsBaseProvider provider1 = new LanguageSettingsBaseProvider(); LanguageSettingsBaseProvider provider2 = new LanguageSettingsBaseProvider(); { // configure provider1 Map<String, String> properties = new HashMap<String, String>(); properties.put("key1", "value1"); properties.put("key2", null); properties.put("key3", ""); properties.put("key4", "false"); provider1.configureProvider(PROVIDER_0, PROVIDER_NAME_0, languages, entries, properties); assertEquals(PROVIDER_0, provider1.getId()); assertEquals(PROVIDER_NAME_0, provider1.getName()); assertEquals(languages, provider1.getLanguageScope()); assertEquals(entries, provider1.getSettingEntries(null, null, LANG_ID)); assertEquals("value1", provider1.getProperty("key1")); assertEquals("", provider1.getProperty("key2")); assertEquals("", provider1.getProperty("key3")); assertEquals("false", provider1.getProperty("key4")); assertEquals(false, provider1.getPropertyBool("key4")); assertEquals("", provider1.getProperty("keyX")); assertEquals(false, provider1.getPropertyBool("keyX")); } { // configure provider2 Map<String, String> properties = new HashMap<String, String>(); properties.put("key1", "value1"); provider2.configureProvider(PROVIDER_0, PROVIDER_NAME_0, languages, entries, properties); assertEquals(PROVIDER_0, provider2.getId()); assertEquals(PROVIDER_NAME_0, provider2.getName()); assertEquals(languages, provider2.getLanguageScope()); assertEquals(entries, provider2.getSettingEntries(null, null, LANG_ID)); assertEquals("value1", provider2.getProperty("key1")); assertEquals("", provider2.getProperty("keyX")); assertEquals(false, provider2.getPropertyBool("keyX")); } // test equality assertTrue(provider1.equals(provider2)); } /** * {@link LanguageSettingsBaseProvider} is not allowed to be configured twice. */ public void testBaseProviderCantReconfigure() throws Exception { // create LanguageSettingsBaseProvider LanguageSettingsBaseProvider provider = new LanguageSettingsBaseProvider(); List<ICLanguageSettingEntry> entries = new ArrayList<ICLanguageSettingEntry>(); entries.add(new CIncludePathEntry("/usr/include/", 0)); // configure it provider.configureProvider("test.id", "test.name", null, entries, null); try { // attempt to configure it twice should fail provider.configureProvider("test.id", "test.name", null, entries, null); fail("LanguageSettingsBaseProvider is not allowed to be configured twice"); } catch (UnsupportedOperationException e) { } } /** * Test {@link LanguageSettingsSerializableProvider} defined via extension point. */ public void testSerializableProvider() throws Exception { // get test plugin extension for serializable provider ILanguageSettingsProvider providerExtCopy = LanguageSettingsManager.getExtensionProviderCopy(EXTENSION_SERIALIZABLE_PROVIDER_ID, true); assertNull(providerExtCopy); ILanguageSettingsProvider providerExt = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_SERIALIZABLE_PROVIDER_ID); assertTrue(LanguageSettingsManager.isWorkspaceProvider(providerExt)); // get raw extension provider ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(providerExt); assertTrue(rawProvider instanceof LanguageSettingsSerializableProvider); LanguageSettingsSerializableProvider provider = (LanguageSettingsSerializableProvider) rawProvider; assertEquals(null, provider.getLanguageScope()); assertEquals("", provider.getProperty(EXTENSION_SERIALIZABLE_PROVIDER_MISSING_PARAMETER)); List<ICLanguageSettingEntry> expected = new ArrayList<ICLanguageSettingEntry>(); expected.add(EXTENSION_EDITABLE_PROVIDER_ENTRY); assertEquals(expected, provider.getSettingEntries(null, null, null)); } /** * Test {@link ILanguageSettingsEditableProvider} defined via extension point. */ public void testEditableProvider() throws Exception { // Non-editable providers cannot be copied so they are singletons { // get test plugin extension for serializable provider ILanguageSettingsProvider providerExtCopy = LanguageSettingsManager.getExtensionProviderCopy(EXTENSION_SERIALIZABLE_PROVIDER_ID, true); assertNull(providerExtCopy); ILanguageSettingsProvider providerExt = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_SERIALIZABLE_PROVIDER_ID); assertTrue(LanguageSettingsManager.isWorkspaceProvider(providerExt)); // get raw extension provider ILanguageSettingsProvider rawProvider = LanguageSettingsManager.getRawProvider(providerExt); assertTrue(rawProvider instanceof LanguageSettingsSerializableProvider); assertTrue(LanguageSettingsManager.isEqualExtensionProvider(rawProvider, true)); assertEquals(true, LanguageSettingsExtensionManager.isPreferShared(EXTENSION_SERIALIZABLE_PROVIDER_ID)); } // Editable providers are retrieved by copy { // get extension provider ILanguageSettingsProvider providerExt = LanguageSettingsManager.getExtensionProviderCopy(EXTENSION_EDITABLE_PROVIDER_ID, true); assertFalse(LanguageSettingsManager.isWorkspaceProvider(providerExt)); assertTrue(providerExt instanceof ILanguageSettingsEditableProvider); assertTrue(LanguageSettingsManager.isEqualExtensionProvider(providerExt, true)); assertEquals(LanguageSettingsExtensionManager.isPreferShared(EXTENSION_EDITABLE_PROVIDER_ID), false); // test that different copies are not same ILanguageSettingsProvider providerExt2 = LanguageSettingsManager.getExtensionProviderCopy(EXTENSION_EDITABLE_PROVIDER_ID, true); assertNotSame(providerExt, providerExt2); assertEquals(providerExt, providerExt2); // test that workspace provider is not the same as extension provider ILanguageSettingsProvider providerWsp = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_EDITABLE_PROVIDER_ID); ILanguageSettingsProvider providerWspRaw = LanguageSettingsManager.getRawProvider(providerWsp); assertNotSame(providerExt, providerWspRaw); assertEquals(providerExt, providerWspRaw); assertTrue(LanguageSettingsManager.isEqualExtensionProvider(providerWspRaw, true)); } // Test shallow copy { ILanguageSettingsProvider provider = LanguageSettingsManager.getExtensionProviderCopy(EXTENSION_EDITABLE_PROVIDER_ID, true); assertNotNull(provider); assertTrue(provider instanceof ILanguageSettingsEditableProvider); ILanguageSettingsProvider providerShallow = LanguageSettingsManager.getExtensionProviderCopy(EXTENSION_EDITABLE_PROVIDER_ID, false); assertNotNull(providerShallow); assertTrue(providerShallow instanceof ILanguageSettingsEditableProvider); assertFalse(provider.equals(providerShallow)); assertFalse(LanguageSettingsManager.isEqualExtensionProvider(providerShallow, true)); assertTrue(LanguageSettingsManager.isEqualExtensionProvider(providerShallow, false)); } } }