001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 * 019 */ 020package org.apache.mina.handler.demux; 021 022import org.apache.mina.core.session.IoSession; 023import org.easymock.EasyMock; 024import org.junit.Before; 025import org.junit.Test; 026 027/** 028 * Tests {@link org.apache.mina.handler.demux.DemuxingIoHandler}. 029 * 030 * @author <a href="http://mina.apache.org">Apache MINA Project</a> 031 */ 032@SuppressWarnings("unchecked") 033public class DemuxingIoHandlerTest { 034 MessageHandler handler1; 035 036 MessageHandler handler2; 037 038 MessageHandler handler3; 039 040 IoSession session; 041 042 Object[] msg; 043 044 @Before 045 public void setUp() throws Exception { 046 /* 047 * Create the messages. 048 */ 049 msg = new Object[9]; 050 msg[0] = new C1(); 051 msg[1] = new C2(); 052 msg[2] = new C3(); 053 msg[3] = new C1(); 054 msg[4] = new C2(); 055 msg[5] = new C3(); 056 msg[6] = new C1(); 057 msg[7] = new C2(); 058 msg[8] = new C3(); 059 060 /* 061 * Create mocks. 062 */ 063 handler1 = EasyMock.createMock(MessageHandler.class); 064 handler2 = EasyMock.createMock(MessageHandler.class); 065 handler3 = EasyMock.createMock(MessageHandler.class); 066 067 session = EasyMock.createMock(IoSession.class); 068 } 069 070 @Test 071 public void testFindHandlerByClass() throws Exception { 072 /* 073 * Record expectations. 074 */ 075 handler1.handleMessage(session, msg[0]); 076 handler1.handleMessage(session, msg[1]); 077 handler1.handleMessage(session, msg[2]); 078 handler1.handleMessage(session, msg[3]); 079 handler2.handleMessage(session, msg[4]); 080 handler2.handleMessage(session, msg[5]); 081 handler1.handleMessage(session, msg[6]); 082 handler2.handleMessage(session, msg[7]); 083 handler3.handleMessage(session, msg[8]); 084 085 /* 086 * Replay. 087 */ 088 EasyMock.replay(handler1); 089 EasyMock.replay(handler2); 090 EasyMock.replay(handler3); 091 092 DemuxingIoHandler ioHandler = new DemuxingIoHandler(); 093 094 /* 095 * First round. All messages should be handled by handler1 096 */ 097 ioHandler.addReceivedMessageHandler(C1.class, handler1); 098 ioHandler.messageReceived(session, msg[0]); 099 ioHandler.messageReceived(session, msg[1]); 100 ioHandler.messageReceived(session, msg[2]); 101 102 /* 103 * Second round. C1 messages should be handled by handler1. C2 and C3 104 * messages should be handled by handler2. 105 */ 106 ioHandler.addReceivedMessageHandler(C2.class, handler2); 107 ioHandler.messageReceived(session, msg[3]); 108 ioHandler.messageReceived(session, msg[4]); 109 ioHandler.messageReceived(session, msg[5]); 110 111 /* 112 * Third round. C1 messages should be handled by handler1, C2 by 113 * handler2 and C3 by handler3. 114 */ 115 ioHandler.addReceivedMessageHandler(C3.class, handler3); 116 ioHandler.messageReceived(session, msg[6]); 117 ioHandler.messageReceived(session, msg[7]); 118 ioHandler.messageReceived(session, msg[8]); 119 120 /* 121 * Verify. 122 */ 123 EasyMock.verify(handler1); 124 EasyMock.verify(handler2); 125 EasyMock.verify(handler3); 126 } 127 128 @Test 129 public void testFindHandlerByInterface() throws Exception { 130 /* 131 * Record expectations. 132 */ 133 handler1.handleMessage(session, msg[0]); 134 handler1.handleMessage(session, msg[1]); 135 handler1.handleMessage(session, msg[2]); 136 handler1.handleMessage(session, msg[3]); 137 handler2.handleMessage(session, msg[4]); 138 handler1.handleMessage(session, msg[5]); 139 handler3.handleMessage(session, msg[6]); 140 handler2.handleMessage(session, msg[7]); 141 handler3.handleMessage(session, msg[8]); 142 143 /* 144 * Replay. 145 */ 146 EasyMock.replay(handler1); 147 EasyMock.replay(handler2); 148 EasyMock.replay(handler3); 149 150 DemuxingIoHandler ioHandler = new DemuxingIoHandler(); 151 152 /* 153 * First round. All messages should be handled by handler1 154 */ 155 ioHandler.addReceivedMessageHandler(I4.class, handler1); 156 ioHandler.messageReceived(session, msg[0]); 157 ioHandler.messageReceived(session, msg[1]); 158 ioHandler.messageReceived(session, msg[2]); 159 160 /* 161 * Second round. C1 and C3 messages should be handled by handler1. C2 162 * messages should be handled by handler2. 163 */ 164 ioHandler.addReceivedMessageHandler(I6.class, handler2); 165 ioHandler.messageReceived(session, msg[3]); 166 ioHandler.messageReceived(session, msg[4]); 167 ioHandler.messageReceived(session, msg[5]); 168 169 /* 170 * Third round. C1 and C3 messages should be handled by handler3. C2 171 * messages should be handled by handler2. 172 */ 173 ioHandler.addReceivedMessageHandler(I3.class, handler3); 174 ioHandler.messageReceived(session, msg[6]); 175 ioHandler.messageReceived(session, msg[7]); 176 ioHandler.messageReceived(session, msg[8]); 177 178 /* 179 * Verify. 180 */ 181 EasyMock.verify(handler1); 182 EasyMock.verify(handler2); 183 EasyMock.verify(handler3); 184 } 185 186 /* 187 * Define some interfaces and classes used when testing the findHandler 188 * method. This is what the hierarchy looks like: 189 * 190 * C3 - I7 - I9 191 * | | /\ 192 * | I8 I3 I4 193 * | 194 * C2 - I5 - I6 195 * | 196 * C1 - I1 - I2 - I4 197 * | 198 * I3 199 */ 200 201 public interface I1 { 202 // Do nothing 203 } 204 205 public interface I2 extends I3 { 206 // Do nothing 207 } 208 209 public interface I3 { 210 // Do nothing 211 } 212 213 public interface I4 { 214 // Do nothing 215 } 216 217 public static class C1 implements I1, I2, I4 { 218 // Do nothing 219 } 220 221 public interface I5 { 222 // Do nothing 223 } 224 225 public interface I6 { 226 // Do nothing 227 } 228 229 public static class C2 extends C1 implements I5, I6 { 230 // Do nothing 231 } 232 233 public interface I7 extends I8 { 234 // Do nothing 235 } 236 237 public interface I8 { 238 // Do nothing 239 } 240 241 public interface I9 extends I3, I4 { 242 // Do nothing 243 } 244 245 public static class C3 extends C2 implements I7, I9 { 246 // Do nothing 247 } 248}