| /******************************************************************************* |
| * 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); |
| } |
| |
| } |