@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 @SuppressWarnings("unchecked") public void normalBlackboxProcessor(){ UnicastProcessor<Integer> upstream = UnicastProcessor.create(); FluxProcessor<Integer, Integer> processor = FluxProcessor.wrap(upstream, upstream.map(i -> i + 1) .filter(i -> i % 2 == 0)); DelegateProcessor<Integer, Integer> delegateProcessor = (DelegateProcessor<Integer, Integer>)processor; delegateProcessor.parents().findFirst().ifPresent(s -> assertThat(s).isInstanceOf(FluxFilterFuseable.class)); StepVerifier.create(processor) .then(() -> Flux.just(1, 2, 3).subscribe(processor)) .expectNext(2, 4) .verifyComplete(); }
@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 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 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(); }
/** * @return */ public final BlockingSink<Object> streamCannon() { UnicastProcessor<Object> p = UnicastProcessor.create(); this.cannons.submit(p.map(new GraphMapper())); return p.connectSink(); }
/** * @return */ public final BlockingSink<Object> metricCannon() { UnicastProcessor<Object> p = UnicastProcessor.create(); this.cannons.submit(p.map(new MetricMapper())); return p.connectSink(); }
/** * @param o * @param period * @param unit * @param <E> * * @return */ public final <E> E monitor(final E o, long period, TimeUnit unit) { final long _period = period > 0 ? period : 400L; UnicastProcessor<Object> p = UnicastProcessor.create(); log.info("State Monitoring Starting on " + FlowSerializerUtils.getName(o)); timer.schedulePeriodically(() -> { if (!p.isCancelled()) { p.onNext(FlowSerializerUtils.scan(o)); } else { log.info("State Monitoring stopping on " + FlowSerializerUtils.getName(o)); throw Exceptions.failWithCancel(); } }, 0L, _period, unit != null ? unit : TimeUnit.MILLISECONDS); this.cannons.submit(p.map(new GraphMapper())); return o; }