@Override public void addCallback(FutureCallback<? super T> callback, Executor executor, ListenerOptimizationStrategy optimizeExecution) { futureImp.addCallback(callback, executor, optimizeExecution); }
@Override public void addListener(Runnable listener, Executor executor, ListenerOptimizationStrategy optimizeExecution) { futureImp.addListener(listener, executor, optimizeExecution); }
protected boolean cancelRegardlessOfDelegateFutureState(boolean interruptThread) { ListenableFuture<?> cancelDelegateFuture = this.delegateFuture; if (super.cancel(interruptThread)) { cancelDelegateFuture.cancel(interruptThread); return true; } else { return false; } }
@Override public boolean cancel(boolean interrupt) { StackTraceElement[] cancelStack = delegateFuture.getRunningStackTrace(); // must get stack BEFORE cancel if (delegateFuture.cancel(interrupt)) { this.cancelStack = cancelStack; return true; } else { return false; } }
public static void resultTest(ListenableFuture<?> testFuture, Object expectedResult) throws InterruptedException, ExecutionException, TimeoutException { assertTrue(testFuture.isDone()); assertTrue(testFuture.get() == expectedResult); assertTrue(testFuture.get(1, TimeUnit.MILLISECONDS) == expectedResult); }
@Test public void watchAlreadyCanceledFutureTest() { Future<Object> canceledFuture = new FutureTask<>(() -> { return null; }); assertTrue(canceledFuture.cancel(true)); ListenableFuture<Object> lfResult = poller.watch(canceledFuture); assertTrue(lfResult.isDone()); assertTrue(lfResult.isCancelled()); }
@Test public void flatMapAlreadyCanceledTest() { ListenableFuture<?> lf = makeListenableFutureFactory().makeCanceled(); AtomicBoolean mapperRan = new AtomicBoolean(false); ListenableFuture<Void> mappedLF = lf.flatMap((o) -> { mapperRan.set(true); return FutureUtils.immediateResultFuture(null); }); assertTrue(mappedLF.isDone()); assertTrue(mappedLF.isCancelled()); }
@Test public void flatMapFailureIntoResultTest() throws InterruptedException, ExecutionException { ListenableFuture<?> lf = makeListenableFutureFactory().makeWithFailure(new Exception()); AtomicBoolean mapped = new AtomicBoolean(false); ListenableFuture<?> finalLF = lf.flatMapFailure(Exception.class, (t) -> { mapped.set(true); return FutureUtils.immediateResultFuture(null); }); assertTrue(finalLF.isDone()); assertTrue(mapped.get()); assertTrue(finalLF != lf); assertNull(finalLF.get()); }
@Test public void flatMapAlreadyDoneTest() throws InterruptedException, ExecutionException { String sourceObject = StringUtils.makeRandomString(5); ListenableFuture<String> lf = makeListenableFutureFactory().makeWithResult(sourceObject); String translatedObject = StringUtils.makeRandomString(10); ListenableFuture<String> mappedLF = lf.flatMap((s) -> { if (s == sourceObject) { return FutureUtils.immediateResultFuture(translatedObject); } else { // test failure return FutureUtils.immediateResultFuture(null); } }); assertTrue(mappedLF.isDone()); assertTrue(translatedObject == mappedLF.get()); }
@Test public void flatMapAlreadyDoneExecutionExceptionTest() throws InterruptedException { Exception failure = new Exception(); ListenableFuture<?> lf = makeListenableFutureFactory().makeWithFailure(failure); AtomicBoolean mapperRan = new AtomicBoolean(false); ListenableFuture<Void> mappedLF = lf.flatMap((o) -> { mapperRan.set(true); return FutureUtils.immediateResultFuture(null); }); assertTrue(mappedLF.isDone()); verifyFutureFailure(mappedLF, failure); }
@Test public void throwMapAlreadyCanceledTest() { ListenableFuture<?> lf = makeListenableFutureFactory().makeCanceled(); AtomicBoolean mapperRan = new AtomicBoolean(false); ListenableFuture<Void> mappedLF = lf.throwMap((o) -> { mapperRan.set(true); return null; }); assertTrue(mappedLF.isDone()); assertTrue(mappedLF.isCancelled()); }
@Test public void mapAlreadyCanceledTest() { ListenableFuture<?> lf = makeListenableFutureFactory().makeCanceled(); AtomicBoolean mapperRan = new AtomicBoolean(false); ListenableFuture<Void> mappedLF = lf.map((o) -> { mapperRan.set(true); return null; }); assertTrue(mappedLF.isDone()); assertTrue(mappedLF.isCancelled()); }
@Test public void mapFailureIntoResultNullClassTest() throws InterruptedException, ExecutionException { ListenableFuture<?> lf = makeListenableFutureFactory().makeWithFailure(new Exception()); AtomicBoolean mapped = new AtomicBoolean(false); ListenableFuture<?> finalLF = lf.mapFailure(null, (t) -> { mapped.set(true); return null; }); assertTrue(finalLF.isDone()); assertTrue(mapped.get()); assertTrue(finalLF != lf); assertNull(finalLF.get()); }
@Override public StackTraceElement[] getRunningStackTrace() { return futureImp.getRunningStackTrace(); } }
@Test public void cancelFlatMappedAsyncFutureTest() { SettableListenableFuture<Void> asyncSLF = new SettableListenableFuture<>(); ListenableFuture<Void> mappedLF = slf.flatMap(asyncSLF); slf.setResult(null); // complete source future before cancel assertFalse(mappedLF.isDone()); assertTrue(mappedLF.cancel(false)); // no interrupt needed, delegate future not started assertTrue(asyncSLF.isCancelled()); }
public static void cancelTest(ListenableFuture<?> testFuture) { assertFalse(testFuture.cancel(true)); assertFalse(testFuture.isCancelled()); }
@Test public void flatMapFailureWithExecutorIgnoredFailureTypeTest() { TestableScheduler scheduler = new TestableScheduler(); ListenableFuture<?> lf = makeListenableFutureFactory().makeWithFailure(new Exception()); AtomicBoolean mapped = new AtomicBoolean(false); ListenableFuture<?> finalLF = lf.flatMapFailure(RuntimeException.class, (t) -> { mapped.set(true); return FutureUtils.immediateResultFuture(null); }, scheduler); assertTrue(finalLF != lf); assertFalse(finalLF.isDone()); assertEquals(1, scheduler.tick()); assertTrue(finalLF.isDone()); assertFalse(mapped.get()); assertTrue(finalLF.isDone()); }
@Test public void getFlatMappedRunningStackTraceTest() { ListenableFuture<Object> mappedFuture = slf.flatMap((o) -> FutureUtils.immediateResultFuture(o)) .flatMap((o) -> FutureUtils.immediateResultFuture(null)); assertNull(mappedFuture.getRunningStackTrace()); slf.setRunningThread(Thread.currentThread()); StackTraceElement[] stack = mappedFuture.getRunningStackTrace(); assertEquals(this.getClass().getName(), stack[4].getClassName()); slf.setResult(null); assertNull(mappedFuture.getRunningStackTrace()); }
@Test public void getMappedRunningStackTraceTest() { ListenableFuture<Object> mappedFuture = slf.map((o) -> o).map((o) -> null); assertNull(mappedFuture.getRunningStackTrace()); slf.setRunningThread(Thread.currentThread()); StackTraceElement[] stack = mappedFuture.getRunningStackTrace(); assertEquals(this.getClass().getName(), stack[4].getClassName()); slf.setResult(null); assertNull(mappedFuture.getRunningStackTrace()); }
@Override public boolean isCancelled() { return futureImp.isCancelled(); }