protected InstanceEventPublisher() { UnicastProcessor<InstanceEvent> unicastProcessor = UnicastProcessor.create(); this.publishedFlux = unicastProcessor.publish().autoConnect(0); this.sink = unicastProcessor.sink(); }
@Test public void bufferSizeOtherQueue() { UnicastProcessor processor = UnicastProcessor.create( new PriorityQueue<>(10)); assertThat(processor.getBufferSize()) .isEqualTo(Integer.MIN_VALUE) .isEqualTo(Queues.CAPACITY_UNSURE); }
@Test public void bufferSizeBoundedBlockingQueue() { UnicastProcessor processor = UnicastProcessor.create( new LinkedBlockingQueue<>(10)); assertThat(processor.getBufferSize()).isEqualTo(10); }
@Test public void bufferSizeReactorBoundedQueue() { //the bounded queue floors at 8 and rounds to the next power of 2 assertThat(UnicastProcessor.create(Queues.get(2).get()) .getBufferSize()) .isEqualTo(8); assertThat(UnicastProcessor.create(Queues.get(8).get()) .getBufferSize()) .isEqualTo(8); assertThat(UnicastProcessor.create(Queues.get(9).get()) .getBufferSize()) .isEqualTo(16); }
@Test // SPR-16402 public void singleSubscriberWithStrings() { UnicastProcessor<String> processor = UnicastProcessor.create(); Flux.just("foo", "bar", "baz").subscribe(processor); MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder(); bodyBuilder.asyncPart("name", processor, String.class); Mono<MultiValueMap<String, HttpEntity<?>>> result = Mono.just(bodyBuilder.build()); Map<String, Object> hints = Collections.emptyMap(); this.writer.write(result, null, MediaType.MULTIPART_FORM_DATA, this.response, hints).block(); }
@Test public void bufferSizeReactorUnboundedQueue() { UnicastProcessor processor = UnicastProcessor.create( Queues.unbounded(2).get()); assertThat(processor.getBufferSize()).isEqualTo(Integer.MAX_VALUE); }
@Test public void createOverrideQueue() { Queue<Integer> queue = Queues.<Integer>get(10).get(); UnicastProcessor<Integer> processor = UnicastProcessor.create(queue); assertProcessor(processor, queue, null, null); }
@Test public void createOverrideQueueOnTerminate() { Disposable onTerminate = () -> {}; Queue<Integer> queue = Queues.<Integer>get(10).get(); UnicastProcessor<Integer> processor = UnicastProcessor.create(queue, onTerminate); assertProcessor(processor, queue, null, onTerminate); }
@Test public void createOverrideAll() { Disposable onTerminate = () -> {}; Consumer<? super Integer> onOverflow = t -> {}; Queue<Integer> queue = Queues.<Integer>get(10).get(); UnicastProcessor<Integer> processor = UnicastProcessor.create(queue, onOverflow, onTerminate); assertProcessor(processor, queue, onOverflow, onTerminate); }
@Test // SPR-16402 public void singleSubscriberWithResource() throws IOException { UnicastProcessor<Resource> processor = UnicastProcessor.create(); Resource logo = new ClassPathResource("/org/springframework/http/converter/logo.jpg"); Mono.just(logo).subscribe(processor); MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder(); bodyBuilder.asyncPart("logo", processor, Resource.class); Mono<MultiValueMap<String, HttpEntity<?>>> result = Mono.just(bodyBuilder.build()); Map<String, Object> hints = Collections.emptyMap(); this.writer.write(result, null, MediaType.MULTIPART_FORM_DATA, this.response, hints).block(); MultiValueMap<String, Part> requestParts = parse(hints); assertEquals(1, requestParts.size()); Part part = requestParts.getFirst("logo"); assertEquals("logo", part.name()); assertTrue(part instanceof FilePart); assertEquals("logo.jpg", ((FilePart) part).filename()); assertEquals(MediaType.IMAGE_JPEG, part.headers().getContentType()); assertEquals(logo.getFile().length(), part.headers().getContentLength()); }
@Test public void asyncFusionAvailable() { AssertSubscriber<Integer> ts = AssertSubscriber.create(); UnicastProcessor.create(Queues.<Integer>get(2).get()) .doOnNext(v -> { }) .subscribe(ts); Subscription s = ts.upstream(); Assert.assertTrue("Non-fuseable upstream" + s, s instanceof Fuseable.QueueSubscription); }
@Test public void asyncFusionAvailable() { AssertSubscriber<Integer> ts = AssertSubscriber.create(); UnicastProcessor.create(Queues.<Integer>get(2).get()) .doOnNext(v -> { }) .subscribe(ts); Subscription s = ts.upstream(); Assert.assertTrue("Non-fuseable upstream" + s, s instanceof Fuseable.QueueSubscription); }
@Test public void failNextIfTerminatedTakeFused() { UnicastProcessor<Integer> up = UnicastProcessor.create(); Hooks.onNextDropped(t -> assertThat(t).isEqualTo(1)); StepVerifier.create(up.take(2)) .then(() -> up.actual.onComplete()) .then(() -> up.actual.onNext(1)) .verifyComplete(); Hooks.resetOnNextDropped(); }
@SuppressWarnings("unchecked") final StepVerifier.Step<O> inputFusedError(OperatorScenario<I, PI, O, PO> scenario) { UnicastProcessor<I> up = UnicastProcessor.create(); return StepVerifier.create(scenario.body() .apply(up.as(f -> withFluxSource(new FluxFuseableExceptionOnPoll<>( f, exception()))))) .then(testUnicastDropPath(scenario, up)); }
@Test public void disconnectedBlackboxProcessor(){ UnicastProcessor<Integer> upstream = UnicastProcessor.create(); FluxProcessor<Integer, Integer> processor = FluxProcessor.wrap(upstream, Flux.just(1)); StepVerifier.create(processor) .expectNext(1) .verifyComplete(); }
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 symmetricBlackboxProcessor(){ UnicastProcessor<Integer> upstream = UnicastProcessor.create(); FluxProcessor<Integer, Integer> processor = FluxProcessor.wrap(upstream, upstream); StepVerifier.create(processor) .then(() -> Flux.just(1).subscribe(processor)) .expectNext(1) .verifyComplete(); }
@Test public void takeFusedAsync() { UnicastProcessor<String> up = UnicastProcessor.create(); StepVerifier.create(up.take(2)) .expectFusion(Fuseable.ASYNC) .then(() -> { up.onNext("test"); up.onNext("test2"); }) .expectNext("test", "test2") .verifyComplete(); }
@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 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(); }