/* * Copyright 2012 The Netty Project * * The Netty Project licenses this file to you 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.jboss.netty.util; import org.junit.After; import org.junit.AfterClass; import org.junit.Test; import java.security.Permission; import java.util.concurrent.Executor; import static org.easymock.EasyMock.*; import static org.junit.Assert.*; public class ThreadRenamingRunnableTest { @After public void setUp() { ThreadRenamingRunnable.setThreadNameDeterminer(ThreadNameDeterminer.PROPOSED); } @Test public void defaultIsProposed() { assertSame(ThreadNameDeterminer.PROPOSED, ThreadRenamingRunnable.getThreadNameDeterminer()); } @Test(expected = NullPointerException.class) public void shouldNotAllowNullName() throws Exception { new ThreadRenamingRunnable(createMock(Runnable.class), null); } @Test(expected = NullPointerException.class) public void shouldNotAllowNullRunnable() throws Exception { new ThreadRenamingRunnable(null, "foo"); } @Test public void testWithoutSecurityManager() throws Exception { final String oldThreadName = Thread.currentThread().getName(); Executor e = new ImmediateExecutor(); e.execute(new ThreadRenamingRunnable( new Runnable() { public void run() { assertEquals("foo", Thread.currentThread().getName()); assertFalse(oldThreadName.equals(Thread.currentThread().getName())); } }, "foo")); assertEquals(oldThreadName, Thread.currentThread().getName()); } @Test public void testWithSecurityManager() throws Exception { final String oldThreadName = Thread.currentThread().getName(); Executor e = new ImmediateExecutor(); System.setSecurityManager(new SecurityManager() { @Override public void checkAccess(Thread t) { throw new SecurityException(); } @Override public void checkPermission(Permission perm, Object context) { // Allow } @Override public void checkPermission(Permission perm) { // Allow } }); try { e.execute(new ThreadRenamingRunnable( new Runnable() { public void run() { assertEquals(oldThreadName, Thread.currentThread().getName()); } }, "foo")); } finally { System.setSecurityManager(null); assertEquals(oldThreadName, Thread.currentThread().getName()); } } // Tests mainly changed which were introduced as part of #711 @Test public void testThreadNameDeterminer() { final String oldThreadName = Thread.currentThread().getName(); final String newThreadName = "new"; final String proposed = "proposed"; ThreadNameDeterminer determiner = new ThreadNameDeterminer() { public String determineThreadName(String currentThreadName, String proposedThreadName) throws Exception { assertEquals(proposed, proposedThreadName); assertEquals(oldThreadName, currentThreadName); return newThreadName; } }; ThreadRenamingRunnable.setThreadNameDeterminer(new ThreadNameDeterminer() { public String determineThreadName(String currentThreadName, String proposedThreadName) throws Exception { assertEquals(proposed, proposedThreadName); assertEquals(oldThreadName, currentThreadName); return proposed; } }); Executor e = new ImmediateExecutor(); try { e.execute(new ThreadRenamingRunnable(new Runnable() { public void run() { assertEquals("Should use the given ThreadNameDEterminer", newThreadName, Thread.currentThread().getName()); } }, proposed, determiner)); } finally { assertEquals(oldThreadName, Thread.currentThread().getName()); } try { e.execute(new ThreadRenamingRunnable(new Runnable() { public void run() { assertEquals("Should use the static set ThreadNameDeterminer", proposed, Thread.currentThread().getName()); } }, proposed)); } finally { assertEquals(oldThreadName, Thread.currentThread().getName()); } } @AfterClass public static void after() { // reset to default ThreadRenamingRunnable.setThreadNameDeterminer(ThreadNameDeterminer.PROPOSED); } private static class ImmediateExecutor implements Executor { ImmediateExecutor() { } public void execute(Runnable command) { command.run(); } } }