package org.mariadb.jdbc.internal.util; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mariadb.jdbc.internal.util.scheduler.DynamicSizedSchedulerInterface; import org.mariadb.jdbc.internal.util.scheduler.SchedulerServiceProviderHolder; import org.mariadb.jdbc.internal.util.scheduler.SchedulerServiceProviderHolder.SchedulerProvider; import org.threadly.concurrent.DoNothingRunnable; import org.threadly.test.concurrent.TestRunnable; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; import static org.junit.Assert.*; public class SchedulerServiceProviderHolderTest { @After @Before public void providerReset() { SchedulerServiceProviderHolder.setSchedulerProvider(null); } @Test public void getDefaultProviderTest() { assertTrue(SchedulerServiceProviderHolder.DEFAULT_PROVIDER == SchedulerServiceProviderHolder.getSchedulerProvider()); } @Test public void defaultProviderGetSchedulerTest() { testRunnable(SchedulerServiceProviderHolder.getScheduler(1, "testScheduler", 8)); testRunnable(SchedulerServiceProviderHolder.getFixedSizeScheduler(1, "testFixedScheduler")); } private void testRunnable(ScheduledExecutorService scheduler) { try { assertNotNull(scheduler); // verify scheduler works TestRunnable tr = new TestRunnable(); scheduler.execute(tr); tr.blockTillFinished(); // will throw exception if timeout } finally { scheduler.shutdown(); } } @Test public void defaultProviderSchedulerShutdownTest() { testExecuteAfterShutdown(SchedulerServiceProviderHolder.getScheduler(1, "testScheduler", 8)); testExecuteAfterShutdown(SchedulerServiceProviderHolder.getFixedSizeScheduler(1, "testFixedScheduler")); } private void testExecuteAfterShutdown(ScheduledExecutorService scheduler) { scheduler.shutdown(); try { scheduler.execute(DoNothingRunnable.instance()); fail("Exception should have thrown"); } catch (RejectedExecutionException expected) { // ignore } } @Test public void setAndGetProviderTest() { SchedulerProvider emptyProvider = new SchedulerProvider() { @Override public DynamicSizedSchedulerInterface getScheduler(int minimumThreads, String poolName, int maximumPoolSize) { throw new UnsupportedOperationException(); } @Override public ScheduledThreadPoolExecutor getFixedSizeScheduler(int minimumThreads, String poolName) { throw new UnsupportedOperationException(); } @Override public ScheduledThreadPoolExecutor getTimeoutScheduler() { throw new UnsupportedOperationException(); } @Override public ScheduledThreadPoolExecutor getBulkScheduler() { throw new UnsupportedOperationException(); } }; SchedulerServiceProviderHolder.setSchedulerProvider(emptyProvider); assertTrue(emptyProvider == SchedulerServiceProviderHolder.getSchedulerProvider()); } }