@Test public void blockTillAllCompleteErrorTest() throws InterruptedException { int errorIndex = TEST_QTY / 2; List<ListenableFuture<?>> futures = makeFutures(TEST_QTY, errorIndex); FutureUtils.blockTillAllComplete(futures); Iterator<ListenableFuture<?>> it = futures.iterator(); while (it.hasNext()) { assertTrue(it.next().isDone()); } }
@Test public void blockTillAllCompleteWithTimeoutErrorTest() throws InterruptedException, TimeoutException { int errorIndex = TEST_QTY / 2; List<ListenableFuture<?>> futures = makeFutures(TEST_QTY, errorIndex); FutureUtils.blockTillAllComplete(futures, 1000 * 10); Iterator<ListenableFuture<?>> it = futures.iterator(); while (it.hasNext()) { assertTrue(it.next().isDone()); } }
@Test public void makeCompleteListFutureEmptyListTest() { List<ListenableFuture<?>> futures = Collections.emptyList(); ListenableFuture<List<ListenableFuture<?>>> f = FutureUtils.makeCompleteListFuture(futures); assertTrue(f.isDone()); }
@Test public void simplePollTest() { AtomicBoolean pollState = new AtomicBoolean(false); ListenableFuture<?> f = poller.watch(() -> pollState.get()); assertFalse(f.isDone()); assertEquals(1, scheduler.advance(POLL_INTERVAL)); assertFalse(f.isDone()); pollState.set(true); assertEquals(1, scheduler.advance(POLL_INTERVAL)); assertTrue(f.isDone()); assertEquals(0, scheduler.advance(POLL_INTERVAL)); }
@Test public void executeWhileTest() throws InterruptedException, ExecutionException { AtomicInteger ai = new AtomicInteger(); ListenableFuture<Integer> f = FutureUtils.executeWhile(() -> FutureUtils.immediateResultFuture(ai.getAndIncrement()), (i) -> i < 10); assertTrue(f.isDone()); assertEquals(10, f.get().intValue()); }
@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 makeCompleteFutureEmptyListTest() throws InterruptedException, ExecutionException { List<ListenableFuture<?>> futures = Collections.emptyList(); ListenableFuture<?> f = FutureUtils.makeCompleteFuture(futures); assertTrue(f.isDone()); assertNull(f.get()); }
@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 makeResultListFutureAlreadyDoneFuturesTest() throws InterruptedException, ExecutionException { List<ListenableFuture<? extends String>> futures = makeFutures(TEST_QTY, -1); ListenableFuture<List<String>> resultFuture = FutureUtils.makeResultListFuture(futures, false); assertTrue(resultFuture.isDone()); assertEquals(TEST_QTY, resultFuture.get().size()); }
@Test public void interceptSubmitCallableTest() { ListenableFuture<?> f = executorInterceptor.submit(new TestCallable()); assertEquals(1, testInterceptor.getInterceptedTasks().size()); assertTrue(testInterceptor.getInterceptedTasks().get(0) instanceof ListenableFutureTask); assertEquals(1, scheduler.tick()); // replaced task should run assertFalse(f.isDone()); }
@Test public void interceptSubmitScheduledRunnableWithResultTest() throws InterruptedException, ExecutionException { Object result = new Object(); ListenableFuture<Object> f = submitterSchedulerInterceptor.submitScheduled(tr, result, DELAY_TIME); assertEquals(1, testInterceptor.getInterceptedTasks().size()); assertTrue(tr == testInterceptor.getInterceptedTasks().get(0)); assertEquals(1, scheduler.advance(DELAY_TIME)); // replaced task should run assertEquals(0, tr.getRunCount()); // should have been replaced and not run assertTrue(f.isDone()); assertTrue(f.get() == result); }
@Test public void interceptSubmitRunnableWithResultTest() throws InterruptedException, ExecutionException { Object result = new Object(); ListenableFuture<?> f = executorInterceptor.submit(tr, result); assertEquals(1, testInterceptor.getInterceptedTasks().size()); assertTrue(tr == testInterceptor.getInterceptedTasks().get(0)); assertEquals(1, scheduler.tick()); // replaced task should run assertEquals(0, tr.getRunCount()); // should have been replaced and not run assertTrue(f.isDone()); assertTrue(f.get() == result); }
@Test public void interceptSubmitScheduledRunnableTest() { ListenableFuture<?> f = submitterSchedulerInterceptor.submitScheduled(tr, DELAY_TIME); assertEquals(1, testInterceptor.getInterceptedTasks().size()); assertTrue(tr == testInterceptor.getInterceptedTasks().get(0)); assertEquals(1, scheduler.advance(DELAY_TIME)); // replaced task should run assertEquals(0, tr.getRunCount()); // should have been replaced and not run assertTrue(f.isDone()); }
@Test (expected = ExecutionException.class) public void makeResultListFutureWithFailureTest() throws InterruptedException, ExecutionException { List<ListenableFuture<? extends String>> futures = makeFutures(TEST_QTY, TEST_QTY / 2); ListenableFuture<List<String>> resultFuture = FutureUtils.makeResultListFuture(futures, false); assertTrue(resultFuture.isDone()); resultFuture.get(); fail("Exception should have thrown"); }
@Test public void interceptSubmitRunnableWithPriorityTest() { ListenableFuture<?> f = priorityInterceptor.submit(tr, TaskPriority.Low); assertEquals(1, testInterceptor.getInterceptedTasks().size()); assertTrue(tr == testInterceptor.getInterceptedTasks().get(0)); assertEquals(1, scheduler.tick()); // replaced task should run assertEquals(0, tr.getRunCount()); // should have been replaced and not run assertTrue(f.isDone()); }
@Test public void interceptSubmitRunnableTest() { ListenableFuture<?> f = executorInterceptor.submit(tr); assertEquals(1, testInterceptor.getInterceptedTasks().size()); assertTrue(tr == testInterceptor.getInterceptedTasks().get(0)); assertEquals(1, scheduler.tick()); // replaced task should run assertEquals(0, tr.getRunCount()); // should have been replaced and not run assertTrue(f.isDone()); }
@Test public void scheduleWhileAlreadyDoneCanceledTest() { TestableScheduler scheduler = new TestableScheduler(); SettableListenableFuture<?> startingFuture = new SettableListenableFuture<>(); startingFuture.cancel(false); ListenableFuture<Object> f = FutureUtils.scheduleWhile(scheduler, 2, startingFuture, () -> null, (o) -> false); assertTrue(f.isDone()); assertTrue(f.isCancelled()); }
@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 public void throwMapAlreadyDoneMapperThrowExceptionTest() throws InterruptedException { TestExceptionHandler teh = new TestExceptionHandler(); ExceptionUtils.setDefaultExceptionHandler(teh); RuntimeException failure = new SuppressedStackRuntimeException(); ListenableFuture<?> lf = makeListenableFutureFactory().makeWithResult(null); ListenableFuture<Void> mappedLF = lf.throwMap((o) -> { throw failure; }); assertTrue(mappedLF.isDone()); verifyFutureFailure(mappedLF, failure); assertEquals(0, teh.getCallCount()); }
@Test public void flatMapWithExecutorAlreadyDoneMapperReturnFailedFutureTest() throws InterruptedException { TestableScheduler scheduler = new TestableScheduler(); RuntimeException failure = new SuppressedStackRuntimeException(); ListenableFuture<?> lf = makeListenableFutureFactory().makeWithResult(null); ListenableFuture<Void> mappedLF = lf.flatMap((o) -> FutureUtils.immediateFailureFuture(failure), scheduler); assertEquals(1, scheduler.tick()); assertTrue(mappedLF.isDone()); verifyFutureFailure(mappedLF, failure); }