diff options
Diffstat (limited to 'watchmaker/framework/src/java/test/org/uncommons/util/concurrent/ConfigurableThreadFactoryTest.java')
-rw-r--r-- | watchmaker/framework/src/java/test/org/uncommons/util/concurrent/ConfigurableThreadFactoryTest.java | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/watchmaker/framework/src/java/test/org/uncommons/util/concurrent/ConfigurableThreadFactoryTest.java b/watchmaker/framework/src/java/test/org/uncommons/util/concurrent/ConfigurableThreadFactoryTest.java new file mode 100644 index 0000000..8aaae2f --- /dev/null +++ b/watchmaker/framework/src/java/test/org/uncommons/util/concurrent/ConfigurableThreadFactoryTest.java @@ -0,0 +1,137 @@ +//============================================================================= +// Copyright 2006-2010 Daniel W. Dyer +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//============================================================================= +package org.uncommons.util.concurrent; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicInteger; +import org.testng.annotations.Test; + +/** + * Unit test for the general-purpose thread factory implementation. + * @author Daniel Dyer + */ +public class ConfigurableThreadFactoryTest +{ + @Test + public void testDaemonThreads() + { + ThreadFactory threadFactory = new ConfigurableThreadFactory("Test", + Thread.MIN_PRIORITY, + true); + Runnable doNothing = new Runnable() + { + public void run() + { + // Do nothing. + } + }; + Thread thread1 = threadFactory.newThread(doNothing); + assert thread1.getName().startsWith("Test") : "Wrong thread name: " + thread1.getName(); + assert thread1.getPriority() == Thread.MIN_PRIORITY : "Wrong priority: " + thread1.getPriority(); + assert thread1.isDaemon() : "Thread should be a daemon."; + + // Second thread should have a different name. + Thread thread2 = threadFactory.newThread(doNothing); + assert thread2.getName().startsWith("Test") : "Wrong thread name: " + thread2.getName(); + assert !thread1.getName().equals(thread2.getName()) : "Thread names should be different."; + } + + + @Test + public void testNonDaemonThreads() + { + ThreadFactory threadFactory = new ConfigurableThreadFactory("Test", + Thread.MAX_PRIORITY, + false); + Runnable doNothing = new Runnable() + { + public void run() + { + // Do nothing. + } + }; + Thread thread = threadFactory.newThread(doNothing); + assert thread.getName().startsWith("Test") : "Wrong thread name: " + thread.getName(); + assert thread.getPriority() == Thread.MAX_PRIORITY : "Wrong priority: " + thread.getPriority(); + assert !thread.isDaemon() : "Thread should not be a daemon."; + } + + + @Test + public void testDefaultExceptionHandler() throws InterruptedException + { + // Intercept std. err. + ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); + System.setErr(new PrintStream(byteStream)); + + ThreadFactory threadFactory = new ConfigurableThreadFactory("Test", + Thread.MAX_PRIORITY, + false); + Runnable doNothing = new Runnable() + { + public void run() + { + throw new IllegalStateException("This is a test."); + } + }; + Thread thread = threadFactory.newThread(doNothing); + thread.start(); + thread.join(); + + String output = byteStream.toString(); + assert output.startsWith("java.lang.IllegalStateException") : "Exception handler failed to log exception."; + } + + + @Test + public void testCustomExceptionHandler() throws InterruptedException + { + ExceptionHandler exceptionHandler = new ExceptionHandler(); + ThreadFactory threadFactory = new ConfigurableThreadFactory("Test", + Thread.MAX_PRIORITY, + false, + exceptionHandler); + Runnable doNothing = new Runnable() + { + public void run() + { + throw new IllegalStateException("This is a test."); + } + }; + Thread thread = threadFactory.newThread(doNothing); + thread.start(); + thread.join(); + assert exceptionHandler.getExceptionCount() == 1 : "Exception not thrown."; + } + + + private static final class ExceptionHandler implements Thread.UncaughtExceptionHandler + { + private final AtomicInteger count = new AtomicInteger(); + + public void uncaughtException(Thread thread, Throwable throwable) + { + count.incrementAndGet(); + } + + public int getExceptionCount() + { + return count.get(); + } + } +} |