@Override public void onError(Throwable t) { final ArrayDeque<UnicastSubject<T>> ws = windows; while (!ws.isEmpty()) { ws.poll().onError(t); } downstream.onError(t); }
@Override public void onError(Throwable t) { UnicastSubject<T> w = window; if (w != null) { window = null; w.onError(t); } downstream.onError(t); }
void errorAll(Observer<?> a) { Throwable ex = ExceptionHelper.terminate(error); for (UnicastSubject<TRight> up : lefts.values()) { up.onError(ex); } lefts.clear(); rights.clear(); a.onError(ex); }
@Override public void onError(Throwable t) { final ArrayDeque<UnicastSubject<T>> ws = windows; while (!ws.isEmpty()) { ws.poll().onError(t); } actual.onError(t); }
@Override public void onError(Throwable t) { UnicastSubject<T> w = window; if (w != null) { window = null; w.onError(t); } actual.onError(t); }
void errorAll(Observer<?> a) { Throwable ex = ExceptionHelper.terminate(error); for (UnicastSubject<TRight> up : lefts.values()) { up.onError(ex); } lefts.clear(); rights.clear(); a.onError(ex); }
@Override public void onNext(Integer t) { super.onNext(t); us.onError(new TestException()); } };
@Test public void onTerminateCalledWhenOnError() { final AtomicBoolean didRunOnTerminate = new AtomicBoolean(); UnicastSubject<Integer> us = UnicastSubject.create(Observable.bufferSize(), new Runnable() { @Override public void run() { didRunOnTerminate.set(true); } }); assertEquals(false, didRunOnTerminate.get()); us.onError(new RuntimeException("some error")); assertEquals(true, didRunOnTerminate.get()); }
@Test public void threeArgsFactoryDelayError() { Runnable noop = mock(Runnable.class); UnicastSubject<Integer> ap = UnicastSubject.create(16, noop, true); ap.onNext(1); ap.onError(new RuntimeException()); TestObserver<Integer> to = TestObserver.create(); ap.subscribe(to); to .assertValueCount(1) .assertError(RuntimeException.class); }
@Test public void threeArgsFactoryFailFast() { Runnable noop = mock(Runnable.class); UnicastSubject<Integer> ap = UnicastSubject.create(16, noop, false); ap.onNext(1); ap.onError(new RuntimeException()); TestObserver<Integer> to = TestObserver.create(); ap.subscribe(to); to .assertValueCount(0) .assertError(RuntimeException.class); }
@Test public void failFast() { UnicastSubject<Integer> ap = UnicastSubject.create(false); ap.onNext(1); ap.onError(new RuntimeException()); TestObserver<Integer> to = TestObserver.create(); ap.subscribe(to); to .assertValueCount(0) .assertError(RuntimeException.class); }
@Test public void fusionOfflineFailFast() { UnicastSubject<Integer> ap = UnicastSubject.create(false); ap.onNext(1); ap.onError(new RuntimeException()); TestObserver<Integer> to = ObserverFusion.newTest(QueueFuseable.ANY); ap.subscribe(to); to .assertValueCount(0) .assertError(RuntimeException.class); }
Throwable err = error; if (err != null) { w.onError(err); } else { w.onComplete();
@Test public void inputAsyncFusedError() { UnicastSubject<Integer> us = UnicastSubject.create(); TestObserver<Integer> to = us.observeOn(Schedulers.single()).test(); us.onError(new TestException()); to .awaitDone(5, TimeUnit.SECONDS) .assertFailure(TestException.class); }
@Test public void inputAsyncFusedErrorDelayed() { UnicastSubject<Integer> us = UnicastSubject.create(); TestObserver<Integer> to = us.observeOn(Schedulers.single(), true).test(); us.onError(new TestException()); to .awaitDone(5, TimeUnit.SECONDS) .assertFailure(TestException.class); }
@Test public void inputOutputAsyncFusedError() { TestObserver<Integer> to = ObserverFusion.newTest(QueueFuseable.ANY); UnicastSubject<Integer> us = UnicastSubject.create(); us.observeOn(Schedulers.single()) .subscribe(to); us.onError(new TestException()); to .awaitDone(5, TimeUnit.SECONDS) .assertFailure(TestException.class); ObserverFusion.assertFusion(to, QueueFuseable.ASYNC) .awaitDone(5, TimeUnit.SECONDS) .assertFailure(TestException.class); }
@Test public void inputOutputAsyncFusedErrorDelayed() { TestObserver<Integer> to = ObserverFusion.newTest(QueueFuseable.ANY); UnicastSubject<Integer> us = UnicastSubject.create(); us.observeOn(Schedulers.single(), true) .subscribe(to); us.onError(new TestException()); to .awaitDone(5, TimeUnit.SECONDS) .assertFailure(TestException.class); ObserverFusion.assertFusion(to, QueueFuseable.ASYNC) .awaitDone(5, TimeUnit.SECONDS) .assertFailure(TestException.class); }
@Test public void dispose() { final int[] calls = { 0 }; UnicastSubject<Integer> us = new UnicastSubject<Integer>(128, new Runnable() { @Override public void run() { calls[0]++; } }); TestHelper.checkDisposed(us); assertEquals(1, calls[0]); List<Throwable> errors = TestHelper.trackPluginErrors(); try { us.onError(new TestException()); TestHelper.assertUndeliverable(errors, 0, TestException.class); } finally { RxJavaPlugins.reset(); } Disposable d = Disposables.empty(); us.onSubscribe(d); assertTrue(d.isDisposed()); }
@Test public void onErrorStatePeeking() { UnicastSubject<Object> p = UnicastSubject.create(); assertFalse(p.hasComplete()); assertFalse(p.hasThrowable()); assertNull(p.getThrowable()); TestException ex = new TestException(); p.onError(ex); assertFalse(p.hasComplete()); assertTrue(p.hasThrowable()); assertSame(ex, p.getThrowable()); }
@Test public void afterDone() { UnicastSubject<Object> p = UnicastSubject.create(); p.onComplete(); Disposable bs = Disposables.empty(); p.onSubscribe(bs); p.onNext(1); List<Throwable> errors = TestHelper.trackPluginErrors(); try { p.onError(new TestException()); TestHelper.assertUndeliverable(errors, 0, TestException.class); } finally { RxJavaPlugins.reset(); } p.onComplete(); p.test().assertResult(); assertNull(p.getThrowable()); assertTrue(p.hasComplete()); assertFalse(p.hasThrowable()); }