View Javadoc

1   /*
2    *  Licensed to the Apache Software Foundation (ASF) under one
3    *  or more contributor license agreements.  See the NOTICE file
4    *  distributed with this work for additional information
5    *  regarding copyright ownership.  The ASF licenses this file
6    *  to you under the Apache License, Version 2.0 (the
7    *  "License"); you may not use this file except in compliance
8    *  with the License.  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,
13   *  software distributed under the License is distributed on an
14   *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   *  KIND, either express or implied.  See the License for the
16   *  specific language governing permissions and limitations
17   *  under the License.
18   *
19   */
20  package org.apache.mina.core;
21  
22  import java.net.InetSocketAddress;
23  import java.net.SocketAddress;
24  
25  import org.apache.mina.core.service.IoAcceptor;
26  import org.apache.mina.core.service.IoConnector;
27  import org.apache.mina.core.service.IoHandler;
28  import org.apache.mina.core.service.IoService;
29  import org.apache.mina.core.service.IoServiceListener;
30  import org.apache.mina.core.service.IoServiceListenerSupport;
31  import org.apache.mina.core.session.DummySession;
32  import org.easymock.EasyMock;
33  import org.junit.Test;
34  
35  import static org.junit.Assert.assertTrue;
36  import static org.junit.Assert.assertNull;
37  import static org.junit.Assert.assertEquals;
38  import static org.junit.Assert.assertSame;
39  
40  /**
41   * Tests {@link IoServiceListenerSupport}.
42   *
43   * @author <a href="http://mina.apache.org">Apache MINA Project</a>
44   */
45  public class IoServiceListenerSupportTest {
46      private static final SocketAddress ADDRESS = new InetSocketAddress(8080);
47  
48      private final IoService mockService = EasyMock.createMock(IoService.class);
49  
50      @Test
51      public void testServiceLifecycle() throws Exception {
52          IoServiceListenerSupport support = new IoServiceListenerSupport(
53                  mockService);
54  
55          IoServiceListener listener = EasyMock.createStrictMock(IoServiceListener.class);
56  
57          // Test activation
58          listener.serviceActivated(mockService);
59  
60          EasyMock.replay(listener);
61  
62          support.add(listener);
63          support.fireServiceActivated();
64  
65          EasyMock.verify(listener);
66  
67          // Test deactivation & other side effects
68          EasyMock.reset(listener);
69          listener.serviceDeactivated(mockService);
70  
71          EasyMock.replay(listener);
72          //// Activate more than once
73          support.fireServiceActivated();
74          //// Deactivate
75          support.fireServiceDeactivated();
76          //// Deactivate more than once
77          support.fireServiceDeactivated();
78  
79          EasyMock.verify(listener);
80      }
81  
82      @Test
83      public void testSessionLifecycle() throws Exception {
84          IoServiceListenerSupport support = new IoServiceListenerSupport(
85                  mockService);
86  
87          DummySession session = new DummySession();
88          session.setService(mockService);
89          session.setLocalAddress(ADDRESS);
90  
91          IoHandler handler = EasyMock.createStrictMock( IoHandler.class );
92          session.setHandler(handler);
93  
94          IoServiceListener listener = EasyMock.createStrictMock(IoServiceListener.class);
95  
96          // Test creation
97          listener.sessionCreated(session);
98          handler.sessionCreated(session);
99          handler.sessionOpened(session);
100 
101         EasyMock.replay(listener);
102         EasyMock.replay(handler);
103 
104         support.add(listener);
105         support.fireSessionCreated(session);
106 
107         EasyMock.verify(listener);
108         EasyMock.verify(handler);
109 
110         assertEquals(1, support.getManagedSessions().size());
111         assertSame(session, support.getManagedSessions().get(session.getId()));
112 
113         // Test destruction & other side effects
114         EasyMock.reset(listener);
115         EasyMock.reset(handler);
116         handler.sessionClosed(session);
117         listener.sessionDestroyed(session);
118 
119         EasyMock.replay(listener);
120         //// Activate more than once
121         support.fireSessionCreated(session);
122         //// Deactivate
123         support.fireSessionDestroyed(session);
124         //// Deactivate more than once
125         support.fireSessionDestroyed(session);
126 
127         EasyMock.verify(listener);
128 
129         assertTrue(session.isClosing());
130         assertEquals(0, support.getManagedSessions().size());
131         assertNull(support.getManagedSessions().get(session.getId()));
132     }
133 
134     @Test
135     public void testDisconnectOnUnbind() throws Exception {
136         IoAcceptor acceptor = EasyMock.createStrictMock(IoAcceptor.class);
137 
138         final IoServiceListenerSupport support = new IoServiceListenerSupport(
139                 acceptor);
140 
141         final DummySession session = new DummySession();
142         session.setService(acceptor);
143         session.setLocalAddress(ADDRESS);
144 
145         IoHandler handler = EasyMock.createStrictMock(IoHandler.class);
146         session.setHandler(handler);
147 
148         final IoServiceListener listener = EasyMock.createStrictMock(IoServiceListener.class);
149 
150         // Activate a service and create a session.
151         listener.serviceActivated(acceptor);
152         listener.sessionCreated(session);
153         handler.sessionCreated(session);
154         handler.sessionOpened(session);
155 
156         EasyMock.replay(listener);
157         EasyMock.replay(handler);
158 
159         support.add(listener);
160         support.fireServiceActivated();
161         support.fireSessionCreated(session);
162 
163         EasyMock.verify(listener);
164         EasyMock.verify(handler);
165 
166         // Deactivate a service and make sure the session is closed & destroyed.
167         EasyMock.reset(listener);
168         EasyMock.reset(handler);
169 
170         listener.serviceDeactivated(acceptor);
171         EasyMock.expect(acceptor.isCloseOnDeactivation()).andReturn(true);
172         listener.sessionDestroyed(session);
173         handler.sessionClosed(session);
174 
175         EasyMock.replay(listener);
176         EasyMock.replay(acceptor);
177         EasyMock.replay(handler);
178 
179         new Thread() {
180             // Emulate I/O service
181             @Override
182             public void run() {
183                 try {
184                     Thread.sleep(500);
185                 } catch (InterruptedException e) {
186                     //e.printStackTrace();
187                 }
188                 // This synchronization block is a workaround for
189                 // the visibility problem of simultaneous EasyMock
190                 // state update. (not sure if it fixes the failing test yet.)
191                 synchronized (listener) {
192                     support.fireSessionDestroyed(session);
193                 }
194             }
195         }.start();
196         support.fireServiceDeactivated();
197 
198         synchronized (listener) {
199             EasyMock.verify(listener);
200         }
201         EasyMock.verify(acceptor);
202         EasyMock.verify(handler);
203 
204         assertTrue(session.isClosing());
205         assertEquals(0, support.getManagedSessions().size());
206         assertNull(support.getManagedSessions().get(session.getId()));
207     }
208 
209     @Test
210     public void testConnectorActivation() throws Exception {
211         IoConnector connector = EasyMock.createStrictMock(IoConnector.class);
212 
213         IoServiceListenerSupport support = new IoServiceListenerSupport(
214                 connector);
215 
216         final DummySession session = new DummySession();
217         session.setService(connector);
218         session.setRemoteAddress(ADDRESS);
219 
220         IoHandler handler = EasyMock.createStrictMock(IoHandler.class);
221         session.setHandler(handler);
222 
223         IoServiceListener listener = EasyMock.createStrictMock(IoServiceListener.class);
224 
225         // Creating a session should activate a service automatically.
226         listener.serviceActivated(connector);
227         listener.sessionCreated(session);
228         handler.sessionCreated(session);
229         handler.sessionOpened(session);
230 
231         EasyMock.replay(listener);
232         EasyMock.replay(handler);
233 
234         support.add(listener);
235         support.fireSessionCreated(session);
236 
237         EasyMock.verify(listener);
238         EasyMock.verify(handler);
239 
240         // Destroying a session should deactivate a service automatically.
241         EasyMock.reset(listener);
242         EasyMock.reset(handler);
243         listener.sessionDestroyed(session);
244         handler.sessionClosed(session);
245         listener.serviceDeactivated(connector);
246 
247         EasyMock.replay(listener);
248         EasyMock.replay(handler);
249 
250         support.fireSessionDestroyed(session);
251 
252         EasyMock.verify(listener);
253         EasyMock.verify(handler);
254 
255         assertEquals(0, support.getManagedSessions().size());
256         assertNull(support.getManagedSessions().get(session.getId()));
257     }
258 }