package org.threadly.concurrent.wrapper;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.threadly.concurrent.DoNothingRunnable;
import org.threadly.concurrent.SubmitterExecutor;
import org.threadly.concurrent.SubmitterScheduler;
import org.threadly.concurrent.SubmitterSchedulerInterfaceTest;
import org.threadly.concurrent.PrioritySchedulerTest.PrioritySchedulerFactory;
import org.threadly.test.concurrent.TestableScheduler;
@SuppressWarnings("javadoc")
public class SchedulerExecutorDelegatorTest extends SubmitterSchedulerInterfaceTest {
private TestableScheduler executor;
private TestableScheduler scheduler;
private SchedulerExecutorDelegator delegator;
@Before
public void setup() {
executor = new TestableScheduler();
scheduler = new TestableScheduler();
delegator = new SchedulerExecutorDelegator(executor, scheduler);
}
@After
public void cleanup() {
executor = null;
scheduler = null;
delegator = null;
}
@Override
protected SubmitterSchedulerFactory getSubmitterSchedulerFactory() {
return new DelegatorFactory();
}
@Override
protected boolean isSingleThreaded() {
return false;
}
@Test
public void executeDelegateTest() {
delegator.execute(DoNothingRunnable.instance());
delegator.submit(DoNothingRunnable.instance());
assertEquals(2, executor.tick());
assertEquals(0, scheduler.tick());
}
@Test
public void scheduleDelegateTest() {
delegator.schedule(DoNothingRunnable.instance(), 10);
delegator.submitScheduled(DoNothingRunnable.instance(), 10);
delegator.scheduleAtFixedRate(DoNothingRunnable.instance(), 10, 100);
delegator.scheduleWithFixedDelay(DoNothingRunnable.instance(), 10, 100);
assertEquals(0, executor.advance(10));
assertEquals(4, scheduler.advance(10));
}
protected static class DelegatorFactory implements SubmitterSchedulerFactory {
private final PrioritySchedulerFactory schedulerFactory;
public DelegatorFactory() {
schedulerFactory = new PrioritySchedulerFactory();
}
@Override
public void shutdown() {
schedulerFactory.shutdown();
}
@Override
public SubmitterExecutor makeSubmitterExecutor(int poolSize, boolean prestartIfAvailable) {
return makeSubmitterScheduler(poolSize, prestartIfAvailable);
}
@Override
public SubmitterScheduler makeSubmitterScheduler(int poolSize, boolean prestartIfAvailable) {
SubmitterScheduler scheduler = schedulerFactory.makeSubmitterScheduler(poolSize, prestartIfAvailable);
return new SchedulerExecutorDelegator(scheduler, scheduler);
}
}
}