@Test
public void testInterruption() throws Exception
{

    Timing2 timing = new Timing2();
    LeaderSelector selector = null;
    CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1));
    try
    {
        client.start();
        CountDownLatch exitLatch = new CountDownLatch(1);
        BlockingQueue<Thread> threadExchange = new ArrayBlockingQueue<>(1);
        LeaderSelectorListener listener = new LeaderSelectorListenerAdapter()
        {
            @Override
            public void takeLeadership(CuratorFramework client) throws Exception
            {
                threadExchange.put(Thread.currentThread());
                try
                {
                    Thread.currentThread().join();
                }
                finally
                {
                    exitLatch.countDown();
                }
            }
        };
        selector = new LeaderSelector(client, PATH_NAME, listener);
        selector.failedMutexReleaseCount = new AtomicInteger();
        selector.start();
        Thread leaderThread = timing.takeFromQueue(threadExchange);
        leaderThread.interrupt();
        Assert.assertTrue(timing.awaitLatch(exitLatch));
        timing.sleepABit(); // wait for leader selector to clear nodes
        Assert.assertEquals(0, selector.failedMutexReleaseCount.get());
    }
    finally
    {
        CloseableUtils.closeQuietly(selector);
        CloseableUtils.closeQuietly(client);
    }
}