/** * Synchronizes the execution of two {@link Runnable} as much as possible * to test race conditions. The method blocks until both have run to completion. * @param r1 the first runnable * @param r2 the second runnable */ public static void race(final Runnable r1, final Runnable r2) { race(r1, r2, Schedulers.single()); }
@Override public void onSubscribe(Subscription s) { Schedulers.single().schedule(() -> finish(s), 5000, TimeUnit.MILLISECONDS); s.request(Long.MAX_VALUE); }
@Test public void error() { StepVerifier.create(Mono.error(new RuntimeException("forced failure")) .publishOn(Schedulers.single())) .verifyErrorMessage("forced failure"); }
@Test public void bufferLimit() { StepVerifier.create(Flux.range(1, 5) .onBackpressureBuffer(Duration.ofMinutes(1), 1, this, Schedulers.single()), 0) .expectSubscription() .expectNoEvent(Duration.ofMillis(100)) .thenRequest(1) .expectNext(5) .verifyComplete(); assertThat(evicted).containsExactly(1, 2, 3, 4); }
@Test public void callableReturnsNull() { StepVerifier.create(Mono.empty() .flux() .subscribeOn(Schedulers.single())) .verifyComplete(); }
@Test public void depthCancelRace() { for (int i = 0; i < 1000; i++) { final AssertSubscriber<Integer> ts = AssertSubscriber.create(0); Mono.just(0) .expandDeep(countDown) .subscribe(ts); Runnable r1 = () -> ts.request(1); Runnable r2 = ts::cancel; RaceTestUtils.race(r1, r2, Schedulers.single()); } }
@Test public void callableReturnsNullFused() { StepVerifier.create(Mono.empty() .flux() .subscribeOn(Schedulers.single())) .expectFusion(Fuseable.ASYNC) .verifyComplete(); }
@Test public void errorHide() { StepVerifier.create(Mono.error(new RuntimeException("forced failure")) .hide() .publishOn(Schedulers.single())) .verifyErrorMessage("forced failure"); } }
@Test public void normal2SingleStep() { StepVerifier.create(Flux.range(1, 5) .onBackpressureBuffer(Duration.ofMinutes(1), Integer.MAX_VALUE, v -> {}, Schedulers.single()) .limitRate(1)) .expectNext(1, 2, 3, 4, 5) .verifyComplete(); }
@Test public void normal4SingleStep() { StepVerifier.create(Flux.range(1, 5) .onBackpressureBuffer(Duration.ofMinutes(1), Integer.MAX_VALUE, this, Schedulers.single()) .limitRate(1)) .expectNext(1, 2, 3, 4, 5) .verifyComplete(); }
@Test public void enableProvidedAllSchedulerIdempotent() { VirtualTimeScheduler vts = VirtualTimeScheduler.create(); VirtualTimeScheduler.getOrSet(vts); Assert.assertSame(vts, uncache(Schedulers.single())); Assert.assertFalse(vts.shutdown); VirtualTimeScheduler.getOrSet(vts); Assert.assertSame(vts, uncache(Schedulers.single())); Assert.assertFalse(vts.shutdown); }
@Test public void completeCancelRace() { for (int i = 0; i < 500; i++) { final MonoSubscriber<Integer, Integer> ds = new MonoSubscriber<>(new AssertSubscriber<>()); Runnable r1 = () -> ds.complete(1); Runnable r2 = ds::cancel; race(r1, r2, Schedulers.single()); } }
@Test public void callableReturnsNull3() { StepVerifier.create(Mono.fromCallable(() -> null) .flux() .subscribeOn(Schedulers.single()), 1) .verifyComplete(); }
@Test public void callableReturnsNullFused2() { StepVerifier.create(Mono.fromCallable(() -> null) .flux() .subscribeOn(Schedulers.single()) .doOnNext(v -> System.out.println(v)), 1) .expectFusion(Fuseable.ASYNC) .thenRequest(1) .verifyComplete(); }
@Test public void depthCancelRace() { for (int i = 0; i < 1000; i++) { final AssertSubscriber<Integer> ts = AssertSubscriber.create(0); Flux.just(0) .expandDeep(countDown) .subscribe(ts); Runnable r1 = () -> ts.request(1); Runnable r2 = ts::cancel; RaceTestUtils.race(r1, r2, Schedulers.single()); } }
@Test public void normalBackpressured() { StepVerifier.withVirtualTime( () -> Mono.fromCallable(() -> 1).subscribeOn(Schedulers.single()), 0) .expectSubscription() .expectNoEvent(Duration.ofSeconds(1)) .thenRequest(1) .thenAwait() .expectNext(1) .expectComplete() .verify(); }
@Test public void normal() { StepVerifier.create(Mono.fromCallable(() -> 1) .flux() .subscribeOn(Schedulers.single())) .expectNext(1) .expectComplete() .verify(); }
@Test public void prematureCancel2() { StepVerifier.create(Flux.range(1, 10000) .flatMap(Flux::just, 2) .cancelOn(Schedulers.single()), 1) .expectNext(1) .thenRequest(2) .expectNext(2, 3) .thenCancel() .verify(); }