package org.threadly.concurrent.wrapper.interceptor;
import static org.junit.Assert.*;
import static org.threadly.TestConstants.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.threadly.concurrent.DoNothingRunnable;
import org.threadly.concurrent.SubmitterScheduler;
import org.threadly.concurrent.TestCallable;
import org.threadly.concurrent.future.ListenableFuture;
import org.threadly.concurrent.future.ListenableFutureTask;
import org.threadly.test.concurrent.TestRunnable;
import org.threadly.test.concurrent.TestableScheduler;
@SuppressWarnings("javadoc")
public class SubmitterSchedulerTaskInterceptorTest extends ExecutorTaskInterceptorTest {
protected SubmitterSchedulerTaskInterceptor submitterSchedulerInterceptor;
protected SubmitterSchedulerTaskInterceptor submitSchedulerTaskInterceptorLamba;
protected List<Runnable> interceptedTasks;
@Before
@Override
public void setup() {
scheduler = new TestableScheduler();
submitterSchedulerInterceptor = new TestSubmitterSchedulerInterceptor(scheduler);
executorInterceptor = submitterSchedulerInterceptor;
testInterceptor = (TestInterceptor)executorInterceptor;
interceptedTasks = new ArrayList<>(1);
submitSchedulerTaskInterceptorLamba = new SubmitterSchedulerTaskInterceptor(scheduler, (r1, b1) -> {
interceptedTasks.add(r1);
return DoNothingRunnable.instance();
});
tr = new TestRunnable();
}
@After
@Override
public void cleanup() {
submitterSchedulerInterceptor = null;
super.cleanup();
}
@Test
public void interceptScheduleTest() {
submitterSchedulerInterceptor.schedule(tr, DELAY_TIME);
assertEquals(1, testInterceptor.getInterceptedTasks().size());
assertTrue(tr == testInterceptor.getInterceptedTasks().get(0));
assertEquals(1, scheduler.advance(DELAY_TIME)); // replaced task should run
assertEquals(0, tr.getRunCount()); // should have been replaced and not run
}
@Test
public void interceptScheduleLambdaTest() {
submitSchedulerTaskInterceptorLamba.schedule(tr, DELAY_TIME);
assertEquals(1, interceptedTasks.size());
assertTrue(tr == interceptedTasks.get(0));
assertEquals(1, scheduler.advance(DELAY_TIME)); // replaced task should run
assertEquals(0, tr.getRunCount()); // should have been replaced and not run
}
@Test
public void interceptSubmitScheduledRunnableTest() {
ListenableFuture<?> f = submitterSchedulerInterceptor.submitScheduled(tr, DELAY_TIME);
assertEquals(1, testInterceptor.getInterceptedTasks().size());
assertTrue(tr == testInterceptor.getInterceptedTasks().get(0));
assertEquals(1, scheduler.advance(DELAY_TIME)); // replaced task should run
assertEquals(0, tr.getRunCount()); // should have been replaced and not run
assertTrue(f.isDone());
}
@Test
public void interceptSubmitScheduledRunnableWithResultTest() throws InterruptedException, ExecutionException {
Object result = new Object();
ListenableFuture<Object> f = submitterSchedulerInterceptor.submitScheduled(tr, result, DELAY_TIME);
assertEquals(1, testInterceptor.getInterceptedTasks().size());
assertTrue(tr == testInterceptor.getInterceptedTasks().get(0));
assertEquals(1, scheduler.advance(DELAY_TIME)); // replaced task should run
assertEquals(0, tr.getRunCount()); // should have been replaced and not run
assertTrue(f.isDone());
assertTrue(f.get() == result);
}
@Test
public void interceptSubmitScheduledCallableTest() {
ListenableFuture<?> f = submitterSchedulerInterceptor.submitScheduled(new TestCallable(), DELAY_TIME);
assertEquals(1, testInterceptor.getInterceptedTasks().size());
assertTrue(testInterceptor.getInterceptedTasks().get(0) instanceof ListenableFutureTask);
assertEquals(1, scheduler.advance(DELAY_TIME)); // replaced task should run
assertFalse(f.isDone());
}
@Test
public void interceptScheduleWithFixedDelayTest() {
submitterSchedulerInterceptor.scheduleWithFixedDelay(tr, DELAY_TIME, DELAY_TIME);
assertEquals(1, testInterceptor.getInterceptedTasks().size());
assertTrue(tr == testInterceptor.getInterceptedTasks().get(0));
assertEquals(1, scheduler.advance(DELAY_TIME)); // replaced task should run
assertEquals(0, tr.getRunCount()); // should have been replaced and not run
}
@Test
public void interceptScheduleAtFixedRateTest() {
submitterSchedulerInterceptor.scheduleAtFixedRate(tr, DELAY_TIME, DELAY_TIME);
assertEquals(1, testInterceptor.getInterceptedTasks().size());
assertTrue(tr == testInterceptor.getInterceptedTasks().get(0));
assertEquals(1, scheduler.advance(DELAY_TIME)); // replaced task should run
assertEquals(0, tr.getRunCount()); // should have been replaced and not run
}
@Override
@Test (expected = RuntimeException.class)
public void defaultConstructorFail() {
SubmitterSchedulerTaskInterceptor ssti = new SubmitterSchedulerTaskInterceptor(scheduler);
ssti.schedule(DoNothingRunnable.instance(), 10);
}
@Override
@Test (expected = RuntimeException.class)
public void nullConstructorFail() {
@SuppressWarnings("unused")
SubmitterSchedulerTaskInterceptor ssti = new SubmitterSchedulerTaskInterceptor(scheduler, null);
}
private static class TestSubmitterSchedulerInterceptor extends SubmitterSchedulerTaskInterceptor
implements TestInterceptor {
private final List<Runnable> interceptedTasks;
public TestSubmitterSchedulerInterceptor(SubmitterScheduler parentScheduler) {
super(parentScheduler);
interceptedTasks = new ArrayList<>(1);
}
@Override
public List<Runnable> getInterceptedTasks() {
return interceptedTasks;
}
@Override
public Runnable wrapTask(Runnable task, boolean recurring) {
interceptedTasks.add(task);
return DoNothingRunnable.instance();
}
}
}