View Javadoc

1   /*
2    *  Licensed to the Apache Software Foundation (ASF) under one
3    *  or more contributor license agreements.  See the NOTICE file
4    *  distributed with this work for additional information
5    *  regarding copyright ownership.  The ASF licenses this file
6    *  to you under the Apache License, Version 2.0 (the
7    *  "License"); you may not use this file except in compliance
8    *  with the License.  You may obtain a copy of the License at
9    *
10   *    http://www.apache.org/licenses/LICENSE-2.0
11   *
12   *  Unless required by applicable law or agreed to in writing,
13   *  software distributed under the License is distributed on an
14   *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   *  KIND, either express or implied.  See the License for the
16   *  specific language governing permissions and limitations
17   *  under the License.
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   * Tests {@link DefaultIoFilterChain}.
44   *
45   * @author <a href="http://mina.apache.org">Apache MINA Project</a>
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                  //cause.printStackTrace(System.out);
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         // Do nothing
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         // When the chain is empty
175         assertEquals("{ empty }", chain.toString());
176 
177         // When there's one filter
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         // When there are two
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          * Default constructor
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 }