1   /*
2    * Copyright (C) The Spice Group. All rights reserved.
3    *
4    * This software is published under the terms of the Spice
5    * Software License version 1.1, a copy of which has been included
6    * with this distribution in the LICENSE.txt file.
7    */
8   package org.codehaus.spice.netserve.connection.impl;
9   
10  import java.net.Socket;
11  import java.net.InetAddress;
12  import java.net.InetSocketAddress;
13  import java.net.ServerSocket;
14  import java.nio.channels.ServerSocketChannel;
15  import java.util.Random;
16  
17  import junit.framework.TestCase;
18  
19  /***
20   *
21   * @author Peter Donald
22   * @version $Revision: 1.2 $ $Date: 2004/03/21 23:42:59 $
23   */
24  public class DefaultAcceptorManagerTestCase
25     extends TestCase
26  {
27     public void testConnectAndDisconnectWithTimeoutNotSet()
28        throws Exception
29     {
30        final DefaultAcceptorManager manager = new DefaultAcceptorManager();
31        manager.setMonitor( NullAcceptorMonitor.MONITOR );
32        manager.setSoTimeout( 10 );
33        manager.setShutdownTimeout( 0 );
34        final String name = "name";
35        assertEquals( "isConnected pre connect", false, manager.isConnected( name ) );
36        final ExceptOnAcceptServerSocket socket = new ExceptOnAcceptServerSocket( true );
37        assertEquals( "socket.getSoTimeout pre connect", 0, socket.getSoTimeout() );
38        manager.connect( name,
39                         socket,
40                         new MockSocketConnectionHandler() );
41        assertEquals( "socket.getSoTimeout post connect", 10, socket.getSoTimeout() );
42        assertEquals( "isConnected pre disconnect", true, manager.isConnected( name ) );
43        manager.disconnect( name );
44        assertEquals( "isConnected post disconnect", false, manager.isConnected( name ) );
45     }
46  
47     public void testShutdownAcceptors()
48        throws Exception
49     {
50        final DefaultAcceptorManager manager = new DefaultAcceptorManager();
51        manager.setMonitor( NullAcceptorMonitor.MONITOR );
52        manager.setSoTimeout( 10 );
53        final String name = "name";
54        assertEquals( "isConnected pre connect", false, manager.isConnected( name ) );
55        manager.connect( name,
56                         new ExceptOnAcceptServerSocket( true ),
57                         new MockSocketConnectionHandler() );
58        assertEquals( "isConnected pre shutdownAcceptors", true, manager.isConnected( name ) );
59        manager.shutdownAcceptors();
60        assertEquals( "isConnected post shutdownAcceptors", false, manager.isConnected( name ) );
61     }
62  
63     public void testConnectAndDisconnectWithTimeoutSet()
64        throws Exception
65     {
66        final DefaultAcceptorManager manager = new DefaultAcceptorManager();
67        manager.setMonitor( NullAcceptorMonitor.MONITOR );
68        manager.setSoTimeout( 10 );
69        final String name = "name";
70        assertEquals( "isConnected pre connect", false, manager.isConnected( name ) );
71        final ExceptOnAcceptServerSocket socket = new ExceptOnAcceptServerSocket( true );
72        socket.setSoTimeout( 123 );
73        assertEquals( "socket.getSoTimeout pre connect", 123, socket.getSoTimeout() );
74        manager.connect( name,
75                         socket,
76                         new MockSocketConnectionHandler() );
77        assertEquals( "socket.getSoTimeout post connect", 123, socket.getSoTimeout() );
78        assertEquals( "isConnected pre disconnect", true, manager.isConnected( name ) );
79        manager.disconnect( name );
80        assertEquals( "isConnected post disconnect", false, manager.isConnected( name ) );
81     }
82  
83     public void testConnectAndAcceptAndDisconnectWithTimeoutSet()
84        throws Exception
85     {
86        final DefaultAcceptorManager manager = new DefaultAcceptorManager();
87        final RecordingAcceptorMonitor monitor = new RecordingAcceptorMonitor();
88        manager.setMonitor( monitor );
89        manager.setSoTimeout( 10 );
90        final String name = "name";
91        assertEquals( "isConnected pre connect", false, manager.isConnected( name ) );
92        final ServerSocketChannel channel = ServerSocketChannel.open();
93        final ServerSocket serverSocket = channel.socket();
94        serverSocket.setReuseAddress( true );
95        final InetAddress localAddress = InetAddress.getLocalHost();
96        final Random random = new Random();
97        final int port = Math.abs( random.nextInt() % 5000 ) + 1024;
98        final InetSocketAddress address = new InetSocketAddress( localAddress, port );
99        serverSocket.bind( address );
100       while ( !serverSocket.isBound() )
101       {
102          System.out.print( "." );
103          Thread.yield();
104       }
105 
106       final MockSocketConnectionHandler handler = new MockSocketConnectionHandler();
107       manager.connect( name, serverSocket, handler );
108 
109       final Socket clientSocket = new Socket( localAddress, port );
110       System.out.print( "Socket Connecting" );
111       while ( !clientSocket.isConnected() )
112       {
113          System.out.print( "." );
114          Thread.yield();
115       }
116       System.out.println( " - Connected" );
117       clientSocket.close();
118 
119       //Sleep to make sure accept goes through
120       Thread.sleep( 200 );
121 
122       assertNotNull( "handler.socket", handler.getSocket() );
123 
124       assertEquals( "isConnected pre disconnect", true, manager.isConnected( name ) );
125       manager.disconnect( name );
126       assertEquals( "isConnected post disconnect", false, manager.isConnected( name ) );
127    }
128 
129    public void testDuplicateConnect()
130       throws Exception
131    {
132       final DefaultAcceptorManager manager = new DefaultAcceptorManager();
133       final String name = "name";
134       assertEquals( "isConnected pre connect", false, manager.isConnected( name ) );
135       final ExceptOnAcceptServerSocket socket = new ExceptOnAcceptServerSocket( true );
136       manager.connect( name,
137                        socket,
138                        new MockSocketConnectionHandler() );
139       assertEquals( "isConnected pre disconnect", true, manager.isConnected( name ) );
140       try
141       {
142          manager.connect( name,
143                           new ExceptOnAcceptServerSocket( true ),
144                           new MockSocketConnectionHandler() );
145       }
146       catch ( final IllegalArgumentException iae )
147       {
148          return;
149       }
150       finally
151       {
152          socket.close();
153          manager.shutdownAcceptors();
154          assertEquals( "isConnected post disconnect", false, manager.isConnected( name ) );
155       }
156       fail( "Expected to fail due to duplicate connect" );
157    }
158 
159    public void testDisconnectNonExistent()
160       throws Exception
161    {
162       final DefaultAcceptorManager manager = new DefaultAcceptorManager();
163       try
164       {
165          manager.disconnect( "NonExistent" );
166       }
167       catch ( IllegalArgumentException iae )
168       {
169          return;
170       }
171       finally
172       {
173          manager.shutdownAcceptors();
174       }
175       fail( "Expected to fail to disconnect non existent acceptor" );
176    }
177 
178    public void testConnectWithNullName()
179       throws Exception
180    {
181       final DefaultAcceptorManager manager = new DefaultAcceptorManager();
182       try
183       {
184          manager.connect( null,
185                           new ExceptOnAcceptServerSocket( true ),
186                           new MockSocketConnectionHandler() );
187       }
188       catch ( final NullPointerException npe )
189       {
190          assertEquals( "npe.message", "name", npe.getMessage() );
191          return;
192       }
193       finally
194       {
195          manager.shutdownAcceptors();
196       }
197       fail( "expected NPE due to null name in connect" );
198    }
199 
200    public void testConnectWithNullSocket()
201       throws Exception
202    {
203       final DefaultAcceptorManager manager = new DefaultAcceptorManager();
204       try
205       {
206          manager.connect( "name",
207                           null,
208                           new MockSocketConnectionHandler() );
209       }
210       catch ( final NullPointerException npe )
211       {
212          assertEquals( "npe.message", "socket", npe.getMessage() );
213          return;
214       }
215       finally
216       {
217          manager.shutdownAcceptors();
218       }
219       fail( "expected NPE due to null socket in connect" );
220    }
221 
222    public void testConnectWithNullHandler()
223       throws Exception
224    {
225       final DefaultAcceptorManager manager = new DefaultAcceptorManager();
226       try
227       {
228          manager.connect( "name",
229                           new ExceptOnAcceptServerSocket( true ),
230                           null );
231       }
232       catch ( final NullPointerException npe )
233       {
234          assertEquals( "npe.message", "handler", npe.getMessage() );
235          return;
236       }
237       finally
238       {
239          manager.shutdownAcceptors();
240       }
241       fail( "expected NPE due to null handler in connect" );
242    }
243 
244     protected void setUp() throws Exception
245     {
246         System.out.print( "Test: " + getName() );
247     }
248 }