@Override public void run() { rp.subscribe(to); } };
replay.subscribe(slow); try { slowLatch.await();
@Override public void run() { final CountDownLatch fastLatch = new CountDownLatch(1); Observer<Long> fast = new DefaultObserver<Long>() { @Override public void onComplete() { System.out.println("*** Fast Observer completed"); fastLatch.countDown(); } @Override public void onError(Throwable e) { } @Override public void onNext(Long args) { if (args == 1) { System.out.println("*** Fast Observer STARTED"); } } }; replay.subscribe(fast); try { fastLatch.await(); } catch (InterruptedException e1) { e1.printStackTrace(); } } });
@Override public void run() { final CountDownLatch fastLatch = new CountDownLatch(1); Observer<Long> fast = new DefaultObserver<Long>() { @Override public void onComplete() { System.out.println("*** Fast Observer completed"); fastLatch.countDown(); } @Override public void onError(Throwable e) { } @Override public void onNext(Long args) { if (args == 1) { System.out.println("*** Fast Observer STARTED"); } } }; replay.subscribe(fast); try { fastLatch.await(); } catch (InterruptedException e1) { e1.printStackTrace(); } } });
replay.subscribe(slow); try { slowLatch.await();
@Test public void testReplay1AfterTermination() { ReplaySubject<Integer> source = ReplaySubject.createWithSize(1); source.onNext(1); source.onNext(2); source.onComplete(); for (int i = 0; i < 1; i++) { Observer<Integer> o = TestHelper.mockObserver(); source.subscribe(o); verify(o, never()).onNext(1); verify(o).onNext(2); verify(o).onComplete(); verify(o, never()).onError(any(Throwable.class)); } }
@Test public void testCompletedAfterError() { ReplaySubject<String> subject = ReplaySubject.create(); Observer<String> observer = TestHelper.mockObserver(); subject.onNext("one"); subject.onError(testException); subject.onNext("two"); subject.onComplete(); subject.onError(new RuntimeException()); subject.subscribe(observer); verify(observer).onSubscribe((Disposable)notNull()); verify(observer, times(1)).onNext("one"); verify(observer, times(1)).onError(testException); verifyNoMoreInteractions(observer); }
@Test public void testReplay1Directly() { ReplaySubject<Integer> source = ReplaySubject.createWithSize(1); Observer<Integer> o = TestHelper.mockObserver(); source.onNext(1); source.onNext(2); source.subscribe(o); source.onNext(3); source.onComplete(); verify(o, never()).onNext(1); verify(o).onNext(2); verify(o).onNext(3); verify(o).onComplete(); verify(o, never()).onError(any(Throwable.class)); }
@Test public void testSubscriptionLeak() { ReplaySubject<Object> subject = ReplaySubject.create(); Disposable d = subject.subscribe(); assertEquals(1, subject.observerCount()); d.dispose(); assertEquals(0, subject.observerCount()); }
@Test public void testReplayTimestampedAfterTermination() { TestScheduler scheduler = new TestScheduler(); ReplaySubject<Integer> source = ReplaySubject.createWithTime(1, TimeUnit.SECONDS, scheduler); source.onNext(1); scheduler.advanceTimeBy(1, TimeUnit.SECONDS); source.onNext(2); scheduler.advanceTimeBy(1, TimeUnit.SECONDS); source.onNext(3); source.onComplete(); scheduler.advanceTimeBy(1, TimeUnit.SECONDS); Observer<Integer> o = TestHelper.mockObserver(); source.subscribe(o); verify(o, never()).onNext(1); verify(o, never()).onNext(2); verify(o, never()).onNext(3); verify(o).onComplete(); verify(o, never()).onError(any(Throwable.class)); }
@Test public void testTerminateOnce() { ReplaySubject<Integer> source = ReplaySubject.create(); source.onNext(1); source.onNext(2); source.onComplete(); final Observer<Integer> o = TestHelper.mockObserver(); source.subscribe(new DefaultObserver<Integer>() { @Override public void onNext(Integer t) { o.onNext(t); } @Override public void onError(Throwable e) { o.onError(e); } @Override public void onComplete() { o.onComplete(); } }); verify(o).onNext(1); verify(o).onNext(2); verify(o).onComplete(); verify(o, never()).onError(any(Throwable.class)); }
@Test public void testReplayTimestampedDirectly() { TestScheduler scheduler = new TestScheduler(); ReplaySubject<Integer> source = ReplaySubject.createWithTime(1, TimeUnit.SECONDS, scheduler); source.onNext(1); scheduler.advanceTimeBy(1, TimeUnit.SECONDS); Observer<Integer> o = TestHelper.mockObserver(); source.subscribe(o); source.onNext(2); scheduler.advanceTimeBy(1, TimeUnit.SECONDS); source.onNext(3); scheduler.advanceTimeBy(1, TimeUnit.SECONDS); source.onComplete(); scheduler.advanceTimeBy(1, TimeUnit.SECONDS); verify(o, never()).onError(any(Throwable.class)); verify(o, never()).onNext(1); verify(o).onNext(2); verify(o).onNext(3); verify(o).onComplete(); }
@Test public void testCompleted() { ReplaySubject<String> subject = ReplaySubject.create(); Observer<String> o1 = TestHelper.mockObserver(); subject.subscribe(o1); subject.onNext("one"); subject.onNext("two"); subject.onNext("three"); subject.onComplete(); subject.onNext("four"); subject.onComplete(); subject.onError(new Throwable()); assertCompletedSubscriber(o1); // assert that subscribing a 2nd time gets the same data Observer<String> o2 = TestHelper.mockObserver(); subject.subscribe(o2); assertCompletedSubscriber(o2); }
@Test public void testError() { ReplaySubject<String> subject = ReplaySubject.create(); Observer<String> observer = TestHelper.mockObserver(); subject.subscribe(observer); subject.onNext("one"); subject.onNext("two"); subject.onNext("three"); subject.onError(testException); subject.onNext("four"); subject.onError(new Throwable()); subject.onComplete(); assertErrorSubscriber(observer); observer = TestHelper.mockObserver(); subject.subscribe(observer); assertErrorSubscriber(observer); }
@Test public void testSubscribeMidSequence() { ReplaySubject<String> subject = ReplaySubject.create(); Observer<String> observer = TestHelper.mockObserver(); subject.subscribe(observer); subject.onNext("one"); subject.onNext("two"); assertObservedUntilTwo(observer); Observer<String> anotherSubscriber = TestHelper.mockObserver(); subject.subscribe(anotherSubscriber); assertObservedUntilTwo(anotherSubscriber); subject.onNext("three"); subject.onComplete(); assertCompletedSubscriber(observer); assertCompletedSubscriber(anotherSubscriber); }
@Test public void reentrantDrain() { TestScheduler scheduler = new TestScheduler(); final ReplaySubject<Integer> rp = ReplaySubject.createWithTimeAndSize(1, TimeUnit.SECONDS, scheduler, 2); TestObserver<Integer> to = new TestObserver<Integer>() { @Override public void onNext(Integer t) { if (t == 1) { rp.onNext(2); } super.onNext(t); } }; rp.subscribe(to); rp.onNext(1); rp.onComplete(); to.assertResult(1, 2); }
final AtomicReference<String> value1 = new AtomicReference<String>(); subject.subscribe(new Consumer<String>() {
final AtomicReference<String> value1 = new AtomicReference<String>(); subject.subscribe(new Consumer<String>() {
@Test public void testUnsubscribeFirstSubscriber() { ReplaySubject<String> subject = ReplaySubject.create(); Observer<String> observer = TestHelper.mockObserver(); TestObserver<String> to = new TestObserver<String>(observer); subject.subscribe(to); subject.onNext("one"); subject.onNext("two"); to.dispose(); assertObservedUntilTwo(observer); Observer<String> anotherSubscriber = TestHelper.mockObserver(); subject.subscribe(anotherSubscriber); assertObservedUntilTwo(anotherSubscriber); subject.onNext("three"); subject.onComplete(); assertObservedUntilTwo(observer); assertCompletedSubscriber(anotherSubscriber); }