1   /*
2    *  Copyright 2006 Simon Raess
3    *
4    *  Licensed under the Apache License, Version 2.0 (the "License");
5    *  you may not use this file except in compliance with the License.
6    *  You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   *  Unless required by applicable law or agreed to in writing, software
11   *  distributed under the License is distributed on an "AS IS" BASIS,
12   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *  See the License for the specific language governing permissions and
14   *  limitations under the License.
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  		// test		
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  		// test
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  		// test
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  			// expected
96  		}
97  	}
98  	
99  	public void testMSGInvalidSuccessor() throws Exception {
100 		control.replay();
101 		
102 		// test
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 			// expected
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 		// test
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 		// test
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 		// test
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 		// test
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 			// expected
203 		}
204 	}
205 	
206 	public void testANSMessageNumberMismatch() throws Exception {
207 		handler.receiveANS(1, 0, 0, null);
208 		control.replay();
209 		
210 		// test
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 			// expected
222 		}
223 	}
224 	
225 	public void testANSUnfinishedAnswers() throws Exception {
226 		control.replay();
227 		
228 		// test
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 			// expected
240 		}
241 	}
242 	
243 	public void testNUL() throws Exception {
244 		handler.receiveNUL(1, 0);
245 		control.replay();
246 		
247 		// test
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 		// verify
253 		control.verify();
254 	}
255 	
256 	public void testNULInvalid() throws Exception {
257 		control.replay();
258 		
259 		// test
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 			// exected
268 			// TODO: correct exception type
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 			// exected
279 			// TODO: correct exception type
280 		}
281 
282 		// verify
283 		control.verify();
284 	}
285 	
286 }