11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2010 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.util.concurrent;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static org.junit.contrib.truth.Truth.ASSERT;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.lang.Thread.UncaughtExceptionHandler;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.Executors;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.ThreadFactory;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Tests for ThreadFactoryBuilder.
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kurt Alfred Kluever
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Martin Buchholz
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class ThreadFactoryBuilderTest extends TestCase {
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private final Runnable monitoredRunnable = new Runnable() {
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public void run() {
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      completed = true;
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  };
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final UncaughtExceptionHandler UNCAUGHT_EXCEPTION_HANDLER =
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      new UncaughtExceptionHandler() {
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @Override public void uncaughtException(Thread t, Throwable e) {
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          // No-op
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      };
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private ThreadFactoryBuilder builder;
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private volatile boolean completed = false;
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override public void setUp() {
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder = new ThreadFactoryBuilder();
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testThreadFactoryBuilder_defaults() throws InterruptedException {
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ThreadFactory threadFactory = builder.build();
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Thread thread = threadFactory.newThread(monitoredRunnable);
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkThreadPoolName(thread, 1);
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Thread defaultThread =
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Executors.defaultThreadFactory().newThread(monitoredRunnable);
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(defaultThread.isDaemon(), thread.isDaemon());
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(defaultThread.getPriority(), thread.getPriority());
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(defaultThread.getThreadGroup(), thread.getThreadGroup());
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(defaultThread.getUncaughtExceptionHandler(),
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        thread.getUncaughtExceptionHandler());
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(completed);
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    thread.start();
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    thread.join();
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(completed);
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Creating a new thread from the same ThreadFactory will have the same
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // pool ID but a thread ID of 2.
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Thread thread2 = threadFactory.newThread(monitoredRunnable);
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkThreadPoolName(thread2, 2);
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        thread.getName().substring(0, thread.getName().lastIndexOf('-')),
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        thread2.getName().substring(0, thread.getName().lastIndexOf('-')));
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Building again should give us a different pool ID.
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ThreadFactory threadFactory2 = builder.build();
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Thread thread3 = threadFactory2.newThread(monitoredRunnable);
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkThreadPoolName(thread3, 1);
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        thread2.getName().substring(0, thread.getName().lastIndexOf('-')))
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .isNotEqualTo(
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            thread3.getName().substring(0, thread.getName().lastIndexOf('-')));
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static void checkThreadPoolName(Thread thread, int threadId) {
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(thread.getName().matches("^pool-\\d+-thread-" + threadId + "$"));
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNameFormat_custom() {
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final String NAME_FORMAT = "super duper thread #%s";
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ThreadFactory factory = builder.setNameFormat(NAME_FORMAT).build();
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 0; i < 10; i++) {
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(String.format(NAME_FORMAT, i),
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          factory.newThread(monitoredRunnable).getName());
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testDaemon_false() {
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ThreadFactory factory = builder.setDaemon(false).build();
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Thread thread = factory.newThread(monitoredRunnable);
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(thread.isDaemon());
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testDaemon_true() {
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ThreadFactory factory = builder.setDaemon(true).build();
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Thread thread = factory.newThread(monitoredRunnable);
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(thread.isDaemon());
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPriority_custom() {
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = Thread.MIN_PRIORITY; i <= Thread.MAX_PRIORITY; i++) {
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ThreadFactory factory = builder.setPriority(i).build();
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Thread thread = factory.newThread(monitoredRunnable);
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(i, thread.getPriority());
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPriority_tooLow() {
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.setPriority(Thread.MIN_PRIORITY - 1);
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPriority_tooHigh() {
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder.setPriority(Thread.MAX_PRIORITY + 1);
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testUncaughtExceptionHandler_custom() {
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(UNCAUGHT_EXCEPTION_HANDLER,
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        builder.setUncaughtExceptionHandler(UNCAUGHT_EXCEPTION_HANDLER).build()
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .newThread(monitoredRunnable).getUncaughtExceptionHandler());
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuildMutateBuild() {
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ThreadFactory factory1 = builder.setPriority(1).build();
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, factory1.newThread(monitoredRunnable).getPriority());
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ThreadFactory factory2 = builder.setPriority(2).build();
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, factory1.newThread(monitoredRunnable).getPriority());
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, factory2.newThread(monitoredRunnable).getPriority());
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuildTwice() {
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.build();  // this is allowed
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.build();  // this is *also* allowed
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testBuildMutate() {
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ThreadFactory factory1 = builder.setPriority(1).build();
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, factory1.newThread(monitoredRunnable).getPriority());
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.setPriority(2);  // change the state of the builder
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, factory1.newThread(monitoredRunnable).getPriority());
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testThreadFactory() throws InterruptedException {
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final String THREAD_NAME = "ludicrous speed";
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final int THREAD_PRIORITY = 1;
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final boolean THREAD_DAEMON = false;
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ThreadFactory backingThreadFactory = new ThreadFactory() {
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public Thread newThread(Runnable r) {
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Thread thread = new Thread(r);
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        thread.setName(THREAD_NAME);
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        thread.setPriority(THREAD_PRIORITY);
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        thread.setDaemon(THREAD_DAEMON);
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        thread.setUncaughtExceptionHandler(UNCAUGHT_EXCEPTION_HANDLER);
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return thread;
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Thread thread = builder.setThreadFactory(backingThreadFactory).build()
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .newThread(monitoredRunnable);
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(THREAD_NAME, thread.getName());
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(THREAD_PRIORITY, thread.getPriority());
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(THREAD_DAEMON, thread.isDaemon());
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(UNCAUGHT_EXCEPTION_HANDLER,
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        thread.getUncaughtExceptionHandler());
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(Thread.State.NEW, thread.getState());
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(completed);
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    thread.start();
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    thread.join();
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(completed);
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNulls() throws Exception {
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    NullPointerTester npTester = new NullPointerTester();
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    npTester.testAllPublicConstructors(ThreadFactoryBuilder.class);
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    npTester.testAllPublicStaticMethods(ThreadFactoryBuilder.class);
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    npTester.testAllPublicInstanceMethods(builder);
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
207