1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package net.sf.beep4j.internal;
17
18 import java.nio.ByteBuffer;
19
20 import junit.framework.TestCase;
21 import net.sf.beep4j.internal.DataHeader.ANSHeader;
22
23 import org.easymock.MockControl;
24
25 public class MessageAssemblerTest extends TestCase {
26
27 private MockControl control;
28 private MessageHandler handler;
29 private MessageAssembler target;
30
31 @Override
32 protected void setUp() throws Exception {
33 control = MockControl.createStrictControl(MessageHandler.class);
34 control.setDefaultMatcher(MockControl.ALWAYS_MATCHER);
35 handler = (MessageHandler) control.getMock();
36 target = new MessageAssembler(handler);
37 }
38
39 @Override
40 protected void tearDown() throws Exception {
41 control.verify();
42 }
43
44 private ByteBuffer getByteBuffer(int capacity) {
45 return ByteBuffer.allocate(capacity);
46 }
47
48 public void testMSGNonFragmented() throws Exception {
49 handler.receiveMSG(0, 0, null);
50 handler.receiveMSG(0, 1, null);
51 control.replay();
52
53
54 DataHeader header = new DataHeader(MessageType.MSG, 0, 0, false, 0, 10);
55 Frame frame = new Frame(header, getByteBuffer(10));
56 target.handleFrame(frame);
57
58 header = new DataHeader(MessageType.MSG, 0, 1, false, 10, 10);
59 frame = new Frame(header, getByteBuffer(10));
60 target.handleFrame(frame);
61 }
62
63 public void testMSGFragmented() throws Exception {
64 handler.receiveMSG(0, 0, null);
65 control.replay();
66
67
68 DataHeader header = new DataHeader(MessageType.MSG, 0, 0, true, 0, 10);
69 Frame frame = new Frame(header, getByteBuffer(10));
70 target.handleFrame(frame);
71
72 header = new DataHeader(MessageType.MSG, 0, 0, false, 10, 10);
73 frame = new Frame(header, getByteBuffer(10));
74 target.handleFrame(frame);
75
76 header = new DataHeader(MessageType.MSG, 0, 0, true, 20, 10);
77 frame = new Frame(header, getByteBuffer(10));
78 target.handleFrame(frame);
79 }
80
81 public void testMSGMessageNumberMismatch() throws Exception {
82 control.replay();
83
84 DataHeader header = new DataHeader(MessageType.MSG, 0, 0, true, 0, 10);
85
86 Frame frame = new Frame(header, getByteBuffer(10));
87 target.handleFrame(frame);
88
89 header = new DataHeader(MessageType.MSG, 0, 1, false, 10, 10);
90 frame = new Frame(header, getByteBuffer(10));
91 try {
92 target.handleFrame(frame);
93 fail("message numbers are not equal");
94 } catch (Exception e) {
95
96 }
97 }
98
99 public void testMSGInvalidSuccessor() throws Exception {
100 control.replay();
101
102
103 DataHeader header = new DataHeader(MessageType.MSG, 1, 0, true, 0, 20);
104 Frame frame = new Frame(header, getByteBuffer(20));
105 target.handleFrame(frame);
106
107 header = new DataHeader(MessageType.RPY, 1, 0, false, 20, 20);
108 frame = new Frame(header, getByteBuffer(20));
109 try {
110 target.handleFrame(frame);
111 fail("invalid successor not detected");
112 } catch (Exception e) {
113
114 }
115 }
116
117 public void testANSNonFragmented() throws Exception {
118 handler.receiveANS(1, 0, 0, null);
119 handler.receiveANS(1, 0, 1, null);
120 handler.receiveNUL(1, 0);
121 control.replay();
122
123
124 DataHeader header = new ANSHeader(1, 0, false, 0, 20, 0);
125 Frame frame = new Frame(header, getByteBuffer(20));
126 target.handleFrame(frame);
127
128 header = new ANSHeader(1, 0, false, 20, 20, 1);
129 frame = new Frame(header, getByteBuffer(20));
130 target.handleFrame(frame);
131
132 header = new DataHeader(MessageType.NUL, 1, 0, false, 40, 0);
133 frame = new Frame(header, getByteBuffer(0));
134 target.handleFrame(frame);
135 }
136
137 public void testANSFragmented() throws Exception {
138 handler.receiveANS(1, 0, 0, null);
139 handler.receiveNUL(1, 0);
140 control.replay();
141
142
143 DataHeader header = new ANSHeader(1, 0, true, 0, 20, 0);
144 Frame frame = new Frame(header, getByteBuffer(20));
145 target.handleFrame(frame);
146
147 header = new ANSHeader(1, 0, true, 20, 20, 0);
148 frame = new Frame(header, getByteBuffer(20));
149 target.handleFrame(frame);
150
151 header = new ANSHeader(1, 0, false, 40, 20, 0);
152 frame = new Frame(header, getByteBuffer(20));
153 target.handleFrame(frame);
154
155 header = new DataHeader(MessageType.NUL, 1, 0, false, 60, 0);
156 frame = new Frame(header, getByteBuffer(0));
157 target.handleFrame(frame);
158 }
159
160 public void testANSInterleaved() throws Exception {
161 handler.receiveANS(1, 0, 0, null);
162 handler.receiveANS(1, 0, 1, null);
163 handler.receiveNUL(1, 0);
164 control.replay();
165
166
167 DataHeader header = new ANSHeader(1, 0, true, 0, 20, 0);
168 Frame frame = new Frame(header, getByteBuffer(20));
169 target.handleFrame(frame);
170
171 header = new ANSHeader(1, 0, true, 20, 20, 1);
172 frame = new Frame(header, getByteBuffer(20));
173 target.handleFrame(frame);
174
175 header = new ANSHeader(1, 0, false, 40, 10, 0);
176 frame = new Frame(header, getByteBuffer(10));
177 target.handleFrame(frame);
178
179 header = new ANSHeader(1, 0, false, 50, 10, 1);
180 frame = new Frame(header, getByteBuffer(10));
181 target.handleFrame(frame);
182
183 header = new DataHeader(MessageType.NUL, 1, 0, false, 60, 0);
184 frame = new Frame(header, getByteBuffer(0));
185 target.handleFrame(frame);
186 }
187
188 public void testANSInvalidSuccessor() throws Exception {
189 control.replay();
190
191
192 DataHeader header = new ANSHeader(1, 0, true, 0, 20, 0);
193 Frame frame = new Frame(header, getByteBuffer(20));
194 target.handleFrame(frame);
195
196 header = new DataHeader(MessageType.RPY, 1, 0, false, 20, 20);
197 frame = new Frame(header, getByteBuffer(20));
198 try {
199 target.handleFrame(frame);
200 fail("ANS or NUL expected");
201 } catch (Exception e) {
202
203 }
204 }
205
206 public void testANSMessageNumberMismatch() throws Exception {
207 handler.receiveANS(1, 0, 0, null);
208 control.replay();
209
210
211 DataHeader header = new ANSHeader(1, 0, false, 0, 20, 0);
212 Frame frame = new Frame(header, getByteBuffer(20));
213 target.handleFrame(frame);
214
215 header = new ANSHeader(1, 1, false, 20, 20, 1);
216 frame = new Frame(header, getByteBuffer(20));
217 try {
218 target.handleFrame(frame);
219 fail("message number mismatch");
220 } catch (Exception e) {
221
222 }
223 }
224
225 public void testANSUnfinishedAnswers() throws Exception {
226 control.replay();
227
228
229 DataHeader header = new ANSHeader(1, 0, true, 0, 20, 0);
230 Frame frame = new Frame(header, getByteBuffer(20));
231 target.handleFrame(frame);
232
233 header = new DataHeader(MessageType.NUL, 1, 0, false, 20, 0);
234 frame = new Frame(header, getByteBuffer(20));
235 try {
236 target.handleFrame(frame);
237 fail("response has unfinished ANS messages");
238 } catch (Exception e) {
239
240 }
241 }
242
243 public void testNUL() throws Exception {
244 handler.receiveNUL(1, 0);
245 control.replay();
246
247
248 DataHeader header = new DataHeader(MessageType.NUL, 1, 0, false, 0, 0);
249 Frame frame = new Frame(header, getByteBuffer(0));
250 target.handleFrame(frame);
251
252
253 control.verify();
254 }
255
256 public void testNULInvalid() throws Exception {
257 control.replay();
258
259
260 DataHeader header = new DataHeader(MessageType.NUL, 1, 0, true, 0, 0);
261 Frame frame = new Frame(header, getByteBuffer(0));
262
263 try {
264 target.handleFrame(frame);
265 fail("NUL frame cannot have continuation indicator set to true");
266 } catch (Exception e) {
267
268
269 }
270
271 header = new DataHeader(MessageType.NUL, 1, 0, false, 0, 20);
272 frame = new Frame(header, getByteBuffer(20));
273
274 try {
275 target.handleFrame(frame);
276 fail("NUL frame cannot have non-zero size");
277 } catch (Exception e) {
278
279
280 }
281
282
283 control.verify();
284 }
285
286 }