@Test public void threadBoundaryPreventsInvalidFusionFilter() { UnicastProcessor<Integer> up = UnicastProcessor.create(Queues.<Integer>get(2).get()); String s = Thread.currentThread() .getName(); AssertSubscriber<Integer> ts = AssertSubscriber.create(); up.filter(v -> s.equals(Thread.currentThread() .getName())) .publishOn(Schedulers.fromExecutorService(exec)) .subscribe(ts); up.onNext(1); up.onComplete(); ts.await(Duration.ofSeconds(5)); ts.assertValues(1) .assertNoError() .assertComplete(); }
@Test public void threadBoundaryPreventsInvalidFusionMap() { UnicastProcessor<Integer> up = UnicastProcessor.create(Queues.<Integer>get(2).get()); AssertSubscriber<String> ts = AssertSubscriber.create(); up.map(v -> Thread.currentThread() .getName()) .publishOn(Schedulers.fromExecutorService(exec)) .subscribe(ts); up.onNext(1); up.onComplete(); ts.await(Duration.ofSeconds(5)); ts.assertValues(Thread.currentThread() .getName()) .assertNoError() .assertComplete(); }
@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 //FIXME use Violation.NO_CLEANUP_ON_TERMINATE public void failNextOnTerminated() { UnicastProcessor<Integer> up = UnicastProcessor.create(); Hooks.onNextDropped(c -> { assertThat(c).isEqualTo(2); }); StepVerifier.create(up.flatMap(Flux::just)) .then(() -> { up.onNext(1); CoreSubscriber<? super Integer> a = up.actual; up.onComplete(); a.onNext(2); }) .expectNext(1) .verifyComplete(); Hooks.resetOnNextDropped(); }
@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 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 mappedAsyncSourceWithNullPostFilter() { 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)) .filter(v -> true) .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(); }
@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 asyncFusionBackpressured() { AssertSubscriber<Object> ts = AssertSubscriber.create(1); UnicastProcessor<Integer> up = UnicastProcessor.create(new ConcurrentLinkedQueue<>()); Flux.just(1) .hide() .flatMap(w -> up.map(v -> v + 1)) .subscribe(ts); up.onNext(1); ts.assertValues(2) .assertNoError() .assertNotComplete(); up.onComplete(); ts.assertValues(2) .assertNoError() .assertComplete(); }
@Test public void asyncFusionBackpressured() { AssertSubscriber<Object> ts = AssertSubscriber.create(1); UnicastProcessor<Integer> up = UnicastProcessor.create(new ConcurrentLinkedQueue<>()); Flux.just(1) .hide() .flatMap(w -> up.filter(v -> (v & 1) == 0)) .subscribe(ts); up.onNext(1); up.onNext(2); ts.assertValues(2) .assertNoError() .assertNotComplete(); up.onComplete(); ts.assertValues(2) .assertNoError() .assertComplete(); }
@Test public void asyncFusionBackpressured2() { AssertSubscriber<Object> ts = AssertSubscriber.create(1); UnicastProcessor<Integer> up = UnicastProcessor.create(new ConcurrentLinkedQueue<>()); Flux.just(1) .hide() .flatMap(w -> up.filter(v -> (v & 1) == 0), false, 1, 1) .subscribe(ts); up.onNext(1); up.onNext(2); ts.assertValues(2) .assertNoError() .assertNotComplete(); up.onComplete(); ts.assertValues(2) .assertNoError() .assertComplete(); }
@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 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 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(); }
@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 asyncFusedConditional() { 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) .filter(i -> true)) .expectFusion(ASYNC) .expectNext(1, 2, 3, 4, 5) .expectComplete() .verify(); assertEquals(1, calls); assertEquals(SignalType.ON_COMPLETE, signalType); }
@Test public void asyncFusedThreadBarrierConditional() { 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) .filter(i -> true)) .expectFusion(ASYNC | THREAD_BARRIER, NONE) .expectNext(1, 2, 3, 4, 5) .expectComplete() .verify(); assertEquals(1, calls); assertEquals(SignalType.ON_COMPLETE, signalType); }