@Test public void cancelAfterRun() throws Exception { BasicTask<Integer> t = new BasicTask<Integer>(Callables.returning(42)); em.submit(MutableMap.of("tag", "A"), t); assertEquals(t.get(), (Integer)42); t.cancel(true); assertFalse(t.isCancelled()); assertFalse(t.isError()); assertTrue(t.isDone()); }
@Test public void cancelBeforeRun() throws Exception { final CountDownLatch blockForever = new CountDownLatch(1); BasicTask<Integer> t = new BasicTask<Integer>(new Callable<Integer>() { @Override public Integer call() throws Exception { blockForever.await(); return 42; }}); t.cancel(true); assertTrue(t.isCancelled()); assertTrue(t.isDone()); assertTrue(t.isError()); em.submit(MutableMap.of("tag", "A"), t); try { t.get(); fail("get should have failed due to cancel"); } catch (CancellationException e) { // expected } assertTrue(t.isCancelled()); assertTrue(t.isDone()); assertTrue(t.isError()); log.debug("cancelBeforeRun status: {}", t.getStatusDetail(false)); assertTrue(t.getStatusDetail(false).toLowerCase().contains("cancel")); }
@Test public void errorDuringRun() throws Exception { BasicTask<Void> t = new BasicTask<Void>(new Callable<Void>() { @Override public Void call() throws Exception { throw new IllegalStateException("Simulating failure in errorDuringRun"); }}); em.submit(MutableMap.of("tag", "A"), t); try { t.get(); fail("get should have failed due to error"); } catch (Exception eo) { Throwable e = Throwables.getRootCause(eo); assertEquals("Simulating failure in errorDuringRun", e.getMessage()); } assertFalse(t.isCancelled()); assertTrue(t.isError()); assertTrue(t.isDone()); log.debug("errorDuringRun status: {}", t.getStatusDetail(false)); assertTrue(t.getStatusDetail(false).contains("Simulating failure in errorDuringRun"), "details="+t.getStatusDetail(false)); }
@Test public void testParallelTaskFailsWhenIntermediateTaskThrowsException() throws Exception { // differs from test above of SequentialTask in that expect t3 to be executed, // despite t2 failing. // TODO Do we expect tSequence.get() to block for everything to either fail or complete, // and then to throw exception? Currently it does *not* do that so test was previously failing. BasicTask<String> t1 = taskReturning("a"); BasicTask<String> t2 = new BasicTask<String>(new Callable<String>() { @Override public String call() throws Exception { throw new IllegalArgumentException("forced exception"); } }); BasicTask<String> t3 = slowTaskReturning("c", Duration.millis(100)); ParallelTask<String> task = new ParallelTask<String>(t1, t2, t3); Task<List<String>> tSequence = ec.submit(task); try { tSequence.get(); fail("t2 should have thrown an exception"); } catch (Exception e) {} assertTrue(task.isDone()); assertTrue(task.isError()); assertTrue(t1.isDone()); assertFalse(t1.isError()); assertTrue(t2.isDone()); assertTrue(t2.isError()); assertTrue(t3.isBegun()); assertTrue(t3.isDone()); assertFalse(t3.isError()); }
@Test public void testSequentialTaskFailsWhenIntermediateTaskThrowsException() throws Exception { BasicTask<String> t1 = taskReturning("a"); BasicTask<String> t2 = new BasicTask<String>(new Callable<String>() { @Override public String call() throws Exception { throw new IllegalArgumentException("forced exception"); } }); BasicTask<String> t3 = taskReturning("c"); SequentialTask<String> task = new SequentialTask<String>(t1, t2, t3); Task<List<String>> tSequence = ec.submit(task); try { tSequence.get(); fail("t2 should have thrown an exception"); } catch (Exception e) {} assertTrue(task.isDone()); assertTrue(task.isError()); assertTrue(t1.isDone()); assertFalse(t1.isError()); assertTrue(t2.isDone()); assertTrue(t2.isError()); // t3 not run because of t2 exception assertFalse(t3.isDone()); assertFalse(t3.isBegun()); }
rv += "\n\n"+getExtraStatusText(); } else if (isError()) { rv = "Failed"; if (verbosity >= 1) {