@Override public <T> ObservableFuture<T> schedule(String queueName, Callable<T> task) { synchronized (lock) { if (service != null) { return service.schedule(queueName, task); } else { BoundFuture<T> future = new BoundFuture<>(queueName, task); postponed.add(future); return future; } } }
@Override public synchronized void act(final Goro goro) { goroFuture = (GoroFuture<T>) goro.schedule(queue, task); if (pendingObservers != null) { pendingObservers.execute(); pendingObservers = null; } notifyAll(); }
@Override public <T> ObservableFuture<T> schedule(String queueName, Callable<T> task) { synchronized (lock) { if (delegate != null) { return delegate.schedule(queueName, task); } else { BoundFuture<T> future = new BoundFuture<>(queueName, task); postponed.add(future); return future; } } }
@Override public synchronized void act(final Goro goro) { goroFuture = (GoroFuture<T>) goro.schedule(queue, task); if (pendingObservers != null) { pendingObservers.execute(); pendingObservers = null; } notifyAll(); }
@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 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 int onStartCommand(final Intent intent, final int flags, final int startId) { if (intent != null) { Callable<?> task = getTaskFromExtras(intent); if (task != null) { injectContext(task); String queueName = intent.hasExtra(EXTRA_QUEUE_NAME) ? intent.getStringExtra(EXTRA_QUEUE_NAME) : Goro.DEFAULT_QUEUE; ObservableFuture<?> future = getBinder().goro.schedule(queueName, task); if (!intent.getBooleanExtra(EXTRA_IGNORE_ERROR, false)) { ensureErrorWillBeThrown(future); } } } return START_STICKY; }
@SuppressWarnings("unchecked") @Test public void firstSubscribeShouldCallSchedule() { Callable<?> task = mock(Callable.class); Async<?> async = asyncGoro.schedule("1", task); verify(goro, never()).schedule(anyString(), any(Callable.class)); async.subscribe(mock(AsyncObserver.class)); verify(goro).schedule("1", task); async.subscribe(mock(AsyncObserver.class)); verify(goro, times(1 /* not 2 */)).schedule(anyString(), any(Callable.class)); }
@Before public void init() { goro = mock(Goro.class); doReturn(mock(ObservableFuture.class)).when(goro).schedule(anyString(), any(Callable.class)); asyncGoro = new AsyncGoro(goro); }
@Test public void clearShouldBeAppliedAfterBinding() { Callable<?> task1 = mock(Callable.class); goro().schedule("clearedQueue", task1); goro().clear("clearedQueue"); Callable<?> task2 = mock(Callable.class); goro().schedule("clearedQueue", task2); doBinding(); InOrder order = inOrder(serviceInstance); order.verify(serviceInstance).schedule("clearedQueue", task1); order.verify(serviceInstance).clear("clearedQueue"); order.verify(serviceInstance).schedule("clearedQueue", task2); }
@Test public void scheduleShouldReturnFuture() { Future<?> future = goro().schedule(mock(Callable.class)); assertThat(future).isNotNull(); }
@SuppressWarnings("unchecked") @Test public void cancelShouldMakeSubscribeNoOp() { Async<?> async = asyncGoro.schedule("1", mock(Callable.class)); async.cancel(); async.subscribe(mock(AsyncObserver.class)); verify(goro, never()).schedule(anyString(), any(Callable.class)); }
@Test public void cancelFutureBeforeBindingShouldRemoveRecordedTask() { Future<?> future = goro.schedule(mock(Callable.class)); future.cancel(true); goro.bind(); assertBinding(); verify(serviceInstance, never()).schedule(anyString(), any(Callable.class)); }
@Test public void afterBindingScheduleShouldBeDelegated() { goro.bind(); Callable<?> task = mock(Callable.class); ObservableFuture<?> future = mock(ObservableFuture.class); doReturn(future).when(serviceInstance).schedule("2", task); assertThat((Object) goro.schedule("2", task)).isSameAs(future); }
public void testExecutionStartFinish() throws Exception { Log.i("GoroTest", "testExecutionStartFinish"); goro.schedule(mockTask); executor.runAllAndClean(); final CountDownLatch sync = new CountDownLatch(1); onMainThread(new Runnable() { @Override public void run() { assertThat(mockTask.scheduled).isTrue(); assertThat(mockTask.started).isTrue(); assertThat(mockTask.called).isTrue(); assertThat(mockTask.finished).isTrue(); assertThat(mockTask.canceled).isFalse(); assertThat(mockTask.errored).isFalse(); sync.countDown(); } }); sync.await(); }
@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); }
@MainThread public void testExecutionCancel() throws Exception { Log.i("GoroTest", "testExecutionCancel"); Future<?> future = goro.schedule(mockTask); assertThat(future.cancel(true)).isTrue(); executor.runAllAndClean(); final CountDownLatch sync = new CountDownLatch(1); onMainThread(new Runnable() { @Override public void run() { assertThat(mockTask.scheduled).isTrue(); assertThat(mockTask.started).isFalse(); assertThat(mockTask.called).isFalse(); assertThat(mockTask.finished).isFalse(); assertThat(mockTask.canceled).isTrue(); assertThat(mockTask.errored).isFalse(); sync.countDown(); } }); sync.await(); }
@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"); }