@Before public void virtualTime(){ VirtualTimeScheduler.getOrSet(); }
@Before public void vtsStart() { //delayElements (notably) now uses parallel() so VTS must be enabled everywhere vts = VirtualTimeScheduler.getOrSet(); }
@Test public void virtualTimeSchedulerUseExactlySupplied() { VirtualTimeScheduler vts1 = VirtualTimeScheduler.create(); VirtualTimeScheduler vts2 = VirtualTimeScheduler.create(); VirtualTimeScheduler.getOrSet(vts1); StepVerifier.withVirtualTime(Mono::empty, () -> vts2, Long.MAX_VALUE) .then(() -> assertThat(VirtualTimeScheduler.get()).isSameAs(vts2)) .verifyComplete(); assertThat(vts1.isDisposed()).isFalse(); assertThat(vts2.isDisposed()).isTrue(); assertThat(VirtualTimeScheduler.isFactoryEnabled()).isFalse(); }
@Test public void downstreamDemandShouldBeAbleToDecreaseOnTimeSpan() { Subscription[] subscriptionsHolder = new Subscription[1]; CoreSubscriber<List<String>> actual = new LambdaSubscriber<>(null, e -> {}, null, s -> subscriptionsHolder[0] = s); VirtualTimeScheduler timeScheduler = VirtualTimeScheduler.getOrSet(); FluxBufferTimeout.BufferTimeoutSubscriber<String, List<String>> test = new FluxBufferTimeout.BufferTimeoutSubscriber<String, List<String>>( actual, 5, 100, timeScheduler.createWorker(), ArrayList::new); Subscription subscription = Operators.emptySubscription(); test.onSubscribe(subscription); subscriptionsHolder[0].request(1); assertThat(test.scan(Scannable.Attr.REQUESTED_FROM_DOWNSTREAM)).isEqualTo(1L); timeScheduler.advanceTimeBy(Duration.ofMillis(100)); assertThat(test.scan(Scannable.Attr.REQUESTED_FROM_DOWNSTREAM)).isEqualTo(1L); test.onNext(String.valueOf("0")); timeScheduler.advanceTimeBy(Duration.ofMillis(100)); assertThat(test.scan(Scannable.Attr.REQUESTED_FROM_DOWNSTREAM)).isEqualTo(0L); }
@Test public void enableTwoSimilarSchedulersUsesFirst() { VirtualTimeScheduler vts1 = VirtualTimeScheduler.create(); VirtualTimeScheduler vts2 = VirtualTimeScheduler.create(); VirtualTimeScheduler firstEnableResult = VirtualTimeScheduler.getOrSet(vts1); VirtualTimeScheduler secondEnableResult = VirtualTimeScheduler.getOrSet(vts2); Assert.assertSame(vts1, firstEnableResult); Assert.assertSame(vts1, secondEnableResult); Assert.assertSame(vts1, uncache(Schedulers.single())); Assert.assertFalse(vts1.shutdown); }
@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 timedError() throws Exception { VirtualTimeScheduler.getOrSet(); ReplayProcessor<Integer> rp = ReplayProcessor.createTimeout(Duration.ofSeconds(1)); for (int i = 0; i < 5; i++) { rp.onNext(i); } VirtualTimeScheduler.get().advanceTimeBy(Duration.ofSeconds(2)); for (int i = 5; i < 10; i++) { rp.onNext(i); } rp.onError(new Exception("test")); StepVerifier.create(rp.hide()) .expectNext(5,6,7,8,9) .verifyErrorMessage("test"); }
@Test public void timedFusedError() throws Exception { VirtualTimeScheduler.getOrSet(); ReplayProcessor<Integer> rp = ReplayProcessor.createTimeout(Duration.ofSeconds(1)); for (int i = 0; i < 5; i++) { rp.onNext(i); } VirtualTimeScheduler.get().advanceTimeBy(Duration.ofSeconds(2)); for (int i = 5; i < 10; i++) { rp.onNext(i); } rp.onError(new Exception("test")); StepVerifier.create(rp) .expectFusion(Fuseable.NONE) .expectNext(5,6,7,8,9) .verifyErrorMessage("test"); }
@Test public void timedFused() throws Exception { VirtualTimeScheduler.getOrSet(); ReplayProcessor<Integer> rp = ReplayProcessor.createTimeout(Duration.ofSeconds(1)); for (int i = 0; i < 5; i++) { rp.onNext(i); } VirtualTimeScheduler.get().advanceTimeBy(Duration.ofSeconds(2)); for (int i = 5; i < 10; i++) { rp.onNext(i); } rp.onComplete(); StepVerifier.create(rp) .expectFusion(Fuseable.NONE) .expectNext(5,6,7,8,9) .verifyComplete(); }
@Test public void timed() throws Exception { VirtualTimeScheduler.getOrSet(); ReplayProcessor<Integer> rp = ReplayProcessor.createTimeout(Duration.ofSeconds(1)); for (int i = 0; i < 5; i++) { rp.onNext(i); } VirtualTimeScheduler.get().advanceTimeBy(Duration.ofSeconds(2)); for (int i = 5; i < 10; i++) { rp.onNext(i); } rp.onComplete(); StepVerifier.create(rp.hide()) .expectFusion(Fuseable.NONE) .expectNext(5,6,7,8,9) .verifyComplete(); }
@Test(timeout = 4000) public void manuallyManagedVirtualTime() { VirtualTimeScheduler vts = VirtualTimeScheduler.create(); try { VirtualTimeScheduler.getOrSet(vts); assertThat(VirtualTimeScheduler.get()).isSameAs(vts); Flux<String> flux = Flux.just("foo").delayElements(Duration.ofSeconds(4)); DefaultVerifySubscriber<String> s = new DefaultStepVerifierBuilder<String>(StepVerifierOptions.create() .initialRequest(Long.MAX_VALUE) .virtualTimeSchedulerSupplier(() -> vts), null)//important to avoid triggering of vts capture-and-enable .thenAwait(Duration.ofSeconds(1)) .expectNext("foo") .expectComplete() .toSubscriber(); flux.subscribe(s); vts.advanceTimeBy(Duration.ofSeconds(3)); s.verify(); assertThat(s.virtualTimeScheduler()).isSameAs(vts); assertThat(VirtualTimeScheduler.get()).isSameAs(vts); } finally { VirtualTimeScheduler.reset(); } }
@Test public void allEnabled() { Assert.assertFalse(Schedulers.newParallel("") instanceof VirtualTimeScheduler); Assert.assertFalse(Schedulers.newElastic("") instanceof VirtualTimeScheduler); Assert.assertFalse(Schedulers.newSingle("") instanceof VirtualTimeScheduler); VirtualTimeScheduler.getOrSet(); Assert.assertTrue(Schedulers.newParallel("") instanceof VirtualTimeScheduler); Assert.assertTrue(Schedulers.newElastic("") instanceof VirtualTimeScheduler); Assert.assertTrue(Schedulers.newSingle("") instanceof VirtualTimeScheduler); VirtualTimeScheduler t = VirtualTimeScheduler.get(); Assert.assertSame(Schedulers.newParallel(""), t); Assert.assertSame(Schedulers.newElastic(""), t); Assert.assertSame(Schedulers.newSingle(""), t); }