1919import java .net .URI ;
2020import java .nio .ByteBuffer ;
2121import java .nio .charset .StandardCharsets ;
22+ import java .util .Arrays ;
2223import java .util .List ;
2324import java .util .NoSuchElementException ;
2425
4546
4647/**
4748 * Tests for {@link JettyWebSocketSession}.
48- *
4949 * @author Max Guiking
5050 */
5151class JettyWebSocketSessionTests {
5252
53- private final DefaultDataBufferFactory bufferFactory = DefaultDataBufferFactory .sharedInstance ;
54-
55- private final Session jettySession = mock (Session .class );
53+ private final Session nativeSession = mock (Session .class );
5654
57- private final JettyWebSocketSession session = new JettyWebSocketSession (this . jettySession ,
58- new HandshakeInfo (URI .create ("ws://example.org" ), new HttpHeaders (), Mono . empty (), null ),
59- this . bufferFactory );
55+ private final JettyWebSocketSession webSocketSession = new JettyWebSocketSession (
56+ this . nativeSession , new HandshakeInfo (URI .create ("ws://example.org" ),
57+ new HttpHeaders (), Mono . empty (), null ), DefaultDataBufferFactory . sharedInstance );
6058
6159
6260 @ Test
63- void sendBinaryMessageWithSingleFragmentMarksFragmentAsLast () {
61+ void sendBinaryMessageWithSingleBuffer () {
6462 succeedOnSendPartialBinary ();
6563
66- DataBuffer payload = this . bufferFactory .wrap ("hello" .getBytes (StandardCharsets .UTF_8 ));
64+ DataBuffer payload = DefaultDataBufferFactory . sharedInstance .wrap ("hello" .getBytes (StandardCharsets .UTF_8 ));
6765 WebSocketMessage message = new WebSocketMessage (WebSocketMessage .Type .BINARY , payload );
6866
69- this .session .sendMessage (message ).block ();
67+ this .webSocketSession .sendMessage (message ).block ();
7068
71- ArgumentCaptor <Boolean > lastCaptor = ArgumentCaptor .forClass (Boolean .class );
72- verify (this .jettySession ).sendPartialBinary (any (ByteBuffer .class ), lastCaptor .capture (), any (Callback .class ));
73- assertThat (lastCaptor .getValue ()). as ( "FIN bit must be set for the final (and only) fragment" ).isTrue ();
69+ ArgumentCaptor <Boolean > last = ArgumentCaptor .forClass (Boolean .class );
70+ verify (this .nativeSession ).sendPartialBinary (any (ByteBuffer .class ), last .capture (), any (Callback .class ));
71+ assertThat (last .getValue ()).isTrue ();
7472 }
7573
7674 @ Test
77- void sendBinaryMessageWithMultipleFragmentsMarksOnlyFinalFragmentAsLast () {
75+ void sendBinaryMessageWithMultipleBuffers () {
7876 succeedOnSendPartialBinary ();
7977
80- List < ByteBuffer > fragments = List . of (
78+ WebSocketMessage message = new WebSocketMessage ( WebSocketMessage . Type . BINARY , new MultiBufferDataBuffer (
8179 ByteBuffer .wrap ("one" .getBytes (StandardCharsets .UTF_8 )),
8280 ByteBuffer .wrap ("two" .getBytes (StandardCharsets .UTF_8 )),
83- ByteBuffer .wrap ("three" .getBytes (StandardCharsets .UTF_8 )));
84- WebSocketMessage message = new WebSocketMessage (WebSocketMessage .Type .BINARY ,
85- new MultiBufferDataBuffer (this .bufferFactory , fragments ));
81+ ByteBuffer .wrap ("three" .getBytes (StandardCharsets .UTF_8 ))));
8682
87- this .session .sendMessage (message ).block ();
83+ this .webSocketSession .sendMessage (message ).block ();
8884
89- ArgumentCaptor <Boolean > lastCaptor = ArgumentCaptor .forClass (Boolean .class );
90- verify (this .jettySession , times (fragments .size ()))
91- .sendPartialBinary (any (ByteBuffer .class ), lastCaptor .capture (), any (Callback .class ));
92- assertThat (lastCaptor .getAllValues ()).containsExactly (false , false , true );
85+ ArgumentCaptor <Boolean > last = ArgumentCaptor .forClass (Boolean .class );
86+ verify (this .nativeSession , times (3 )).sendPartialBinary (any (ByteBuffer .class ), last .capture (), any (Callback .class ));
87+ assertThat (last .getAllValues ()).containsExactly (false , false , true );
9388 }
9489
9590 private void succeedOnSendPartialBinary () {
9691 doAnswer (invocation -> {
9792 Callback callback = invocation .getArgument (2 );
9893 callback .succeed ();
9994 return null ;
100- }).when (this .jettySession ).sendPartialBinary (any (ByteBuffer .class ), anyBoolean (), any (Callback .class ));
95+ }).when (this .nativeSession ).sendPartialBinary (any (ByteBuffer .class ), anyBoolean (), any (Callback .class ));
10196 }
10297
10398
10499 /**
105- * Minimal {@link DataBuffer} whose {@link #readableByteBuffers()} yields a
106- * caller-supplied list of buffers, exercising the multi-fragment branch of
107- * {@link JettyWebSocketSession#sendMessage(WebSocketMessage)}.
100+ * Minimal DataBuffer that returns a given list of buffers from {@link #readableByteBuffers()}.
108101 */
109102 private static final class MultiBufferDataBuffer extends DataBufferWrapper {
110103
111104 private final List <ByteBuffer > buffers ;
112105
113- MultiBufferDataBuffer (DefaultDataBufferFactory factory , List < ByteBuffer > buffers ) {
114- super (factory .allocateBuffer (0 ));
115- this .buffers = buffers ;
106+ MultiBufferDataBuffer (ByteBuffer ... buffers ) {
107+ super (DefaultDataBufferFactory . sharedInstance .allocateBuffer (0 ));
108+ this .buffers = Arrays . asList ( buffers ) ;
116109 }
117110
118111 @ Override
@@ -123,7 +116,7 @@ public DataBuffer.ByteBufferIterator readableByteBuffers() {
123116
124117 @ Override
125118 public boolean hasNext () {
126- return this .index < MultiBufferDataBuffer .this .buffers .size ();
119+ return ( this .index < MultiBufferDataBuffer .this .buffers .size () );
127120 }
128121
129122 @ Override
0 commit comments