1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.messaging.simp.stomp;
18
19 import java.nio.ByteBuffer;
20 import java.nio.charset.Charset;
21 import java.util.Collections;
22 import java.util.List;
23
24 import org.junit.Test;
25
26 import org.springframework.messaging.Message;
27
28 import static org.junit.Assert.*;
29
30
31
32
33
34
35
36 public class BufferingStompDecoderTests {
37
38 private final StompDecoder STOMP_DECODER = new StompDecoder();
39
40
41 @Test
42 public void basic() throws InterruptedException {
43 BufferingStompDecoder stompDecoder = new BufferingStompDecoder(STOMP_DECODER, 128);
44 String chunk = "SEND\na:alpha\n\nMessage body\0";
45
46 List<Message<byte[]>> messages = stompDecoder.decode(toByteBuffer(chunk));
47 assertEquals(1, messages.size());
48 assertEquals("Message body", new String(messages.get(0).getPayload()));
49
50 assertEquals(0, stompDecoder.getBufferSize());
51 assertNull(stompDecoder.getExpectedContentLength());
52 }
53
54 @Test
55 public void oneMessageInTwoChunks() throws InterruptedException {
56 BufferingStompDecoder stompDecoder = new BufferingStompDecoder(STOMP_DECODER, 128);
57 String chunk1 = "SEND\na:alpha\n\nMessage";
58 String chunk2 = " body\0";
59
60 List<Message<byte[]>> messages = stompDecoder.decode(toByteBuffer(chunk1));
61 assertEquals(Collections.<Message<byte[]>>emptyList(), messages);
62
63 messages = stompDecoder.decode(toByteBuffer(chunk2));
64 assertEquals(1, messages.size());
65 assertEquals("Message body", new String(messages.get(0).getPayload()));
66
67 assertEquals(0, stompDecoder.getBufferSize());
68 assertNull(stompDecoder.getExpectedContentLength());
69 }
70
71 @Test
72 public void twoMessagesInOneChunk() throws InterruptedException {
73 BufferingStompDecoder stompDecoder = new BufferingStompDecoder(STOMP_DECODER, 128);
74 String chunk = "SEND\na:alpha\n\nPayload1\0" + "SEND\na:alpha\n\nPayload2\0";
75 List<Message<byte[]>> messages = stompDecoder.decode(toByteBuffer(chunk));
76
77 assertEquals(2, messages.size());
78 assertEquals("Payload1", new String(messages.get(0).getPayload()));
79 assertEquals("Payload2", new String(messages.get(1).getPayload()));
80
81 assertEquals(0, stompDecoder.getBufferSize());
82 assertNull(stompDecoder.getExpectedContentLength());
83 }
84
85 @Test
86 public void oneFullAndOneSplitMessageContentLength() throws InterruptedException {
87 BufferingStompDecoder stompDecoder = new BufferingStompDecoder(STOMP_DECODER, 128);
88 int contentLength = "Payload2a-Payload2b".getBytes().length;
89 String chunk1 = "SEND\na:alpha\n\nPayload1\0SEND\ncontent-length:" + contentLength + "\n";
90 List<Message<byte[]>> messages = stompDecoder.decode(toByteBuffer(chunk1));
91
92 assertEquals(1, messages.size());
93 assertEquals("Payload1", new String(messages.get(0).getPayload()));
94
95 assertEquals(23, stompDecoder.getBufferSize());
96 assertEquals(contentLength, (int) stompDecoder.getExpectedContentLength());
97
98 String chunk2 = "\nPayload2a";
99 messages = stompDecoder.decode(toByteBuffer(chunk2));
100
101 assertEquals(0, messages.size());
102 assertEquals(33, stompDecoder.getBufferSize());
103 assertEquals(contentLength, (int) stompDecoder.getExpectedContentLength());
104
105 String chunk3 = "-Payload2b\0";
106 messages = stompDecoder.decode(toByteBuffer(chunk3));
107
108 assertEquals(1, messages.size());
109 assertEquals("Payload2a-Payload2b", new String(messages.get(0).getPayload()));
110 assertEquals(0, stompDecoder.getBufferSize());
111 assertNull(stompDecoder.getExpectedContentLength());
112 }
113
114 @Test
115 public void oneFullAndOneSplitMessageNoContentLength() throws InterruptedException {
116 BufferingStompDecoder stompDecoder = new BufferingStompDecoder(STOMP_DECODER, 128);
117 String chunk1 = "SEND\na:alpha\n\nPayload1\0SEND\na:alpha\n";
118 List<Message<byte[]>> messages = stompDecoder.decode(toByteBuffer(chunk1));
119
120 assertEquals(1, messages.size());
121 assertEquals("Payload1", new String(messages.get(0).getPayload()));
122
123 assertEquals(13, stompDecoder.getBufferSize());
124 assertNull(stompDecoder.getExpectedContentLength());
125
126 String chunk2 = "\nPayload2a";
127 messages = stompDecoder.decode(toByteBuffer(chunk2));
128
129 assertEquals(0, messages.size());
130 assertEquals(23, stompDecoder.getBufferSize());
131 assertNull(stompDecoder.getExpectedContentLength());
132
133 String chunk3 = "-Payload2b\0";
134 messages = stompDecoder.decode(toByteBuffer(chunk3));
135
136 assertEquals(1, messages.size());
137 assertEquals("Payload2a-Payload2b", new String(messages.get(0).getPayload()));
138 assertEquals(0, stompDecoder.getBufferSize());
139 assertNull(stompDecoder.getExpectedContentLength());
140 }
141
142 @Test
143 public void oneFullAndOneSplitWithContentLengthExceedingBufferSize() throws InterruptedException {
144 BufferingStompDecoder stompDecoder = new BufferingStompDecoder(STOMP_DECODER, 128);
145 String chunk1 = "SEND\na:alpha\n\nPayload1\0SEND\ncontent-length:129\n";
146 List<Message<byte[]>> messages = stompDecoder.decode(toByteBuffer(chunk1));
147
148 assertEquals("We should have gotten the 1st message", 1, messages.size());
149 assertEquals("Payload1", new String(messages.get(0).getPayload()));
150
151 assertEquals(24, stompDecoder.getBufferSize());
152 assertEquals(129, (int) stompDecoder.getExpectedContentLength());
153
154 try {
155 String chunk2 = "\nPayload2a";
156 stompDecoder.decode(toByteBuffer(chunk2));
157 fail("Expected exception");
158 }
159 catch (StompConversionException ex) {
160
161 }
162 }
163
164 @Test(expected = StompConversionException.class)
165 public void bufferSizeLimit() {
166 BufferingStompDecoder stompDecoder = new BufferingStompDecoder(STOMP_DECODER, 10);
167 String payload = "SEND\na:alpha\n\nMessage body";
168 stompDecoder.decode(toByteBuffer(payload));
169 }
170
171 @Test
172 public void incompleteCommand() {
173 BufferingStompDecoder stompDecoder = new BufferingStompDecoder(STOMP_DECODER, 128);
174 String chunk = "MESSAG";
175
176 List<Message<byte[]>> messages = stompDecoder.decode(toByteBuffer(chunk));
177 assertEquals(0, messages.size());
178 }
179
180 @Test(expected = StompConversionException.class)
181 public void endingBackslashHeaderValueCheck() {
182 BufferingStompDecoder stompDecoder = new BufferingStompDecoder(STOMP_DECODER, 128);
183 String payload = "SEND\na:alpha\\\n\nMessage body\0";
184 stompDecoder.decode(toByteBuffer(payload));
185 }
186
187
188 private ByteBuffer toByteBuffer(String chunk) {
189 return ByteBuffer.wrap(chunk.getBytes(Charset.forName("UTF-8")));
190 }
191
192 }