@Override public void run() { T value = null; Throwable error = null; boolean cancelled = false; try { value = future.get(); } catch (InterruptedException e) { throw new RuntimeException(e); } catch (CancellationException e) { cancelled = true; } catch (ExecutionException e) { error = e.getCause(); } finally { future = null; } if (cancelled) { return; } if (error != null) { observer.onError(error); } else { observer.onSuccess(value); } } }
@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 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 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 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); }
@Override public void run() { T value = null; Throwable error = null; boolean cancelled = false; try { value = future.get(); } catch (InterruptedException e) { throw new RuntimeException(e); } catch (CancellationException e) { cancelled = true; } catch (ExecutionException e) { error = e.getCause(); } finally { future = null; } if (cancelled) { return; } if (error != null) { observer.onError(error); } else { observer.onSuccess(value); } } }
@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"); }