@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(); }
@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(); }
@Test public void pluginCrash() { Thread.currentThread().setUncaughtExceptionHandler((t, e) -> { throw new IllegalStateException("Second"); }); Disposable.Composite set = Disposables.composite(); final WorkerTask run = new WorkerTask(() -> { throw new IllegalStateException("First"); }, set); set.add(run); try { run.run(); fail("Should have thrown!"); } catch (IllegalStateException ex) { assertThat(ex).hasMessage("Second"); } finally { Thread.currentThread().setUncaughtExceptionHandler(null); } assertThat(run.isDisposed()).as("isDisposed").isTrue(); assertThat(set.size()).isZero(); }
@Test public void crashReported() { List<Throwable> errors = Collections.synchronizedList(new ArrayList<>()); Schedulers.onHandleError((thread, error) -> errors.add(error)); try { Disposable.Composite set = Disposables.composite(); final WorkerTask run = new WorkerTask(() -> { throw new IllegalStateException("First"); }, set); set.add(run); run.run(); assertThat(run.isDisposed()).as("isDisposed").isTrue(); assertThat(set.size()).isZero(); assertThat(errors) .hasSize(1); assertThat(errors.get(0)) .isInstanceOf(IllegalStateException.class) .hasMessage("First"); } finally { Schedulers.resetOnHandleError(); } }
@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 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 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); }