package com.ankurm.vthreadswebflux; import org.junit.jupiter.api.Test; import reactor.test.StepVerifier; import java.time.Duration; /** * Proves the backpressure claim in docs/01-webflux-benchmark-methodology.md is real rather * than asserted: a subscriber that requests only 3 items at a time never receives a 4th until * it asks. StepVerifier.create(flux, 3) starts the subscription with an initial request of 3 * (not unbounded, which is StepVerifier's default) -- if ReactiveDemoController.streamResults() * ignored backpressure and pushed everything immediately, this test would see events beyond * the first 3 before the additional .thenRequest(...) calls run, and StepVerifier would fail * the sequence. * * Output: docs/output/04-stream-backpressure.txt. */ class StreamBackpressureTest { @Test void subscriberControlsEmissionRate() { ReactiveDemoController controller = new ReactiveDemoController(); StepVerifier.create(controller.streamResults(), 3) .expectNext("event-0", "event-1", "event-2") .expectNoEvent(Duration.ofMillis(80)) // no 4th item until we ask for one .thenRequest(2) .expectNext("event-3", "event-4") .thenRequest(45) .expectNextCount(45) .expectComplete() .verify(Duration.ofSeconds(10)); Transcript t = Transcript.start("04-stream-backpressure.txt", "Flux backpressure proof: /stream, requested in batches of 3, 2, then 45"); t.line("StepVerifier.create(controller.streamResults(), 3)"); t.line(" .expectNext(\"event-0\", \"event-1\", \"event-2\")"); t.line(" .expectNoEvent(Duration.ofMillis(80)) -- no 4th item arrives without a request"); t.line(" .thenRequest(2).expectNext(\"event-3\", \"event-4\")"); t.line(" .thenRequest(45).expectNextCount(45)"); t.line(" .expectComplete()"); t.blank(); t.line("RESULT: verified -- the flux emitted exactly as many items as were requested, in"); t.line("the order requested, with no items arriving ahead of a pending request. This is"); t.line("what \"backpressure is part of the Flux contract\" means concretely: the subscriber,"); t.line("not the producer, controls the emission rate."); t.save(); } }