1 package org.opendaylight.openflowplugin.openflow.md.core.session;
3 import java.math.BigInteger;
4 import java.util.HashMap;
6 import java.util.Map.Entry;
8 import java.util.concurrent.Future;
10 import junit.framework.Assert;
12 import org.junit.After;
13 import org.junit.Before;
14 import org.junit.Test;
15 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
16 import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor;
17 import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoInput;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoOutput;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoReplyInput;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInput;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncInput;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutput;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigInput;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigOutput;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesInput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigInput;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigOutput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInput;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInputBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestInput;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestOutput;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetConfigInput;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.TableModInput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
46 import org.opendaylight.yangtools.yang.common.RpcResult;
48 public class MessageDispatchServiceImplTest {
50 MockSessionContext session;
53 * @throws java.lang.Exception
56 public void setUp() throws Exception {
57 session = new MockSessionContext(0);
62 * @throws java.lang.Exception
65 public void tearDown() throws Exception {
70 * Test barrier message for null cookie
75 public void testBarrierMessageForPrimary() throws Exception {
76 session.getMessageDispatchService().barrier(null, null);
77 Assert.assertEquals(MessageType.BARRIER, session.getPrimaryConductor().getMessageType());
81 * Test packet out message for primary connection
86 public void testPacketOutMessageForPrimary() throws Exception {
87 session.getMessageDispatchService().packetOut(null, null);
88 Assert.assertEquals(MessageType.PACKETOUT, session.getPrimaryConductor().getMessageType());
92 * Test packet out message for auxiliary connection
97 public void testPacketOutMessageForAuxiliary() throws Exception {
98 MockConnectionConductor conductor = new MockConnectionConductor(1);
99 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
100 session.addAuxiliaryConductor(cookie, conductor);
101 session.getMessageDispatchService().packetOut(null, cookie);
102 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
103 conductor = (MockConnectionConductor) session.getAuxiliaryConductor(cookie);
104 Assert.assertEquals(MessageType.PACKETOUT, conductor.getMessageType());
108 * Test packet out message when multiple auxiliary connection exist
113 public void testPacketOutMessageForMultipleAuxiliary() throws Exception {
114 MockConnectionConductor conductor1 = new MockConnectionConductor(1);
115 SwitchConnectionDistinguisher cookie1 = conductor1.getAuxiliaryKey();
116 session.addAuxiliaryConductor(cookie1, conductor1);
117 MockConnectionConductor conductor2 = new MockConnectionConductor(2);
118 SwitchConnectionDistinguisher cookie2 = conductor2.getAuxiliaryKey();
119 session.addAuxiliaryConductor(cookie2, conductor2);
120 MockConnectionConductor conductor3 = new MockConnectionConductor(3);
121 SwitchConnectionDistinguisher cookie3 = conductor3.getAuxiliaryKey();
122 session.addAuxiliaryConductor(cookie3, conductor3);
123 PacketOutInputBuilder builder = new PacketOutInputBuilder();
125 session.getMessageDispatchService().packetOut(builder.build(), cookie2);
127 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
129 conductor3 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie3);
130 Assert.assertEquals(MessageType.NONE, conductor3.getMessageType());
132 conductor2 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie2);
133 Assert.assertEquals(MessageType.PACKETOUT, conductor2.getMessageType());
135 conductor1 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie1);
136 Assert.assertEquals(MessageType.NONE, conductor1.getMessageType());
141 * Test for invalid session
146 public void testInvalidSession() throws Exception {
147 session.setValid(false);
149 session.getMessageDispatchService().packetOut(null, null);
150 Assert.assertTrue(false);
151 } catch (IllegalArgumentException ex) {
152 Assert.assertTrue(true);
158 class MockSessionContext implements SessionContext {
159 private MockConnectionConductor conductor;
160 private Map<SwitchConnectionDistinguisher, ConnectionConductor> map;
161 private IMessageDispatchService messageService;
162 private boolean isValid = true;
164 MockSessionContext(int conductorNum) {
165 conductor = new MockConnectionConductor(conductorNum);
166 map = new HashMap<SwitchConnectionDistinguisher, ConnectionConductor>();
167 messageService = new MessageDispatchServiceImpl(this);
171 public MockConnectionConductor getPrimaryConductor() {
172 // TODO Auto-generated method stub
177 public GetFeaturesOutput getFeatures() {
178 // TODO Auto-generated method stub
183 public ConnectionConductor getAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey) {
185 return map.get(auxiliaryKey);
189 public Set<Entry<SwitchConnectionDistinguisher, ConnectionConductor>> getAuxiliaryConductors() {
190 // TODO Auto-generated method stub
195 public void addAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey, ConnectionConductor conductor) {
196 map.put(auxiliaryKey, conductor);
200 public ConnectionConductor removeAuxiliaryConductor(SwitchConnectionDistinguisher connectionCookie) {
201 return map.remove(connectionCookie);
205 public boolean isValid() {
206 // TODO Auto-generated method stub
211 public void setValid(boolean valid) {
216 public SwitchConnectionDistinguisher getSessionKey() {
217 // TODO Auto-generated method stub
222 public IMessageDispatchService getMessageDispatchService() {
223 // TODO Auto-generated method stub
224 return messageService;
228 public Long getNextXid() {
229 // TODO Auto-generated method stub
235 class MockConnectionConductor implements ConnectionConductor {
237 private int conductorNum;
238 private MockConnectionAdapter adapter;
240 public MockConnectionConductor(int conductorNumber) {
241 conductorNum = conductorNumber;
242 adapter = new MockConnectionAdapter();
247 // TODO Auto-generated method stub
252 public Short getVersion() {
253 // TODO Auto-generated method stub
258 public CONDUCTOR_STATE getConductorState() {
259 // TODO Auto-generated method stub
264 public void setConductorState(CONDUCTOR_STATE conductorState) {
265 // TODO Auto-generated method stub
270 public Future<Boolean> disconnect() {
271 // TODO Auto-generated method stub
276 public void setSessionContext(SessionContext context) {
277 // TODO Auto-generated method stub
282 public void setConnectionCookie(SwitchConnectionDistinguisher auxiliaryKey) {
283 // TODO Auto-generated method stub
288 public SessionContext getSessionContext() {
289 // TODO Auto-generated method stub
294 public SwitchConnectionDistinguisher getAuxiliaryKey() {
295 if (0 != conductorNum) {
296 SwitchConnectionCookieOFImpl key = new SwitchConnectionCookieOFImpl();
297 key.setDatapathId(BigInteger.valueOf(10L));
298 key.setAuxiliaryId((short) conductorNum);
306 public ConnectionAdapter getConnectionAdapter() {
307 // TODO Auto-generated method stub
311 public MessageType getMessageType() {
312 return adapter.getMessageType();
318 NONE, BARRIER, FLOWMOD, TABLEMOD, PACKETOUT;
321 class MockConnectionAdapter implements ConnectionAdapter {
323 private MessageType messageType;
325 public MockConnectionAdapter() {
326 setMessageType(MessageType.NONE);
330 public Future<RpcResult<BarrierOutput>> barrier(BarrierInput input) {
331 setMessageType(MessageType.BARRIER);
336 public Future<RpcResult<EchoOutput>> echo(EchoInput input) {
337 // TODO Auto-generated method stub
342 public Future<RpcResult<Void>> echoReply(EchoReplyInput input) {
343 // TODO Auto-generated method stub
348 public Future<RpcResult<Void>> experimenter(ExperimenterInput input) {
349 // TODO Auto-generated method stub
354 public Future<RpcResult<Void>> flowMod(FlowModInput input) {
355 setMessageType(MessageType.FLOWMOD);
360 public Future<RpcResult<GetAsyncOutput>> getAsync(GetAsyncInput input) {
361 // TODO Auto-generated method stub
366 public Future<RpcResult<GetConfigOutput>> getConfig(GetConfigInput input) {
367 // TODO Auto-generated method stub
372 public Future<RpcResult<GetFeaturesOutput>> getFeatures(GetFeaturesInput input) {
373 // TODO Auto-generated method stub
378 public Future<RpcResult<GetQueueConfigOutput>> getQueueConfig(GetQueueConfigInput input) {
379 // TODO Auto-generated method stub
384 public Future<RpcResult<Void>> groupMod(GroupModInput input) {
385 // TODO Auto-generated method stub
390 public Future<RpcResult<Void>> hello(HelloInput input) {
391 // TODO Auto-generated method stub
396 public Future<RpcResult<Void>> meterMod(MeterModInput input) {
397 // TODO Auto-generated method stub
402 public Future<RpcResult<Void>> packetOut(PacketOutInput input) {
403 setMessageType(MessageType.PACKETOUT);
408 public Future<RpcResult<Void>> portMod(PortModInput input) {
409 // TODO Auto-generated method stub
414 public Future<RpcResult<RoleRequestOutput>> roleRequest(RoleRequestInput input) {
415 // TODO Auto-generated method stub
420 public Future<RpcResult<Void>> setAsync(SetAsyncInput input) {
421 // TODO Auto-generated method stub
426 public Future<RpcResult<Void>> setConfig(SetConfigInput input) {
427 // TODO Auto-generated method stub
432 public Future<RpcResult<Void>> tableMod(TableModInput input) {
433 setMessageType(MessageType.TABLEMOD);
438 public Future<Boolean> disconnect() {
439 // TODO Auto-generated method stub
444 public boolean isAlive() {
445 // TODO Auto-generated method stub
450 public void setMessageListener(OpenflowProtocolListener messageListener) {
451 // TODO Auto-generated method stub
456 public void setSystemListener(SystemNotificationsListener systemListener) {
457 // TODO Auto-generated method stub
462 public void checkListeners() {
463 // TODO Auto-generated method stub
468 * @return the messageType
470 public MessageType getMessageType() {
476 * the messageType to set
478 public void setMessageType(MessageType messageType) {
479 this.messageType = messageType;