@Test public void innerErrorsBoundary() { AssertSubscriber<Integer> ts = AssertSubscriber.create(); DirectProcessor<Integer> source = DirectProcessor.create(); DirectProcessor<Integer> source1 = DirectProcessor.create(); DirectProcessor<Integer> source2 = DirectProcessor.create(); //gh-1101: default changed from BOUNDARY to END source.concatMapDelayError(v -> v == 1 ? source1 : source2, false, Queues.XS_BUFFER_SIZE) .subscribe(ts); ts.assertNoValues() .assertNoError() .assertNotComplete(); source.onNext(1); Assert.assertTrue("source1 no subscribers?", source1.hasDownstreams()); Assert.assertFalse("source2 has subscribers?", source2.hasDownstreams()); source1.onNext(1); source1.onError(new RuntimeException("forced failure")); ts.assertValues(1) .assertError(RuntimeException.class) .assertErrorMessage("forced failure") .assertNotComplete(); Assert.assertFalse("source1 has subscribers?", source1.hasDownstreams()); Assert.assertFalse("source2 has subscribers?", source2.hasDownstreams()); }
@Test public void mainErrorsBoundary() { AssertSubscriber<Integer> ts = AssertSubscriber.create(); DirectProcessor<Integer> source = DirectProcessor.create(); DirectProcessor<Integer> source1 = DirectProcessor.create(); DirectProcessor<Integer> source2 = DirectProcessor.create(); source.concatMapDelayError(v -> v == 1 ? source1 : source2) .subscribe(ts); ts.assertNoValues() .assertNoError() .assertNotComplete(); source.onNext(1); Assert.assertTrue("source1 no subscribers?", source1.hasDownstreams()); Assert.assertFalse("source2 has subscribers?", source2.hasDownstreams()); source1.onNext(1); source.onError(new RuntimeException("forced failure")); ts.assertValues(1) .assertNoError() .assertNotComplete(); source1.onNext(2); source1.onComplete(); ts.assertValues(1, 2) .assertError(RuntimeException.class) .assertErrorMessage("forced failure") .assertNotComplete(); Assert.assertFalse("source1 has subscribers?", source1.hasDownstreams()); Assert.assertFalse("source2 has subscribers?", source2.hasDownstreams()); }
@Test public void innerErrorsEnd() { AssertSubscriber<Integer> ts = AssertSubscriber.create(); DirectProcessor<Integer> source = DirectProcessor.create(); DirectProcessor<Integer> source1 = DirectProcessor.create(); DirectProcessor<Integer> source2 = DirectProcessor.create(); source.concatMapDelayError(v -> v == 1 ? source1 : source2, true, 32) .subscribe(ts); ts.assertNoValues() .assertNoError() .assertNotComplete(); source.onNext(1); Assert.assertTrue("source1 no subscribers?", source1.hasDownstreams()); Assert.assertFalse("source2 has subscribers?", source2.hasDownstreams()); source1.onNext(1); source1.onError(new RuntimeException("forced failure")); source.onNext(2); Assert.assertTrue("source2 no subscribers?", source2.hasDownstreams()); source2.onNext(2); source2.onComplete(); source.onComplete(); ts.assertValues(1, 2) .assertError(RuntimeException.class) .assertErrorMessage("forced failure") .assertNotComplete(); Assert.assertFalse("source1 has subscribers?", source1.hasDownstreams()); Assert.assertFalse("source2 has subscribers?", source2.hasDownstreams()); }
@Test public void singleSubscriberOnlyBoundary() { AssertSubscriber<Integer> ts = AssertSubscriber.create(); DirectProcessor<Integer> source = DirectProcessor.create(); DirectProcessor<Integer> source1 = DirectProcessor.create(); DirectProcessor<Integer> source2 = DirectProcessor.create(); source.concatMapDelayError(v -> v == 1 ? source1 : source2) .subscribe(ts); ts.assertNoValues() .assertNoError() .assertNotComplete(); source.onNext(1); Assert.assertTrue("source1 no subscribers?", source1.hasDownstreams()); Assert.assertFalse("source2 has subscribers?", source2.hasDownstreams()); source1.onNext(1); source2.onNext(10); source1.onComplete(); source.onNext(2); source.onComplete(); source2.onNext(2); source2.onComplete(); ts.assertValues(1, 2) .assertNoError() .assertComplete(); Assert.assertFalse("source1 has subscribers?", source1.hasDownstreams()); Assert.assertFalse("source2 has subscribers?", source2.hasDownstreams()); }