@Test public void testShutdownWithNoTasks() throws InterruptedException { _engine.shutdown(); assertTrue(_engine.isShutdown()); assertTrue(_engine.awaitTermination(50, TimeUnit.MILLISECONDS)); assertTrue(_engine.isTerminated()); assertTrue(_engine.isShutdown()); }
@Test public void testShutdownWithRunningTask() throws InterruptedException { final CountDownLatch finishLatch = new CountDownLatch(1); final String taskValue = "task executed"; final Task<String> task = new BaseTask<String>() { @Override protected Promise<? extends String> run(final Context context) throws Exception { finishLatch.await(); return Promises.value(taskValue); } }; _engine.run(task); _engine.shutdown(); // shutdown should not complete until after our task is done assertFalse(_engine.awaitTermination(50, TimeUnit.MILLISECONDS)); assertTrue(_engine.isShutdown()); assertFalse(_engine.isTerminated()); finishLatch.countDown(); assertTrue(_engine.awaitTermination(50, TimeUnit.MILLISECONDS)); assertTrue(_engine.isShutdown()); assertTrue(_engine.isTerminated()); // Task should finish shortly assertTrue(task.await(50, TimeUnit.MILLISECONDS)); assertEquals(taskValue, task.get()); }
@Test public void testShutdownWithSideEffectTask() throws InterruptedException { final CountDownLatch finishLatch = new CountDownLatch(1); final String mainValue = "main task executed"; final String sideEffectValue = "side-effect task executed"; Task<String> sideEffect = Task.async(context -> { finishLatch.await(); return Promises.value(sideEffectValue); }); Task<String> task = Task.value(mainValue).withSideEffect(v -> sideEffect); _engine.run(task); _engine.shutdown(); assertFalse(_engine.awaitTermination(50, TimeUnit.MILLISECONDS)); assertTrue(_engine.isShutdown()); assertFalse(_engine.isTerminated()); finishLatch.countDown(); assertTrue(_engine.awaitTermination(50, TimeUnit.MILLISECONDS)); assertTrue(_engine.isShutdown()); assertTrue(_engine.isTerminated()); assertEquals(mainValue, task.get()); assertEquals(sideEffectValue, sideEffect.get()); }
@Test public void testShutdownWithRunningAndSuccessorTask() throws InterruptedException { final CountDownLatch finishLatch = new CountDownLatch(1); final String predValue = "task executed"; final String sucValue = "task executed"; final Task<String> predTask = new BaseTask<String>() { @Override protected Promise<? extends String> run(final Context context) throws Exception { finishLatch.await(); return Promises.value(predValue); } }; final Task<String> sucTask = Task.value(sucValue); final Task<String> seq = predTask.andThen(sucTask); _engine.run(seq); _engine.shutdown(); // shutdown should not complete until after our task is done assertFalse(_engine.awaitTermination(50, TimeUnit.MILLISECONDS)); assertTrue(_engine.isShutdown()); assertFalse(_engine.isTerminated()); finishLatch.countDown(); assertTrue(_engine.awaitTermination(50, TimeUnit.MILLISECONDS)); assertTrue(_engine.isShutdown()); assertTrue(_engine.isTerminated()); // Tasks should finish shortly assertTrue(predTask.await(50, TimeUnit.MILLISECONDS)); assertEquals(predValue, predTask.get()); assertTrue(sucTask.await(50, TimeUnit.MILLISECONDS)); assertEquals(sucValue, sucTask.get()); }
@Test public void testShutdownWithSideEffectTask2() throws InterruptedException { final SettablePromise<String> sideEffectPromise = Promises.settable(); final String mainValue = "main task executed"; final String sideEffectValue = "side-effect task executed"; Task<String> sideEffect = Task.async(context -> sideEffectPromise); Task<String> task = Task.value(mainValue).withSideEffect(v -> sideEffect); _engine.run(task); _engine.shutdown(); assertFalse(_engine.awaitTermination(50, TimeUnit.MILLISECONDS)); assertTrue(_engine.isShutdown()); assertFalse(_engine.isTerminated()); sideEffectPromise.done(sideEffectValue); assertTrue(_engine.awaitTermination(50, TimeUnit.MILLISECONDS)); assertTrue(_engine.isShutdown()); assertTrue(_engine.isTerminated()); assertEquals(mainValue, task.get()); assertEquals(sideEffectValue, sideEffect.get()); }