/*******************************************************************************
* Copyright (c) 2012, 2015 Marc-Andre Laperle 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:
* Marc-Andre Laperle - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.pdom.tests;
import java.util.regex.Pattern;
import junit.framework.Test;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IndexFilter;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICLanguageSetting;
import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry;
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
import org.eclipse.cdt.core.settings.model.ICProjectDescriptionPreferences;
import org.eclipse.cdt.core.settings.model.ICSettingEntry;
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.TestSourceReader;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
public class ChangeConfigurationTests extends PDOMTestBase {
public static Test suite() {
return suite(ChangeConfigurationTests.class);
}
private void changeConfigRelations(ICProject project, int option) throws CoreException, InterruptedException {
ICProjectDescription pd= CCorePlugin.getDefault().getProjectDescription(project.getProject());
pd.setConfigurationRelations(option);
CCorePlugin.getDefault().setProjectDescription(project.getProject(), pd);
waitForIndexer(project);
}
// Emulates ChangeConfigAction
private void changeProjectConfiguration(IProject project, String configName) throws CoreException, InterruptedException {
ICProjectDescription prjd = CCorePlugin.getDefault().getProjectDescriptionManager().getProjectDescription(project);
ICConfigurationDescription[] configs = prjd.getConfigurations();
if (configs != null && configs.length > 0) {
for (ICConfigurationDescription config : configs) {
if (config.getName().equals(configName)) {
config.setActive();
CoreModel.getDefault().setProjectDescription(project, prjd);
break;
}
}
}
}
//#ifdef MACRO1
//void testFunc1();
//#endif
//#ifdef MACRO2
//void testFunc2();
//#endif
public void testRepeatedlyChangeConfig_bug375226() throws Exception {
ModelJoiner mj = new ModelJoiner();
ICProject cProject = CProjectHelper.createNewStyleCProject("testChangeConfiguration", IPDOMManager.ID_FAST_INDEXER);
IProject project = cProject.getProject();
StringBuilder[] contents= TestSourceReader.getContentsForTest(CTestPlugin.getDefault().getBundle(), "parser", getClass(), getName(), 1);
IFile file= TestSourceReader.createFile(cProject.getProject(), new Path("test.c"), contents[0].toString());
mj.join();
mj.dispose();
changeConfigRelations(cProject, ICProjectDescriptionPreferences.CONFIGS_LINK_SETTINGS_AND_ACTIVE);
ICProjectDescription prjd = CCorePlugin.getDefault().getProjectDescriptionManager().getProjectDescription(project);
ICConfigurationDescription configuration1 = prjd.getConfigurations()[0];
String firstConfigName = configuration1.getName();
for(ICLanguageSetting languageSetting : configuration1.getRootFolderDescription().getLanguageSettings())
{
languageSetting.setSettingEntries(ICSettingEntry.MACRO, new ICLanguageSettingEntry[] { CDataUtil.createCMacroEntry("MACRO1", null, 0)});
}
ICConfigurationDescription configuration2 = prjd.createConfiguration("id2", "Configuration2", configuration1);
String secondConfigName = configuration2.getName();
for(ICLanguageSetting languageSetting : configuration2.getRootFolderDescription().getLanguageSettings())
{
languageSetting.setSettingEntries(ICSettingEntry.MACRO, new ICLanguageSettingEntry[] { CDataUtil.createCMacroEntry("MACRO2", null, 0)} );
}
CoreModel.getDefault().setProjectDescription(project, prjd);
CCorePlugin.getIndexManager().reindex(cProject);
waitForIndexer(cProject);
Pattern testFunc1 = Pattern.compile("testFunc1");
Pattern testFunc2 = Pattern.compile("testFunc2");
int i = 0, noTrials = 50;
do {
boolean isFirstConfig = i % 2 == 0;
IIndex index = CCorePlugin.getIndexManager().getIndex(cProject);
index.acquireReadLock();
try {
IBinding[] bindings = index.findBindings(isFirstConfig ? testFunc1 : testFunc2, true, IndexFilter.ALL, new NullProgressMonitor());
IBinding[] noBindings = index.findBindings(isFirstConfig ? testFunc2 : testFunc1, true, IndexFilter.ALL, new NullProgressMonitor());
assertEquals(1, bindings.length);
assertEquals(0, noBindings.length);
} finally {
index.releaseReadLock();
}
String nextConfig = isFirstConfig ? secondConfigName : firstConfigName;
changeProjectConfiguration(project, nextConfig);
waitForIndexer(cProject);
i++;
} while (i < noTrials);
}
}