@Test public void testServerShutdown3() throws Exception { final StringBuilder error = new StringBuilder(); Thread callThread = new Thread() { public void run() { try { EchoMessage message = EchoMessage.newBuilder().setMessage(MESSAGE).build(); stub.delay(null, message); } catch (Exception e) { error.append(e.getMessage()); } synchronized (error) { error.notifyAll(); } } }; callThread.start(); final CountDownLatch latch = new CountDownLatch(1); Thread shutdownThread = new Thread() { public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { } try { server.shutdown(); server = null; latch.countDown(); } catch (Throwable e) { e.printStackTrace(); } } }; shutdownThread.start(); assertTrue(latch.await(5 * 1000, TimeUnit.MILLISECONDS)); assertTrue(latch.getCount() == 0); synchronized (error) { error.wait(5 * 1000); } if (!error.toString().isEmpty()) { fail(error.toString()); } }