blob: a916c2294aefb86240058a2734ccfec545cada50 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2015 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.core.tests.internal.builders;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.internal.events.BuildContext;
import org.eclipse.core.internal.resources.BuildConfiguration;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
/**
* These tests exercise the build context functionality that tells a builder in what context
* it was called.
*/
public class BuildContextTest extends AbstractBuilderTest {
public static Test suite() {
return new TestSuite(BuildContextTest.class);
}
private IProject project0;
private IProject project1;
private IProject project2;
private final String variant0 = "Variant0";
private final String variant1 = "Variant1";
public BuildContextTest(String name) {
super(name);
}
@Override
protected void setUp() throws Exception {
super.setUp();
// Create resources
IWorkspaceRoot root = getWorkspace().getRoot();
project0 = root.getProject("BuildContextTests_p0");
project1 = root.getProject("BuildContextTests_p1");
project2 = root.getProject("BuildContextTests_p2");
IResource[] resources = {project0, project1, project2};
ensureExistsInWorkspace(resources, true);
setAutoBuilding(false);
setupProject(project0);
setupProject(project1);
setupProject(project2);
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
// Cleanup
project0.delete(true, null);
project1.delete(true, null);
project2.delete(true, null);
}
/**
* Helper method to configure a project with a build command and several buildConfigs.
*/
private void setupProject(IProject project) throws CoreException {
IProjectDescription desc = project.getDescription();
// Add build command
ICommand command = createCommand(desc, ContextBuilder.BUILDER_NAME, "Build0");
command.setBuilding(IncrementalProjectBuilder.AUTO_BUILD, true);
command.setBuilding(IncrementalProjectBuilder.FULL_BUILD, true);
command.setBuilding(IncrementalProjectBuilder.INCREMENTAL_BUILD, true);
command.setBuilding(IncrementalProjectBuilder.CLEAN_BUILD, true);
desc.setBuildSpec(new ICommand[] {command});
// Create buildConfigs
desc.setBuildConfigs(new String[] {variant0, variant1});
project.setDescription(desc, getMonitor());
}
/**
* Change the active build configuration on the project returning the new active build configuration
*/
private IBuildConfiguration changeActiveBuildConfig(IProject project) throws CoreException {
IBuildConfiguration[] configs = project.getBuildConfigs();
IBuildConfiguration active = project.getActiveBuildConfig();
IProjectDescription desc = project.getDescription();
for (IBuildConfiguration config : configs) {
if (!config.equals(active)) {
desc.setActiveBuildConfig(config.getName());
project.setDescription(desc, getMonitor());
return config;
}
}
assertTrue(false);
return null;
}
/**
* p0 --> p1 --> p2
* @throws CoreException
*/
private void setupSimpleReferences() throws CoreException {
setReferences(project0.getActiveBuildConfig(), new IBuildConfiguration[] {project1.getActiveBuildConfig()});
setReferences(project1.getActiveBuildConfig(), new IBuildConfiguration[] {project2.getActiveBuildConfig()});
setReferences(project2.getActiveBuildConfig(), new IBuildConfiguration[] {});
}
/**
* Helper method to set the references for a project.
*/
private void setReferences(IBuildConfiguration variant, IBuildConfiguration[] refs) throws CoreException {
IProjectDescription desc = variant.getProject().getDescription();
desc.setBuildConfigReferences(variant.getName(), refs);
variant.getProject().setDescription(desc, getMonitor());
}
/**
* Setup a reference graph, then test the build context for for each project involved
* in the 'build'.
*/
public void testBuildContext() {
// Create reference graph
IBuildConfiguration p0v0 = getWorkspace().newBuildConfig(project0.getName(), variant0);
IBuildConfiguration p0v1 = getWorkspace().newBuildConfig(project0.getName(), variant1);
IBuildConfiguration p1v0 = getWorkspace().newBuildConfig(project1.getName(), variant0);
// Create build order
final IBuildConfiguration[] buildOrder = new IBuildConfiguration[] {p0v0, p0v1, p1v0};
IBuildContext context;
context = new BuildContext(p0v0, new IBuildConfiguration[] {p0v0, p1v0}, buildOrder);
assertEquals("1.0", new IBuildConfiguration[] {}, context.getAllReferencedBuildConfigs());
assertEquals("1.1", new IBuildConfiguration[] {p0v1, p1v0}, context.getAllReferencingBuildConfigs());
assertEquals("1.2", new IBuildConfiguration[] {p0v0, p1v0}, context.getRequestedConfigs());
context = new BuildContext(p0v1, buildOrder, buildOrder);
assertEquals("2.0", new IBuildConfiguration[] {p0v0}, context.getAllReferencedBuildConfigs());
assertEquals("2.1", new IBuildConfiguration[] {p1v0}, context.getAllReferencingBuildConfigs());
context = new BuildContext(p1v0, buildOrder, buildOrder);
assertEquals("3.0", new IBuildConfiguration[] {p0v0, p0v1}, context.getAllReferencedBuildConfigs());
assertEquals("3.1", new IBuildConfiguration[] {}, context.getAllReferencingBuildConfigs());
// And it works with no build context too
context = new BuildContext(p1v0);
assertEquals("4.0", new IBuildConfiguration[] {}, context.getAllReferencedBuildConfigs());
assertEquals("4.1", new IBuildConfiguration[] {}, context.getAllReferencingBuildConfigs());
}
public void testSingleProjectBuild() throws CoreException {
setAutoBuilding(true);
setupSimpleReferences();
ContextBuilder.clearStats();
project0.build(IncrementalProjectBuilder.FULL_BUILD, getMonitor());
assertTrue("1.0", ContextBuilder.checkValid());
IBuildContext context = ContextBuilder.getContext(project0.getActiveBuildConfig());
assertEquals("2.0", 0, context.getAllReferencedBuildConfigs().length);
assertEquals("2.1", 0, context.getAllReferencingBuildConfigs().length);
// Change the active build configuration will cause the project to be rebuilt
ContextBuilder.clearStats();
IBuildConfiguration newActive = changeActiveBuildConfig(project0);
waitForBuild();
assertTrue("3.0", ContextBuilder.checkValid());
context = ContextBuilder.getContext(newActive);
assertEquals("3.1", 0, context.getAllReferencedBuildConfigs().length);
}
/**
* Tests building a single project with and without references
* @throws CoreException
*/
public void testWorkspaceBuildProject() throws CoreException {
setupSimpleReferences();
ContextBuilder.clearStats();
// Build project and resolve references
getWorkspace().build(new IBuildConfiguration[] {project0.getActiveBuildConfig()}, IncrementalProjectBuilder.FULL_BUILD, true, getMonitor());
assertTrue("1.0", ContextBuilder.checkValid());
IBuildContext context = ContextBuilder.getContext(project0.getActiveBuildConfig());
assertEquals("2.0", new IBuildConfiguration[] {project2.getActiveBuildConfig(), project1.getActiveBuildConfig()}, context.getAllReferencedBuildConfigs());
assertEquals("2.1", 0, context.getAllReferencingBuildConfigs().length);
context = ContextBuilder.getBuilder(project1.getActiveBuildConfig()).contextForLastBuild;
assertEquals("3.0", new IBuildConfiguration[] {project2.getActiveBuildConfig()}, context.getAllReferencedBuildConfigs());
assertEquals("3.1", new IBuildConfiguration[] {project0.getActiveBuildConfig()}, context.getAllReferencingBuildConfigs());
context = ContextBuilder.getBuilder(project2.getActiveBuildConfig()).contextForLastBuild;
assertEquals("4.0", 0, context.getAllReferencedBuildConfigs().length);
assertEquals("4.1", new IBuildConfiguration[] {project1.getActiveBuildConfig(), project0.getActiveBuildConfig()}, context.getAllReferencingBuildConfigs());
// Build just project0
ContextBuilder.clearStats();
getWorkspace().build(new IBuildConfiguration[] {project0.getActiveBuildConfig()}, IncrementalProjectBuilder.FULL_BUILD, false, getMonitor());
assertTrue("5.0", ContextBuilder.checkValid());
context = ContextBuilder.getContext(project0.getActiveBuildConfig());
assertTrue("5.1", context.getAllReferencedBuildConfigs().length == 0);
assertTrue("5.2", context.getAllReferencingBuildConfigs().length == 0);
}
/**
* Builds a couple configurations, including references
* @throws CoreException
*/
public void testWorkspaceBuildProjects() throws CoreException {
setupSimpleReferences();
ContextBuilder.clearStats();
// build project0 & project2 ; project1 will end up being built too.
getWorkspace().build(new IBuildConfiguration[] {project0.getActiveBuildConfig(), project2.getActiveBuildConfig()}, IncrementalProjectBuilder.FULL_BUILD, true, getMonitor());
assertTrue("1.0", ContextBuilder.checkValid());
IBuildContext context = ContextBuilder.getContext(project0.getActiveBuildConfig());
assertEquals("2.0", new IBuildConfiguration[] {project2.getActiveBuildConfig(), project1.getActiveBuildConfig()}, context.getAllReferencedBuildConfigs());
assertEquals("2.1", 0, context.getAllReferencingBuildConfigs().length);
context = ContextBuilder.getBuilder(project1.getActiveBuildConfig()).contextForLastBuild;
assertEquals("3.0", new IBuildConfiguration[] {project2.getActiveBuildConfig()}, context.getAllReferencedBuildConfigs());
assertEquals("3.1", new IBuildConfiguration[] {project0.getActiveBuildConfig()}, context.getAllReferencingBuildConfigs());
context = ContextBuilder.getBuilder(project2.getActiveBuildConfig()).contextForLastBuild;
assertEquals("4.0", 0, context.getAllReferencedBuildConfigs().length);
assertEquals("4.1", new IBuildConfiguration[] {project1.getActiveBuildConfig(), project0.getActiveBuildConfig()}, context.getAllReferencingBuildConfigs());
}
/**
* Sets references to the 'active' project build configuration
* @throws CoreException
*/
public void testReferenceActiveVariant() throws CoreException {
setReferences(project0.getActiveBuildConfig(), new IBuildConfiguration[] {getWorkspace().newBuildConfig(project1.getName(), null)});
setReferences(project1.getActiveBuildConfig(), new IBuildConfiguration[] {getWorkspace().newBuildConfig(project2.getName(), null)});
setReferences(project2.getActiveBuildConfig(), new IBuildConfiguration[] {});
ContextBuilder.clearStats();
getWorkspace().build(new IBuildConfiguration[] {project0.getActiveBuildConfig()}, IncrementalProjectBuilder.FULL_BUILD, true, getMonitor());
assertTrue("1.0", ContextBuilder.checkValid());
IBuildContext context = ContextBuilder.getContext(project0.getActiveBuildConfig());
assertEquals("2.0", new IBuildConfiguration[] {project2.getActiveBuildConfig(), project1.getActiveBuildConfig()}, context.getAllReferencedBuildConfigs());
assertEquals("2.1", 0, context.getAllReferencingBuildConfigs().length);
context = ContextBuilder.getBuilder(project1.getActiveBuildConfig()).contextForLastBuild;
assertEquals("3.0", new IBuildConfiguration[] {project2.getActiveBuildConfig()}, context.getAllReferencedBuildConfigs());
assertEquals("3.1", new IBuildConfiguration[] {project0.getActiveBuildConfig()}, context.getAllReferencingBuildConfigs());
context = ContextBuilder.getBuilder(project2.getActiveBuildConfig()).contextForLastBuild;
assertEquals("4.0", 0, context.getAllReferencedBuildConfigs().length);
assertEquals("4.1", new IBuildConfiguration[] {project1.getActiveBuildConfig(), project0.getActiveBuildConfig()}, context.getAllReferencingBuildConfigs());
}
/**
* Attempts to build a project that references the active variant of another project,
* and the same variant directly. This should only result in one referenced variant being built.
*/
public void testReferenceVariantTwice() throws CoreException {
IBuildConfiguration ref1 = new BuildConfiguration(project1, null);
IBuildConfiguration ref2 = new BuildConfiguration(project1, project1.getActiveBuildConfig().getName());
setReferences(project0.getActiveBuildConfig(), new IBuildConfiguration[] {ref1, ref2});
setReferences(project1.getActiveBuildConfig(), new IBuildConfiguration[] {});
ContextBuilder.clearStats();
getWorkspace().build(new IBuildConfiguration[] {project0.getActiveBuildConfig()}, IncrementalProjectBuilder.FULL_BUILD, true, getMonitor());
assertTrue("1.0", ContextBuilder.checkValid());
IBuildContext context = ContextBuilder.getContext(project0.getActiveBuildConfig());
assertEquals("2.0", new IBuildConfiguration[] {project1.getActiveBuildConfig()}, context.getAllReferencedBuildConfigs());
assertEquals("2.1", 0, context.getAllReferencingBuildConfigs().length);
assertEquals("2.2", new IBuildConfiguration[] {project0.getActiveBuildConfig()}, context.getRequestedConfigs());
context = ContextBuilder.getBuilder(project1.getActiveBuildConfig()).contextForLastBuild;
assertEquals("3.0", 0, context.getAllReferencedBuildConfigs().length);
assertEquals("3.1", new IBuildConfiguration[] {project0.getActiveBuildConfig()}, context.getAllReferencingBuildConfigs());
// Change the active configuration of project1, and test that two configurations are built
ContextBuilder.clearStats();
IBuildConfiguration project1PreviousActive = project1.getActiveBuildConfig();
IBuildConfiguration project1NewActive = changeActiveBuildConfig(project1);
getWorkspace().build(new IBuildConfiguration[] {project0.getActiveBuildConfig()}, IncrementalProjectBuilder.FULL_BUILD, true, getMonitor());
assertTrue("4.0", ContextBuilder.checkValid());
context = ContextBuilder.getContext(project0.getActiveBuildConfig());
assertEquals("4.1", new IBuildConfiguration[] {project1PreviousActive, project1NewActive}, context.getAllReferencedBuildConfigs());
assertEquals("4.2", 0, context.getAllReferencingBuildConfigs().length);
assertEquals("4.3", new IBuildConfiguration[] {project0.getActiveBuildConfig()}, context.getRequestedConfigs());
}
}