@Test public void withFutureDisposed() { WorkerTask run = new WorkerTask(() -> {}, null); run.setFuture(new FutureTask<Void>(() -> {}, null)); run.dispose(); run.call(); }
@Test public void noParentIsDisposed() { WorkerTask run = new WorkerTask(() -> {}, null); assertThat(run.isDisposed()).as("not yet disposed").isFalse(); run.run(); assertThat(run.isDisposed()).as("isDisposed").isTrue(); }
static Disposable workerSchedule(ScheduledExecutorService exec, Disposable.Composite tasks, Runnable task, long delay, TimeUnit unit) { WorkerTask sr = new WorkerTask(task, tasks); if (!tasks.add(sr)) { throw Exceptions.failWithRejected(); } try { Future<?> f; if (delay <= 0L) { f = exec.submit((Callable<?>) sr); } else { f = exec.schedule((Callable<?>) sr, delay, unit); } sr.setFuture(f); } catch (RejectedExecutionException ex) { sr.dispose(); //RejectedExecutionException are propagated up throw ex; } return sr; }
@Test public void withoutParentDisposed() { WorkerTask run = new WorkerTask(() -> {}, null); run.dispose(); run.call(); }
@Test public void disposeAfterRun() { final WorkerTask run = new WorkerTask(() -> {}, null); run.run(); assertThat((Future<?>) WorkerTask.FUTURE.get(run)).isEqualTo(WorkerTask.FINISHED); run.dispose(); assertThat((Future<?>) WorkerTask.FUTURE.get(run)).isEqualTo(WorkerTask.FINISHED); }
@Test public void runFuture() { for (int i = 0; i < RACE_DEFAULT_LOOPS; i++) { Disposable.Composite set = Disposables.composite(); final WorkerTask run = new WorkerTask(() -> {}, set); set.add(run); final FutureTask<Void> ft = new FutureTask<>(() -> { }, null); Runnable r1 = run::call; Runnable r2 = () -> run.setFuture(ft); RaceTestUtils.race(r1, r2); } }
@Test public void disposeRun() { Disposable.Composite set = Disposables.composite(); WorkerTask run = new WorkerTask(() -> {}, set); set.add(run); assertThat(run.isDisposed()).isFalse(); run.dispose(); run.dispose(); assertThat(run.isDisposed()).isTrue(); }
@Test public void dispose() { Disposable.Composite set = Disposables.composite(); WorkerTask run = new WorkerTask(() -> {}, set); set.add(run); assertThat(run.isDisposed()).isFalse(); set.dispose(); assertThat(run.isDisposed()).isTrue(); }
@Test public void runDispose() { for (int i = 0; i < RACE_DEFAULT_LOOPS; i++) { Disposable.Composite set = Disposables.composite(); final WorkerTask run = new WorkerTask(() -> {}, set); set.add(run); Runnable r1 = run::call; Runnable r2 = run::dispose; RaceTestUtils.race(r1, r2); assertThat(set.size()).isZero(); } }
@Override public void run() { call(); }
@Test public void withParentDisposed() { WorkerTask run = new WorkerTask(() -> {}, Disposables.composite()); run.dispose(); run.call(); }
static Disposable workerSchedule(ScheduledExecutorService exec, Disposable.Composite tasks, Runnable task, long delay, TimeUnit unit) { WorkerTask sr = new WorkerTask(task, tasks); if (!tasks.add(sr)) { throw Exceptions.failWithRejected(); } try { Future<?> f; if (delay <= 0L) { f = exec.submit((Callable<?>) sr); } else { f = exec.schedule((Callable<?>) sr, delay, unit); } sr.setFuture(f); } catch (RejectedExecutionException ex) { sr.dispose(); //RejectedExecutionException are propagated up throw ex; } return sr; }
@Test public void asyncDisposeIdempotent() { final WorkerTask run = new WorkerTask(() -> {}, null); run.dispose(); assertThat((Future<?>) WorkerTask.FUTURE.get(run)) .isEqualTo(WorkerTask.ASYNC_CANCELLED); run.dispose(); assertThat((Future<?>) WorkerTask.FUTURE.get(run)) .isEqualTo(WorkerTask.ASYNC_CANCELLED); run.run(); assertThat((Future<?>) WorkerTask.FUTURE.get(run)) .isEqualTo(WorkerTask.ASYNC_CANCELLED); }
@Test public void setFutureCancelRace() { for (int i = 0; i < RACE_DEFAULT_LOOPS; i++) { Disposable.Composite set = Disposables.composite(); final WorkerTask run = new WorkerTask(() -> {}, set); set.add(run); final FutureTask<Object> ft = new FutureTask<>(() -> { }, 0); Runnable r1 = () -> run.setFuture(ft); Runnable r2 = run::dispose; RaceTestUtils.race(r1, r2); assertThat(set.size()).isZero(); } }
@Test public void disposeRace() { for (int i = 0; i < RACE_DEFAULT_LOOPS; i++) { Disposable.Composite set = Disposables.composite(); final WorkerTask run = new WorkerTask(() -> {}, set); set.add(run); Runnable r1 = run::dispose; RaceTestUtils.race(r1, r1); assertThat(set.size()).isZero(); } }
@Override public void run() { call(); }
@Test public void withFutureDisposed2() { WorkerTask run = new WorkerTask(() -> {}, null); run.dispose(); run.setFuture(new FutureTask<Void>(() -> {}, null)); run.call(); }
@Test public void syncDisposeIdempotent() { final WorkerTask run = new WorkerTask(() -> {}, null); WorkerTask.THREAD.set(run, Thread.currentThread()); run.dispose(); assertThat((Future<?>) WorkerTask.FUTURE.get(run)).isEqualTo(WorkerTask.SYNC_CANCELLED); run.dispose(); assertThat((Future<?>) WorkerTask.FUTURE.get(run)).isEqualTo(WorkerTask.SYNC_CANCELLED); run.run(); assertThat((Future<?>) WorkerTask.FUTURE.get(run)).isEqualTo(WorkerTask.SYNC_CANCELLED); }
@Test public void setFutureRunRace() { for (int i = 0; i < RACE_DEFAULT_LOOPS; i++) { Disposable.Composite set = Disposables.composite(); final WorkerTask run = new WorkerTask(() -> {}, set); set.add(run); final FutureTask<Object> ft = new FutureTask<>(() -> { }, 0); Runnable r1 = () -> run.setFuture(ft); Runnable r2 = run::run; RaceTestUtils.race(r1, r2); assertThat(set.size()).isZero(); } }
@Test public void withParentIsDisposed() { Disposable.Composite set = Disposables.composite(); WorkerTask run = new WorkerTask(() -> {}, set); set.add(run); assertThat(run.isDisposed()).as("not yet disposed").isFalse(); run.run(); assertThat(run.isDisposed()).as("isDisposed").isTrue(); assertThat(set.remove(run)).isFalse(); }