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.vmpipe;
21
22 import java.util.concurrent.Semaphore;
23 import java.util.concurrent.TimeUnit;
24
25 import junit.framework.Assert;
26 import junit.framework.TestCase;
27
28 import org.apache.mina.core.buffer.IoBuffer;
29 import org.apache.mina.core.future.ConnectFuture;
30 import org.apache.mina.core.service.IoAcceptor;
31 import org.apache.mina.core.service.IoConnector;
32 import org.apache.mina.core.service.IoHandlerAdapter;
33 import org.apache.mina.core.session.IoSession;
34 import org.apache.mina.filter.executor.ExecutorFilter;
35
36
37
38
39
40
41 public class VmPipeEventOrderTest extends TestCase {
42 public void testServerToClient() throws Exception {
43 IoAcceptor acceptor = new VmPipeAcceptor();
44 IoConnector connector = new VmPipeConnector();
45
46 acceptor.setHandler(new IoHandlerAdapter() {
47 @Override
48 public void sessionOpened(IoSession session) throws Exception {
49 session.write("B");
50 }
51
52 @Override
53 public void messageSent(IoSession session, Object message)
54 throws Exception {
55 session.close(true);
56 }
57 });
58
59 acceptor.bind(new VmPipeAddress(1));
60
61 final StringBuffer actual = new StringBuffer();
62
63 connector.setHandler(new IoHandlerAdapter() {
64
65 @Override
66 public void messageReceived(IoSession session, Object message)
67 throws Exception {
68 actual.append(message);
69 }
70
71 @Override
72 public void sessionClosed(IoSession session) throws Exception {
73 actual.append("C");
74 }
75
76 @Override
77 public void sessionOpened(IoSession session) throws Exception {
78 actual.append("A");
79 }
80
81 });
82
83 ConnectFuture future = connector.connect(new VmPipeAddress(1));
84
85 future.awaitUninterruptibly();
86 future.getSession().getCloseFuture().awaitUninterruptibly();
87 acceptor.dispose();
88
89
90
91 while (actual.indexOf("C") < 0) {
92 Thread.yield();
93 }
94
95 Assert.assertEquals("ABC", actual.toString());
96 }
97
98 public void testClientToServer() throws Exception {
99 IoAcceptor acceptor = new VmPipeAcceptor();
100 IoConnector connector = new VmPipeConnector();
101
102 final StringBuffer actual = new StringBuffer();
103
104 acceptor.setHandler(new IoHandlerAdapter() {
105
106 @Override
107 public void messageReceived(IoSession session, Object message)
108 throws Exception {
109 actual.append(message);
110 }
111
112 @Override
113 public void sessionClosed(IoSession session) throws Exception {
114 actual.append("C");
115 }
116
117 @Override
118 public void sessionOpened(IoSession session) throws Exception {
119 actual.append("A");
120 }
121
122 });
123
124 acceptor.bind(new VmPipeAddress(1));
125
126 connector.setHandler(new IoHandlerAdapter() {
127 @Override
128 public void sessionOpened(IoSession session) throws Exception {
129 session.write("B");
130 }
131
132 @Override
133 public void messageSent(IoSession session, Object message)
134 throws Exception {
135 session.close(true);
136 }
137 });
138
139 ConnectFuture future = connector.connect(new VmPipeAddress(1));
140
141 future.awaitUninterruptibly();
142 future.getSession().getCloseFuture().awaitUninterruptibly();
143 acceptor.dispose();
144 connector.dispose();
145
146
147
148 while (actual.indexOf("C") < 0) {
149 Thread.yield();
150 }
151
152 Assert.assertEquals("ABC", actual.toString());
153 }
154
155 public void testSessionCreated() throws Exception {
156 final Semaphore semaphore = new Semaphore(0);
157 final StringBuffer stringBuffer = new StringBuffer();
158 VmPipeAcceptor vmPipeAcceptor = new VmPipeAcceptor();
159 final VmPipeAddress vmPipeAddress = new VmPipeAddress(12345);
160 vmPipeAcceptor.setHandler(new IoHandlerAdapter() {
161 @Override
162 public void sessionCreated(IoSession session) throws Exception {
163
164
165
166
167 Thread.sleep(1000);
168 stringBuffer.append("A");
169 }
170
171 @Override
172 public void sessionOpened(IoSession session) throws Exception {
173 stringBuffer.append("B");
174 }
175
176 @Override
177 public void messageReceived(IoSession session, Object message)
178 throws Exception {
179 stringBuffer.append("C");
180 }
181
182 @Override
183 public void sessionClosed(IoSession session) throws Exception {
184 stringBuffer.append("D");
185 semaphore.release();
186 }
187 });
188 vmPipeAcceptor.bind(vmPipeAddress);
189
190 final VmPipeConnector vmPipeConnector = new VmPipeConnector();
191 vmPipeConnector.getFilterChain().addLast("executor", new ExecutorFilter());
192 vmPipeConnector.setHandler(new IoHandlerAdapter());
193 ConnectFuture connectFuture = vmPipeConnector.connect(vmPipeAddress);
194 connectFuture.awaitUninterruptibly();
195 connectFuture.getSession().write(IoBuffer.wrap(new byte[1])).awaitUninterruptibly();
196 connectFuture.getSession().close(false).awaitUninterruptibly();
197
198 semaphore.tryAcquire(1, TimeUnit.SECONDS);
199 vmPipeAcceptor.unbind(vmPipeAddress);
200 Assert.assertEquals(1, connectFuture.getSession().getWrittenBytes());
201 Assert.assertEquals("ABCD", stringBuffer.toString());
202 }
203 }