blob: 1f16ebeba925ba8fbe08ef611620804b1f6d41b5 [file] [log] [blame]
/*******************************************************************************
* 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)+"]";
}
}