/** * Returns a test instance of {@link RequestStreamFrame}. * * @return a test instance of {@link RequestStreamFrame} */ public static RequestStreamFrame createTestRequestStreamFrame() { return createRequestStreamFrame(DEFAULT, false, 1, (ByteBuf) null, null); }
public static RequestStreamFrame createTestRequestStreamFrame() { return createRequestStreamFrame(DEFAULT, false, 1, (ByteBuf) null, null); }
@Override public RequestStreamFrame createFragment( ByteBufAllocator byteBufAllocator, @Nullable ByteBuf metadata, @Nullable ByteBuf data) { return createRequestStreamFrame(byteBufAllocator, true, getInitialRequestN(), metadata, data); }
@Override public RequestStreamFrame createNonFragment( ByteBufAllocator byteBufAllocator, @Nullable ByteBuf metadata, @Nullable ByteBuf data) { return createRequestStreamFrame(byteBufAllocator, false, getInitialRequestN(), metadata, data); }
/** * Creates the {@code REQUEST_STREAM} frame. * * @param byteBufAllocator the {@code ByteBufAllocator} to use * @param follows whether to set the Follows flag * @param initialRequestN the initial requestN * @param metadata the metadata * @param data the data * @return the {@code REQUEST_STREAM} frame * @throws NullPointerException if {@code byteBufAllocator} is {@code null} */ public static RequestStreamFrame createRequestStreamFrame( ByteBufAllocator byteBufAllocator, boolean follows, int initialRequestN, @Nullable String metadata, @Nullable String data) { ByteBuf metadataByteBuf = getUtf8AsByteBuf(metadata); ByteBuf dataByteBuf = getUtf8AsByteBuf(data); try { return createRequestStreamFrame( byteBufAllocator, follows, initialRequestN, metadataByteBuf, dataByteBuf); } finally { release(metadataByteBuf); release(dataByteBuf); } }
@DisplayName("reassembles data") @Test void reassembleData() { ByteBuf data = getRandomByteBuf(6); RequestStreamFrame frame = createRequestStreamFrame(DEFAULT, false, 1, null, data); RequestStreamFrame fragment1 = createRequestStreamFrame(DEFAULT, true, 1, null, data.slice(0, 2)); PayloadFrame fragment2 = createPayloadFrame(DEFAULT, true, false, null, data.slice(2, 2)); PayloadFrame fragment3 = createPayloadFrame(DEFAULT, false, false, null, data.slice(4, 2)); FrameReassembler frameReassembler = createFrameReassembler(DEFAULT); assertThat(frameReassembler.reassemble(fragment1)).isNull(); assertThat(frameReassembler.reassemble(fragment2)).isNull(); assertThat(frameReassembler.reassemble(fragment3)).isEqualTo(frame); }
@DisplayName("reassembles metadata") @Test void reassembleMetadata() { ByteBuf metadata = getRandomByteBuf(6); RequestStreamFrame frame = createRequestStreamFrame(DEFAULT, false, 1, metadata, null); RequestStreamFrame fragment1 = createRequestStreamFrame(DEFAULT, true, 1, metadata.slice(0, 2), null); PayloadFrame fragment2 = createPayloadFrame(DEFAULT, true, true, metadata.slice(2, 2), null); PayloadFrame fragment3 = createPayloadFrame(DEFAULT, false, true, metadata.slice(4, 2), null); FrameReassembler frameReassembler = createFrameReassembler(DEFAULT); assertThat(frameReassembler.reassemble(fragment1)).isNull(); assertThat(frameReassembler.reassemble(fragment2)).isNull(); assertThat(frameReassembler.reassemble(fragment3)).isEqualTo(frame); }
@DisplayName( "createRequestStreamFrame throws IllegalArgumentException with invalid initialRequestN") @Test void createRequestStreamFrameInvalidInitialRequestN() { assertThatIllegalArgumentException() .isThrownBy(() -> createRequestStreamFrame(DEFAULT, false, 0, (ByteBuf) null, null)) .withMessage("initialRequestN must be positive"); }
@DisplayName("createRequestStreamFrame throws NullPointerException with null byteBufAllocator") @Test void createRequestStreamFrameNullByteBufAllocator() { assertThatNullPointerException() .isThrownBy(() -> createRequestStreamFrame(null, false, 100, (ByteBuf) null, null)) .withMessage("byteBufAllocator must not be null"); }
return createRequestFireAndForgetFrame(byteBuf); case REQUEST_STREAM: return createRequestStreamFrame(byteBuf); case REQUEST_CHANNEL: return createRequestChannelFrame(byteBuf);
@DisplayName("reassembles metadata and data") @Test void reassembleMetadataAndData() { ByteBuf metadata = getRandomByteBuf(5); ByteBuf data = getRandomByteBuf(5); RequestStreamFrame frame = createRequestStreamFrame(DEFAULT, false, 1, metadata, data); RequestStreamFrame fragment1 = createRequestStreamFrame(DEFAULT, true, 1, metadata.slice(0, 2), null); PayloadFrame fragment2 = createPayloadFrame(DEFAULT, true, true, metadata.slice(2, 2), null); PayloadFrame fragment3 = createPayloadFrame(DEFAULT, true, false, metadata.slice(4, 1), data.slice(0, 1)); PayloadFrame fragment4 = createPayloadFrame(DEFAULT, true, false, null, data.slice(1, 2)); PayloadFrame fragment5 = createPayloadFrame(DEFAULT, false, false, null, data.slice(3, 2)); FrameReassembler frameReassembler = createFrameReassembler(DEFAULT); assertThat(frameReassembler.reassemble(fragment1)).isNull(); assertThat(frameReassembler.reassemble(fragment2)).isNull(); assertThat(frameReassembler.reassemble(fragment3)).isNull(); assertThat(frameReassembler.reassemble(fragment4)).isNull(); assertThat(frameReassembler.reassemble(fragment5)).isEqualTo(frame); }
@DisplayName("reassembles data") @Test void reassembleData() { ByteBuf data = getRandomByteBuf(6); Frame frame = toAbstractionLeakingFrame( DEFAULT, 1, createRequestStreamFrame(DEFAULT, false, 1, null, data)); Frame fragment1 = toAbstractionLeakingFrame( DEFAULT, 1, createRequestStreamFrame(DEFAULT, true, 1, null, data.slice(0, 2))); Frame fragment2 = toAbstractionLeakingFrame( DEFAULT, 1, createPayloadFrame(DEFAULT, true, false, null, data.slice(2, 2))); Frame fragment3 = toAbstractionLeakingFrame( DEFAULT, 1, createPayloadFrame(DEFAULT, false, false, null, data.slice(4, 2))); when(delegate.receive()).thenReturn(Flux.just(fragment1, fragment2, fragment3)); when(delegate.onClose()).thenReturn(Mono.never()); new FragmentationDuplexConnection(DEFAULT, delegate, 2) .receive() .as(StepVerifier::create) .expectNext(frame) .verifyComplete(); }
@DisplayName("reassembles metadata") @Test void reassembleMetadata() { ByteBuf metadata = getRandomByteBuf(6); Frame frame = toAbstractionLeakingFrame( DEFAULT, 1, createRequestStreamFrame(DEFAULT, false, 1, metadata, null)); Frame fragment1 = toAbstractionLeakingFrame( DEFAULT, 1, createRequestStreamFrame(DEFAULT, true, 1, metadata.slice(0, 2), null)); Frame fragment2 = toAbstractionLeakingFrame( DEFAULT, 1, createPayloadFrame(DEFAULT, true, true, metadata.slice(2, 2), null)); Frame fragment3 = toAbstractionLeakingFrame( DEFAULT, 1, createPayloadFrame(DEFAULT, false, true, metadata.slice(4, 2), null)); when(delegate.receive()).thenReturn(Flux.just(fragment1, fragment2, fragment3)); when(delegate.onClose()).thenReturn(Mono.never()); new FragmentationDuplexConnection(DEFAULT, delegate, 2) .receive() .as(StepVerifier::create) .expectNext(frame) .verifyComplete(); }
@DisplayName("fragments data") @Test void sendData() { ByteBuf data = getRandomByteBuf(6); Frame frame = toAbstractionLeakingFrame( DEFAULT, 1, createRequestStreamFrame(DEFAULT, false, 1, null, data)); Frame fragment1 = toAbstractionLeakingFrame( DEFAULT, 1, createRequestStreamFrame(DEFAULT, true, 1, null, data.slice(0, 2))); Frame fragment2 = toAbstractionLeakingFrame( DEFAULT, 1, createPayloadFrame(DEFAULT, true, false, null, data.slice(2, 2))); Frame fragment3 = toAbstractionLeakingFrame( DEFAULT, 1, createPayloadFrame(DEFAULT, false, false, null, data.slice(4, 2))); when(delegate.onClose()).thenReturn(Mono.never()); new FragmentationDuplexConnection(DEFAULT, delegate, 2).sendOne(frame.retain()); verify(delegate).send(publishers.capture()); StepVerifier.create(Flux.from(publishers.getValue())) .expectNext(fragment1) .expectNext(fragment2) .expectNext(fragment3) .verifyComplete(); }
@DisplayName("fragments metadata") @Test void sendMetadata() { ByteBuf metadata = getRandomByteBuf(6); Frame frame = toAbstractionLeakingFrame( DEFAULT, 1, createRequestStreamFrame(DEFAULT, false, 1, metadata, null)); Frame fragment1 = toAbstractionLeakingFrame( DEFAULT, 1, createRequestStreamFrame(DEFAULT, true, 1, metadata.slice(0, 2), null)); Frame fragment2 = toAbstractionLeakingFrame( DEFAULT, 1, createPayloadFrame(DEFAULT, true, true, metadata.slice(2, 2), null)); Frame fragment3 = toAbstractionLeakingFrame( DEFAULT, 1, createPayloadFrame(DEFAULT, false, true, metadata.slice(4, 2), null)); when(delegate.onClose()).thenReturn(Mono.never()); new FragmentationDuplexConnection(DEFAULT, delegate, 2).sendOne(frame.retain()); verify(delegate).send(publishers.capture()); StepVerifier.create(Flux.from(publishers.getValue())) .expectNext(fragment1) .expectNext(fragment2) .expectNext(fragment3) .verifyComplete(); }
@DisplayName("fragments metadata") @Test void fragmentMetadata() { ByteBuf metadata = getRandomByteBuf(6); RequestStreamFrame frame = createRequestStreamFrame(DEFAULT, false, 1, metadata, null); RequestStreamFrame fragment1 = createRequestStreamFrame(DEFAULT, true, 1, metadata.slice(0, 2), null); PayloadFrame fragment2 = createPayloadFrame(DEFAULT, true, true, metadata.slice(2, 2), null); PayloadFrame fragment3 = createPayloadFrame(DEFAULT, false, true, metadata.slice(4, 2), null); new FrameFragmenter(DEFAULT, 2) .fragment(frame) .as(StepVerifier::create) .expectNext(fragment1) .expectNext(fragment2) .expectNext(fragment3) .verifyComplete(); }
@DisplayName("fragments data") @Test void fragmentData() { ByteBuf data = getRandomByteBuf(6); RequestStreamFrame frame = createRequestStreamFrame(DEFAULT, false, 1, null, data); RequestStreamFrame fragment1 = createRequestStreamFrame(DEFAULT, true, 1, null, data.slice(0, 2)); PayloadFrame fragment2 = createPayloadFrame(DEFAULT, true, false, null, data.slice(2, 2)); PayloadFrame fragment3 = createPayloadFrame(DEFAULT, false, false, null, data.slice(4, 2)); new FrameFragmenter(DEFAULT, 2) .fragment(frame) .as(StepVerifier::create) .expectNext(fragment1) .expectNext(fragment2) .expectNext(fragment3) .verifyComplete(); }
DEFAULT, 1, createRequestStreamFrame(DEFAULT, false, 1, metadata, data)); DEFAULT, 1, createRequestStreamFrame(DEFAULT, true, 1, metadata.slice(0, 2), null));
DEFAULT, 1, createRequestStreamFrame(DEFAULT, false, 1, metadata, data)); DEFAULT, 1, createRequestStreamFrame(DEFAULT, true, 1, metadata.slice(0, 2), null));
@DisplayName("fragments metadata and data") @Test void fragmentMetadataAndData() { ByteBuf metadata = getRandomByteBuf(5); ByteBuf data = getRandomByteBuf(5); RequestStreamFrame frame = createRequestStreamFrame(DEFAULT, false, 1, metadata, data); RequestStreamFrame fragment1 = createRequestStreamFrame(DEFAULT, true, 1, metadata.slice(0, 2), null); PayloadFrame fragment2 = createPayloadFrame(DEFAULT, true, true, metadata.slice(2, 2), null); PayloadFrame fragment3 = createPayloadFrame(DEFAULT, true, false, metadata.slice(4, 1), data.slice(0, 1)); PayloadFrame fragment4 = createPayloadFrame(DEFAULT, true, false, null, data.slice(1, 2)); PayloadFrame fragment5 = createPayloadFrame(DEFAULT, false, false, null, data.slice(3, 2)); new FrameFragmenter(DEFAULT, 2) .fragment(frame) .as(StepVerifier::create) .expectNext(fragment1) .expectNext(fragment2) .expectNext(fragment3) .expectNext(fragment4) .expectNext(fragment5) .verifyComplete(); }