blob: 067d3072f13c913def16a99c7bf0dbc46c6e9c23 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2012 IBM 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.core.tests.internal.builders;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
/**
* Tests platform support for build cycles. Namely, the ability of builders to
* request that a rebuild occur automatically if it modifies projects that came
* before it in the build order.
*/
public class BuilderCycleTest extends AbstractBuilderTest {
public BuilderCycleTest(String name) {
super(name);
}
public BuilderCycleTest() {
super(null);
}
public static Test suite() {
return new TestSuite(BuilderCycleTest.class);
}
public void testIsBeforeThisProject() {
IWorkspaceRoot root = getWorkspace().getRoot();
IProject project = root.getProject("Project");
IProject before1 = root.getProject("Before1");
IProject before2 = root.getProject("Before2");
IProject after1 = root.getProject("After1");
IProject after2 = root.getProject("After2");
ensureExistsInWorkspace(new IResource[] {project, before1, before2, after1, after2}, true);
try {
IWorkspaceDescription description = getWorkspace().getDescription();
description.setBuildOrder(new String[] {before1.getName(), before2.getName(), project.getName(), after1.getName(), after2.getName()});
description.setAutoBuilding(false);
getWorkspace().setDescription(description);
} catch (CoreException e) {
fail("1.0", e);
}
try {
IProjectDescription description = project.getDescription();
ICommand command1 = createCommand(description, CycleBuilder.BUILDER_NAME, "Build0");
description.setBuildSpec(new ICommand[] {command1});
project.setDescription(description, IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("2.0", e);
}
try {
getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, getMonitor());
} catch (CoreException e) {
fail("3.0", e);
}
CycleBuilder builder = CycleBuilder.getInstance();
builder.resetBuildCount();
builder.setBeforeProjects(new IProject[] {before1, before2});
builder.setAfterProjects(new IProject[] {after1, after2});
try {
//create a file to ensure incremental build is called
project.getFile("Foo.txt").create(getRandomContents(), IResource.NONE, getMonitor());
getWorkspace().build(IncrementalProjectBuilder.INCREMENTAL_BUILD, getMonitor());
builder.resetBuildCount();
getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, getMonitor());
} catch (CoreException e) {
fail("3.0", e);
}
}
public void skipTestNeedRebuild() {
IWorkspaceRoot root = getWorkspace().getRoot();
IProject project = root.getProject("Project");
IFolder unsorted = project.getFolder(SortBuilder.DEFAULT_UNSORTED_FOLDER);
IFile unsortedFile = unsorted.getFile("File.txt");
ensureExistsInWorkspace(project, true);
ensureExistsInWorkspace(unsorted, true);
ensureExistsInWorkspace(unsortedFile, true);
//setup so that the sortbuilder and cycle builder are both touching files in the project
try {
setAutoBuilding(true);
IProjectDescription description = project.getDescription();
ICommand command1 = createCommand(description, CycleBuilder.BUILDER_NAME, "Build0");
ICommand command2 = createCommand(description, SortBuilder.BUILDER_NAME, "Build1");
description.setBuildSpec(new ICommand[] {command1, command2});
project.setDescription(description, IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("1.0", e);
}
CycleBuilder builder = CycleBuilder.getInstance();
builder.resetBuildCount();
try {
getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, getMonitor());
} catch (CoreException e) {
fail("3.0", e);
}
//don't request rebuilds and ensure we're only called once
builder.setRebuildsToRequest(0);
builder.resetBuildCount();
try {
getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, getMonitor());
} catch (CoreException e) {
fail("4.0", e);
}
assertEquals("4.1", 1, builder.getBuildCount());
//force an incremental build
IFile file = project.getFile("foo.txt");
builder.resetBuildCount();
try {
file.create(getRandomContents(), IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("4.2", e);
}
assertEquals("4.3", 1, builder.getBuildCount());
//request 1 rebuild and ensure we're called twice
builder.setRebuildsToRequest(1);
builder.resetBuildCount();
try {
getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, getMonitor());
} catch (CoreException e) {
fail("5.0", e);
}
assertEquals("5.1", 2, builder.getBuildCount());
//force an incremental build
builder.resetBuildCount();
try {
file.setContents(getRandomContents(), IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("5.2", e);
}
assertEquals("5.3", 2, builder.getBuildCount());
//request 5 rebuilds and ensure we're called six times
builder.setRebuildsToRequest(5);
builder.resetBuildCount();
try {
getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, getMonitor());
} catch (CoreException e) {
fail("6.0", e);
}
assertEquals("6.1", 6, builder.getBuildCount());
//force an incremental build
builder.resetBuildCount();
try {
file.setContents(getRandomContents(), IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("6.2", e);
}
assertEquals("6.3", 6, builder.getBuildCount());
//request many rebuilds and ensure we're called according to the build policy
int maxBuilds = getWorkspace().getDescription().getMaxBuildIterations();
builder.setRebuildsToRequest(maxBuilds * 2);
builder.resetBuildCount();
try {
getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, getMonitor());
} catch (CoreException e) {
fail("7.0", e);
}
assertEquals("7.1", maxBuilds, builder.getBuildCount());
//force an incremental build
builder.resetBuildCount();
try {
file.setContents(getRandomContents(), IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("7.2", e);
}
assertEquals("7.3", maxBuilds, builder.getBuildCount());
//change the rebuild policy and ensure we're called the correct number of times
maxBuilds = 7;
try {
IWorkspaceDescription desc = getWorkspace().getDescription();
desc.setMaxBuildIterations(maxBuilds);
getWorkspace().setDescription(desc);
} catch (CoreException e) {
fail("8.0", e);
}
builder.setRebuildsToRequest(maxBuilds * 2);
builder.resetBuildCount();
try {
getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, getMonitor());
} catch (CoreException e) {
fail("8.1", e);
}
assertEquals("8.2", maxBuilds, builder.getBuildCount());
//force an incremental build
builder.resetBuildCount();
try {
file.setContents(getRandomContents(), IResource.NONE, getMonitor());
} catch (CoreException e) {
fail("8.3", e);
}
assertEquals("8.4", maxBuilds, builder.getBuildCount());
}
}