1   /*
2    *   @(#) $Id: IoFilterChainTest.java 357871 2005-12-20 01:56:40Z trustin $
3    *
4    *   Copyright 2004 The Apache Software Foundation
5    *
6    *   Licensed under the Apache License, Version 2.0 (the "License");
7    *   you may not use this file except in compliance with the License.
8    *   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, software
13   *   distributed under the License is distributed on an "AS IS" BASIS,
14   *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   *   See the License for the specific language governing permissions and
16   *   limitations under the License.
17   *
18   */
19  package org.apache.mina.io;
20  
21  import java.net.SocketAddress;
22  import java.util.Iterator;
23  
24  import junit.framework.Assert;
25  import junit.framework.TestCase;
26  
27  import org.apache.mina.common.BaseSession;
28  import org.apache.mina.common.ByteBuffer;
29  import org.apache.mina.common.IdleStatus;
30  import org.apache.mina.common.SessionConfig;
31  import org.apache.mina.common.TransportType;
32  
33  /***
34   * Tests {@link AbstractIoFilterChain}.
35   * 
36   * @author The Apache Directory Project (dev@directory.apache.org)
37   * @version $Rev: 357871 $, $Date: 2005-12-20 10:56:40 +0900 (Tue, 20 Dec 2005) $ 
38   */
39  public class IoFilterChainTest extends TestCase
40  {
41      private IoFilterChainImpl chain;
42      private IoSession session;
43      private String result;
44  
45      public void setUp()
46      {
47          chain = new IoFilterChainImpl();
48          session = new TestSession();
49          result = "";
50      }
51      
52      public void tearDown()
53      {
54      }
55      
56      public void testAdd() throws Exception
57      {
58          chain.addFirst( "A", new TestFilter( 'A' ) );
59          chain.addLast( "B", new TestFilter( 'B' ) );
60          chain.addFirst( "C", new TestFilter( 'C' ) );
61          chain.addLast( "D", new TestFilter( 'D' ) );
62          chain.addBefore( "B", "E", new TestFilter( 'E' ) );
63          chain.addBefore( "C", "F", new TestFilter( 'F' ) );
64          chain.addAfter( "B", "G", new TestFilter( 'G' ) );
65          chain.addAfter( "D", "H", new TestFilter( 'H' ) );
66          
67          String actual = "";
68          for( Iterator i = chain.getChildren().iterator(); i.hasNext(); ) 
69          {
70              TestFilter f = ( TestFilter ) i.next();
71              actual += f.id;
72          }
73          
74          Assert.assertEquals( "FCAEBGDH", actual );
75      }
76      
77      public void testRemove() throws Exception
78      {
79          chain.addLast( "A", new TestFilter( 'A' ) );
80          chain.addLast( "B", new TestFilter( 'B' ) );
81          chain.addLast( "C", new TestFilter( 'C' ) );
82          chain.addLast( "D", new TestFilter( 'D' ) );
83          chain.addLast( "E", new TestFilter( 'E' ) );
84          
85          chain.remove( "A" );
86          chain.remove( "E" );
87          chain.remove( "C" );
88          chain.remove( "B" );
89          chain.remove( "D" );
90          
91          Assert.assertEquals( 0, chain.getChildren().size() );
92      }
93      
94      public void testClear() throws Exception
95      {
96          chain.addLast( "A", new TestFilter( 'A' ) );
97          chain.addLast( "B", new TestFilter( 'B' ) );
98          chain.addLast( "C", new TestFilter( 'C' ) );
99          chain.addLast( "D", new TestFilter( 'D' ) );
100         chain.addLast( "E", new TestFilter( 'E' ) );
101         
102         chain.clear();
103         
104         Assert.assertEquals( 0, chain.getChildren().size() );
105     }
106     
107     public void testDefault()
108     {
109         run( "HSO HDR HDW HSI HEC HSC" );
110     }
111     
112     public void testChained()
113     {
114         chain.addLast( "A", new TestFilter( 'A' ) );
115         chain.addLast( "B", new TestFilter( 'B' ) );
116         run( "ASO BSO HSO" +
117              "ADR BDR HDR" +
118              "BFW AFW ADW BDW HDW" +
119              "ASI BSI HSI" +
120              "AEC BEC HEC" +
121              "ASC BSC HSC" );
122     }
123     
124     private void run( String expectedResult )
125     {
126         chain.sessionOpened( session );
127         chain.dataRead( session, ByteBuffer.allocate( 16 ) );
128         chain.filterWrite( session, ByteBuffer.allocate( 16 ), null );
129         chain.sessionIdle( session, IdleStatus.READER_IDLE );
130         chain.exceptionCaught( session, new Exception() );
131         chain.sessionClosed( session );
132         
133         result = formatResult( result );
134         expectedResult = formatResult( expectedResult );
135         
136         System.out.println( "Expected: " + expectedResult );
137         System.out.println( "Actual:   " + result );
138         Assert.assertEquals( expectedResult, result );
139     }
140     
141     private String formatResult( String result )
142     {
143         result = result.replaceAll( "//s", "" );
144         StringBuffer buf = new StringBuffer( result.length() * 4 / 3 );
145         for( int i = 0; i < result.length(); i++ )
146         {
147             buf.append( result.charAt( i ) );
148             if( i % 3 == 2 )
149             {
150                 buf.append(' ');
151             }
152         }
153         
154         return buf.toString();
155     }
156 
157     private class TestSession extends BaseSession implements IoSession
158     {
159         private IoHandler handler = new IoHandlerAdapter()
160         {
161             public void sessionOpened(IoSession session) {
162                 result += "HSO ";
163             }
164 
165             public void dataRead(IoSession session, ByteBuffer buf) {
166                 result += "HDR ";
167             }
168 
169             public void dataWritten(IoSession session, Object marker) {
170                 result += "HDW ";
171             }
172             
173             public void sessionIdle(IoSession session, IdleStatus status) {
174                 result += "HSI ";
175             }
176 
177             public void exceptionCaught(IoSession session, Throwable cause) {
178                 result += "HEC ";
179                 if( cause.getClass() != Exception.class )
180                 {
181                     cause.printStackTrace( System.out );
182                 }
183             }
184 
185             public void sessionClosed(IoSession session) {
186                 result += "HSC ";
187             }
188         };
189 
190         public IoHandler getHandler()
191         {
192             return handler;
193         }
194 
195         public void close( boolean wait )
196         {
197         }
198 
199         public void write(ByteBuffer buf, Object marker)
200         {
201         }
202 
203         public int getScheduledWriteRequests()
204         {
205             return 0;
206         }
207 
208         public TransportType getTransportType()
209         {
210             return null;
211         }
212 
213         public boolean isConnected()
214         {
215             return false;
216         }
217 
218         public SessionConfig getConfig()
219         {
220             return null;
221         }
222 
223         public SocketAddress getRemoteAddress()
224         {
225             return null;
226         }
227 
228         public SocketAddress getLocalAddress()
229         {
230             return null;
231         }
232 
233         public IoFilterChain getFilterChain()
234         {
235             return null;
236         }
237     }
238 
239     private class TestFilter implements IoFilter
240     {
241         private final char id;
242 
243         private TestFilter( char id )
244         {
245             this.id = id;
246         }
247         
248         public void sessionOpened(NextFilter nextFilter, IoSession session) {
249             result += id + "SO ";
250             nextFilter.sessionOpened( session );
251         }
252 
253         public void sessionClosed(NextFilter nextFilter, IoSession session) {
254             result += id + "SC ";
255             nextFilter.sessionClosed( session );
256         }
257 
258         public void sessionIdle(NextFilter nextFilter, IoSession session, IdleStatus status) {
259             result += id + "SI ";
260             nextFilter.sessionIdle( session, status );
261         }
262 
263         public void exceptionCaught(NextFilter nextFilter, IoSession session, Throwable cause) {
264             result += id + "EC ";
265             nextFilter.exceptionCaught( session, cause );
266         }
267 
268         public void dataRead(NextFilter nextFilter, IoSession session, ByteBuffer buf) {
269             result += id + "DR ";
270             nextFilter.dataRead( session, buf );
271         }
272 
273         public void dataWritten(NextFilter nextFilter, IoSession session, Object marker) {
274             result += id + "DW ";
275             nextFilter.dataWritten( session, marker );
276         }
277 
278         public void filterWrite(NextFilter nextFilter, IoSession session, ByteBuffer buf, Object marker) {
279             result += id + "FW ";
280             nextFilter.filterWrite( session, buf, marker );
281         }
282     }
283 
284     private static class IoFilterChainImpl extends AbstractIoFilterChain
285     {
286         protected IoFilterChainImpl()
287         {
288         }
289 
290         protected void doWrite(IoSession session, ByteBuffer buffer, Object marker)
291         {
292             dataWritten( session, marker );
293         }
294     }
295     
296 }