package com.path.android.jobqueue.test.jobmanager; import com.path.android.jobqueue.BaseJob; import com.path.android.jobqueue.JobManager; import com.path.android.jobqueue.config.Configuration; import static org.hamcrest.CoreMatchers.*; import org.hamcrest.*; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.*; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; @RunWith(RobolectricTestRunner.class) public class PriorityTest extends JobManagerTestBase { private static CountDownLatch priorityRunLatch; @Test public void testPriority() throws Exception { JobManager jobManager = createJobManager(new Configuration.Builder(Robolectric.application).maxConsumerCount(1)); testPriority(jobManager, false); } public void testPriority(JobManager jobManager, boolean persist) throws Exception { priorityRunLatch = new CountDownLatch(2); DummyJobWithRunOrderAssert.globalRunCount = new AtomicInteger(0); BaseJob job1 = new DummyJobWithRunOrderAssert(2, persist); BaseJob job2 = new DummyJobWithRunOrderAssert(1, persist); jobManager.stop(); jobManager.addJob(1, job1); jobManager.addJob(2, job2); jobManager.start(); priorityRunLatch.await(4, TimeUnit.SECONDS); //ensure both jobs did run MatcherAssert.assertThat((int) priorityRunLatch.getCount(), equalTo(0)); } public static class DummyJobWithRunOrderAssert extends BaseJob { transient public static AtomicInteger globalRunCount; private int expectedRunOrder; public DummyJobWithRunOrderAssert(int expectedRunOrder, boolean persist) { super(true, persist); this.expectedRunOrder = expectedRunOrder; } @Override public void onAdded() { } @Override public void onRun() throws Throwable { final int cnt = globalRunCount.incrementAndGet(); MatcherAssert.assertThat(expectedRunOrder, equalTo(cnt)); priorityRunLatch.countDown(); } @Override protected void onCancel() { } @Override protected boolean shouldReRunOnThrowable(Throwable throwable) { return false; } } }