package io.dropwizard.metrics; import org.junit.Before; import org.junit.Test; import io.dropwizard.metrics.InstrumentedExecutorService; import io.dropwizard.metrics.InstrumentedExecutors; import io.dropwizard.metrics.InstrumentedScheduledExecutorService; import io.dropwizard.metrics.InstrumentedThreadFactory; import io.dropwizard.metrics.MetricRegistry; import java.lang.reflect.Field; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import static org.assertj.core.api.Assertions.assertThat; public class InstrumentedExecutorsTest { private final ThreadFactory defaultThreadFactory = Executors.defaultThreadFactory(); private MetricRegistry registry; @Before public void setUp() { registry = new MetricRegistry(); } @Test public void testNewFixedThreadPool() throws Exception { final ExecutorService executorService = InstrumentedExecutors.newFixedThreadPool(2, registry, "xs"); executorService.submit(new NoopRunnable()); assertThat(registry.meter("xs.submitted").getCount()).isEqualTo(1l); final Field delegateField = InstrumentedExecutorService.class.getDeclaredField("delegate"); delegateField.setAccessible(true); final ThreadPoolExecutor delegate = (ThreadPoolExecutor) delegateField.get(executorService); assertThat(delegate.getCorePoolSize()).isEqualTo(2); assertThat(delegate.getMaximumPoolSize()).isEqualTo(2); } @Test public void testNewFixedThreadPoolWithThreadFactory() throws Exception { final ExecutorService executorService = InstrumentedExecutors.newFixedThreadPool(2, defaultThreadFactory, registry); executorService.submit(new NoopRunnable()); final Field delegateField = InstrumentedExecutorService.class.getDeclaredField("delegate"); delegateField.setAccessible(true); final ThreadPoolExecutor delegate = (ThreadPoolExecutor) delegateField.get(executorService); assertThat(delegate.getCorePoolSize()).isEqualTo(2); assertThat(delegate.getMaximumPoolSize()).isEqualTo(2); assertThat(delegate.getThreadFactory()).isSameAs(defaultThreadFactory); } @Test public void testNewFixedThreadPoolWithThreadFactoryAndName() throws Exception { final ExecutorService executorService = InstrumentedExecutors.newFixedThreadPool(2, defaultThreadFactory, registry, "xs"); executorService.submit(new NoopRunnable()); assertThat(registry.meter("xs.submitted").getCount()).isEqualTo(1l); final Field delegateField = InstrumentedExecutorService.class.getDeclaredField("delegate"); delegateField.setAccessible(true); final ThreadPoolExecutor delegate = (ThreadPoolExecutor) delegateField.get(executorService); assertThat(delegate.getCorePoolSize()).isEqualTo(2); assertThat(delegate.getMaximumPoolSize()).isEqualTo(2); assertThat(delegate.getThreadFactory()).isSameAs(defaultThreadFactory); } @Test public void testNewSingleThreadExecutor() throws Exception { final ExecutorService executorService = InstrumentedExecutors.newSingleThreadExecutor(registry, "xs"); executorService.submit(new NoopRunnable()); assertThat(registry.meter("xs.submitted").getCount()).isEqualTo(1l); } @Test public void testNewSingleThreadExecutorWithThreadFactory() throws Exception { final ExecutorService executorService = InstrumentedExecutors.newSingleThreadExecutor(defaultThreadFactory, registry); executorService.submit(new NoopRunnable()); } @Test public void testNewSingleThreadExecutorWithThreadFactoryAndName() throws Exception { final ExecutorService executorService = InstrumentedExecutors.newSingleThreadExecutor(defaultThreadFactory, registry, "xs"); executorService.submit(new NoopRunnable()); assertThat(registry.meter("xs.submitted").getCount()).isEqualTo(1l); } @Test public void testNewCachedThreadPool() throws Exception { final ExecutorService executorService = InstrumentedExecutors.newCachedThreadPool(registry, "xs"); executorService.submit(new NoopRunnable()); executorService.submit(new NoopRunnable()); assertThat(registry.meter("xs.submitted").getCount()).isEqualTo(2l); final Field delegateField = InstrumentedExecutorService.class.getDeclaredField("delegate"); delegateField.setAccessible(true); final ThreadPoolExecutor delegate = (ThreadPoolExecutor) delegateField.get(executorService); assertThat(delegate.getCorePoolSize()).isEqualTo(0); assertThat(delegate.getPoolSize()).isEqualTo(2); } @Test public void testNewCachedThreadPoolWithThreadFactory() throws Exception { final ExecutorService executorService = InstrumentedExecutors.newCachedThreadPool(defaultThreadFactory, registry); executorService.submit(new NoopRunnable()); executorService.submit(new NoopRunnable()); final Field delegateField = InstrumentedExecutorService.class.getDeclaredField("delegate"); delegateField.setAccessible(true); final ThreadPoolExecutor delegate = (ThreadPoolExecutor) delegateField.get(executorService); assertThat(delegate.getCorePoolSize()).isEqualTo(0); assertThat(delegate.getPoolSize()).isEqualTo(2); assertThat(delegate.getThreadFactory()).isSameAs(defaultThreadFactory); } @Test public void testNewCachedThreadPoolWithThreadFactoryAndName() throws Exception { final ExecutorService executorService = InstrumentedExecutors.newCachedThreadPool(defaultThreadFactory, registry, "xs"); executorService.submit(new NoopRunnable()); executorService.submit(new NoopRunnable()); assertThat(registry.meter("xs.submitted").getCount()).isEqualTo(2l); final Field delegateField = InstrumentedExecutorService.class.getDeclaredField("delegate"); delegateField.setAccessible(true); final ThreadPoolExecutor delegate = (ThreadPoolExecutor) delegateField.get(executorService); assertThat(delegate.getCorePoolSize()).isEqualTo(0); assertThat(delegate.getPoolSize()).isEqualTo(2); assertThat(delegate.getThreadFactory()).isSameAs(defaultThreadFactory); } @Test public void testNewSingleThreadScheduledExecutor() throws Exception { final ScheduledExecutorService executorService = InstrumentedExecutors.newSingleThreadScheduledExecutor(registry); executorService.schedule(new NoopRunnable(), 0, TimeUnit.SECONDS); } @Test public void testNewSingleThreadScheduledExecutorWithName() throws Exception { final ScheduledExecutorService executorService = InstrumentedExecutors.newSingleThreadScheduledExecutor(registry, "xs"); executorService.schedule(new NoopRunnable(), 0, TimeUnit.SECONDS); assertThat(registry.meter("xs.scheduled.once").getCount()).isEqualTo(1l); } @Test public void testNewScheduledThreadPool() throws Exception { final ScheduledExecutorService executorService = InstrumentedExecutors.newScheduledThreadPool(2, registry, "xs"); executorService.schedule(new NoopRunnable(), 0, TimeUnit.SECONDS); assertThat(registry.meter("xs.scheduled.once").getCount()).isEqualTo(1l); final Field delegateField = InstrumentedScheduledExecutorService.class.getDeclaredField("delegate"); delegateField.setAccessible(true); final ScheduledThreadPoolExecutor delegate = (ScheduledThreadPoolExecutor) delegateField.get(executorService); assertThat(delegate.getCorePoolSize()).isEqualTo(2); } @Test public void testNewScheduledThreadPoolWithThreadFactory() throws Exception { final ScheduledExecutorService executorService = InstrumentedExecutors.newScheduledThreadPool(2, defaultThreadFactory, registry); executorService.schedule(new NoopRunnable(), 0, TimeUnit.SECONDS); final Field delegateField = InstrumentedScheduledExecutorService.class.getDeclaredField("delegate"); delegateField.setAccessible(true); final ScheduledThreadPoolExecutor delegate = (ScheduledThreadPoolExecutor) delegateField.get(executorService); assertThat(delegate.getCorePoolSize()).isEqualTo(2); assertThat(delegate.getThreadFactory()).isSameAs(defaultThreadFactory); } @Test public void testNewScheduledThreadPoolWithThreadFactoryAndName() throws Exception { final ScheduledExecutorService executorService = InstrumentedExecutors.newScheduledThreadPool(2, defaultThreadFactory, registry, "xs"); executorService.schedule(new NoopRunnable(), 0, TimeUnit.SECONDS); assertThat(registry.meter("xs.scheduled.once").getCount()).isEqualTo(1l); final Field delegateField = InstrumentedScheduledExecutorService.class.getDeclaredField("delegate"); delegateField.setAccessible(true); final ScheduledThreadPoolExecutor delegate = (ScheduledThreadPoolExecutor) delegateField.get(executorService); assertThat(delegate.getCorePoolSize()).isEqualTo(2); assertThat(delegate.getThreadFactory()).isSameAs(defaultThreadFactory); } @Test public void testDefaultThreadFactory() throws Exception { final ThreadFactory threadFactory = InstrumentedExecutors.defaultThreadFactory(registry); threadFactory.newThread(new NoopRunnable()); final Field delegateField = InstrumentedThreadFactory.class.getDeclaredField("delegate"); delegateField.setAccessible(true); final ThreadFactory delegate = (ThreadFactory) delegateField.get(threadFactory); assertThat(delegate.getClass().getCanonicalName()).isEqualTo("java.util.concurrent.Executors.DefaultThreadFactory"); } @Test public void testDefaultThreadFactoryWithName() throws Exception { final ThreadFactory threadFactory = InstrumentedExecutors.defaultThreadFactory(registry, "tf"); threadFactory.newThread(new NoopRunnable()); assertThat(registry.meter("tf.created").getCount()).isEqualTo(1l); final Field delegateField = InstrumentedThreadFactory.class.getDeclaredField("delegate"); delegateField.setAccessible(true); final ThreadFactory delegate = (ThreadFactory) delegateField.get(threadFactory); assertThat(delegate.getClass().getCanonicalName()).isEqualTo("java.util.concurrent.Executors.DefaultThreadFactory"); } @Test public void testPrivilegedThreadFactory() throws Exception { final ThreadFactory threadFactory = InstrumentedExecutors.privilegedThreadFactory(registry); threadFactory.newThread(new NoopRunnable()); final Field delegateField = InstrumentedThreadFactory.class.getDeclaredField("delegate"); delegateField.setAccessible(true); final ThreadFactory delegate = (ThreadFactory) delegateField.get(threadFactory); assertThat(delegate.getClass().getCanonicalName()).isEqualTo("java.util.concurrent.Executors.PrivilegedThreadFactory"); } @Test public void testPrivilegedThreadFactoryWithName() throws Exception { final ThreadFactory threadFactory = InstrumentedExecutors.privilegedThreadFactory(registry, "tf"); threadFactory.newThread(new NoopRunnable()); assertThat(registry.meter("tf.created").getCount()).isEqualTo(1l); final Field delegateField = InstrumentedThreadFactory.class.getDeclaredField("delegate"); delegateField.setAccessible(true); final ThreadFactory delegate = (ThreadFactory) delegateField.get(threadFactory); assertThat(delegate.getClass().getCanonicalName()).isEqualTo("java.util.concurrent.Executors.PrivilegedThreadFactory"); } private static class NoopRunnable implements Runnable { @Override public void run() { } } }