| /******************************************************************************* |
| * Copyright (c) 2007, 2012 Symbian Software Systems 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 Ferguson (Symbian) - Initial implementation |
| * Markus Schorn (Wind River Systems) |
| *******************************************************************************/ |
| package org.eclipse.cdt.internal.index.tests; |
| |
| import java.io.File; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.eclipse.cdt.core.CCorePlugin; |
| import org.eclipse.cdt.core.cdtvariables.ICdtVariablesContributor; |
| import org.eclipse.cdt.core.dom.IPDOMManager; |
| import org.eclipse.cdt.core.index.IIndex; |
| import org.eclipse.cdt.core.index.IIndexManager; |
| import org.eclipse.cdt.core.index.provider.IIndexProvider; |
| import org.eclipse.cdt.core.internal.index.provider.test.DummyProviderTraces; |
| import org.eclipse.cdt.core.internal.index.provider.test.Providers; |
| import org.eclipse.cdt.core.model.CoreModel; |
| import org.eclipse.cdt.core.model.ICProject; |
| import org.eclipse.cdt.core.parser.util.ArrayUtil; |
| import org.eclipse.cdt.core.settings.model.CConfigurationStatus; |
| import org.eclipse.cdt.core.settings.model.ICBuildSetting; |
| import org.eclipse.cdt.core.settings.model.ICConfigExtensionReference; |
| import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; |
| import org.eclipse.cdt.core.settings.model.ICExternalSetting; |
| import org.eclipse.cdt.core.settings.model.ICFileDescription; |
| import org.eclipse.cdt.core.settings.model.ICFolderDescription; |
| import org.eclipse.cdt.core.settings.model.ICLanguageSetting; |
| import org.eclipse.cdt.core.settings.model.ICProjectDescription; |
| import org.eclipse.cdt.core.settings.model.ICProjectDescriptionPreferences; |
| import org.eclipse.cdt.core.settings.model.ICResourceDescription; |
| import org.eclipse.cdt.core.settings.model.ICSettingContainer; |
| import org.eclipse.cdt.core.settings.model.ICSettingEntry; |
| import org.eclipse.cdt.core.settings.model.ICSettingObject; |
| import org.eclipse.cdt.core.settings.model.ICSourceEntry; |
| import org.eclipse.cdt.core.settings.model.ICStorageElement; |
| import org.eclipse.cdt.core.settings.model.ICTargetPlatformSetting; |
| import org.eclipse.cdt.core.settings.model.WriteAccessException; |
| import org.eclipse.cdt.core.settings.model.extension.CConfigurationData; |
| import org.eclipse.cdt.core.settings.model.extension.impl.CDefaultConfigurationData; |
| import org.eclipse.cdt.core.testplugin.CProjectHelper; |
| import org.eclipse.cdt.internal.core.index.IIndexFragment; |
| import org.eclipse.cdt.internal.core.index.provider.IIndexFragmentProvider; |
| import org.eclipse.cdt.internal.core.index.provider.IndexProviderManager; |
| import org.eclipse.cdt.internal.core.pdom.PDOM; |
| import org.eclipse.cdt.internal.core.pdom.PDOMManager; |
| import org.eclipse.cdt.internal.core.pdom.indexer.DeltaAnalyzer; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IProjectDescription; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.NullProgressMonitor; |
| import org.eclipse.core.runtime.QualifiedName; |
| import org.eclipse.osgi.service.resolver.VersionRange; |
| |
| import junit.framework.TestSuite; |
| |
| /** |
| * Example usage and test for IIndexProvider |
| */ |
| public class IndexProviderManagerTest extends IndexTestBase { |
| private static final int A_FRAGMENT_OPTION = IIndexManager.ADD_EXTENSION_FRAGMENTS_NAVIGATION; |
| |
| final static DummyProviderTraces DPT= DummyProviderTraces.getInstance(); |
| final static Class DP1= Providers.Dummy1.class; |
| final static Class DP2= Providers.Dummy2.class; |
| final static Class DP3= Providers.Dummy3.class; |
| final static Class DP4= Providers.Dummy4.class; |
| final static Class DP5= Providers.Dummy5.class; |
| final static Class[] DPS= new Class[] {DP4, DP2, DP1, DP3, DP5}; |
| |
| /* |
| * Fictional compatibility ranges for testing |
| */ |
| final static VersionRange VERSION_400= new VersionRange("36"); |
| final static VersionRange VERSION_401= new VersionRange("[36,37]"); |
| final static VersionRange VERSION_405= new VersionRange("[37,39]"); |
| final static VersionRange VERSION_502= new VersionRange("[89,91]"); |
| |
| final CCorePlugin core= CCorePlugin.getDefault(); |
| |
| public IndexProviderManagerTest() { |
| super("IndexProviderManagerTest"); |
| } |
| |
| public static TestSuite suite() { |
| return suite(IndexProviderManagerTest.class); |
| } |
| |
| @Override |
| protected void setUp() throws Exception { |
| DPT.enabled = true; |
| super.setUp(); |
| } |
| |
| @Override |
| protected void tearDown() throws Exception { |
| DPT.enabled = false; |
| IndexProviderManager ipm= ((PDOMManager)CCorePlugin.getIndexManager()).getIndexProviderManager(); |
| ipm.reset(); ipm.startup(); |
| } |
| |
| public void testProvider_SimpleLifeCycle_200958() throws Exception { |
| for (Class element : DPS) |
| DPT.reset(element); |
| |
| List cprojects = new ArrayList(), expectedTrace = new ArrayList(); |
| try { |
| for(int i=0; i<3; i++) { |
| ICProject cproject = CProjectHelper.createCProject("P"+System.currentTimeMillis(), "bin", IPDOMManager.ID_NO_INDEXER); |
| IIndex index = CCorePlugin.getIndexManager().getIndex(cproject, A_FRAGMENT_OPTION); |
| cprojects.add(cproject); |
| expectedTrace.add(cproject); |
| } |
| for (Class element : DPS) |
| assertEquals(expectedTrace, DPT.getProjectsTrace(element)); |
| for(int i=0; i<expectedTrace.size(); i++) { |
| ICProject cproject = (ICProject) expectedTrace.get(i); |
| IIndex index = CCorePlugin.getIndexManager().getIndex(cproject, A_FRAGMENT_OPTION); |
| } |
| for (Class element : DPS) |
| assertEquals(expectedTrace, DPT.getProjectsTrace(element)); |
| } finally { |
| for(int i=0; i<cprojects.size(); i++) { |
| ICProject cproject = (ICProject) expectedTrace.get(i); |
| cproject.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor()); |
| } |
| } |
| } |
| |
| public void testProvider_OverDeleteAndAdd() throws Exception { |
| DPT.reset(DP1); |
| |
| List expectedTrace = new ArrayList(); |
| ICProject cproject = null; |
| try { |
| String name = "P"+System.currentTimeMillis(); |
| cproject = CProjectHelper.createCProject(name, "bin", IPDOMManager.ID_NO_INDEXER); |
| IIndex index = CCorePlugin.getIndexManager().getIndex(cproject, A_FRAGMENT_OPTION); |
| expectedTrace.add(cproject); |
| assertEquals(expectedTrace, DPT.getProjectsTrace(DP1)); |
| |
| cproject.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor()); |
| cproject = CProjectHelper.createCProject(name, "bin", IPDOMManager.ID_NO_INDEXER); |
| index = CCorePlugin.getIndexManager().getIndex(cproject, A_FRAGMENT_OPTION); |
| expectedTrace.add(cproject); |
| assertEquals(expectedTrace, DPT.getProjectsTrace(DP1)); |
| } finally { |
| if(cproject!=null) { |
| cproject.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor()); |
| } |
| } |
| } |
| |
| public void testProvider_OverMove() throws Exception { |
| DPT.reset(DP1); |
| List cprojects = new ArrayList(); |
| List expectedTrace = new ArrayList(); |
| |
| /* n.b. here we test for the current implementation expected behaviour, |
| * not the contract of IIndexProvider.providesFor |
| */ |
| |
| ICProject cproject = null; |
| try { |
| String name = "P"+System.currentTimeMillis(); |
| cproject = CProjectHelper.createCProject(name, "bin", IPDOMManager.ID_NO_INDEXER); |
| IIndex index = CCorePlugin.getIndexManager().getIndex(cproject, A_FRAGMENT_OPTION); |
| expectedTrace.add(cproject); |
| assertEquals(expectedTrace, DPT.getProjectsTrace(DP1)); |
| |
| // move the project to a random new location |
| File newLocation = CProjectHelper.freshDir(); |
| IProjectDescription description = cproject.getProject().getDescription(); |
| description.setLocationURI(newLocation.toURI()); |
| cproject.getProject().move(description, IResource.FORCE | IResource.SHALLOW, new NullProgressMonitor()); |
| |
| index = CCorePlugin.getIndexManager().getIndex(cproject, A_FRAGMENT_OPTION); |
| assertEquals(expectedTrace, DPT.getProjectsTrace(DP1)); |
| } finally { |
| if(cproject!=null) { |
| cproject.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor()); |
| } |
| } |
| } |
| |
| public void testVersioning_IncompatibleIgnored() throws Exception { |
| IndexProviderManager ipm= ((PDOMManager)CCorePlugin.getIndexManager()).getIndexProviderManager(); |
| |
| ICProject cproject = null; |
| try { |
| cproject= CProjectHelper.createCCProject("IndexFactoryConfigurationUsageTest", IPDOMManager.ID_NO_INDEXER); |
| IProject project= cproject.getProject(); |
| |
| |
| MockState mockState = new MockState(cproject); |
| mockState.setConfig(MockState.REL_V1_ID); |
| |
| IIndexProvider provider1= new IIndexFragmentProvider() { |
| IIndexFragment[] fragments= new IIndexFragment[] { |
| new MockPDOM("contentID.contentA", "36"), |
| new MockPDOM("contentID.contentA", "37"), |
| new MockPDOM("contentID.foo", "90"), |
| new MockPDOM("contentID.bar", "91"), |
| new MockPDOM("contentID.baz", "89") |
| }; |
| @Override |
| public IIndexFragment[] getIndexFragments(ICConfigurationDescription config) { |
| return fragments; |
| } |
| @Override |
| public boolean providesFor(ICProject project) throws CoreException { |
| return true; |
| } |
| }; |
| IIndexProvider provider2= new IIndexFragmentProvider() { |
| IIndexFragment[] fragments= new IIndexFragment[] { |
| new MockPDOM("contentID.baz", "90"), |
| new MockPDOM("contentID.contentA", "38"), |
| }; |
| @Override |
| public IIndexFragment[] getIndexFragments(ICConfigurationDescription config) { |
| return fragments; |
| } |
| @Override |
| public boolean providesFor(ICProject project) throws CoreException { |
| return true; |
| } |
| }; |
| waitForIndexer(cproject); |
| setExpectedNumberOfLoggedNonOKStatusObjects(3); // foo, bar and baz have no compatible fragments available |
| |
| ipm.reset(VERSION_405); ipm.startup(); |
| ipm.addIndexProvider(provider1); ipm.addIndexProvider(provider2); |
| |
| IIndexFragment[] actual = ipm.getProvidedIndexFragments(mockState.getCurrentConfig(), -1); |
| assertEquals(1, actual.length); |
| assertFragmentPresent("contentID.contentA", "38", actual); |
| } finally { |
| if(cproject!=null) { |
| cproject.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor()); |
| } |
| } |
| } |
| |
| public void testVersioning_NoCompatibleVersionsFound() throws Exception { |
| IndexProviderManager ipm= ((PDOMManager)CCorePlugin.getIndexManager()).getIndexProviderManager(); |
| |
| ICProject cproject = null; |
| try { |
| cproject= CProjectHelper.createCCProject("IndexFactoryConfigurationUsageTest", IPDOMManager.ID_NO_INDEXER); |
| IProject project= cproject.getProject(); |
| |
| |
| MockState mockState = new MockState(cproject); |
| mockState.setConfig(MockState.REL_V1_ID); |
| |
| IIndexProvider provider1= new IIndexFragmentProvider() { |
| IIndexFragment[] fragments= new IIndexFragment[] { |
| new MockPDOM("contentID.contentA", "36"), |
| new MockPDOM("contentID.contentA", "37"), |
| new MockPDOM("contentID.foo", "90"), |
| new MockPDOM("contentID.bar", "91"), |
| new MockPDOM("contentID.baz", "89") |
| }; |
| @Override |
| public IIndexFragment[] getIndexFragments(ICConfigurationDescription config) { |
| return fragments; |
| } |
| @Override |
| public boolean providesFor(ICProject project) throws CoreException { |
| return true; |
| } |
| }; |
| IIndexProvider provider2= new IIndexFragmentProvider() { |
| IIndexFragment[] fragments= new IIndexFragment[] { |
| new MockPDOM("contentID.contentA", "41"), |
| }; |
| @Override |
| public IIndexFragment[] getIndexFragments(ICConfigurationDescription config) { |
| return fragments; |
| } |
| @Override |
| public boolean providesFor(ICProject project) throws CoreException { |
| return true; |
| } |
| }; |
| |
| waitForIndexer(cproject); |
| setExpectedNumberOfLoggedNonOKStatusObjects(1); // contentA has no compatible fragments available |
| |
| ipm.reset(VERSION_502); ipm.startup(); |
| ipm.addIndexProvider(provider1); ipm.addIndexProvider(provider2); |
| |
| IIndexFragment[] actual = ipm.getProvidedIndexFragments(mockState.getCurrentConfig(), -1); |
| assertEquals(3, actual.length); |
| assertFragmentPresent("contentID.foo", "90", actual); |
| assertFragmentPresent("contentID.bar", "91", actual); |
| assertFragmentPresent("contentID.baz", "89", actual); |
| } finally { |
| if(cproject!=null) { |
| cproject.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor()); |
| } |
| } |
| } |
| |
| private void assertFragmentPresent(String id, String version, IIndexFragment[] fragments) throws Exception { |
| for (IIndexFragment candidate : fragments) { |
| String cid= null, csver= null; |
| try { |
| candidate.acquireReadLock(); |
| cid= candidate.getProperty(IIndexFragment.PROPERTY_FRAGMENT_ID); |
| csver= candidate.getProperty(IIndexFragment.PROPERTY_FRAGMENT_FORMAT_VERSION); |
| } finally { |
| candidate.releaseReadLock(); |
| } |
| if(id.equals(cid) && version.equals(csver)) |
| return; |
| } |
| fail("Fragment matching (id="+id+",version="+version+") was not present"); |
| } |
| |
| public void testIndexFactoryConfigurationUsage() throws Exception { |
| IIndex index; |
| |
| ICProject cproject = null; |
| // Modifying the .project file triggers an indexer job, suppress that: |
| DeltaAnalyzer.sSuppressPotentialTUs= true; |
| try { |
| cproject = CProjectHelper.createCCProject("IndexFactoryConfigurationUsageTest", IPDOMManager.ID_NO_INDEXER); |
| IProject project= cproject.getProject(); |
| |
| ICProjectDescription pd= core.getProjectDescription(project); |
| ICConfigurationDescription cfg1= newCfg(pd, "project", "config1"); |
| ICConfigurationDescription cfg2= newCfg(pd, "project", "config2"); |
| core.setProjectDescription(project, pd); |
| |
| index= CCorePlugin.getIndexManager().getIndex(cproject, A_FRAGMENT_OPTION); |
| waitForIndexer(cproject); |
| |
| DPT.reset(DP1); |
| changeConfigRelations(cproject, ICProjectDescriptionPreferences.CONFIGS_LINK_SETTINGS_AND_ACTIVE); |
| assertEquals(0, DPT.getProjectsTrace(DP1).size()); |
| assertEquals(0, DPT.getCfgsTrace(DP1).size()); |
| |
| changeActiveConfiguration(cproject, cfg1); |
| DPT.reset(DP1); |
| index= CCorePlugin.getIndexManager().getIndex(cproject, A_FRAGMENT_OPTION); |
| assertEquals(0, DPT.getProjectsTrace(DP1).size()); |
| assertEquals(1, DPT.getCfgsTrace(DP1).size()); |
| assertEquals("project.config1", ((ICConfigurationDescription)DPT.getCfgsTrace(DP1).get(0)).getId()); |
| |
| changeActiveConfiguration(cproject, cfg2); |
| DPT.reset(DP1); |
| index= CCorePlugin.getIndexManager().getIndex(cproject, A_FRAGMENT_OPTION); |
| assertEquals(0, DPT.getProjectsTrace(DP1).size()); |
| assertEquals(1, DPT.getCfgsTrace(DP1).size()); |
| assertEquals("project.config2", ((ICConfigurationDescription)DPT.getCfgsTrace(DP1).get(0)).getId()); |
| |
| DPT.reset(DP1); |
| changeConfigRelations(cproject, ICProjectDescriptionPreferences.CONFIGS_INDEPENDENT); |
| assertEquals(0, DPT.getProjectsTrace(DP1).size()); |
| assertEquals(0, DPT.getCfgsTrace(DP1).size()); |
| |
| changeActiveConfiguration(cproject, cfg1); |
| DPT.reset(DP1); |
| index= CCorePlugin.getIndexManager().getIndex(cproject, A_FRAGMENT_OPTION); |
| assertEquals(0, DPT.getProjectsTrace(DP1).size()); |
| assertEquals(1, DPT.getCfgsTrace(DP1).size()); |
| // should still be config2, as the change in active configuration does not matter |
| assertEquals("project.config2", ((ICConfigurationDescription)DPT.getCfgsTrace(DP1).get(0)).getId()); |
| |
| changeActiveConfiguration(cproject, cfg2); |
| DPT.reset(DP1); |
| index= CCorePlugin.getIndexManager().getIndex(cproject, A_FRAGMENT_OPTION); |
| assertEquals(0, DPT.getProjectsTrace(DP1).size()); |
| assertEquals(1, DPT.getCfgsTrace(DP1).size()); |
| // there should be no change from the previous state (also config2) |
| assertEquals("project.config2", ((ICConfigurationDescription)DPT.getCfgsTrace(DP1).get(0)).getId()); |
| } finally { |
| DeltaAnalyzer.sSuppressPotentialTUs= false; |
| if (cproject != null) { |
| cproject.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor()); |
| } |
| } |
| } |
| |
| public void testGetProvidedFragments() throws Exception { |
| ICProject cproject= CProjectHelper.createCProject("IndexProviderManagerTest", "bin", IPDOMManager.ID_NO_INDEXER); |
| |
| try { |
| MockState mockState = new MockState(cproject); |
| MockStateIndexFragmentProvider provider1 = new MockStateIndexFragmentProvider(cproject); |
| MockStateIndexFragmentProvider provider2 = new MockStateIndexFragmentProvider(cproject); |
| |
| IndexProviderManager ipm = ((PDOMManager)CCorePlugin.getIndexManager()).getIndexProviderManager(); |
| ipm.addIndexProvider(provider1); |
| ipm.addIndexProvider(provider2); |
| |
| IIndexFragment[] fragments; |
| mockState.setConfig(MockState.REL_V1_ID); |
| fragments = ipm.getProvidedIndexFragments(mockState.getCurrentConfig(), -1); |
| assertEquals(2, fragments.length); |
| assertTrue(ArrayUtil.contains(fragments, provider1.fragments[0])); |
| assertTrue(ArrayUtil.contains(fragments, provider2.fragments[0])); |
| |
| mockState.setConfig(MockState.DBG_V2_ID); |
| fragments = ipm.getProvidedIndexFragments(mockState.getCurrentConfig(), -1); |
| assertEquals(2, fragments.length); |
| assertTrue(ArrayUtil.contains(fragments, provider1.fragments[3])); |
| assertTrue(ArrayUtil.contains(fragments, provider2.fragments[3])); |
| |
| mockState.setConfig(MockState.DBG_V1_ID); |
| fragments = ipm.getProvidedIndexFragments(mockState.getCurrentConfig(), -1); |
| assertEquals(0, fragments.length); |
| |
| mockState.setConfig(MockState.REL_V2_ID); |
| fragments = ipm.getProvidedIndexFragments(mockState.getCurrentConfig(), -1); |
| assertEquals(2, fragments.length); |
| assertTrue(ArrayUtil.contains(fragments, provider1.fragments[1])); |
| assertTrue(ArrayUtil.contains(fragments, provider2.fragments[1])); |
| |
| mockState.setConfig(MockState.REL_V1_ID); |
| fragments = ipm.getProvidedIndexFragments(mockState.getCurrentConfig(), -1); |
| assertEquals(2, fragments.length); |
| assertTrue(ArrayUtil.contains(fragments, provider1.fragments[0])); |
| assertTrue(ArrayUtil.contains(fragments, provider2.fragments[0])); |
| |
| provider1.invert(); |
| |
| mockState.setConfig(MockState.REL_V1_ID); |
| fragments = ipm.getProvidedIndexFragments(mockState.getCurrentConfig(), -1); |
| assertEquals(2, fragments.length); |
| assertTrue(ArrayUtil.contains(fragments, provider1.fragments[3])); |
| assertTrue(ArrayUtil.contains(fragments, provider2.fragments[0])); |
| |
| mockState.setConfig(MockState.DBG_V2_ID); |
| fragments = ipm.getProvidedIndexFragments(mockState.getCurrentConfig(), -1); |
| assertEquals(2, fragments.length); |
| assertTrue(ArrayUtil.contains(fragments, provider1.fragments[0])); |
| assertTrue(ArrayUtil.contains(fragments, provider2.fragments[3])); |
| |
| mockState.setConfig(MockState.DBG_V1_ID); |
| fragments = ipm.getProvidedIndexFragments(mockState.getCurrentConfig(), -1); |
| assertEquals(1, fragments.length); |
| assertTrue(ArrayUtil.contains(fragments, provider1.fragments[1])); |
| |
| mockState.setConfig(MockState.REL_V2_ID); |
| fragments = ipm.getProvidedIndexFragments(mockState.getCurrentConfig(), -1); |
| assertEquals(1, fragments.length); |
| assertTrue(ArrayUtil.contains(fragments, provider2.fragments[1])); |
| |
| mockState.setConfig(MockState.REL_V1_ID); |
| fragments = ipm.getProvidedIndexFragments(mockState.getCurrentConfig(), -1); |
| assertEquals(2, fragments.length); |
| assertTrue(ArrayUtil.contains(fragments, provider1.fragments[3])); |
| assertTrue(ArrayUtil.contains(fragments, provider2.fragments[0])); |
| |
| provider2.invert(); |
| |
| mockState.setConfig(MockState.REL_V1_ID); |
| fragments = ipm.getProvidedIndexFragments(mockState.getCurrentConfig(), -1); |
| assertEquals(2, fragments.length); |
| assertTrue(ArrayUtil.contains(fragments, provider1.fragments[3])); |
| assertTrue(ArrayUtil.contains(fragments, provider2.fragments[3])); |
| |
| mockState.setConfig(MockState.DBG_V2_ID); |
| fragments = ipm.getProvidedIndexFragments(mockState.getCurrentConfig(), -1); |
| assertEquals(2, fragments.length); |
| assertTrue(ArrayUtil.contains(fragments, provider1.fragments[0])); |
| assertTrue(ArrayUtil.contains(fragments, provider2.fragments[0])); |
| |
| mockState.setConfig(MockState.DBG_V1_ID); |
| fragments = ipm.getProvidedIndexFragments(mockState.getCurrentConfig(), -1); |
| assertEquals(2, fragments.length); |
| assertTrue(ArrayUtil.contains(fragments, provider1.fragments[1])); |
| assertTrue(ArrayUtil.contains(fragments, provider2.fragments[1])); |
| |
| mockState.setConfig(MockState.REL_V2_ID); |
| fragments = ipm.getProvidedIndexFragments(mockState.getCurrentConfig(), -1); |
| assertEquals(0, fragments.length); |
| |
| mockState.setConfig(MockState.REL_V1_ID); |
| fragments = ipm.getProvidedIndexFragments(mockState.getCurrentConfig(), -1); |
| assertEquals(2, fragments.length); |
| assertTrue(ArrayUtil.contains(fragments, provider1.fragments[3])); |
| assertTrue(ArrayUtil.contains(fragments, provider2.fragments[3])); |
| } finally { |
| if (cproject != null) { |
| cproject.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor()); |
| } |
| } |
| } |
| |
| public void testProviderUsageFilter() throws Exception { |
| // The provider 'Providers.Counter' is registered 7 times with different usage filters. |
| ICProject cproject= null; |
| try { |
| cproject = CProjectHelper.createCProject("P"+System.currentTimeMillis(), "bin", IPDOMManager.ID_NO_INDEXER); |
| |
| Providers.Counter.fCounter= 0; |
| CCorePlugin.getIndexManager().getIndex(cproject, IIndexManager.ADD_EXTENSION_FRAGMENTS_ADD_IMPORT); |
| assertEquals(7, Providers.Counter.fCounter); |
| |
| Providers.Counter.fCounter= 0; |
| CCorePlugin.getIndexManager().getIndex(cproject, IIndexManager.ADD_EXTENSION_FRAGMENTS_CALL_HIERARCHY); |
| assertEquals(6, Providers.Counter.fCounter); |
| |
| Providers.Counter.fCounter= 0; |
| CCorePlugin.getIndexManager().getIndex(cproject, IIndexManager.ADD_EXTENSION_FRAGMENTS_CONTENT_ASSIST); |
| assertEquals(5, Providers.Counter.fCounter); |
| |
| Providers.Counter.fCounter= 0; |
| CCorePlugin.getIndexManager().getIndex(cproject, IIndexManager.ADD_EXTENSION_FRAGMENTS_INCLUDE_BROWSER); |
| assertEquals(4, Providers.Counter.fCounter); |
| |
| Providers.Counter.fCounter= 0; |
| CCorePlugin.getIndexManager().getIndex(cproject, IIndexManager.ADD_EXTENSION_FRAGMENTS_NAVIGATION); |
| assertEquals(3, Providers.Counter.fCounter); |
| |
| Providers.Counter.fCounter= 0; |
| CCorePlugin.getIndexManager().getIndex(cproject, IIndexManager.ADD_EXTENSION_FRAGMENTS_SEARCH); |
| assertEquals(2, Providers.Counter.fCounter); |
| |
| Providers.Counter.fCounter= 0; |
| CCorePlugin.getIndexManager().getIndex(cproject, IIndexManager.ADD_EXTENSION_FRAGMENTS_TYPE_HIERARCHY); |
| assertEquals(1, Providers.Counter.fCounter); |
| |
| Providers.Counter.fCounter= 0; |
| CCorePlugin.getIndexManager().getIndex(cproject); |
| assertEquals(0, Providers.Counter.fCounter); |
| |
| } finally { |
| if (cproject != null) { |
| cproject.getProject().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, new NullProgressMonitor()); |
| } |
| } |
| } |
| |
| |
| private ICConfigurationDescription newCfg(ICProjectDescription des, String project, String config) throws CoreException { |
| CDefaultConfigurationData data= new CDefaultConfigurationData(project+"."+config, project+" "+config+" name", null); |
| data.initEmptyData(); |
| return des.createConfiguration(CCorePlugin.DEFAULT_PROVIDER_ID, data); |
| } |
| |
| private void changeActiveConfiguration(ICProject cproject, ICConfigurationDescription cfg) throws CoreException, InterruptedException { |
| ICProjectDescription pd= core.getProjectDescription(cproject.getProject()); |
| pd.setActiveConfiguration(pd.getConfigurationById(cfg.getId())); |
| core.setProjectDescription(cproject.getProject(), pd); |
| waitForIndexer(cproject); |
| } |
| |
| private void changeConfigRelations(ICProject cproject, int option) throws CoreException, InterruptedException { |
| ICProjectDescription pd= core.getProjectDescription(cproject.getProject()); |
| pd.setConfigurationRelations(option); |
| core.setProjectDescription(cproject.getProject(), pd); |
| waitForIndexer(cproject); |
| } |
| } |
| |
| class MockStateIndexProvider implements IIndexProvider { |
| protected ICProject targetProject; |
| |
| public MockStateIndexProvider(ICProject cproject) { |
| this.targetProject = cproject; |
| } |
| |
| @Override |
| public boolean providesFor(ICProject cproject) throws CoreException { |
| return this.targetProject.equals(cproject); |
| } |
| } |
| |
| class MockStateIndexFragmentProvider extends MockStateIndexProvider implements IIndexFragmentProvider { |
| private boolean invert; |
| final IIndexFragment[] fragments; |
| |
| public void invert() { |
| invert = !invert; |
| } |
| |
| public MockStateIndexFragmentProvider(ICProject cproject) { |
| super(cproject); |
| |
| fragments = new IIndexFragment[MockState.states.size()]; |
| for(int i=0; i<MockState.states.size(); i++) { |
| fragments[i] = new MockPDOM("mock.test.index."+System.identityHashCode(this)+"."+i, PDOM.versionString(PDOM.getDefaultVersion())); |
| } |
| } |
| |
| @Override |
| public IIndexFragment[] getIndexFragments(ICConfigurationDescription config) throws CoreException { |
| int index = MockState.states.indexOf(config.getId()); |
| index = invert ? (fragments.length-1)-index : index; |
| |
| // nb. we're checking this after inverting on purpose |
| if(index == MockState.states.indexOf(MockState.DBG_V1_ID)) { |
| return new IIndexFragment[0]; |
| } else { |
| return new IIndexFragment[] {fragments[index]}; |
| } |
| } |
| } |
| |
| class MockConfig implements ICConfigurationDescription { |
| String id; |
| IProject project; |
| |
| MockConfig(String id, IProject project) { |
| this.id= id; |
| this.project= project; |
| } |
| |
| @Override |
| public String getId() { |
| return id; |
| } |
| |
| @Override |
| public ICConfigExtensionReference create(String extensionPoint, |
| String extension) throws CoreException { |
| return null; |
| } |
| |
| @Override |
| public ICExternalSetting createExternalSetting(String[] languageIDs, |
| String[] contentTypeIds, String[] extensions, |
| ICSettingEntry[] entries) throws WriteAccessException { |
| return null; |
| } |
| |
| @Override |
| public ICFileDescription createFileDescription(IPath path, |
| ICResourceDescription base) throws CoreException, |
| WriteAccessException { |
| return null; |
| } |
| |
| @Override |
| public ICFolderDescription createFolderDescription(IPath path, |
| ICFolderDescription base) throws CoreException, |
| WriteAccessException { |
| return null; |
| } |
| |
| @Override |
| public ICConfigExtensionReference[] get(String extensionPointID) { |
| return null; |
| } |
| |
| @Override |
| public ICBuildSetting getBuildSetting() { |
| return null; |
| } |
| |
| @Override |
| public String getBuildSystemId() { |
| return null; |
| } |
| |
| @Override |
| public ICdtVariablesContributor getBuildVariablesContributor() { |
| return null; |
| } |
| |
| @Override |
| public CConfigurationData getConfigurationData() { |
| return null; |
| } |
| |
| @Override |
| public String getDescription() { |
| return null; |
| } |
| |
| @Override |
| public ICExternalSetting[] getExternalSettings() { |
| return null; |
| } |
| |
| @Override |
| public ICFileDescription[] getFileDescriptions() { |
| return null; |
| } |
| |
| @Override |
| public ICFolderDescription[] getFolderDescriptions() { |
| return null; |
| } |
| |
| @Override |
| public ICProjectDescription getProjectDescription() { |
| return CoreModel.getDefault().getProjectDescription(project); |
| } |
| |
| @Override |
| public Map getReferenceInfo() { |
| return null; |
| } |
| |
| @Override |
| public ICResourceDescription getResourceDescription(IPath path, |
| boolean exactPath) { |
| return null; |
| } |
| |
| @Override |
| public ICResourceDescription[] getResourceDescriptions() { |
| return null; |
| } |
| |
| @Override |
| public ICFolderDescription getRootFolderDescription() {return null;} |
| @Override |
| public Object getSessionProperty(QualifiedName name) {return null;} |
| @Override |
| public ICSourceEntry[] getSourceEntries() {return null;} |
| @Override |
| public ICTargetPlatformSetting getTargetPlatformSetting() {return null;} |
| @Override |
| public boolean isActive() {return false;} |
| @Override |
| public boolean isModified() {return false;} |
| @Override |
| public boolean isPreferenceConfiguration() {return false;} |
| @Override |
| public void remove(ICConfigExtensionReference ext) throws CoreException {} |
| @Override |
| public void remove(String extensionPoint) throws CoreException {} |
| @Override |
| public void removeExternalSetting(ICExternalSetting setting) throws WriteAccessException {} |
| @Override |
| public void removeExternalSettings() throws WriteAccessException {} |
| @Override |
| public void removeResourceDescription(ICResourceDescription des) |
| throws CoreException, WriteAccessException {} |
| @Override |
| public void setActive() throws WriteAccessException {} |
| @Override |
| public void setConfigurationData(String buildSystemId, |
| CConfigurationData data) throws WriteAccessException {} |
| @Override |
| public void setDescription(String des) throws WriteAccessException {} |
| @Override |
| public void setName(String name) throws WriteAccessException {} |
| @Override |
| public void setReferenceInfo(Map<String, String> refs) throws WriteAccessException {} |
| @Override |
| public void setSessionProperty(QualifiedName name, Object value) {} |
| @Override |
| public void setSourceEntries(ICSourceEntry[] entries) throws CoreException, |
| WriteAccessException {} |
| @Override |
| public ICSettingObject[] getChildSettings() {return null;} |
| @Override |
| public ICConfigurationDescription getConfiguration() {return null;} |
| @Override |
| public String getName() {return null;} |
| @Override |
| public ICSettingContainer getParent() {return null;} |
| @Override |
| public int getType() {return 0;} |
| @Override |
| public boolean isReadOnly() {return false;} |
| @Override |
| public boolean isValid() {return false;} |
| @Override |
| public ICStorageElement getStorage(String id, boolean create) throws CoreException { |
| return null; |
| } |
| @Override |
| public ICStorageElement importStorage(String id, ICStorageElement storage) { |
| return null; |
| } |
| |
| @Override |
| public void removeStorage(String id) throws CoreException { |
| } |
| |
| @Override |
| public ICLanguageSetting getLanguageSettingForFile(IPath path, boolean ignoreExludeStatus) { |
| return null; |
| } |
| |
| @Override |
| public String[] getExternalSettingsProviderIds() { |
| return null; |
| } |
| |
| @Override |
| public void setExternalSettingsProviderIds(String[] ids) {} |
| |
| @Override |
| public void updateExternalSettingsProviders(String[] ids) {} |
| |
| @Override |
| public ICSourceEntry[] getResolvedSourceEntries() { |
| return null; |
| } |
| |
| @Override |
| public CConfigurationStatus getConfigurationStatus() { |
| return CConfigurationStatus.CFG_STATUS_OK; |
| } |
| |
| @Override |
| public void setReadOnly(boolean readOnly, boolean keepModify) {} |
| } |
| |
| /* |
| * This represents a project state, here we use configuration IDs as the only state variable |
| */ |
| class MockState { |
| public static final String REL_V1_ID = "rel_v1"; |
| public static final String REL_V2_ID = "rel_v2"; |
| public static final String DBG_V1_ID = "dbg_v1"; |
| public static final String DBG_V2_ID = "dbg_v2"; |
| public static final List states = new ArrayList(Arrays.asList(new String[]{REL_V1_ID, REL_V2_ID, DBG_V1_ID, DBG_V2_ID})); |
| |
| private final IProject project; |
| private String currentConfig; |
| |
| public MockState(ICProject cproject) { |
| this.currentConfig = REL_V1_ID; |
| this.project= cproject.getProject(); |
| } |
| |
| public ICConfigurationDescription getCurrentConfig() { |
| return new MockConfig(currentConfig, project); |
| } |
| |
| public void setConfig(String newConfig) throws CoreException { |
| currentConfig = newConfig; |
| } |
| } |
| |
| class MockPDOM extends EmptyIndexFragment { |
| String id; |
| String version; |
| |
| MockPDOM(String id, String version) { |
| this.id= id; |
| this.version= version; |
| } |
| |
| @Override |
| public String getProperty(String propertyName) throws CoreException { |
| if(IIndexFragment.PROPERTY_FRAGMENT_ID.equals(propertyName)) { |
| return id; |
| } |
| if(IIndexFragment.PROPERTY_FRAGMENT_FORMAT_ID.equals(propertyName)) { |
| return PDOM.FRAGMENT_PROPERTY_VALUE_FORMAT_ID; |
| } |
| if(IIndexFragment.PROPERTY_FRAGMENT_FORMAT_VERSION.equals(propertyName)) { |
| return version; |
| } |
| return null; |
| } |
| |
| @Override |
| public String toString() { |
| return "[Mock index fragment "+id+"."+System.identityHashCode(this)+"]"; |
| } |
| } |