1
2
3
4
5
6
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
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 }