package org.threadly.concurrent.wrapper; import static org.junit.Assert.*; import java.util.concurrent.Callable; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.threadly.concurrent.DoNothingRunnable; import org.threadly.concurrent.PriorityScheduler; import org.threadly.concurrent.PrioritySchedulerService; import org.threadly.concurrent.StrictPriorityScheduler; import org.threadly.concurrent.TaskPriority; import org.threadly.concurrent.TestCallable; import org.threadly.concurrent.future.FutureUtils; import org.threadly.concurrent.future.ListenableFuture; @SuppressWarnings("javadoc") public class PrioritySchedulerDefaultPriorityWrapperTest { private static PriorityScheduler scheduler; @BeforeClass public static void setupClass() { scheduler = new StrictPriorityScheduler(2); } @AfterClass public static void cleanupClass() { scheduler.shutdown(); scheduler = null; } @Test public void constructorTest() { PrioritySchedulerDefaultPriorityWrapper psw = new PrioritySchedulerDefaultPriorityWrapper(scheduler, TaskPriority.Low); assertTrue(psw.scheduler == scheduler); assertEquals(TaskPriority.Low, psw.defaultPriority); psw = new PrioritySchedulerDefaultPriorityWrapper(scheduler, TaskPriority.High); assertEquals(TaskPriority.High, psw.defaultPriority); } @Test @SuppressWarnings("unused") public void constructorFail() { try { new PrioritySchedulerDefaultPriorityWrapper(null, TaskPriority.High); fail("Exception should have thrown"); } catch (IllegalArgumentException e) { // expected } try { new PrioritySchedulerDefaultPriorityWrapper(scheduler, null); fail("Exception should have thrown"); } catch (IllegalArgumentException e) { // expected } } @Test public void isShutdownTest() { PrioritySchedulerDefaultPriorityWrapper psw = new PrioritySchedulerDefaultPriorityWrapper(scheduler, TaskPriority.Low); assertEquals(scheduler.isShutdown(), psw.isShutdown()); TestPriorityScheduler tps = new TestPriorityScheduler(); psw = new PrioritySchedulerDefaultPriorityWrapper(tps, TaskPriority.Low); psw.isShutdown(); assertTrue(tps.isShutdownCalled); } @Test public void executeTest() { TestPriorityScheduler testScheduler = new TestPriorityScheduler(); PrioritySchedulerDefaultPriorityWrapper psw = new PrioritySchedulerDefaultPriorityWrapper(testScheduler, TaskPriority.Low); psw.execute(DoNothingRunnable.instance()); assertTrue(testScheduler.executeCalled); // reset and try with priority testScheduler.executeCalled = false; psw.execute(DoNothingRunnable.instance(), TaskPriority.High); assertTrue(testScheduler.executeCalled); } @Test public void scheduleTest() { TestPriorityScheduler testScheduler = new TestPriorityScheduler(); PrioritySchedulerDefaultPriorityWrapper psw = new PrioritySchedulerDefaultPriorityWrapper(testScheduler, TaskPriority.Low); psw.schedule(DoNothingRunnable.instance(), 10); assertTrue(testScheduler.scheduleCalled); // reset and try with priority testScheduler.scheduleCalled = false; psw.schedule(DoNothingRunnable.instance(), 10, TaskPriority.High); assertTrue(testScheduler.scheduleCalled); } @Test public void submitRunnableTest() { TestPriorityScheduler testScheduler = new TestPriorityScheduler(); PrioritySchedulerDefaultPriorityWrapper psw = new PrioritySchedulerDefaultPriorityWrapper(testScheduler, TaskPriority.Low); psw.submit(DoNothingRunnable.instance()); assertTrue(testScheduler.submitRunnableCalled); // reset and try with priority testScheduler.submitRunnableCalled = false; psw.submit(DoNothingRunnable.instance(), TaskPriority.High); assertTrue(testScheduler.submitRunnableCalled); } @Test public void submitRunnableWithResultTest() { TestPriorityScheduler testScheduler = new TestPriorityScheduler(); PrioritySchedulerDefaultPriorityWrapper psw = new PrioritySchedulerDefaultPriorityWrapper(testScheduler, TaskPriority.Low); psw.submit(DoNothingRunnable.instance(), new Object()); assertTrue(testScheduler.submitRunnableResultCalled); // reset and try with priority testScheduler.submitRunnableResultCalled = false; psw.submit(DoNothingRunnable.instance(), new Object(), TaskPriority.High); assertTrue(testScheduler.submitRunnableResultCalled); } @Test public void submitCallableTest() { TestPriorityScheduler testScheduler = new TestPriorityScheduler(); PrioritySchedulerDefaultPriorityWrapper psw = new PrioritySchedulerDefaultPriorityWrapper(testScheduler, TaskPriority.Low); psw.submit(new TestCallable()); assertTrue(testScheduler.submitCallableCalled); // reset and try with priority testScheduler.submitCallableCalled = false; psw.submit(new TestCallable(), TaskPriority.High); assertTrue(testScheduler.submitCallableCalled); } @Test public void submitScheduledRunnableTest() { TestPriorityScheduler testScheduler = new TestPriorityScheduler(); PrioritySchedulerDefaultPriorityWrapper psw = new PrioritySchedulerDefaultPriorityWrapper(testScheduler, TaskPriority.Low); psw.submitScheduled(DoNothingRunnable.instance(), 10); assertTrue(testScheduler.submitScheduledRunnableCalled); // reset and try with priority testScheduler.submitScheduledRunnableCalled = false; psw.submitScheduled(DoNothingRunnable.instance(), 10, TaskPriority.High); assertTrue(testScheduler.submitScheduledRunnableCalled); } @Test public void submitScheduledRunnableWithResultTest() { TestPriorityScheduler testScheduler = new TestPriorityScheduler(); PrioritySchedulerDefaultPriorityWrapper psw = new PrioritySchedulerDefaultPriorityWrapper(testScheduler, TaskPriority.Low); psw.submitScheduled(DoNothingRunnable.instance(), new Object(), 10); assertTrue(testScheduler.submitScheduledRunnableResultCalled); // reset and try with priority testScheduler.submitScheduledRunnableResultCalled = false; psw.submitScheduled(DoNothingRunnable.instance(), new Object(), 10, TaskPriority.High); assertTrue(testScheduler.submitScheduledRunnableResultCalled); } @Test public void submitScheduledCallableTest() { TestPriorityScheduler testScheduler = new TestPriorityScheduler(); PrioritySchedulerDefaultPriorityWrapper psw = new PrioritySchedulerDefaultPriorityWrapper(testScheduler, TaskPriority.Low); psw.submitScheduled(new TestCallable(), 10); assertTrue(testScheduler.submitScheduledCallableCalled); // reset and try with priority testScheduler.submitScheduledCallableCalled = false; psw.submitScheduled(new TestCallable(), 10, TaskPriority.High); assertTrue(testScheduler.submitScheduledCallableCalled); } @Test public void scheduleWithFixedDelayTest() { TestPriorityScheduler testScheduler = new TestPriorityScheduler(); PrioritySchedulerDefaultPriorityWrapper psw = new PrioritySchedulerDefaultPriorityWrapper(testScheduler, TaskPriority.Low); psw.scheduleWithFixedDelay(DoNothingRunnable.instance(), 10, 10); assertTrue(testScheduler.scheduleWithFixedDelayCalled); // reset and try with priority testScheduler.scheduleWithFixedDelayCalled = false; psw.scheduleWithFixedDelay(DoNothingRunnable.instance(), 10, 10, TaskPriority.High); assertTrue(testScheduler.scheduleWithFixedDelayCalled); } @Test public void scheduleAtFixedRateTest() { TestPriorityScheduler testScheduler = new TestPriorityScheduler(); PrioritySchedulerDefaultPriorityWrapper psw = new PrioritySchedulerDefaultPriorityWrapper(testScheduler, TaskPriority.Low); psw.scheduleAtFixedRate(DoNothingRunnable.instance(), 10, 10); assertTrue(testScheduler.scheduleAtFixedRateCalled); // reset and try with priority testScheduler.scheduleAtFixedRateCalled = false; psw.scheduleAtFixedRate(DoNothingRunnable.instance(), 10, 10, TaskPriority.High); assertTrue(testScheduler.scheduleAtFixedRateCalled); } @Test public void removeRunnableTest() { TestPriorityScheduler testScheduler = new TestPriorityScheduler(); PrioritySchedulerDefaultPriorityWrapper psw = new PrioritySchedulerDefaultPriorityWrapper(testScheduler, TaskPriority.Low); psw.remove(DoNothingRunnable.instance()); assertTrue(testScheduler.removeRunnableCalled); } @Test public void removeCallableTest() { TestPriorityScheduler testScheduler = new TestPriorityScheduler(); PrioritySchedulerDefaultPriorityWrapper psw = new PrioritySchedulerDefaultPriorityWrapper(testScheduler, TaskPriority.Low); psw.remove(new TestCallable()); assertTrue(testScheduler.removeCallableCalled); } // TODO - this may be good to move to something like mockito protected static class TestPriorityScheduler implements PrioritySchedulerService { protected boolean isShutdownCalled = false; protected boolean executeCalled = false; protected boolean scheduleCalled = false; protected boolean submitRunnableCalled = false; protected boolean submitRunnableResultCalled = false; protected boolean submitCallableCalled = false; protected boolean submitScheduledRunnableCalled = false; protected boolean submitScheduledRunnableResultCalled = false; protected boolean submitScheduledCallableCalled = false; protected boolean scheduleWithFixedDelayCalled = false; protected boolean scheduleAtFixedRateCalled = false; protected boolean removeRunnableCalled = false; protected boolean removeCallableCalled = false; @Override public boolean isShutdown() { isShutdownCalled = true; return false; } @Override public void execute(Runnable task, TaskPriority priority) { executeCalled = true; } @Override public ListenableFuture<?> submit(Runnable task, TaskPriority priority) { submitRunnableCalled = true; return FutureUtils.immediateFailureFuture(new UnsupportedOperationException()); } @Override public <T> ListenableFuture<T> submit(Runnable task, T result, TaskPriority priority) { submitRunnableResultCalled = true; return FutureUtils.immediateFailureFuture(new UnsupportedOperationException()); } @Override public <T> ListenableFuture<T> submit(Callable<T> task, TaskPriority priority) { submitCallableCalled = true; return FutureUtils.immediateFailureFuture(new UnsupportedOperationException()); } @Override public void schedule(Runnable task, long delayInMs, TaskPriority priority) { scheduleCalled = true; } @Override public ListenableFuture<?> submitScheduled(Runnable task, long delayInMs, TaskPriority priority) { submitScheduledRunnableCalled = true; return FutureUtils.immediateFailureFuture(new UnsupportedOperationException()); } @Override public <T> ListenableFuture<T> submitScheduled(Runnable task, T result, long delayInMs, TaskPriority priority) { submitScheduledRunnableResultCalled = true; return FutureUtils.immediateFailureFuture(new UnsupportedOperationException()); } @Override public <T> ListenableFuture<T> submitScheduled(Callable<T> task, long delayInMs, TaskPriority priority) { submitScheduledCallableCalled = true; return FutureUtils.immediateFailureFuture(new UnsupportedOperationException()); } @Override public void scheduleWithFixedDelay(Runnable task, long initialDelay, long recurringDelay, TaskPriority priority) { scheduleWithFixedDelayCalled = true; } @Override public void scheduleAtFixedRate(Runnable task, long initialDelay, long period, TaskPriority priority) { scheduleAtFixedRateCalled = true; } @Override public boolean remove(Runnable task) { removeRunnableCalled = true; return false; } @Override public boolean remove(Callable<?> task) { removeCallableCalled = true; return false; } @Override public TaskPriority getDefaultPriority() { throw new UnsupportedOperationException(); } @Override public long getMaxWaitForLowPriority() { throw new UnsupportedOperationException(); } @Override public int getActiveTaskCount() { throw new UnsupportedOperationException(); } @Override public int getQueuedTaskCount() { throw new UnsupportedOperationException(); } @Override public int getQueuedTaskCount(TaskPriority priority) { throw new UnsupportedOperationException(); } // NO OPERATIONS WITHOUT PRIORITY SHOULD BE CALLED @Override public ListenableFuture<?> submitScheduled(Runnable task, long delayInMs) { throw new UnsupportedOperationException(); } @Override public <T> ListenableFuture<T> submitScheduled(Runnable task, T result, long delayInMs) { throw new UnsupportedOperationException(); } @Override public <T> ListenableFuture<T> submitScheduled(Callable<T> task, long delayInMs) { throw new UnsupportedOperationException(); } @Override public void schedule(Runnable task, long delayInMs) { throw new UnsupportedOperationException(); } @Override public void scheduleWithFixedDelay(Runnable task, long initialDelay, long recurringDelay) { throw new UnsupportedOperationException(); } @Override public void scheduleAtFixedRate(Runnable task, long initialDelay, long period) { throw new UnsupportedOperationException(); } @Override public void execute(Runnable command) { throw new UnsupportedOperationException(); } @Override public ListenableFuture<?> submit(Runnable task) { throw new UnsupportedOperationException(); } @Override public <T> ListenableFuture<T> submit(Runnable task, T result) { throw new UnsupportedOperationException(); } @Override public <T> ListenableFuture<T> submit(Callable<T> task) { throw new UnsupportedOperationException(); } } }