@AfterMethod public void tearDown() throws Exception { _engine.shutdown(); _engine.awaitTermination(50, TimeUnit.MILLISECONDS); _engine = null; _scheduler.shutdownNow(); _scheduler = null; }
@AfterMethod public void tearDown() throws Exception { _engine.shutdown(); _engine.awaitTermination(50, TimeUnit.MILLISECONDS); _engine = null; _scheduler.shutdownNow(); _scheduler = null; }
@AfterMethod public void tearDown() throws Exception { _engine.shutdown(); _engine.awaitTermination(50, TimeUnit.MILLISECONDS); _engine = null; _scheduler.shutdownNow(); _scheduler = null; }
@Test public void testShutdownWithNoTasks() throws InterruptedException { _engine.shutdown(); assertTrue(_engine.isShutdown()); assertTrue(_engine.awaitTermination(50, TimeUnit.MILLISECONDS)); assertTrue(_engine.isTerminated()); assertTrue(_engine.isShutdown()); }
@SuppressWarnings("deprecation") @Test public void testTaskWithoutExecutor() throws InterruptedException { final int numCores = Runtime.getRuntime().availableProcessors(); final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(numCores + 1); final Engine engine = new EngineBuilder().setTaskExecutor(scheduler).setTimerScheduler(scheduler).build(); try { final Task<Integer> task = new AsyncCallableTask<Integer>(new Callable<Integer>() { @Override public Integer call() throws Exception { return 1; } }); engine.run(task); assertTrue(task.await(5, TimeUnit.SECONDS)); assertTrue(task.isFailed()); assertTrue(task.getError() instanceof IllegalStateException); } finally { engine.shutdown(); engine.awaitTermination(1, TimeUnit.SECONDS); scheduler.shutdownNow(); } } }
@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()); }