| /******************************************************************************* |
| * Copyright (c) 2006, 2012 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.runtime.jobs; |
| |
| import junit.framework.TestSuite; |
| import org.eclipse.core.runtime.jobs.ISchedulingRule; |
| import org.eclipse.core.tests.harness.TestBarrier; |
| import org.eclipse.core.tests.harness.TestJob; |
| |
| /** |
| * Regression test for bug 129551. A job changes to the ABOUT_TO_RUN |
| * state, and then another job tries to run and is queued behind it. Before |
| * the job starts, it is put to sleep. When the bug existed, putting the job |
| * to sleep would cause any blocked jobs behind the job to be lost. |
| */ |
| public class Bug_129551 extends AbstractJobManagerTest { |
| final boolean[] shouldSleep = new boolean[] {true}; |
| TestBarrier barrier = new TestBarrier(); |
| RuntimeException[] failure = new RuntimeException[1]; |
| |
| class BugJob extends TestJob { |
| public BugJob() { |
| super("Bug_129551", 1, 1); |
| } |
| |
| public boolean shouldRun() { |
| //skip everything if the test is already done |
| if (!shouldSleep[0]) |
| return true; |
| barrier.setStatus(TestBarrier.STATUS_RUNNING); |
| //wait for blocking jobs to queue up |
| barrier.waitForStatus(TestBarrier.STATUS_START); |
| //put the job to sleep |
| try { |
| this.sleep(); |
| } catch (RuntimeException e) { |
| failure[0] = e; |
| } |
| barrier.setStatus(TestBarrier.STATUS_DONE); |
| return true; |
| } |
| } |
| |
| public static TestSuite suite() { |
| return new TestSuite(Bug_129551.class); |
| } |
| |
| public Bug_129551() { |
| super(); |
| } |
| |
| public Bug_129551(String name) { |
| super(name); |
| } |
| protected void setUp() throws Exception { |
| super.setUp(); |
| //don't use fussy progress monitor, because in this case we kill |
| // a job before it has started running |
| manager.setProgressProvider(null); |
| } |
| |
| public void testBug() { |
| ISchedulingRule rule = new IdentityRule(); |
| BugJob job = new BugJob(); |
| job.setRule(rule); |
| TestJob other = new TestJob("bug_129551_other", 1, 1); |
| other.setRule(rule); |
| job.schedule(); |
| other.schedule(); |
| //wait until the first job is about to run |
| barrier.waitForStatus(TestBarrier.STATUS_RUNNING); |
| //wait to ensure the other job is blocked |
| try { |
| Thread.sleep(1000); |
| } catch (InterruptedException e) { |
| fail("4.99", e); |
| } |
| //let the first job go |
| barrier.setStatus(TestBarrier.STATUS_START); |
| barrier.waitForStatus(TestBarrier.STATUS_DONE); |
| |
| //check for failure |
| if (failure[0] != null) |
| fail(failure[0].getMessage()); |
| //tell the job not to sleep this time around |
| shouldSleep[0] = false; |
| job.wakeUp(); |
| waitForCompletion(job); |
| waitForCompletion(other); |
| } |
| } |