@Override public void cancel() { synchronized (this) { canceled = true; if (future != null) { future.cancel(true); future = null; } task = null; } }
@SuppressWarnings("unchecked") private static void ensureErrorWillBeThrown(final ObservableFuture<?> future) { future.subscribe(ERROR_THROWER); }
@Override public boolean isUnsubscribed() { return future.isDone() || future.isCancelled(); } };
@SuppressWarnings("unchecked") private static void ensureErrorWillBeThrown(final ObservableFuture<?> future) { future.subscribe(ERROR_THROWER); }
@Override public void cancel() { synchronized (this) { canceled = true; if (future != null) { future.cancel(true); future = null; } task = null; } }
@Override public void subscribe(final AsyncObserver<T> observer) { synchronized (this) { if (canceled) { return; } if (future == null) { future = goro.schedule(queue, task); } } future.subscribe(new FutureObserver<T>() { @Override public void onSuccess(final T value) { observer.onResult(value); } @Override public void onError(final Throwable error) { observer.onError(error); } }); }
@Override public void unsubscribe() { future.cancel(true); }
@Override public void subscribe(final AsyncObserver<T> observer) { synchronized (this) { if (canceled) { return; } if (future == null) { future = goro.schedule(queue, task); } } future.subscribe(new FutureObserver<T>() { @Override public void onSuccess(final T value) { observer.onResult(value); } @Override public void onError(final Throwable error) { observer.onError(error); } }); }
@Override public void unsubscribe() { synchronized (futures) { if (!futures.isEmpty()) { for (ObservableFuture<?> f : futures) { f.cancel(true); } futures.clear(); } subscription.unsubscribe(); } }
future.subscribe(new FutureObserver<Void>() { @Override public void onSuccess(Void value) {
@Test public void shouldInvokeCancelOnListeners() { goro.addTaskListener(listener); Callable<?> task = mock(Callable.class); goro.schedule(task).cancel(true); testingQueues.executeAll(); verify(listener, never()).onTaskStart(task); verify(listener).onTaskCancel(task); }
@SuppressWarnings("unchecked") @Test public void errorsShouldBePassedToObservers() throws Exception { FutureObserver observer = mock(FutureObserver.class); Callable<?> task = mock(Callable.class); Exception e = new Exception(); doThrow(e).when(task).call(); goro.schedule(task).subscribe(observer); testingQueues.executeAll(); verify(observer).onError(e); }
@SuppressWarnings("unchecked") @Test public void immediateObserversShouldBeCalled() { FutureObserver observer = mock(FutureObserver.class); goro.schedule(mock(Callable.class)).subscribe(observer); verify(observer, never()).onSuccess(any()); testingQueues.executeAll(); verify(observer).onSuccess(any()); }
@SuppressWarnings("unchecked") @Test public void observersError() throws Exception { Callable<String> task = mock(Callable.class); Exception e = new Exception(); doThrow(e).when(task).call(); FutureObserver<String> observer = mock(FutureObserver.class); goro().schedule(task).subscribe(observer); doBinding(); testingQueues.executeAll(); verify(observer).onError(e); }
@SuppressWarnings("unchecked") @Test public void observersShouldBeCalledOnTheirExecutors() { FutureObserver observer = mock(FutureObserver.class); final Runnable[] commands = new Runnable[1]; //noinspection NullableProblems Executor executor = new Executor() { @Override public void execute(final Runnable command) { commands[0] = command; } }; goro.schedule(mock(Callable.class)).subscribe(executor, observer); verify(observer, never()).onSuccess(any()); testingQueues.executeAll(); assertThat(commands[0]).isNotNull(); commands[0].run(); verify(observer).onSuccess(any()); }
@SuppressWarnings("unchecked") @Test public void observersSuccess() throws Exception { Callable<String> task = okTask(); FutureObserver<String> observer = mock(FutureObserver.class); goro().schedule(task).subscribe(observer); doBinding(); verify(serviceInstance).schedule(Goro.DEFAULT_QUEUE, task); testingQueues.executeAll(); verify(observer).onSuccess("ok"); }
public void testSchedule() throws InterruptedException { final CountDownLatch sync = new CountDownLatch(1); Callable<String> task = new Callable<String>() { @Override public String call() { return "done"; } }; final Object[] result = new Object[1]; goro.schedule(task) .subscribe(new FutureObserver<String>() { @Override public void onSuccess(final String value) { result[0] = value; sync.countDown(); } @Override public void onError(final Throwable error) { result[0] = error; sync.countDown(); } }); assertThat(sync.await(2, TimeUnit.SECONDS)).describedAs("Operation timed out").isTrue(); assertThat(result).containsOnly("done"); waitMainThread(); assertThat(goro.delegate()).describedAs("Service must be unbound").isNull(); }