package com.github.davidmoten.rx; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import org.junit.Test; import org.mockito.InOrder; import rx.Observable; import rx.Observable.OnSubscribe; import rx.Subscriber; import rx.functions.Action1; import rx.functions.Func1; import rx.subjects.PublishSubject; public class RetryTest { /** * Checks in a simple and synchronous way that retry resubscribes after * error. This test fails against 0.16.1-0.17.4, hangs on 0.17.5 and passes * in 0.17.6 thanks to fix for issue #1027. */ @SuppressWarnings("unchecked") @Test public void testConcatMapWithRetry() { // record emitted values with this action Action1<Integer> record = mock(Action1.class); InOrder inOrder = inOrder(record); // always throw an exception with this action Func1<Integer, Observable<Integer>> throwException = new Func1<Integer, Observable<Integer>>() { @Override public Observable<Integer> call(Integer n) { return Observable.create(new OnSubscribe<Integer>() { @Override public void call(Subscriber<? super Integer> subscriber) { subscriber.onNext(100); subscriber.onError(new RuntimeException("boo")); } }); } }; // create a retrying observable based on a PublishSubject PublishSubject<Integer> subject = PublishSubject.create(); subject // record item .doOnNext(record) // throw a RuntimeException .concatMap(throwException) // retry on error .retry() // subscribe and ignore .subscribe(); inOrder.verifyNoMoreInteractions(); subject.onNext(1); inOrder.verify(record).call(1); subject.onNext(2); inOrder.verify(record).call(2); subject.onNext(3); inOrder.verify(record).call(3); inOrder.verifyNoMoreInteractions(); } }