package org.threadly.concurrent;
import static org.junit.Assert.*;
import static org.threadly.TestConstants.*;
import java.util.concurrent.Callable;
import org.junit.Test;
import org.threadly.BlockingTestRunnable;
import org.threadly.test.concurrent.TestCondition;
import org.threadly.test.concurrent.TestRunnable;
@SuppressWarnings("javadoc")
public abstract class SchedulerServiceInterfaceTest extends SubmitterSchedulerInterfaceTest {
protected abstract SchedulerServiceFactory getSchedulerServiceFactory();
@Override
protected SubmitterSchedulerFactory getSubmitterSchedulerFactory() {
return getSchedulerServiceFactory();
}
@Test
public void removeRunnableTest() {
SchedulerServiceFactory factory = getSchedulerServiceFactory();
SchedulerService scheduler = factory.makeSchedulerService(1, false);
BlockingTestRunnable btr1 = new BlockingTestRunnable();
BlockingTestRunnable btr2 = new BlockingTestRunnable();
try {
assertFalse(scheduler.remove(btr1));
assertFalse(scheduler.remove((Runnable)null));
scheduler.execute(btr1);
scheduler.execute(btr2);
TestRunnable tr = new TestRunnable();
assertFalse(scheduler.remove(tr));
scheduler.execute(tr);
assertTrue(scheduler.remove(tr));
assertFalse(scheduler.remove(tr));
scheduler.submit(tr);
assertTrue(scheduler.remove(tr));
assertFalse(scheduler.remove(tr));
scheduler.submit(tr, new Object());
assertTrue(scheduler.remove(tr));
assertFalse(scheduler.remove(tr));
scheduler.schedule(tr, 1000 * 10);
assertTrue(scheduler.remove(tr));
assertFalse(scheduler.remove(tr));
scheduler.submitScheduled(tr, 1000 * 10);
assertTrue(scheduler.remove(tr));
assertFalse(scheduler.remove(tr));
scheduler.submitScheduled(tr, new Object(), 1000 * 10);
assertTrue(scheduler.remove(tr));
assertFalse(scheduler.remove(tr));
scheduler.scheduleWithFixedDelay(tr, 0, 1000 * 10);
assertTrue(scheduler.remove(tr));
assertFalse(scheduler.remove(tr));
} finally {
btr1.unblock();
btr2.unblock();
factory.shutdown();
}
}
@Test
public void removeCallableTest() {
SchedulerServiceFactory factory = getSchedulerServiceFactory();
SchedulerService scheduler = factory.makeSchedulerService(1, false);
BlockingTestRunnable btr1 = new BlockingTestRunnable();
BlockingTestRunnable btr2 = new BlockingTestRunnable();
try {
assertFalse(scheduler.remove(btr1));
scheduler.execute(btr1);
scheduler.execute(btr2);
TestCallable tc = new TestCallable();
assertFalse(scheduler.remove(tc));
assertFalse(scheduler.remove((Callable<?>)null));
scheduler.submit(tc);
assertTrue(scheduler.remove(tc));
assertFalse(scheduler.remove(tc));
scheduler.submitScheduled(tc, DELAY_TIME);
assertTrue(scheduler.remove(tc));
assertFalse(scheduler.remove(tc));
} finally {
btr1.unblock();
btr2.unblock();
factory.shutdown();
}
}
@Test
public void getActiveTaskCountTest() {
SchedulerServiceFactory factory = getSchedulerServiceFactory();
final SchedulerService scheduler = factory.makeSchedulerService(1, false);
try {
// verify nothing at the start
assertEquals(0, scheduler.getActiveTaskCount());
BlockingTestRunnable btr = new BlockingTestRunnable();
scheduler.execute(btr);
btr.blockTillStarted();
assertEquals(1, scheduler.getActiveTaskCount());
btr.unblock();
new TestCondition(() -> scheduler.getActiveTaskCount() == 0).blockTillTrue();
} finally {
factory.shutdown();
}
}
public interface SchedulerServiceFactory extends SubmitterSchedulerFactory {
public SchedulerService makeSchedulerService(int poolSize, boolean prestartIfAvailable);
}
}