/*******************************************************************************
 * 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);
	}
}
