blob: 0540400a0f940557e69c8a16935493aed975d41a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2017 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.usecase;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.core.tests.resources.ResourceTest;
public class IWorkspaceRunnableUseCaseTest extends ResourceTest {
public IWorkspaceRunnableUseCaseTest() {
super();
}
public IWorkspaceRunnableUseCaseTest(String name) {
super(name);
}
protected IWorkspaceRunnable createRunnable(final IProject project, final IWorkspaceRunnable nestedOperation, final boolean triggerBuild, final Exception exceptionToThrow) {
return monitor -> {
if (exceptionToThrow != null) {
if (exceptionToThrow instanceof CoreException) {
throw (CoreException) exceptionToThrow;
}
if (exceptionToThrow instanceof RuntimeException) {
throw (RuntimeException) exceptionToThrow;
}
throw new IllegalArgumentException(exceptionToThrow);
}
if (triggerBuild) {
project.touch(getMonitor());
}
if (nestedOperation != null) {
getWorkspace().run(nestedOperation, getMonitor());
}
};
}
public static Test suite() {
return new TestSuite(IWorkspaceRunnableUseCaseTest.class);
}
public void testNestedOperationsAndBuilds() {
IWorkspaceDescription original = getWorkspace().getDescription();
IProject project = getWorkspace().getRoot().getProject("MyProject");
try {
IWorkspaceDescription description = getWorkspace().getDescription();
description.setAutoBuilding(true);
getWorkspace().setDescription(description);
IProjectDescription prjDescription = getWorkspace().newProjectDescription("MyProject");
ICommand command = prjDescription.newCommand();
command.setBuilderName(SignaledBuilder.BUILDER_ID);
prjDescription.setBuildSpec(new ICommand[] {command});
project.create(prjDescription, getMonitor());
project.open(getMonitor());
} catch (CoreException e) {
fail("0.0", e);
}
waitForBuild();
SignaledBuilder builder = SignaledBuilder.getInstance(project);
/* should trigger a build */
IWorkspaceRunnable op1 = createRunnable(project, null, true, null);
IWorkspaceRunnable op2 = createRunnable(project, op1, false, null);
IWorkspaceRunnable op3 = createRunnable(project, op2, false, null);
builder.reset();
try {
getWorkspace().run(op3, getMonitor());
} catch (CoreException e) {
fail("1.0", e);
}
waitForBuild();
assertTrue("1.1", builder.wasExecuted());
/* should not trigger a build */
op1 = createRunnable(project, null, true, new OperationCanceledException());
op2 = createRunnable(project, op1, true, null);
op3 = createRunnable(project, op2, true, null);
builder.reset();
try {
getWorkspace().run(op3, getMonitor());
fail("2.0");
} catch (CoreException e) {
fail("2.1", e);
} catch (OperationCanceledException e) {
// expected
}
//waitForBuild(); // TODO: The test is invalid since it fails if this line is uncommented.
assertTrue("2.2", !builder.wasExecuted());
/* should not trigger a build */
op1 = createRunnable(project, null, true, new CoreException(Status.CANCEL_STATUS));
op2 = createRunnable(project, op1, true, null);
op3 = createRunnable(project, op2, true, null);
builder.reset();
try {
getWorkspace().run(op3, getMonitor());
fail("3.0");
} catch (CoreException e) {
assertEquals(Status.CANCEL_STATUS, e.getStatus());
}
//waitForBuild(); // TODO: The test is invalid since it fails if this line is uncommented.
assertTrue("3.1", !builder.wasExecuted());
/* should not trigger a build */
op1 = createRunnable(project, null, false, null);
op2 = createRunnable(project, op1, false, null);
op3 = createRunnable(project, op2, false, null);
builder.reset();
try {
getWorkspace().run(op3, getMonitor());
} catch (CoreException e) {
fail("4.0", e);
}
//waitForBuild(); // TODO: The test is invalid since it fails if this line is uncommented.
assertTrue("4.1", !builder.wasExecuted());
/* remove trash */
try {
project.delete(true, getMonitor());
getWorkspace().setDescription(original);
} catch (CoreException e) {
fail("20.0", e);
}
}
}