1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.core;
21
22 import org.apache.mina.core.filterchain.DefaultIoFilterChain;
23 import org.apache.mina.core.filterchain.IoFilter;
24 import org.apache.mina.core.filterchain.IoFilterAdapter;
25 import org.apache.mina.core.filterchain.IoFilterChain;
26 import org.apache.mina.core.filterchain.IoFilterChain.Entry;
27 import org.apache.mina.core.service.IoHandler;
28 import org.apache.mina.core.service.IoHandlerAdapter;
29 import org.apache.mina.core.session.DummySession;
30 import org.apache.mina.core.session.IdleStatus;
31 import org.apache.mina.core.session.IoSession;
32 import org.apache.mina.core.write.DefaultWriteRequest;
33 import org.apache.mina.core.write.WriteRequest;
34 import org.apache.mina.filter.util.NoopFilter;
35 import org.junit.After;
36 import org.junit.Before;
37 import org.junit.Test;
38
39 import static org.junit.Assert.assertEquals;
40 import static org.junit.Assert.assertSame;
41
42
43
44
45
46
47 public class IoFilterChainTest {
48 private DummySession dummySession;
49 private IoFilterChain chain;
50 String testResult;
51
52 private final IoHandler handler = new IoHandlerAdapter() {
53 @Override
54 public void sessionCreated(IoSession session) {
55 testResult += "HS0";
56 }
57
58 @Override
59 public void sessionOpened(IoSession session) {
60 testResult += "HSO";
61 }
62
63 @Override
64 public void sessionClosed(IoSession session) {
65 testResult += "HSC";
66 }
67
68 @Override
69 public void sessionIdle(IoSession session, IdleStatus status) {
70 testResult += "HSI";
71 }
72
73 @Override
74 public void exceptionCaught(IoSession session, Throwable cause) {
75 testResult += "HEC";
76 if (cause.getClass() != Exception.class) {
77
78 }
79 }
80
81 @Override
82 public void messageReceived(IoSession session, Object message) {
83 testResult += "HMR";
84 }
85
86 @Override
87 public void messageSent(IoSession session, Object message) {
88 testResult += "HMS";
89 }
90 };
91
92 @Before
93 public void setUp() {
94 dummySession = new DummySession();
95 dummySession.setHandler(handler);
96 chain = dummySession.getFilterChain();
97 testResult = "";
98 }
99
100 @After
101 public void tearDown() {
102
103 }
104
105 @Test
106 public void testAdd() throws Exception {
107 chain.addFirst("A", new EventOrderTestFilter('A'));
108 chain.addLast("B", new EventOrderTestFilter('A'));
109 chain.addFirst("C", new EventOrderTestFilter('A'));
110 chain.addLast("D", new EventOrderTestFilter('A'));
111 chain.addBefore("B", "E", new EventOrderTestFilter('A'));
112 chain.addBefore("C", "F", new EventOrderTestFilter('A'));
113 chain.addAfter("B", "G", new EventOrderTestFilter('A'));
114 chain.addAfter("D", "H", new EventOrderTestFilter('A'));
115
116 String actual = "";
117 for (Entry e : chain.getAll()) {
118 actual += e.getName();
119 }
120
121 assertEquals("FCAEBGDH", actual);
122 }
123
124 @Test
125 public void testGet() throws Exception {
126 IoFilter filterA = new NoopFilter();
127 IoFilter filterB = new NoopFilter();
128 IoFilter filterC = new NoopFilter();
129 IoFilter filterD = new NoopFilter();
130
131 chain.addFirst("A", filterA);
132 chain.addLast("B", filterB);
133 chain.addBefore("B", "C", filterC);
134 chain.addAfter("A", "D", filterD);
135
136 assertSame(filterA, chain.get("A"));
137 assertSame(filterB, chain.get("B"));
138 assertSame(filterC, chain.get("C"));
139 assertSame(filterD, chain.get("D"));
140 }
141
142 @Test
143 public void testRemove() throws Exception {
144 chain.addLast("A", new EventOrderTestFilter('A'));
145 chain.addLast("B", new EventOrderTestFilter('A'));
146 chain.addLast("C", new EventOrderTestFilter('A'));
147 chain.addLast("D", new EventOrderTestFilter('A'));
148 chain.addLast("E", new EventOrderTestFilter('A'));
149
150 chain.remove("A");
151 chain.remove("E");
152 chain.remove("C");
153 chain.remove("B");
154 chain.remove("D");
155
156 assertEquals(0, chain.getAll().size());
157 }
158
159 @Test
160 public void testClear() throws Exception {
161 chain.addLast("A", new EventOrderTestFilter('A'));
162 chain.addLast("B", new EventOrderTestFilter('A'));
163 chain.addLast("C", new EventOrderTestFilter('A'));
164 chain.addLast("D", new EventOrderTestFilter('A'));
165 chain.addLast("E", new EventOrderTestFilter('A'));
166
167 chain.clear();
168
169 assertEquals(0, chain.getAll().size());
170 }
171
172 @Test
173 public void testToString() throws Exception {
174
175 assertEquals("{ empty }", chain.toString());
176
177
178 chain.addLast("A", new IoFilterAdapter() {
179 @Override
180 public String toString() {
181 return "B";
182 }
183 });
184 assertEquals("{ (A:B) }", chain.toString());
185
186
187 chain.addLast("C", new IoFilterAdapter() {
188 @Override
189 public String toString() {
190 return "D";
191 }
192 });
193 assertEquals("{ (A:B), (C:D) }", chain.toString());
194 }
195
196 @Test
197 public void testDefault() {
198 run("HS0 HSO HMR HMS HSI HEC HSC");
199 }
200
201 @Test
202 public void testChained() throws Exception {
203 chain.addLast("A", new EventOrderTestFilter('A'));
204 chain.addLast("B", new EventOrderTestFilter('B'));
205 run("AS0 BS0 HS0" + "ASO BSO HSO" + "AMR BMR HMR"
206 + "BFW AFW AMS BMS HMS" + "ASI BSI HSI" + "AEC BEC HEC"
207 + "ASC BSC HSC");
208 }
209
210 @Test
211 public void testAddRemove() throws Exception {
212 IoFilter filter = new AddRemoveTestFilter();
213
214 chain.addFirst("A", filter);
215 assertEquals("ADDED", testResult);
216
217 chain.remove("A");
218 assertEquals("ADDEDREMOVED", testResult);
219 }
220
221 private void run(String expectedResult) {
222 chain.fireSessionCreated();
223 chain.fireSessionOpened();
224 chain.fireMessageReceived(new Object());
225 chain.fireFilterWrite(new DefaultWriteRequest(new Object()));
226 chain.fireSessionIdle(IdleStatus.READER_IDLE);
227 chain.fireExceptionCaught(new Exception());
228 chain.fireSessionClosed();
229
230 testResult = formatResult(testResult);
231 String formatedExpectedResult = formatResult(expectedResult);
232
233 assertEquals(formatedExpectedResult, testResult);
234 }
235
236 private String formatResult(String result) {
237 String newResult = result.replaceAll("\\s", "");
238 StringBuilder buf = new StringBuilder(newResult.length() * 4 / 3);
239
240 for (int i = 0; i < newResult.length(); i++) {
241 buf.append(newResult.charAt(i));
242
243 if (i % 3 == 2) {
244 buf.append(' ');
245 }
246 }
247
248 return buf.toString();
249 }
250
251 private class EventOrderTestFilter extends IoFilterAdapter {
252 private final char id;
253
254 EventOrderTestFilter(char id) {
255 this.id = id;
256 }
257
258 @Override
259 public void sessionCreated(NextFilter nextFilter, IoSession session) {
260 testResult += id + "S0";
261 nextFilter.sessionCreated(session);
262 }
263
264 @Override
265 public void sessionOpened(NextFilter nextFilter, IoSession session) {
266 testResult += id + "SO";
267 nextFilter.sessionOpened(session);
268 }
269
270 @Override
271 public void sessionClosed(NextFilter nextFilter, IoSession session) {
272 testResult += id + "SC";
273 nextFilter.sessionClosed(session);
274 }
275
276 @Override
277 public void sessionIdle(NextFilter nextFilter, IoSession session,
278 IdleStatus status) {
279 testResult += id + "SI";
280 nextFilter.sessionIdle(session, status);
281 }
282
283 @Override
284 public void exceptionCaught(NextFilter nextFilter, IoSession session,
285 Throwable cause) {
286 testResult += id + "EC";
287 nextFilter.exceptionCaught(session, cause);
288 }
289
290 @Override
291 public void filterWrite(NextFilter nextFilter, IoSession session,
292 WriteRequest writeRequest) {
293 testResult += id + "FW";
294 nextFilter.filterWrite(session, writeRequest);
295 }
296
297 @Override
298 public void messageReceived(NextFilter nextFilter, IoSession session,
299 Object message) {
300 testResult += id + "MR";
301 nextFilter.messageReceived(session, message);
302 }
303
304 @Override
305 public void messageSent(NextFilter nextFilter, IoSession session,
306 WriteRequest writeRequest) {
307 testResult += id + "MS";
308 nextFilter.messageSent(session, writeRequest);
309 }
310
311 @Override
312 public void filterClose(NextFilter nextFilter, IoSession session)
313 throws Exception {
314 nextFilter.filterClose(session);
315 }
316 }
317
318 private class AddRemoveTestFilter extends IoFilterAdapter {
319
320
321
322 public AddRemoveTestFilter() {
323 super();
324 }
325
326 @Override
327 public void onPostAdd(IoFilterChain parent, String name,
328 NextFilter nextFilter) {
329 testResult += "ADDED";
330 }
331
332 @Override
333 public void onPostRemove(IoFilterChain parent, String name,
334 NextFilter nextFilter) {
335 testResult += "REMOVED";
336 }
337 }
338 }