package org.threadly.concurrent; import static org.junit.Assert.*; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicReference; import org.junit.Test; import org.threadly.test.concurrent.TestRunnable; import org.threadly.util.ExceptionHandler; import org.threadly.util.ExceptionUtils; import org.threadly.util.StringUtils; import org.threadly.util.TestExceptionHandler; import org.threadly.util.TestUncaughtExceptionHandler; @SuppressWarnings("javadoc") public class ConfigurableThreadFactoryTest { @Test public void emptyConstructorTest() { ThreadFactory defaultFactory = new ConfigurableThreadFactory(); ConfigurableThreadFactory ctf = new ConfigurableThreadFactory(); Thread defaultThread = defaultFactory.newThread(DoNothingRunnable.instance()); Thread configurableThread = ctf.newThread(DoNothingRunnable.instance()); String defaultName = defaultThread.getName(); String configurableName = configurableThread.getName(); int firstDashIndex = defaultName.indexOf('-'); int secondDashIndex = defaultName.indexOf('-', firstDashIndex + 1); String defaultSantaizedName = defaultName.substring(0, firstDashIndex) + defaultName.substring(secondDashIndex); firstDashIndex = configurableName.indexOf('-'); secondDashIndex = configurableName.indexOf('-', firstDashIndex + 1); String configurableSantaizedName = configurableName.substring(0, firstDashIndex) + configurableName.substring(secondDashIndex); assertEquals(defaultSantaizedName, configurableSantaizedName); assertEquals(defaultThread.isDaemon(), configurableThread.isDaemon()); assertEquals(defaultThread.getPriority(), configurableThread.getPriority()); assertTrue(defaultThread.getUncaughtExceptionHandler() == configurableThread.getUncaughtExceptionHandler()); assertTrue(defaultThread.getThreadGroup() == configurableThread.getThreadGroup()); assertFalse(configurableThread.isAlive()); } @Test public void setPrefixWithPoolIdTest() { String poolPrefix = StringUtils.makeRandomString(5); ConfigurableThreadFactory ctf1 = new ConfigurableThreadFactory(poolPrefix, true); ConfigurableThreadFactory ctf2 = new ConfigurableThreadFactory(poolPrefix, true); assertTrue(ctf1.threadNamePrefix.contains(poolPrefix)); assertFalse(ctf1.threadNamePrefix.equals(ctf2.threadNamePrefix)); Thread t = ctf1.newThread(DoNothingRunnable.instance()); assertTrue(t.getName().contains(ctf1.threadNamePrefix)); } @Test public void setPrefixWithoutPoolIdTest() { String poolPrefix = StringUtils.makeRandomString(5); ConfigurableThreadFactory ctf1 = new ConfigurableThreadFactory(poolPrefix, false); ConfigurableThreadFactory ctf2 = new ConfigurableThreadFactory(poolPrefix, false); assertTrue(ctf1.threadNamePrefix.contains(poolPrefix)); assertTrue(ctf1.threadNamePrefix.equals(ctf2.threadNamePrefix)); Thread t = ctf1.newThread(DoNothingRunnable.instance()); assertTrue(t.getName().contains(ctf1.threadNamePrefix)); } @Test public void useDaemonThreadTest() { ConfigurableThreadFactory ctfFalse = new ConfigurableThreadFactory(false); ConfigurableThreadFactory ctfTrue = new ConfigurableThreadFactory(true); Thread t; assertFalse(ctfFalse.useDaemonThreads); t = ctfFalse.newThread(DoNothingRunnable.instance()); assertFalse(t.isDaemon()); assertTrue(ctfTrue.useDaemonThreads); t = ctfTrue.newThread(DoNothingRunnable.instance()); assertTrue(t.isDaemon()); } @Test public void priorityUnderMinTest() { ConfigurableThreadFactory ctf = new ConfigurableThreadFactory(-1000); assertEquals(Thread.MIN_PRIORITY, ctf.threadPriority); } @Test public void priorityOverMaxTest() { ConfigurableThreadFactory ctf = new ConfigurableThreadFactory(1000); assertEquals(Thread.MAX_PRIORITY, ctf.threadPriority); } @Test public void setPriorityTest() { int priority = Thread.NORM_PRIORITY + 1; ConfigurableThreadFactory ctf = new ConfigurableThreadFactory(priority); assertEquals(priority, ctf.threadPriority); Thread t = ctf.newThread(DoNothingRunnable.instance()); assertEquals(priority, t.getPriority()); } @Test public void setUncaughtExceptionHandlerTest() { TestUncaughtExceptionHandler ueh = new TestUncaughtExceptionHandler(); ConfigurableThreadFactory ctf = new ConfigurableThreadFactory(ueh); assertEquals(ueh, ctf.defaultUncaughtExceptionHandler); Thread t = ctf.newThread(DoNothingRunnable.instance()); assertEquals(ueh, t.getUncaughtExceptionHandler()); } @Test public void setExceptionHandlerTest() { TestExceptionHandler teh = new TestExceptionHandler(); ConfigurableThreadFactory ctf = new ConfigurableThreadFactory(teh); assertEquals(teh, ctf.defaultThreadlyExceptionHandler); final AtomicReference<ExceptionHandler> ehi = new AtomicReference<>(null); TestRunnable tr = new TestRunnable() { @Override public void handleRunStart() { ehi.set(ExceptionUtils.getExceptionHandler()); } }; Thread t = ctf.newThread(tr); t.start(); tr.blockTillFinished(); assertTrue(ehi.get() == teh); } }