1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.transport.socket.nio;
21
22 import java.net.InetSocketAddress;
23 import java.net.PortUnreachableException;
24
25 import junit.framework.TestCase;
26
27 import org.apache.mina.core.buffer.IoBuffer;
28 import org.apache.mina.core.future.ConnectFuture;
29 import org.apache.mina.core.service.IoConnector;
30 import org.apache.mina.core.service.IoHandlerAdapter;
31 import org.apache.mina.core.session.IoSession;
32 import org.apache.mina.transport.socket.DatagramSessionConfig;
33 import org.apache.mina.util.AvailablePortFinder;
34
35
36
37
38
39
40 public class DatagramPortUnreachableTest extends TestCase {
41
42 Object mutex = new Object();
43
44 private void runTest(boolean closeOnPortUnreachable) throws Exception {
45 IoConnector connector = new NioDatagramConnector();
46 connector.setHandler(new IoHandlerAdapter() {
47
48 @Override
49 public void exceptionCaught(IoSession session, Throwable cause)
50 throws Exception {
51 if (cause instanceof PortUnreachableException) {
52 synchronized(mutex) {
53 mutex.notify();
54 }
55 }
56 }
57
58 });
59 ConnectFuture future = connector.connect(new InetSocketAddress("localhost",
60 AvailablePortFinder.getNextAvailable(20000)));
61 future.awaitUninterruptibly();
62 IoSession session = future.getSession();
63
64 DatagramSessionConfig cfg = ((DatagramSessionConfig) session
65 .getConfig());
66 cfg.setUseReadOperation(true);
67 cfg.setCloseOnPortUnreachable(closeOnPortUnreachable);
68
69 synchronized(mutex) {
70 session.write(IoBuffer.allocate(1)).awaitUninterruptibly().isWritten();
71 session.read();
72 mutex.wait();
73 }
74
75 Thread.sleep(500);
76
77 assertEquals(closeOnPortUnreachable, session.isClosing());
78 connector.dispose();
79 }
80
81 public void testPortUnreachableClosesSession() throws Exception {
82
83 runTest(true);
84 }
85
86 public void testNormal() throws Exception {
87
88 runTest(false);
89 }
90 }