blob: 0ade26c8aba133ef3757162dd3d94e5e107bd82b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 Broadcom Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Broadcom Corporation - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.managedbuilder.core.regressions;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.cdtvariables.ICdtVariableManager;
import org.eclipse.cdt.core.envvar.IEnvironmentVariableManager;
import org.eclipse.cdt.managedbuilder.testplugin.AbstractBuilderTest;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.runtime.Path;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
/**
* This tests that an environment variable, which is part of the build
* (in this case referenced by a -I), makes it through to makefile
* correctly when it changes.
*/
@Disabled("This is a test for a known failure - see Bug 335476")
public class Bug_335476Test extends AbstractBuilderTest {
private final String VAR_NAME = "INC";
IProject app;
IEnvironmentVariableManager envManager = CCorePlugin.getDefault().getBuildEnvironmentManager();
ICdtVariableManager buildMacroManager = CCorePlugin.getDefault().getCdtVariableManager();
@BeforeEach
public void setUpLocal() throws Exception {
setWorkspace("regressions");
app = loadProject("bug_335476");
// Ensure Debug is the active configuration
setActiveConfigurationByName(app, "Debug");
}
/**
* Build the project a few times, changing the value of the environment variable each time
* @param build_kind
* @throws Exception
*/
public void runTest(int build_kind) throws Exception {
// Environment containingg the "Lala" environment variable
final IFile lala = app.getFile(new Path(".settings/org.eclipse.cdt.core.prefs.lala"));
// Environment containing the "Foo" environment variable
final IFile foo = app.getFile(new Path(".settings/org.eclipse.cdt.core.prefs.foo"));
final IFile env = app.getFile(new Path(".settings/org.eclipse.cdt.core.prefs"));
IFile current = foo;
for (int i = 0; i < 5; i++) {
// Actual expected value
final String expected = current == foo ? "foo" : "lala";
// Update the environment to reflect the new value.
env.setContents(current.getContents(), IResource.NONE, null);
// Ask for a full build
app.build(build_kind, null);
// Check the makefile for the correct environment
IFile makefile = app.getFile("Debug/src/subdir.mk");
BufferedReader reader = new BufferedReader(new InputStreamReader(makefile.getContents()));
try {
Pattern p = Pattern.compile(".*?-I.*?\"(.*?)\".*");
boolean found = false;
while (reader.ready()) {
String line = reader.readLine();
if (!line.contains("gcc"))
continue;
Matcher m = p.matcher(line);
assertTrue(m.matches());
String buildVar = m.group(1);
// Check that the Environment manager + the build manager have the variable
// (which tells us how far the variable has got through the system...)
String value = envManager.getVariable(VAR_NAME,
CCorePlugin.getDefault().getProjectDescription(app, false).getActiveConfiguration(), false)
.getValue();
String value2 = buildMacroManager.resolveValue("${" + VAR_NAME + "}", "", ";",
CCorePlugin.getDefault().getProjectDescription(app, false).getActiveConfiguration());
assertEquals(expected, value, i + " EnvManager " + expected + " exepected, but was: " + value);
assertEquals(expected, value2, i + " CdtVarManager " + expected + " exepected, but was: " + value2);
assertEquals(expected, buildVar, i + " Makefile: " + expected + " exepected, but was: " + buildVar);
found = true;
}
// Check that we at least matched
assertTrue(found);
} finally {
reader.close();
}
// Change environment
if (current == lala)
current = foo;
else
current = lala;
}
}
@Test
public void testChangingEnvironmentBuildSystem_FULL_BUILD() throws Exception {
runTest(IncrementalProjectBuilder.FULL_BUILD);
}
@Test
public void testChangingEnvironmentBuildSystem_INC_BUILD() throws Exception {
runTest(IncrementalProjectBuilder.INCREMENTAL_BUILD);
}
}