@Override public Publisher<Integer> createPublisher(long elements) { return Flowable.range(0, (int)elements).replay().autoConnect() ; } }
@Override public Publisher<Integer> createPublisher(long elements) { return Flowable.range(0, (int)elements).publish().autoConnect() ; } }
@Test public void testUnsubscribeSource() throws Exception { Action unsubscribe = mock(Action.class); Flowable<Integer> f = Flowable.just(1).doOnCancel(unsubscribe).replay().autoConnect(); f.subscribe(); f.subscribe(); f.subscribe(); verify(unsubscribe, never()).run(); }
@Test public void cancelOnArrival() { Flowable.range(1, 2) .replay(Integer.MAX_VALUE) .autoConnect() .test(Long.MAX_VALUE, true) .assertEmpty(); }
@Test public void replayMaxInt() { Flowable.range(1, 2) .replay(Integer.MAX_VALUE) .autoConnect() .test() .assertResult(1, 2); }
@Test public void autoConnectImmediately() { PublishProcessor<Integer> pp = PublishProcessor.create(); pp.publish().autoConnect(0); assertTrue(pp.hasSubscribers()); } }
@Test public void disposeOnArrival2() { Flowable<Integer> co = Flowable.<Integer>never().publish().autoConnect(); co.test(Long.MAX_VALUE, true).assertEmpty(); }
@Test public void replaySizeAndTime() { Flowable.just(1).replay(1, 1, TimeUnit.MILLISECONDS) .autoConnect() .test() .awaitDone(5, TimeUnit.SECONDS) .assertResult(1); }
@Test public void testColdReplayNoBackpressure() { Flowable<Integer> source = Flowable.range(0, 1000).replay().autoConnect(); TestSubscriber<Integer> ts = new TestSubscriber<Integer>(); source.subscribe(ts); ts.assertNoErrors(); ts.assertTerminated(); List<Integer> onNextEvents = ts.values(); assertEquals(1000, onNextEvents.size()); for (int i = 0; i < 1000; i++) { assertEquals((Integer)i, onNextEvents.get(i)); } }
@Test public void cancelOnArrival2() { ConnectableFlowable<Integer> cf = PublishProcessor.<Integer>create() .replay(Integer.MAX_VALUE); cf.test(); cf .autoConnect() .test(Long.MAX_VALUE, true) .assertEmpty(); }
@Test public void replayTime() { Flowable.just(1).replay(1, TimeUnit.MINUTES) .autoConnect() .test() .awaitDone(5, TimeUnit.SECONDS) .assertResult(1); }
@Test public void replayScheduler() { Flowable.just(1).replay(Schedulers.computation()) .autoConnect() .test() .awaitDone(5, TimeUnit.SECONDS) .assertResult(1); }
@Test public void replaySizeScheduler() { Flowable.just(1).replay(1, Schedulers.computation()) .autoConnect() .test() .awaitDone(5, TimeUnit.SECONDS) .assertResult(1); }
@Test public void reentrantOnNext() { final PublishProcessor<Integer> pp = PublishProcessor.create(); TestSubscriber<Integer> ts = new TestSubscriber<Integer>() { @Override public void onNext(Integer t) { if (t == 1) { pp.onNext(2); pp.onComplete(); } super.onNext(t); } }; pp.replay().autoConnect().subscribe(ts); pp.onNext(1); ts.assertResult(1, 2); }
@Test public void reentrantOnNextCancelBounded() { final PublishProcessor<Integer> pp = PublishProcessor.create(); TestSubscriber<Integer> ts = new TestSubscriber<Integer>() { @Override public void onNext(Integer t) { if (t == 1) { pp.onNext(2); cancel(); } super.onNext(t); } }; pp.replay(10).autoConnect().subscribe(ts); pp.onNext(1); ts.assertValues(1); }
@Test public void testColdReplayBackpressure() { Flowable<Integer> source = Flowable.range(0, 1000).replay().autoConnect(); TestSubscriber<Integer> ts = new TestSubscriber<Integer>(0L); ts.request(10); source.subscribe(ts); ts.assertNoErrors(); ts.assertNotComplete(); List<Integer> onNextEvents = ts.values(); assertEquals(10, onNextEvents.size()); for (int i = 0; i < 10; i++) { assertEquals((Integer)i, onNextEvents.get(i)); } ts.dispose(); }
@Test public void testTake() { TestSubscriber<Integer> ts = new TestSubscriber<Integer>(); Flowable<Integer> cached = Flowable.range(1, 100).replay().autoConnect(); cached.take(10).subscribe(ts); ts.assertNoErrors(); ts.assertTerminated(); ts.assertValues(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); }
@Test public void pollThrows() { Flowable.just(1) .map(new Function<Integer, Object>() { @Override public Object apply(Integer v) throws Exception { throw new TestException(); } }) .compose(TestHelper.flowableStripBoundary()) .publish() .autoConnect() .test() .assertFailure(TestException.class); }
@Test public void timedNoOutdatedData() { TestScheduler scheduler = new TestScheduler(); Flowable<Integer> source = Flowable.just(1) .replay(2, TimeUnit.SECONDS, scheduler) .autoConnect(); source.test().assertResult(1); source.test().assertResult(1); scheduler.advanceTimeBy(3, TimeUnit.SECONDS); source.test().assertResult(); }
@Test public void testValuesAndThenError() { Flowable<Integer> source = Flowable.range(1, 10) .concatWith(Flowable.<Integer>error(new TestException())) .replay().autoConnect(); TestSubscriber<Integer> ts = new TestSubscriber<Integer>(); source.subscribe(ts); ts.assertValues(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); ts.assertNotComplete(); Assert.assertEquals(1, ts.errors().size()); TestSubscriber<Integer> ts2 = new TestSubscriber<Integer>(); source.subscribe(ts2); ts2.assertValues(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); ts2.assertNotComplete(); Assert.assertEquals(1, ts2.errors().size()); }