Bug 261225 Build before launch takes 10s for a runtime workbench
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/AllTests.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/AllTests.java
index 9550f64..649881a 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/AllTests.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/AllTests.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2006 IBM Corporation and others.
+ * Copyright (c) 2004, 2009 IBM Corporation 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
@@ -22,6 +22,7 @@
 		suite.addTest(BenchFileStore.suite());
 		suite.addTest(BenchWorkspace.suite());
 		suite.addTest(BenchMiscWorkspace.suite());
+		suite.addTest(BuilderPerformanceTest.suite());
 		suite.addTest(MarkerPerformanceTest.suite());
 		suite.addTest(LocalHistoryPerformanceTest.suite());
 		suite.addTest(WorkspacePerformanceTest.suite());
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/BuilderPerformanceTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/BuilderPerformanceTest.java
new file mode 100644
index 0000000..6181deb
--- /dev/null
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/BuilderPerformanceTest.java
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.core.tests.resources.perf;
+
+import java.util.Map;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.tests.harness.PerformanceTestRunner;
+import org.eclipse.core.tests.internal.builders.SortBuilder;
+import org.eclipse.core.tests.internal.builders.TestBuilder;
+
+/**
+ * Automated performance tests for builders.
+ */
+public class BuilderPerformanceTest extends WorkspacePerformanceTest {
+	private static final int PROJECT_COUNT = 100;
+	private static final int REPEAT = 20;
+
+	public BuilderPerformanceTest(String name) {
+		super(name);
+	}
+
+	public static Test suite() {
+		TestSuite suite = new TestSuite();
+		suite.addTest(new BuilderPerformanceTest("testManualBuildWithAutobuildOn"));
+		return suite;
+	}
+
+	IProject[] otherProjects;
+
+	/**
+	 * Creates a project and fills it with contents
+	 */
+	void createAndPopulateProject(final IProject project, final IFolder folder, final int totalResources) {
+		try {
+			getWorkspace().run(new IWorkspaceRunnable() {
+				public void run(IProgressMonitor monitor) throws CoreException {
+					IProjectDescription desc = project.getWorkspace().newProjectDescription(project.getName());
+					desc.setBuildSpec(new ICommand[] {createCommand(desc, "Builder1"), createCommand(desc, "Builder2"), createCommand(desc, "Builder3"), createCommand(desc, "Builder4"), createCommand(desc, "Builder5")});
+					project.create(desc, getMonitor());
+					project.open(getMonitor());
+					createFolder(folder, totalResources);
+				}
+			}, getMonitor());
+		} catch (CoreException e) {
+			fail("Failed to create project in performance test", e);
+		}
+	}
+
+	/**
+	 * Creates and returns a new command with the SortBuilder, and the TestBuilder.BUILD_ID 
+	 * parameter set to the given value.
+	 */
+	protected ICommand createCommand(IProjectDescription description, String buildID) {
+		return createCommand(description, SortBuilder.BUILDER_NAME, buildID);
+	}
+
+	/**
+	 * Creates and returns a new command with the given builder name, and the TestBuilder.BUILD_ID 
+	 * parameter set to the given value.
+	 */
+	protected ICommand createCommand(IProjectDescription description, String builderName, String buildID) {
+		ICommand command = description.newCommand();
+		Map args = command.getArguments();
+		args.put(TestBuilder.BUILD_ID, buildID);
+		command.setBuilderName(builderName);
+		command.setArguments(args);
+		return command;
+	}
+
+	protected void setUp() throws Exception {
+		super.setUp();
+		otherProjects = new IProject[PROJECT_COUNT];
+		for (int i = 0; i < otherProjects.length; i++) {
+			otherProjects[i] = getWorkspace().getRoot().getProject("Project " + i);
+			IFolder folder = otherProjects[i].getFolder("Folder");
+			createAndPopulateProject(otherProjects[i], folder, 100);
+		}
+	}
+
+	/**
+	 * Tests performing manual project-level increment builds when autobuild is on.
+	 * See bug 261225 for details.
+	 */
+	public void testManualBuildWithAutobuildOn() {
+		PerformanceTestRunner runner = new PerformanceTestRunner() {
+			IProject[] projects;
+
+			protected void setUp() {
+				waitForBackgroundActivity();
+				projects = getWorkspace().computeProjectOrder(getWorkspace().getRoot().getProjects()).projects;
+			}
+
+			protected void tearDown() {
+			}
+
+			protected void test() {
+				try {
+					for (int repeats = 0; repeats < REPEAT; repeats++) {
+						for (int i = 0; i < projects.length; i++) {
+							projects[i].build(IncrementalProjectBuilder.INCREMENTAL_BUILD, getMonitor());
+						}
+					}
+				} catch (CoreException e) {
+					fail("1.99", e);
+				}
+			}
+		};
+		runner.run(this, REPEATS, 1);
+
+	}
+
+}