package org.limewire.concurrent; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import javax.swing.SwingUtilities; import junit.framework.Test; public class ListeningFutureSimpleTimerTest extends ListeningFutureTaskTest { private ScheduledListeningExecutorService sq; public ListeningFutureSimpleTimerTest(String name) { super(name); } public static Test suite() { return buildTestSuite(ListeningFutureSimpleTimerTest.class); } @Override protected void setUp() throws Exception { super.setUp(); sq = new SimpleTimer(true); q = sq; } public void testIsSimpleTimer() { assertInstanceof(SimpleTimer.class, q); } public void testScheduledListensBeforeCompletes() throws Exception { RunWaiter waiter = new RunWaiter(); sq.execute(waiter); Object result = new Object(); Caller runner = new Caller(result); ListeningFuture<Object> task = sq.schedule((Callable<Object>)runner, 500, TimeUnit.MILLISECONDS); Listener listener = new Listener(); task.addFutureListener(listener); waiter.latch.countDown(); assertTrue(listener.latch.await(1, TimeUnit.SECONDS)); assertNotNull(listener.event); assertSame(result, listener.event.getResult()); assertEquals(FutureEvent.Type.SUCCESS, listener.event.getType()); assertNull(listener.event.getException()); assertEquals(runner.thread, listener.thread); } public void testScheduledListensBeforeCompletesWithException() throws Exception { RunWaiter waiter = new RunWaiter(); sq.execute(waiter); Object result = new Object(); Caller runner = new Caller(result, true); ListeningFuture<Object> task = sq.schedule((Callable<Object>)runner, 500, TimeUnit.MILLISECONDS); Listener listener = new Listener(); task.addFutureListener(listener); waiter.latch.countDown(); assertTrue(listener.latch.await(1, TimeUnit.SECONDS)); assertNotNull(listener.event); assertNull(listener.event.getResult()); assertEquals(FutureEvent.Type.EXCEPTION, listener.event.getType()); ExecutionException ee = listener.event.getException(); assertNotNull(ee); assertInstanceof(RuntimeException.class, ee.getCause()); assertEquals("Boo!", ee.getCause().getMessage()); assertEquals(runner.thread, listener.thread); assertEquals(1, serviceStub.getExceptionCount()); assertEquals("Boo!", serviceStub.getException(0).getMessage()); serviceStub.clear(); } public void testScheduledListensBeforeCompletesCancelsWithoutRun() throws Exception { RunWaiter waiter = new RunWaiter(); sq.execute(waiter); Object result = new Object(); Caller runner = new Caller(result); ListeningFuture<Object> task = sq.schedule((Callable<Object>)runner, 500, TimeUnit.MILLISECONDS); Listener listener = new Listener(); task.addFutureListener(listener); task.cancel(false); assertTrue(listener.latch.await(1, TimeUnit.SECONDS)); assertNotNull(listener.event); assertNull(listener.event.getResult()); assertEquals(FutureEvent.Type.CANCELLED, listener.event.getType()); assertNull(listener.event.getException()); waiter.latch.countDown(); assertEquals(Thread.currentThread(), listener.thread); // from cancel thread. } public void testScheduledListensBeforeCompletesCancelsDuringRun() throws Exception { Object result = new Object(); CallWaiter runner = new CallWaiter(result); ListeningFuture<Object> task = sq.schedule((Callable<Object>)runner, 500, TimeUnit.MILLISECONDS); Listener listener = new Listener(); task.addFutureListener(listener); runner.enter.await(1, TimeUnit.SECONDS); task.cancel(true); assertTrue(listener.latch.await(1, TimeUnit.SECONDS)); assertNotNull(listener.event); assertNull(listener.event.getResult()); assertEquals(FutureEvent.Type.CANCELLED, listener.event.getType()); assertNull(listener.event.getException()); runner.latch.countDown(); Thread.sleep(100); assertTrue(runner.interrupted); assertEquals(Thread.currentThread(), listener.thread); // from cancel thread. assertEquals(1, serviceStub.getExceptionCount()); assertInstanceof(InterruptedException.class, serviceStub.getException(0).getCause()); serviceStub.clear(); } public void testScheduledListensBeforeCompletesCancelsDuringRunWithoutAllowedCausesCancelToo() throws Exception { Object result = new Object(); CallWaiter runner = new CallWaiter(result); ListeningFuture<Object> task = sq.schedule((Callable<Object>)runner, 500, TimeUnit.MILLISECONDS); Listener listener = new Listener(); task.addFutureListener(listener); runner.enter.await(1, TimeUnit.SECONDS); task.cancel(false); assertTrue(listener.latch.await(1, TimeUnit.SECONDS)); assertNotNull(listener.event); assertNull(listener.event.getResult()); assertEquals(FutureEvent.Type.CANCELLED, listener.event.getType()); assertNull(listener.event.getException()); runner.latch.countDown(); Thread.sleep(100); assertFalse(runner.interrupted); assertEquals(Thread.currentThread(), listener.thread); // from cancel thread. } public void testScheduledListensAfterCompletes() throws Exception { Object result = new Object(); Caller runner = new Caller(result); ListeningFuture<Object> task = sq.schedule((Callable<Object>)runner, 500, TimeUnit.MILLISECONDS); waitForFuture(task); Listener listener = new Listener(); task.addFutureListener(listener); assertNotNull(listener.event); assertSame(result, listener.event.getResult()); assertEquals(FutureEvent.Type.SUCCESS, listener.event.getType()); assertNull(listener.event.getException()); assertEquals(Thread.currentThread(), listener.thread); } public void testScheduledListensAfterCompletesWithException() throws Exception { Object result = new Object(); Caller runner = new Caller(result, true); ListeningFuture<Object> task = sq.schedule((Callable<Object>)runner, 500, TimeUnit.MILLISECONDS); waitForFuture(task); Listener listener = new Listener(); task.addFutureListener(listener); assertNotNull(listener.event); assertNull(listener.event.getResult()); assertEquals(FutureEvent.Type.EXCEPTION, listener.event.getType()); ExecutionException ee = listener.event.getException(); assertNotNull(ee); assertInstanceof(RuntimeException.class, ee.getCause()); assertEquals("Boo!", ee.getCause().getMessage()); assertEquals(Thread.currentThread(), listener.thread); assertEquals(1, serviceStub.getExceptionCount()); assertEquals("Boo!", serviceStub.getException(0).getMessage()); serviceStub.clear(); } public void testScheduledListenAfterCompletesCancelsWithoutRun() throws Exception { RunWaiter waiter = new RunWaiter(); sq.execute(waiter); Object result = new Object(); Caller runner = new Caller(result); ListeningFuture<Object> task = sq.schedule((Callable<Object>)runner, 500, TimeUnit.MILLISECONDS); task.cancel(false); waitForFuture(task); Listener listener = new Listener(); task.addFutureListener(listener); assertNotNull(listener.event); assertNull(listener.event.getResult()); assertEquals(FutureEvent.Type.CANCELLED, listener.event.getType()); assertNull(listener.event.getException()); waiter.latch.countDown(); assertEquals(Thread.currentThread(), listener.thread); } public void testScheduledListensAfterCompletesCancelsDuringRun() throws Exception { Object result = new Object(); CallWaiter runner = new CallWaiter(result); ListeningFuture<Object> task = sq.schedule((Callable<Object>)runner, 500, TimeUnit.MILLISECONDS); runner.enter.await(1, TimeUnit.SECONDS); task.cancel(true); waitForFuture(task); Listener listener = new Listener(); task.addFutureListener(listener); assertNotNull(listener.event); assertNull(listener.event.getResult()); assertEquals(FutureEvent.Type.CANCELLED, listener.event.getType()); assertNull(listener.event.getException()); Thread.sleep(100); assertTrue(runner.interrupted); assertEquals(Thread.currentThread(), listener.thread); assertEquals(1, serviceStub.getExceptionCount()); assertInstanceof(InterruptedException.class, serviceStub.getException(0).getCause()); serviceStub.clear(); } public void testScheduledListensAfterCompletesCancelsDuringRunWithoutAllowedCausesCancelToo() throws Exception { Object result = new Object(); CallWaiter runner = new CallWaiter(result); ListeningFuture<Object> task = sq.schedule((Callable<Object>)runner, 500, TimeUnit.MILLISECONDS); runner.enter.await(1, TimeUnit.SECONDS); task.cancel(false); waitForFuture(task); Listener listener = new Listener(); task.addFutureListener(listener); assertNotNull(listener.event); assertNull(listener.event.getResult()); assertEquals(FutureEvent.Type.CANCELLED, listener.event.getType()); assertNull(listener.event.getException()); Thread.sleep(100); assertFalse(runner.interrupted); assertEquals(Thread.currentThread(), listener.thread); } public void testScheduledAnnotatedListensBeforeCompletes() throws Exception { spinUpSwing(); RunWaiter waiter = new RunWaiter(); sq.execute(waiter); Object result = new Object(); Caller runner = new Caller(result); ListeningFuture<Object> task = sq.schedule((Callable<Object>)runner, 500, TimeUnit.MILLISECONDS); AnnotatedListener listener = new AnnotatedListener(); task.addFutureListener(listener); waiter.latch.countDown(); assertTrue(listener.latch.await(1, TimeUnit.SECONDS)); assertNotNull(listener.event); assertSame(result, listener.event.getResult()); assertEquals(FutureEvent.Type.SUCCESS, listener.event.getType()); assertNull(listener.event.getException()); assertEquals(dispatchThread(), listener.thread); } public void testScheduledAnnotatedListensBeforeCompletesWithException() throws Exception { spinUpSwing(); RunWaiter waiter = new RunWaiter(); sq.execute(waiter); Object result = new Object(); Caller runner = new Caller(result, true); ListeningFuture<Object> task = sq.schedule((Callable<Object>)runner, 100, TimeUnit.MILLISECONDS); AnnotatedListener listener = new AnnotatedListener(); task.addFutureListener(listener); waiter.latch.countDown(); assertTrue(listener.latch.await(1, TimeUnit.SECONDS)); assertNotNull(listener.event); assertNull(listener.event.getResult()); assertEquals(FutureEvent.Type.EXCEPTION, listener.event.getType()); ExecutionException ee = listener.event.getException(); assertNotNull(ee); assertInstanceof(RuntimeException.class, ee.getCause()); assertEquals("Boo!", ee.getCause().getMessage()); assertEquals(dispatchThread(), listener.thread); assertEquals(1, serviceStub.getExceptionCount()); assertEquals("Boo!", serviceStub.getException(0).getMessage()); serviceStub.clear(); } public void testScheduledAnnotatedListensBeforeCompletesCancelsWithoutRun() throws Exception { spinUpSwing(); RunWaiter waiter = new RunWaiter(); sq.execute(waiter); Object result = new Object(); Caller runner = new Caller(result); ListeningFuture<Object> task = sq.schedule((Callable<Object>)runner, 500, TimeUnit.MILLISECONDS); AnnotatedListener listener = new AnnotatedListener(); task.addFutureListener(listener); task.cancel(false); assertTrue(listener.latch.await(1, TimeUnit.SECONDS)); assertNotNull(listener.event); assertNull(listener.event.getResult()); assertEquals(FutureEvent.Type.CANCELLED, listener.event.getType()); assertNull(listener.event.getException()); waiter.latch.countDown(); assertEquals(dispatchThread(), listener.thread); // from cancel thread. } public void testScheduledAnnotatedListensBeforeCompletesCancelsDuringRun() throws Exception { spinUpSwing(); Object result = new Object(); CallWaiter runner = new CallWaiter(result); ListeningFuture<Object> task = sq.schedule((Callable<Object>)runner, 500, TimeUnit.MILLISECONDS); AnnotatedListener listener = new AnnotatedListener(); task.addFutureListener(listener); runner.enter.await(1, TimeUnit.SECONDS); task.cancel(true); assertTrue(listener.latch.await(1, TimeUnit.SECONDS)); assertNotNull(listener.event); assertNull(listener.event.getResult()); assertEquals(FutureEvent.Type.CANCELLED, listener.event.getType()); assertNull(listener.event.getException()); runner.latch.countDown(); Thread.sleep(100); assertTrue(runner.interrupted); assertEquals(dispatchThread(), listener.thread); // from cancel thread. assertEquals(1, serviceStub.getExceptionCount()); assertInstanceof(InterruptedException.class, serviceStub.getException(0).getCause()); serviceStub.clear(); } public void testScheduledAnnotatedListensBeforeCompletesCancelsDuringRunWithoutAllowedCausesCancelToo() throws Exception { spinUpSwing(); Object result = new Object(); CallWaiter runner = new CallWaiter(result); ListeningFuture<Object> task = sq.schedule((Callable<Object>)runner, 500, TimeUnit.MILLISECONDS); AnnotatedListener listener = new AnnotatedListener(); task.addFutureListener(listener); runner.enter.await(1, TimeUnit.SECONDS); task.cancel(false); assertTrue(listener.latch.await(1, TimeUnit.SECONDS)); assertNotNull(listener.event); assertNull(listener.event.getResult()); assertEquals(FutureEvent.Type.CANCELLED, listener.event.getType()); assertNull(listener.event.getException()); runner.latch.countDown(); Thread.sleep(100); assertFalse(runner.interrupted); assertEquals(dispatchThread(), listener.thread); // from cancel thread. } public void testScheduledAnnotatedListensAfterCompletes() throws Exception { spinUpSwing(); Object result = new Object(); Caller runner = new Caller(result); ListeningFuture<Object> task = sq.schedule((Callable<Object>)runner, 500, TimeUnit.MILLISECONDS); waitForFuture(task); AnnotatedListener listener = new AnnotatedListener(); task.addFutureListener(listener); assertTrue(listener.latch.await(1, TimeUnit.SECONDS)); assertNotNull(listener.event); assertSame(result, listener.event.getResult()); assertEquals(FutureEvent.Type.SUCCESS, listener.event.getType()); assertNull(listener.event.getException()); assertEquals(dispatchThread(), listener.thread); } public void testScheduledAnnotatedListensAfterCompletesWithException() throws Exception { spinUpSwing(); Object result = new Object(); Caller runner = new Caller(result, true); ListeningFuture<Object> task = sq.schedule((Callable<Object>)runner, 500, TimeUnit.MILLISECONDS); waitForFuture(task); AnnotatedListener listener = new AnnotatedListener(); task.addFutureListener(listener); assertTrue(listener.latch.await(1, TimeUnit.SECONDS)); assertNotNull(listener.event); assertNull(listener.event.getResult()); assertEquals(FutureEvent.Type.EXCEPTION, listener.event.getType()); ExecutionException ee = listener.event.getException(); assertNotNull(ee); assertInstanceof(RuntimeException.class, ee.getCause()); assertEquals("Boo!", ee.getCause().getMessage()); assertEquals(dispatchThread(), listener.thread); assertEquals(1, serviceStub.getExceptionCount()); assertEquals("Boo!", serviceStub.getException(0).getMessage()); serviceStub.clear(); } public void testScheduledAnnotatedListenAfterCompletesCancelsWithoutRun() throws Exception { spinUpSwing(); RunWaiter waiter = new RunWaiter(); sq.execute(waiter); Object result = new Object(); Caller runner = new Caller(result); ListeningFuture<Object> task = sq.schedule((Callable<Object>)runner, 500, TimeUnit.MILLISECONDS); task.cancel(false); waitForFuture(task); AnnotatedListener listener = new AnnotatedListener(); task.addFutureListener(listener); assertTrue(listener.latch.await(1, TimeUnit.SECONDS)); assertNotNull(listener.event); assertNull(listener.event.getResult()); assertEquals(FutureEvent.Type.CANCELLED, listener.event.getType()); assertNull(listener.event.getException()); waiter.latch.countDown(); assertEquals(dispatchThread(), listener.thread); } public void testScheduledAnnotatedListensAfterCompletesCancelsDuringRun() throws Exception { spinUpSwing(); Object result = new Object(); CallWaiter runner = new CallWaiter(result); ListeningFuture<Object> task = sq.schedule((Callable<Object>)runner, 500, TimeUnit.MILLISECONDS); runner.enter.await(1, TimeUnit.SECONDS); task.cancel(true); waitForFuture(task); AnnotatedListener listener = new AnnotatedListener(); task.addFutureListener(listener); assertTrue(listener.latch.await(1, TimeUnit.SECONDS)); assertNotNull(listener.event); assertNull(listener.event.getResult()); assertEquals(FutureEvent.Type.CANCELLED, listener.event.getType()); assertNull(listener.event.getException()); Thread.sleep(100); assertTrue(runner.interrupted); assertEquals(dispatchThread(), listener.thread); assertEquals(1, serviceStub.getExceptionCount()); assertInstanceof(InterruptedException.class, serviceStub.getException(0).getCause()); serviceStub.clear(); } public void testScheduledAnnotatedListensAfterCompletesCancelsDuringRunWithoutAllowedCausesCancelToo() throws Exception { spinUpSwing(); Object result = new Object(); CallWaiter runner = new CallWaiter(result); ListeningFuture<Object> task = sq.schedule((Callable<Object>)runner, 500, TimeUnit.MILLISECONDS); runner.enter.await(1, TimeUnit.SECONDS); task.cancel(false); waitForFuture(task); AnnotatedListener listener = new AnnotatedListener(); task.addFutureListener(listener); assertTrue(listener.latch.await(1, TimeUnit.SECONDS)); assertNotNull(listener.event); assertNull(listener.event.getResult()); assertEquals(FutureEvent.Type.CANCELLED, listener.event.getType()); assertNull(listener.event.getException()); Thread.sleep(100); assertFalse(runner.interrupted); assertEquals(dispatchThread(), listener.thread); } private class CallWaiter extends RunWaiter implements Callable<Object> { private final Object result; public CallWaiter(Object result) { this.result = result; } @Override public Object call() throws Exception { run(); return result; } } private class Caller extends Runner implements Callable<Object> { private final Object result; public Caller(Object result) { this(result, false); } public Caller(Object result, boolean throwException) { super(throwException); this.result = result; } @Override public Object call() throws Exception { run(); return result; } } private void spinUpSwing() throws Exception { SwingUtilities.invokeAndWait(new Runnable() { public void run() {} }); } }