@Override public void run() { co.subscribe(to2); } };
@Override public void run() { co.subscribe(to1); } };
@Override public void run() { co.subscribe(to1); } };
@Override public void run() { co.subscribe(to2); } };
@Override public void run() { co.subscribe(to); } };
@Override public void run() { co.subscribe(to1); } };
@Override public void run() { co.subscribe(to2); } };
@Override public void subscribeActual(Observer<? super T> child) { source.subscribe(child); if (clients.incrementAndGet() == numberOfObservers) { source.connect(connection); } } }
@Override public void subscribeActual(Observer<? super T> child) { source.subscribe(child); if (clients.incrementAndGet() == numberOfObservers) { source.connect(connection); } } }
void doSubscribe(final Observer<? super T> observer, final CompositeDisposable currentBase) { // handle disposing from the base CompositeDisposable Disposable d = disconnect(currentBase); ConnectionObserver s = new ConnectionObserver(observer, currentBase, d); observer.onSubscribe(s); source.subscribe(s); }
void doSubscribe(final Observer<? super T> observer, final CompositeDisposable currentBase) { // handle disposing from the base CompositeDisposable Disposable d = disconnect(currentBase); ConnectionObserver s = new ConnectionObserver(observer, currentBase, d); observer.onSubscribe(s); source.subscribe(s); }
@Test public void testSubscribeAfterDisconnectThenConnect() { ConnectableObservable<Integer> source = Observable.just(1).publish(); TestObserver<Integer> ts1 = new TestObserver<Integer>(); source.subscribe(ts1); Disposable s = source.connect(); ts1.assertValue(1); ts1.assertNoErrors(); ts1.assertTerminated(); TestObserver<Integer> ts2 = new TestObserver<Integer>(); source.subscribe(ts2); Disposable s2 = source.connect(); ts2.assertValue(1); ts2.assertNoErrors(); ts2.assertTerminated(); System.out.println(s); System.out.println(s2); }
@Test public void unsubscribeOnNextRace() { for (int i = 0; i < 500; i++) { final PublishSubject<Integer> ps = PublishSubject.create(); final ConnectableObservable<Integer> co = ps.replay(); final TestObserver<Integer> to1 = new TestObserver<Integer>(); co.subscribe(to1); Runnable r1 = new Runnable() { @Override public void run() { to1.dispose(); } }; Runnable r2 = new Runnable() { @Override public void run() { for (int j = 0; j < 1000; j++) { ps.onNext(j); } } }; TestCommonHelper.race(r1, r2); } }
@Test public void just() { final PublishSubject<Integer> ps = PublishSubject.create(); ConnectableObservable<Integer> co = ps.publish(); TestObserver<Integer> to = new TestObserver<Integer>() { @Override public void onNext(Integer t) { super.onNext(t); ps.onComplete(); } }; co.subscribe(to); co.connect(); ps.onNext(1); to.assertResult(1); }
@Test public void addRemoveRace() { for (int i = 0; i < 500; i++) { final ConnectableObservable<Integer> co = Observable.range(1, 3).replay(); final TestObserver<Integer> to1 = new TestObserver<Integer>(); final TestObserver<Integer> to2 = new TestObserver<Integer>(); co.subscribe(to1); Runnable r1 = new Runnable() { @Override public void run() { to1.cancel(); } }; Runnable r2 = new Runnable() { @Override public void run() { co.subscribe(to2); } }; TestCommonHelper.race(r1, r2); } }
@Test public void testConnectWithNoSubscriber() { TestScheduler scheduler = new TestScheduler(); ConnectableObservable<Long> co = Observable.interval(10, 10, TimeUnit.MILLISECONDS, scheduler).take(3).publish(); co.connect(); // Emit 0 scheduler.advanceTimeBy(15, TimeUnit.MILLISECONDS); TestObserver<Long> to = new TestObserver<Long>(); co.subscribe(to); // Emit 1 and 2 scheduler.advanceTimeBy(50, TimeUnit.MILLISECONDS); to.assertValues(1L, 2L); to.assertNoErrors(); to.assertTerminated(); }
@Test public void testWithMultipleStaggeredSubscribersAndPublish() { ConnectableObservable<Long> w = Observable.interval(1, TimeUnit.SECONDS, scheduler).publish(); TestObserver<Long> ts1 = new TestObserver<Long>(); w.subscribe(ts1); w.connect(); ts1.assertNoValues(); scheduler.advanceTimeTo(2, TimeUnit.SECONDS); TestObserver<Long> ts2 = new TestObserver<Long>(); w.subscribe(ts2); ts1.assertValues(0L, 1L); ts1.assertNoErrors(); ts1.assertNotComplete(); ts2.assertNoValues(); scheduler.advanceTimeTo(4, TimeUnit.SECONDS); ts1.assertValues(0L, 1L, 2L, 3L); ts2.assertValues(2L, 3L); ts1.dispose(); ts2.dispose(); ts1.assertValues(0L, 1L, 2L, 3L); ts1.assertNoErrors(); ts1.assertNotComplete(); ts2.assertValues(2L, 3L); ts2.assertNoErrors(); ts2.assertNotComplete(); } @Test