@Test public void asyncFusedThreadBarrier() { UnicastProcessor<Integer> up = UnicastProcessor.create(); up.onNext(1); up.onNext(2); up.onNext(3); up.onNext(4); up.onNext(5); up.onComplete(); StepVerifier.create(up.doFinally(this)) .expectFusion(ASYNC | THREAD_BARRIER, NONE) .expectNext(1, 2, 3, 4, 5) .expectComplete() .verify(); assertEquals(1, calls); assertEquals(SignalType.ON_COMPLETE, signalType); }
@Test public void subsequentSumAsync() { AssertSubscriber<Integer> ts = AssertSubscriber.create(); UnicastProcessor<Integer> up = UnicastProcessor.create(Queues.<Integer>get(16).get()); up.publish(o -> zip((Object[] a) -> (Integer) a[0] + (Integer) a[1], o, o.skip(1))) .subscribe(ts); up.onNext(1); up.onNext(2); up.onNext(3); up.onNext(4); up.onNext(5); up.onComplete(); ts.assertValues(1 + 2, 2 + 3, 3 + 4, 4 + 5) .assertNoError() .assertComplete(); }
@Test public void asyncFused() { UnicastProcessor<Integer> up = UnicastProcessor.create(); up.onNext(1); up.onNext(2); up.onNext(3); up.onNext(4); up.onNext(5); up.onComplete(); StepVerifier.create(up.doFinally(this)) .expectFusion(ASYNC) .expectNext(1, 2, 3, 4, 5) .expectComplete() .verify(); assertEquals(1, calls); assertEquals(SignalType.ON_COMPLETE, signalType); }
@Test public void asyncInnerFusion() { UnicastProcessor<Integer> up = UnicastProcessor.create(); StepVerifier.create(Flux.just(1) .hide() .flatMap(f -> up, 1)) .then(() -> up.onNext(1)) .then(() -> up.onNext(2)) .then(() -> up.onNext(3)) .then(() -> up.onNext(4)) .then(() -> up.onComplete()) .expectNext(1, 2, 3, 4) .verifyComplete(); }
@Test public void switchOnNextDynamicallyOnNext() { UnicastProcessor<Flux<Integer>> up = UnicastProcessor.create(); up.onNext(Flux.range(1, 3)); up.onNext(Flux.range(2, 3).concatWith(Mono.never())); up.onNext(Flux.range(4, 3)); up.onComplete(); StepVerifier.create(Flux.switchOnNext(up)) .expectNext(1, 2, 3, 2, 3, 4, 4, 5, 6) .verifyComplete(); }
@Test public void takeFusedBackpressuredCancelled() { UnicastProcessor<String> up = UnicastProcessor.create(); StepVerifier.create(up.take(3).doOnSubscribe(s -> { assertThat(((Fuseable.QueueSubscription)s).size()).isEqualTo(0); }), 0) .expectFusion() .then(() -> up.onNext("test")) .then(() -> up.onNext("test")) .then(() -> up.onNext("test")) .thenRequest(2) .expectNext("test", "test") .thenCancel() .verify(); }
@Test public void cancelAsyncFusion() { UnicastProcessor<String> up = UnicastProcessor.create(); StepVerifier.create(up.take(3), 0) .expectFusion() .then(() -> up.onNext("test")) .then(() -> up.onNext("test")) .then(() -> up.onNext("test")) .thenRequest(2) .expectNext("test", "test") .thenCancel() .verify(); }
@Test public void takeFusedBackpressured() { UnicastProcessor<String> up = UnicastProcessor.create(); StepVerifier.create(up.take(3), 0) .expectFusion() .then(() -> up.onNext("test")) .then(() -> up.onNext("test2")) .thenRequest(2) .expectNext("test", "test2") .then(() -> up.onNext("test3")) .then(() -> up.onNext("test4")) .thenRequest(1) .expectNext("test3") .thenRequest(1) .verifyComplete(); }
@Test public void takeAsyncFusedBackpressured() { UnicastProcessor<String> up = UnicastProcessor.create(); StepVerifier.create(up.take(3), 0) .expectFusion() .then(() -> up.onNext("test")) .then(() -> up.onNext("test")) .then(() -> up.onNext("test")) .thenRequest(2) .expectNext("test", "test") .thenRequest(1) .expectNext("test") .verifyComplete(); }
@Test public void asyncFusionMapToNull() { AssertSubscriber<Integer> ts = AssertSubscriber.create(); UnicastProcessor<Integer> up = UnicastProcessor.create(Queues.<Integer>get(2).get()); up.onNext(1); up.onNext(2); up.onComplete(); up.map(v -> v == 2 ? null : v) .concatMap(Flux::just) .subscribe(ts); ts.assertValues(1) .assertError(NullPointerException.class) .assertNotComplete(); }
@Test public void failAsyncInnerFusion() { UnicastProcessor<Integer> up = UnicastProcessor.create(); StepVerifier.create(Flux.just(1) .hide() .flatMap(f -> up, 1)) .then(() -> up.onNext(1)) .then(() -> up.onNext(2)) .then(() -> up.onError(new Exception("test"))) .expectNext(1, 2) .verifyErrorMessage("test"); }
@Test public void mappedAsyncSourceWithNull() { AssertSubscriber<Integer> ts = AssertSubscriber.create(); UnicastProcessor<Integer> up = UnicastProcessor.create(Queues.<Integer>get(2).get()); up.onNext(1); up.onNext(2); up.onComplete(); up.map(v -> v == 2 ? null : v) .publishOn(Schedulers.fromExecutorService(exec)) .subscribe(ts); ts.await(Duration.ofSeconds(5)); ts.assertValues(1) .assertError(NullPointerException.class) .assertNotComplete(); }
@Test public void asyncFusionMapToNullFilter() { AssertSubscriber<Integer> ts = AssertSubscriber.create(); UnicastProcessor<Integer> up = UnicastProcessor.create(Queues.<Integer>get(2).get()); up.onNext(1); up.onNext(2); up.onComplete(); up.map(v -> v == 2 ? null : v) .filter(v -> true) .concatMap(Flux::just) .subscribe(ts); ts.assertValues(1) .assertError(NullPointerException.class) .assertNotComplete(); }
final StepVerifier.Step<O> inputFusedAsyncErrorOutputFusedAsync(OperatorScenario<I, PI, O, PO> scenario) { UnicastProcessor<I> up = UnicastProcessor.create(); up.onNext(item(0)); return StepVerifier.create(scenario.body() .apply(up.as(f -> withFluxSource(new FluxFuseableExceptionOnPoll<>( f, exception()))))) .expectFusion(scenario.fusionMode() & ASYNC); }
@Test public void backpressuredAsyncFusedCancelled2() { UnicastProcessor<Integer> up = UnicastProcessor.create(); StepVerifier.create(Flux.zip(obj -> (int) obj[0] + (int) obj[1], 1, up, Flux.just(2, 3, 5)), 0) .then(() -> up.onNext(1)) .thenRequest(3) .expectNext(3) .then(() -> up.onNext(2)) .expectNext(5) .thenCancel() .verify(); }
@Test public void asyncFusion() { AssertSubscriber<Object> ts = AssertSubscriber.create(); UnicastProcessor<Integer> up = UnicastProcessor.create(new ConcurrentLinkedQueue<>()); up.map(v -> v + 1) .subscribe(ts); for (int i = 1; i < 11; i++) { up.onNext(i); } up.onComplete(); ts.assertValues(2, 3, 4, 5, 6, 7, 8, 9, 10, 11) .assertNoError() .assertComplete(); }
@Test public void asyncFusion() { AssertSubscriber<Object> ts = AssertSubscriber.create(); UnicastProcessor<Integer> up = UnicastProcessor.create(new ConcurrentLinkedQueue<>()); up.filter(v -> (v & 1) == 0) .subscribe(ts); for (int i = 1; i < 11; i++) { up.onNext(i); } up.onComplete(); ts.assertValues(2, 4, 6, 8, 10) .assertNoError() .assertComplete(); }
@Test public void backpressuredAsyncFusedCancelled() { UnicastProcessor<Integer> up = UnicastProcessor.create(); StepVerifier.create(Flux.zip(obj -> (int) obj[0] + (int) obj[1], 1, up, Flux.just(2, 3, 5)), 0) .then(() -> up.onNext(1)) .thenRequest(1) .expectNext(3) .then(() -> up.onNext(2)) .thenRequest(1) .expectNext(5) .thenCancel() .verify(); }
@Test public void backpressuredAsyncFusedComplete() { UnicastProcessor<Integer> up = UnicastProcessor.create(); StepVerifier.create(Flux.zip(obj -> (int) obj[0] + (int) obj[1], 1, up, Flux.just(2, 3, 5)), 0) .then(() -> up.onNext(1)) .thenRequest(1) .expectNext(3) .then(() -> up.onNext(2)) .thenRequest(1) .expectNext(5) .then(() -> up.onComplete()) .verifyComplete(); }