Support splitting STOMP messages in WebSocketStompClient
See gh-31970
This commit is contained in:
@@ -65,6 +65,7 @@ import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||
* Tests for {@link WebSocketStompClient}.
|
||||
*
|
||||
* @author Rossen Stoyanchev
|
||||
* @author Injae Kim
|
||||
*/
|
||||
@MockitoSettings(strictness = Strictness.LENIENT)
|
||||
class WebSocketStompClientTests {
|
||||
@@ -211,6 +212,29 @@ class WebSocketStompClientTests {
|
||||
assertThat(textMessage.getPayload()).isEqualTo("SEND\ndestination:/topic/foo\ncontent-length:7\n\npayload\0");
|
||||
}
|
||||
|
||||
@Test
|
||||
void sendWebSocketMessageExceedOutboundMessageSizeLimit() throws Exception {
|
||||
stompClient.setOutboundMessageSizeLimit(30);
|
||||
StompHeaderAccessor accessor = StompHeaderAccessor.create(StompCommand.SEND);
|
||||
accessor.setDestination("/topic/foo");
|
||||
byte[] payload = "payload".getBytes(StandardCharsets.UTF_8);
|
||||
|
||||
getTcpConnection().sendAsync(MessageBuilder.createMessage(payload, accessor.getMessageHeaders()));
|
||||
|
||||
ArgumentCaptor<TextMessage> textMessageCaptor = ArgumentCaptor.forClass(TextMessage.class);
|
||||
verify(this.webSocketSession, times(2)).sendMessage(textMessageCaptor.capture());
|
||||
TextMessage textMessage = textMessageCaptor.getAllValues().get(0);
|
||||
assertThat(textMessage).isNotNull();
|
||||
assertThat(textMessage.getPayload()).isEqualTo("SEND\ndestination:/topic/foo\nco");
|
||||
assertThat(textMessage.getPayload().getBytes().length).isEqualTo(30);
|
||||
|
||||
textMessage = textMessageCaptor.getAllValues().get(1);
|
||||
assertThat(textMessage).isNotNull();
|
||||
assertThat(textMessage.getPayload()).isEqualTo("ntent-length:7\n\npayload\0");
|
||||
assertThat(textMessage.getPayload().getBytes().length).isEqualTo(24);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
void sendWebSocketBinary() throws Exception {
|
||||
StompHeaderAccessor accessor = StompHeaderAccessor.create(StompCommand.SEND);
|
||||
@@ -228,6 +252,49 @@ class WebSocketStompClientTests {
|
||||
.isEqualTo("SEND\ndestination:/b\ncontent-type:application/octet-stream\ncontent-length:7\n\npayload\0");
|
||||
}
|
||||
|
||||
@Test
|
||||
void sendWebSocketBinaryExceedOutboundMessageSizeLimit() throws Exception {
|
||||
stompClient.setOutboundMessageSizeLimit(50);
|
||||
StompHeaderAccessor accessor = StompHeaderAccessor.create(StompCommand.SEND);
|
||||
accessor.setDestination("/b");
|
||||
accessor.setContentType(MimeTypeUtils.APPLICATION_OCTET_STREAM);
|
||||
byte[] payload = "payload".getBytes(StandardCharsets.UTF_8);
|
||||
|
||||
getTcpConnection().sendAsync(MessageBuilder.createMessage(payload, accessor.getMessageHeaders()));
|
||||
|
||||
ArgumentCaptor<BinaryMessage> binaryMessageCaptor = ArgumentCaptor.forClass(BinaryMessage.class);
|
||||
verify(this.webSocketSession, times(2)).sendMessage(binaryMessageCaptor.capture());
|
||||
BinaryMessage binaryMessage = binaryMessageCaptor.getAllValues().get(0);
|
||||
assertThat(binaryMessage).isNotNull();
|
||||
assertThat(new String(binaryMessage.getPayload().array(), StandardCharsets.UTF_8))
|
||||
.isEqualTo("SEND\ndestination:/b\ncontent-type:application/octet");
|
||||
assertThat(binaryMessage.getPayload().array().length).isEqualTo(50);
|
||||
|
||||
binaryMessage = binaryMessageCaptor.getAllValues().get(1);
|
||||
assertThat(binaryMessage).isNotNull();
|
||||
assertThat(new String(binaryMessage.getPayload().array(), StandardCharsets.UTF_8))
|
||||
.isEqualTo("-stream\ncontent-length:7\n\npayload\0");
|
||||
assertThat(binaryMessage.getPayload().array().length).isEqualTo(34);
|
||||
}
|
||||
|
||||
@Test
|
||||
void reassembleReceivedIFragmentedFrames() throws Exception {
|
||||
WebSocketHandler handler = connect();
|
||||
handler.handleMessage(this.webSocketSession, new TextMessage("SEND\ndestination:/topic/foo\nco"));
|
||||
handler.handleMessage(this.webSocketSession, new TextMessage("ntent-length:7\n\npayload\0"));
|
||||
|
||||
ArgumentCaptor<Message> receiveMessageCaptor = ArgumentCaptor.forClass(Message.class);
|
||||
verify(this.stompSession).handleMessage(receiveMessageCaptor.capture());
|
||||
Message<byte[]> receiveMessage = receiveMessageCaptor.getValue();
|
||||
assertThat(receiveMessage).isNotNull();
|
||||
|
||||
StompHeaderAccessor headers = StompHeaderAccessor.wrap(receiveMessage);
|
||||
assertThat(headers.toNativeHeaderMap()).hasSize(2);
|
||||
assertThat(headers.getContentLength()).isEqualTo(7);
|
||||
assertThat(headers.getDestination()).isEqualTo("/topic/foo");
|
||||
assertThat(new String(receiveMessage.getPayload())).isEqualTo("payload");
|
||||
}
|
||||
|
||||
@Test
|
||||
void heartbeatDefaultValue() {
|
||||
WebSocketStompClient stompClient = new WebSocketStompClient(mock());
|
||||
|
||||
Reference in New Issue
Block a user