diff options
| author | John Arthorne | 2012-05-01 20:08:52 +0000 |
|---|---|---|
| committer | John Arthorne | 2012-05-01 20:08:52 +0000 |
| commit | 6e56a143857adfeb19011ef8f5478d658a5bd87c (patch) | |
| tree | 13426223b749da01d213f518035b8d315593d9ea | |
| parent | 1bd802a18c81b1a7000658018baf643a4622202e (diff) | |
| download | eclipse.platform.resources-6e56a143857adfeb19011ef8f5478d658a5bd87c.tar.gz eclipse.platform.resources-6e56a143857adfeb19011ef8f5478d658a5bd87c.tar.xz eclipse.platform.resources-6e56a143857adfeb19011ef8f5478d658a5bd87c.zip | |
Bug 378156 - build cancelled by waiting (not run) jobv20120501-2008
3 files changed, 63 insertions, 26 deletions
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkManager.java index 926db4e4b..920a3ba05 100644 --- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkManager.java +++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkManager.java @@ -68,16 +68,16 @@ public class WorkManager implements IManager { * modifying the workspace tree. */ private final ILock lock; - + /** * The current depth of running nested operations. */ private int nestedOperations = 0; - + private NotifyRule notifyRule = new NotifyRule(); - + private boolean operationCanceled = false; - + /** * The current depth of prepared operations. */ @@ -89,7 +89,7 @@ public class WorkManager implements IManager { this.jobManager = Job.getJobManager(); this.lock = jobManager.newLock(); } - + /** * Releases the workspace lock without changing the nested operation depth. * Must be followed eventually by endUnprotected. Any @@ -154,7 +154,9 @@ public class WorkManager implements IManager { rebalanceNestedOperations(); //reset state if this is the end of a top level operation if (preparedOperations == 0) - operationCanceled = hasBuildChanges = false; + hasBuildChanges = false; + //don't let cancelation of this operation affect other operations + operationCanceled = false; try { lock.release(); } finally { @@ -188,7 +190,7 @@ public class WorkManager implements IManager { ILock getLock() { return lock; } - + /** * Returns the scheduling rule used during resource change notifications. */ diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/AllTests.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/AllTests.java index 1b86ec460..50ba99b11 100644 --- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/AllTests.java +++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/AllTests.java @@ -13,6 +13,9 @@ package org.eclipse.core.tests.resources.regression; import junit.framework.*; +/** + * A suite that runs all regression tests. + */ public class AllTests extends TestCase { /** * AllTests constructor comment. @@ -63,6 +66,7 @@ public class AllTests extends TestCase { suite.addTest(Bug_329836.suite()); suite.addTest(Bug_331445.suite()); suite.addTest(Bug_332543.suite()); + suite.addTest(Bug_378156.suite()); suite.addTest(IFileTest.suite()); suite.addTest(IFolderTest.suite()); suite.addTest(IProjectTest.suite()); diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_378156.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_378156.java index 3e398d377..d432c5f47 100644 --- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_378156.java +++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_378156.java @@ -15,7 +15,6 @@ import junit.framework.Test; import junit.framework.TestSuite; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.*; -import org.eclipse.core.tests.harness.CancelingProgressMonitor; import org.eclipse.core.tests.resources.ResourceTest; import org.eclipse.core.tests.resources.usecase.SignaledBuilder; @@ -26,9 +25,9 @@ import org.eclipse.core.tests.resources.usecase.SignaledBuilder; public class Bug_378156 extends ResourceTest { class ModifyFileJob extends WorkspaceJob { + private boolean cancel; private IFile jobFile; private Semaphore jobFlag; - private boolean cancel; /** * Modifies a file and then waits for a signal before returning. @@ -40,8 +39,9 @@ public class Bug_378156 extends ResourceTest { } public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException { - IProgressMonitor pm = cancel ? new CancelingProgressMonitor() : null; - jobFile.setContents(getRandomContents(), IResource.NONE, pm); + if (cancel) + throw new OperationCanceledException(); + jobFile.setContents(getRandomContents(), IResource.NONE, null); //wait for signal try { jobFlag.acquire(); @@ -59,25 +59,11 @@ public class Bug_378156 extends ResourceTest { } } - class BuildListener implements IResourceChangeListener { - private boolean buildEvent = false; - - public void resourceChanged(IResourceChangeEvent event) { - if (event.getType() == IResourceChangeEvent.PRE_BUILD) - buildEvent = true; - } - - public boolean buildEventReceived() { - return buildEvent; - } - - } - public static Test suite() { return new TestSuite(Bug_378156.class); } - public void testBug() throws Exception { + public void testBugTwoThreads() throws Exception { //setup IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); final IProject project1 = root.getProject("Bug_378156"); @@ -90,6 +76,8 @@ public class Bug_378156 extends ResourceTest { desc.setBuildSpec(new ICommand[] {command}); project1.setDescription(desc, getMonitor()); ensureExistsInWorkspace(file, getRandomContents()); + //build may not be triggered immediately + Thread.sleep(2000); waitForBuild(); //initialize the builder @@ -111,8 +99,51 @@ public class Bug_378156 extends ResourceTest { //now let the first job finish semaphore.release(); runningJob.join(); + waitForBuild(); //the builder should have run if the bug is fixed assertTrue("1.0", builder.wasExecuted()); } + + public void testBugOneThread() throws Exception { + //setup + IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); + final IProject project1 = root.getProject("Bug_378156"); + final IFile file = project1.getFile("content.txt"); + ensureExistsInWorkspace(project1, true); + //add a builder that can tell us if it was called + IProjectDescription desc = project1.getDescription(); + ICommand command = desc.newCommand(); + command.setBuilderName(SignaledBuilder.BUILDER_ID); + desc.setBuildSpec(new ICommand[] {command}); + project1.setDescription(desc, getMonitor()); + ensureExistsInWorkspace(file, getRandomContents()); + waitForBuild(); + + //initialize the builder + SignaledBuilder builder = SignaledBuilder.getInstance(project1); + builder.reset(); + + getWorkspace().run(new IWorkspaceRunnable() { + + public void run(IProgressMonitor monitor) throws CoreException { + //modify the file so autobuild is needed + file.setContents(getRandomContents(), IResource.NONE, null); + //create a nested operation that immediately cancels + try { + getWorkspace().run(new IWorkspaceRunnable() { + public void run(IProgressMonitor monitor) throws CoreException { + throw new OperationCanceledException(); + } + }, null); + } catch (OperationCanceledException e) { + //don't let this propagate - we changed our mind about canceling + } + } + }, null); + waitForBuild(); + //the builder should have run if the bug is fixed + assertTrue("1.0", builder.wasExecuted()); + } + } |
