package org.threadly.concurrent.statistics; import static org.junit.Assert.*; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.concurrent.TimeoutException; import org.junit.Test; import org.threadly.concurrent.AbstractPriorityScheduler; import org.threadly.concurrent.ConfigurableThreadFactory; import org.threadly.concurrent.PriorityScheduler; import org.threadly.concurrent.PrioritySchedulerTest; import org.threadly.concurrent.SchedulerService; import org.threadly.concurrent.SubmitterExecutor; import org.threadly.concurrent.SubmitterScheduler; import org.threadly.concurrent.TaskPriority; @SuppressWarnings("javadoc") public class PrioritySchedulerStatisticTrackerTest extends PrioritySchedulerTest { @Override protected PrioritySchedulerServiceFactory getPrioritySchedulerFactory() { return new PrioritySchedulerStatisticTrackerTestFactory(); } @Test @SuppressWarnings("unused") public void constructorTest() { new PrioritySchedulerStatisticTracker(1); new PrioritySchedulerStatisticTracker(1, false); new PrioritySchedulerStatisticTracker(1, TaskPriority.High, 100); new PrioritySchedulerStatisticTracker(1, TaskPriority.High, 100, false); new PrioritySchedulerStatisticTracker(1, TaskPriority.High, 100, new ConfigurableThreadFactory()); new PrioritySchedulerStatisticTracker(1, 100); new PrioritySchedulerStatisticTracker(1, false, 100); new PrioritySchedulerStatisticTracker(1, TaskPriority.High, 100, 100); new PrioritySchedulerStatisticTracker(1, TaskPriority.High, 100, false, 100); new PrioritySchedulerStatisticTracker(1, TaskPriority.High, 100, new ConfigurableThreadFactory(), 100); new PrioritySchedulerStatisticTracker(1, 100, true); new PrioritySchedulerStatisticTracker(1, false, 100, true); new PrioritySchedulerStatisticTracker(1, TaskPriority.High, 100, 100, true); new PrioritySchedulerStatisticTracker(1, TaskPriority.High, 100, false, 100, true); new PrioritySchedulerStatisticTracker(1, TaskPriority.High, 100, new ConfigurableThreadFactory(), 100, true); } @Test @Override public void constructorNullFactoryTest() { // ignored due to workerPool visibility } @Test @Override @SuppressWarnings("unused") public void constructorFail() { try { new PrioritySchedulerStatisticTracker(0, TaskPriority.High, 1, null); fail("Exception should have thrown"); } catch (IllegalArgumentException e) { // expected } try { new PrioritySchedulerStatisticTracker(1, TaskPriority.High, -1, null); fail("Exception should have thrown"); } catch (IllegalArgumentException e) { // expected } } // tests for statistics tracking @Test public void resetCollectedStatsTest() { PrioritySchedulerStatisticTracker scheduler = new PrioritySchedulerStatisticTracker(1); try { // prestart so reuse percent is not zero scheduler.prestartAllThreads(); ThreadedStatisticPrioritySchedulerTests.resetCollectedStatsTest(scheduler); } finally { scheduler.shutdownNow(); } } @Test public void getTotalExecutionCountTest() { final PrioritySchedulerStatisticTracker scheduler; scheduler = new PrioritySchedulerStatisticTracker(10); try { ThreadedStatisticPrioritySchedulerTests.getTotalExecutionCountTest(scheduler); } finally { scheduler.shutdownNow(); } } @Test public void getAverageExecutionDelayNoInputTest() { PrioritySchedulerStatisticTracker scheduler = new PrioritySchedulerStatisticTracker(1); try { ThreadedStatisticPrioritySchedulerTests.getAverageExecutionDurationNoInputTest(scheduler); } finally { scheduler.shutdownNow(); } } @Test public void getHighPriorityAvgExecutionDelayNoInputTest() { PrioritySchedulerStatisticTracker scheduler = new PrioritySchedulerStatisticTracker(1); try { ThreadedStatisticPrioritySchedulerTests.getPriorityAverageExecutionDelayNoInputTest(scheduler, TaskPriority.High); } finally { scheduler.shutdownNow(); } } @Test public void getLowPriorityAvgExecutionDelayNoInputTest() { PrioritySchedulerStatisticTracker scheduler = new PrioritySchedulerStatisticTracker(1); try { ThreadedStatisticPrioritySchedulerTests.getPriorityAverageExecutionDelayNoInputTest(scheduler, TaskPriority.Low); } finally { scheduler.shutdownNow(); } } @Test public void getPriorityAverageExecutionDelayTest() { PrioritySchedulerStatisticTracker scheduler = new PrioritySchedulerStatisticTracker(1); try { ThreadedStatisticPrioritySchedulerTests.getPriorityAverageExecutionDelayTest(scheduler, null); } finally { scheduler.shutdownNow(); } } @Test public void getHighPriorityAvgExecutionDelayTest() { PrioritySchedulerStatisticTracker scheduler = new PrioritySchedulerStatisticTracker(1); try { ThreadedStatisticPrioritySchedulerTests.getPriorityAverageExecutionDelayTest(scheduler, TaskPriority.High); } finally { scheduler.shutdownNow(); } } @Test public void getLowPriorityAvgExecutionDelayTest() { PrioritySchedulerStatisticTracker scheduler = new PrioritySchedulerStatisticTracker(1); try { ThreadedStatisticPrioritySchedulerTests.getPriorityAverageExecutionDelayTest(scheduler, TaskPriority.Low); } finally { scheduler.shutdownNow(); } } @Test public void getExecutionDelayPercentilesTest() { PrioritySchedulerStatisticTracker scheduler = new PrioritySchedulerStatisticTracker(1); try { ThreadedStatisticPrioritySchedulerTests.getExecutionDelayPercentilesTest(scheduler); } finally { scheduler.shutdownNow(); } } @Test public void getPriorityExecutionDelayPercentilesTest() { PrioritySchedulerStatisticTracker scheduler = new PrioritySchedulerStatisticTracker(1); try { ThreadedStatisticPrioritySchedulerTests.getPriorityExecutionDelayPercentilesTest(scheduler, null); } finally { scheduler.shutdownNow(); } } @Test public void getHighPriorityExecutionDelayPercentilesTest() { PrioritySchedulerStatisticTracker scheduler = new PrioritySchedulerStatisticTracker(1); try { ThreadedStatisticPrioritySchedulerTests.getPriorityExecutionDelayPercentilesTest(scheduler, TaskPriority.High); } finally { scheduler.shutdownNow(); } } @Test public void getLowPriorityExecutionDelayPercentilesTest() { PrioritySchedulerStatisticTracker scheduler = new PrioritySchedulerStatisticTracker(1); try { ThreadedStatisticPrioritySchedulerTests.getPriorityExecutionDelayPercentilesTest(scheduler, TaskPriority.Low); } finally { scheduler.shutdownNow(); } } @Test public void getAverageExecutionDurationNoInputTest() { PrioritySchedulerStatisticTracker scheduler = new PrioritySchedulerStatisticTracker(1); try { ThreadedStatisticPrioritySchedulerTests.getAverageExecutionDurationNoInputTest(scheduler); } finally { scheduler.shutdownNow(); } } @Test public void getAverageExecutionDurationSimpleTest() { PrioritySchedulerStatisticTracker scheduler = new PrioritySchedulerStatisticTracker(2); try { ThreadedStatisticPrioritySchedulerTests.getAverageExecutionDurationSimpleTest(scheduler); } finally { scheduler.shutdownNow(); } } @Test public void getAverageExecutionDurationTest() { PrioritySchedulerStatisticTracker scheduler = new PrioritySchedulerStatisticTracker(10); try { ThreadedStatisticPrioritySchedulerTests.getAverageExecutionDurationTest(scheduler); } finally { scheduler.shutdownNow(); } } @Test public void getWithPriorityAverageExecutionDurationNoInputTest() { PrioritySchedulerStatisticTracker scheduler = new PrioritySchedulerStatisticTracker(1); try { ThreadedStatisticPrioritySchedulerTests.getWithPriorityAverageExecutionDurationNoInputTest(scheduler); } finally { scheduler.shutdownNow(); } } @Test public void getWithPriorityAverageExecutionDurationTest() { PrioritySchedulerStatisticTracker scheduler = new PrioritySchedulerStatisticTracker(10); try { ThreadedStatisticPrioritySchedulerTests.getWithPriorityAverageExecutionDurationTest(scheduler); } finally { scheduler.shutdownNow(); } } @Test public void getExecutionDurationPercentilesTest() { PrioritySchedulerStatisticTracker scheduler = new PrioritySchedulerStatisticTracker(2); try { ThreadedStatisticPrioritySchedulerTests.getExecutionDurationPercentilesTest(scheduler); } finally { scheduler.shutdownNow(); } } @Test public void getWithPriorityExecutionDurationPercentilesTest() { PrioritySchedulerStatisticTracker scheduler = new PrioritySchedulerStatisticTracker(2); try { ThreadedStatisticPrioritySchedulerTests.getWithPriorityExecutionDurationPercentilesTest(scheduler); } finally { scheduler.shutdownNow(); } } @Test public void getLongRunningTasksTest() { PrioritySchedulerStatisticTracker scheduler = new PrioritySchedulerStatisticTracker(1, 100, true); try { ThreadedStatisticPrioritySchedulerTests.getLongRunningTasksTest(scheduler); } finally { scheduler.shutdownNow(); } } @Test public void getLongRunningTasksWrappedFutureTest() throws InterruptedException, TimeoutException { PrioritySchedulerStatisticTracker scheduler = new PrioritySchedulerStatisticTracker(1); try { ThreadedStatisticPrioritySchedulerTests.getLongRunningTasksWrappedFutureTest(scheduler); } finally { scheduler.shutdownNow(); } } @Test public void getLongRunningTasksQtyTest() { PrioritySchedulerStatisticTracker scheduler = new PrioritySchedulerStatisticTracker(1); try { ThreadedStatisticPrioritySchedulerTests.getLongRunningTasksQtyTest(scheduler); } finally { scheduler.shutdownNow(); } } private class PrioritySchedulerStatisticTrackerTestFactory implements PrioritySchedulerServiceFactory { private final List<PriorityScheduler> executors; private PrioritySchedulerStatisticTrackerTestFactory() { executors = new ArrayList<>(1); } @Override public SubmitterScheduler makeSubmitterScheduler(int poolSize, boolean prestartIfAvailable) { return makeSchedulerService(poolSize, prestartIfAvailable); } @Override public SubmitterExecutor makeSubmitterExecutor(int poolSize, boolean prestartIfAvailable) { return makeSchedulerService(poolSize, prestartIfAvailable); } @Override public SchedulerService makeSchedulerService(int poolSize, boolean prestartIfAvailable) { PriorityScheduler result = makePriorityScheduler(poolSize); if (prestartIfAvailable) { result.prestartAllThreads(); } return result; } @Override public AbstractPriorityScheduler makeAbstractPriorityScheduler(int poolSize, TaskPriority defaultPriority, long maxWaitForLowPriority) { return makePriorityScheduler(poolSize, defaultPriority, maxWaitForLowPriority); } @Override public AbstractPriorityScheduler makeAbstractPriorityScheduler(int poolSize) { return makePriorityScheduler(poolSize); } @Override public PriorityScheduler makePriorityScheduler(int poolSize, TaskPriority defaultPriority, long maxWaitForLowPriority) { PriorityScheduler result = new PrioritySchedulerStatisticTracker(poolSize, defaultPriority, maxWaitForLowPriority); executors.add(result); return result; } @Override public PriorityScheduler makePriorityScheduler(int poolSize) { PriorityScheduler result = new PrioritySchedulerStatisticTracker(poolSize); executors.add(result); return result; } @Override public void shutdown() { Iterator<PriorityScheduler> it = executors.iterator(); while (it.hasNext()) { it.next().shutdownNow(); it.remove(); } } } }