@Override public ListenableFuture<Object> makeWithFailure(Exception e) { SettableListenableFuture<Object> slf = new SettableListenableFuture<>(); slf.handleFailure(e); return slf; }
cancelStateMessage = t.getMessage() == null ? EMPTY_CANCEL_STATE_MESSAGE : t.getMessage(); boolean interrupt = Thread.currentThread().isInterrupted(); if (! cancel(interrupt)) { internalCancel(interrupt); setFailure(t);
@Test (expected = ExecutionException.class) public void getNullExceptionTest() throws InterruptedException, ExecutionException { slf.setFailure(null); slf.get(); }
@Override public void handleFailure(Throwable t) { if (throwableType == null || throwableType.isAssignableFrom(t.getClass())) { try { slf.setRunningThread(Thread.currentThread()); slf.setResult(mapper.apply((TT)t)); } catch (Throwable newT) { slf.setFailure(newT); } } else { slf.setFailure(t); } } }, executor, optimizeExecution);
@Test public void cancelIncompleteFuturesIfAnyFailTest() throws InterruptedException, ExecutionException { List<SettableListenableFuture<?>> futures = new ArrayList<>(TEST_QTY); for (int i = 0; i < TEST_QTY; i++) { SettableListenableFuture<?> slf = new SettableListenableFuture<>(); futures.add(slf); if (i % 2 == 0) { slf.setResult(null); } } FutureUtils.cancelIncompleteFuturesIfAnyFail(false, futures, false); // fail one future futures.get(1).setFailure(null); for (int i = 0; i < TEST_QTY; i++) { SettableListenableFuture<?> slf = futures.get(i); assertTrue(slf.isDone()); if (i % 2 == 0) { slf.get(); // should not throw as was completed normally } else if (i != 1) { // skip manually failed future assertTrue(slf.isCancelled()); } } }
@Test public void cancelTest() { SettableListenableFuture<Object> slf = new SettableListenableFuture<>(); slf.cancel(false); ListenableFutureAdapterTask<Object> adapter = new ListenableFutureAdapterTask<>(slf); adapter.run(); assertTrue(adapter.isCancelled()); }
@Test public void setResultResultTest() { slf = new SettableListenableFuture<>(false); assertTrue(slf.setResult(null)); assertFalse(slf.setResult(null)); }
@Test public void setResultFailureTest() { slf = new SettableListenableFuture<>(false); assertTrue(slf.setResult(null)); assertFalse(slf.setFailure(null)); }
@Test public void setFailureFailureTest() { slf = new SettableListenableFuture<>(false); assertTrue(slf.setFailure(null)); assertFalse(slf.setFailure(null)); }
@Test public void chainCanceledFutureTest() { SettableListenableFuture<String> canceledSlf = new SettableListenableFuture<>(); assertTrue(canceledSlf.cancel(false)); canceledSlf.addCallback(slf); assertTrue(slf.isCancelled()); }
@Test public void getRunningStackTraceTest() { assertNull(slf.getRunningStackTrace()); slf.setRunningThread(Thread.currentThread()); StackTraceElement[] stack = slf.getRunningStackTrace(); assertEquals(this.getClass().getName(), stack[2].getClassName()); slf.setResult(null); assertNull(slf.getRunningStackTrace()); }
@Test public void cancelSetResultTest() { slf = new SettableListenableFuture<>(false); assertTrue(slf.cancel(false)); assertFalse(slf.setResult(null)); }
@Test public void cancelSetFailureTest() { slf = new SettableListenableFuture<>(false); assertTrue(slf.cancel(false)); assertFalse(slf.setFailure(null)); }
@Test public void executeWhileGetRunningStackTraceTest() { SettableListenableFuture<Boolean> startingFuture = new SettableListenableFuture<>(); SettableListenableFuture<Boolean> runningFuture = new SettableListenableFuture<>(); ListenableFuture<Boolean> future = FutureUtils.executeWhile(startingFuture, () -> runningFuture, (loop) -> loop); try { startingFuture.setResult(true); // loop to running future runningFuture.setRunningThread(Thread.currentThread()); StackTraceElement[] stack = future.getRunningStackTrace(); assertNotNull(stack); assertEquals(this.getClass().getName(), stack[3].getClassName()); } finally { runningFuture.setResult(false); } } }
@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()); }
@Test (expected = IllegalStateException.class) public void getAfterClearFailureResultFail() throws InterruptedException, ExecutionException { slf.setFailure(null); slf.clearResult(); slf.get(); fail("Should have thrown exception"); }
@Test (expected = IllegalStateException.class) public void getAfterClearResultFail() throws InterruptedException, ExecutionException { slf.setResult(null); slf.clearResult(); slf.get(); fail("Should have thrown exception"); }
@Test (expected = IllegalStateException.class) public void setFailureResultFail() { slf.setFailure(null); slf.setResult(null); fail("Should have thrown exception"); }
@Test public void getRunningStackTraceTest() { SettableListenableFuture<Object> slf = new SettableListenableFuture<>(); ScheduledFutureDelegate<?> testItem = new ScheduledFutureDelegate<>(slf, null); assertNull(testItem.getRunningStackTrace()); slf.setRunningThread(Thread.currentThread()); assertNotNull(testItem.getRunningStackTrace()); } }