2 * Copyright IBM Corporation, 2013. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.openflowplugin.openflow.md.core.session;
10 import java.math.BigInteger;
11 import java.util.HashMap;
12 import java.util.List;
14 import java.util.Map.Entry;
16 import java.util.concurrent.Future;
18 import junit.framework.Assert;
20 import org.junit.After;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
24 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionReadyListener;
25 import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor;
26 import org.opendaylight.openflowplugin.openflow.md.core.ErrorHandler;
27 import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
28 import org.opendaylight.openflowplugin.openflow.md.queue.QueueKeeper;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInputBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoInput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoOutput;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoReplyInput;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInput;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncInput;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutput;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigInput;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigOutput;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesInput;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigInput;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigOutput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInputBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.Port;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatus;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestInput;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestOutput;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInput;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetConfigInput;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.TableModInput;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
62 import org.opendaylight.yangtools.yang.binding.DataObject;
63 import org.opendaylight.yangtools.yang.common.RpcResult;
65 public class MessageDispatchServiceImplTest {
67 MockSessionContext session;
70 * @throws java.lang.Exception
73 public void setUp() throws Exception {
74 session = new MockSessionContext(0);
79 * @throws java.lang.Exception
82 public void tearDown() throws Exception {
87 * Test barrier message for null cookie
92 public void testBarrierMessageForPrimary() throws Exception {
93 MockConnectionConductor conductor = new MockConnectionConductor(1);
94 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
95 BarrierInputBuilder barrierMsg = new BarrierInputBuilder();
96 session.getMessageDispatchService().barrier(barrierMsg.build(), cookie);
97 Assert.assertEquals(MessageType.BARRIER, session.getPrimaryConductor().getMessageType());
101 * Test packet out message for primary connection
106 public void testPacketOutMessageForPrimary() throws Exception {
107 session.getMessageDispatchService().packetOut(null, null);
108 Assert.assertEquals(MessageType.PACKETOUT, session.getPrimaryConductor().getMessageType());
112 * Test packet out message for auxiliary connection
117 public void testPacketOutMessageForAuxiliary() throws Exception {
118 MockConnectionConductor conductor = new MockConnectionConductor(1);
119 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
120 session.addAuxiliaryConductor(cookie, conductor);
121 session.getMessageDispatchService().packetOut(null, cookie);
122 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
123 conductor = (MockConnectionConductor) session.getAuxiliaryConductor(cookie);
124 Assert.assertEquals(MessageType.PACKETOUT, conductor.getMessageType());
128 * Test packet out message when multiple auxiliary connection exist
133 public void testPacketOutMessageForMultipleAuxiliary() throws Exception {
134 MockConnectionConductor conductor1 = new MockConnectionConductor(1);
135 SwitchConnectionDistinguisher cookie1 = conductor1.getAuxiliaryKey();
136 session.addAuxiliaryConductor(cookie1, conductor1);
137 MockConnectionConductor conductor2 = new MockConnectionConductor(2);
138 SwitchConnectionDistinguisher cookie2 = conductor2.getAuxiliaryKey();
139 session.addAuxiliaryConductor(cookie2, conductor2);
140 MockConnectionConductor conductor3 = new MockConnectionConductor(3);
141 SwitchConnectionDistinguisher cookie3 = conductor3.getAuxiliaryKey();
142 session.addAuxiliaryConductor(cookie3, conductor3);
143 PacketOutInputBuilder builder = new PacketOutInputBuilder();
145 session.getMessageDispatchService().packetOut(builder.build(), cookie2);
147 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
149 conductor3 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie3);
150 Assert.assertEquals(MessageType.NONE, conductor3.getMessageType());
152 conductor2 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie2);
153 Assert.assertEquals(MessageType.PACKETOUT, conductor2.getMessageType());
155 conductor1 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie1);
156 Assert.assertEquals(MessageType.NONE, conductor1.getMessageType());
161 * Test for invalid session
166 public void testInvalidSession() throws Exception {
167 session.setValid(false);
169 session.getMessageDispatchService().packetOut(null, null);
170 Assert.assertTrue(false);
171 } catch (IllegalArgumentException ex) {
172 Assert.assertTrue(true);
178 class MockSessionContext implements SessionContext {
179 private MockConnectionConductor conductor;
180 private Map<SwitchConnectionDistinguisher, ConnectionConductor> map;
181 private IMessageDispatchService messageService;
182 private boolean isValid = true;
184 MockSessionContext(int conductorNum) {
185 conductor = new MockConnectionConductor(conductorNum);
186 map = new HashMap<SwitchConnectionDistinguisher, ConnectionConductor>();
187 messageService = new MessageDispatchServiceImpl(this);
191 public MockConnectionConductor getPrimaryConductor() {
192 // TODO Auto-generated method stub
197 public GetFeaturesOutput getFeatures() {
198 // TODO Auto-generated method stub
203 public ConnectionConductor getAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey) {
205 return map.get(auxiliaryKey);
209 public Set<Entry<SwitchConnectionDistinguisher, ConnectionConductor>> getAuxiliaryConductors() {
210 // TODO Auto-generated method stub
215 public void addAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey, ConnectionConductor conductor) {
216 map.put(auxiliaryKey, conductor);
220 public ConnectionConductor removeAuxiliaryConductor(SwitchConnectionDistinguisher connectionCookie) {
221 return map.remove(connectionCookie);
225 public boolean isValid() {
226 // TODO Auto-generated method stub
231 public void setValid(boolean valid) {
236 public SwitchConnectionDistinguisher getSessionKey() {
237 // TODO Auto-generated method stub
242 public IMessageDispatchService getMessageDispatchService() {
243 // TODO Auto-generated method stub
244 return messageService;
248 public Long getNextXid() {
249 // TODO Auto-generated method stub
254 public Map<Long, Port> getPhysicalPorts() {
255 // TODO Auto-generated method stub
260 public Set<Long> getPorts() {
261 // TODO Auto-generated method stub
266 public Port getPhysicalPort(Long portNumber) {
267 // TODO Auto-generated method stub
272 public Boolean getPortBandwidth(Long portNumber) {
273 // TODO Auto-generated method stub
278 public boolean isPortEnabled(long portNumber) {
279 // TODO Auto-generated method stub
284 public boolean isPortEnabled(Port port) {
285 // TODO Auto-generated method stub
290 public List<Port> getEnabledPorts() {
291 // TODO Auto-generated method stub
296 public Map<Long, Boolean> getPortsBandwidth() {
297 // TODO Auto-generated method stub
303 class MockConnectionConductor implements ConnectionConductor {
305 private int conductorNum;
306 private MockConnectionAdapter adapter;
308 public MockConnectionConductor(int conductorNumber) {
309 conductorNum = conductorNumber;
310 adapter = new MockConnectionAdapter();
315 // TODO Auto-generated method stub
320 public Short getVersion() {
321 // TODO Auto-generated method stub
326 public CONDUCTOR_STATE getConductorState() {
327 // TODO Auto-generated method stub
332 public void setConductorState(CONDUCTOR_STATE conductorState) {
333 // TODO Auto-generated method stub
338 public Future<Boolean> disconnect() {
339 // TODO Auto-generated method stub
344 public void setSessionContext(SessionContext context) {
345 // TODO Auto-generated method stub
350 public void setConnectionCookie(SwitchConnectionDistinguisher auxiliaryKey) {
351 // TODO Auto-generated method stub
356 public SessionContext getSessionContext() {
357 // TODO Auto-generated method stub
362 public SwitchConnectionDistinguisher getAuxiliaryKey() {
363 if (0 != conductorNum) {
364 SwitchConnectionCookieOFImpl key = new SwitchConnectionCookieOFImpl();
365 key.setDatapathId(BigInteger.valueOf(10L));
366 key.setAuxiliaryId((short) conductorNum);
374 public ConnectionAdapter getConnectionAdapter() {
375 // TODO Auto-generated method stub
379 public MessageType getMessageType() {
380 return adapter.getMessageType();
384 public void setQueueKeeper(QueueKeeper<OfHeader, DataObject> queueKeeper) {
389 public void setErrorHandler(ErrorHandler errorHandler) {
394 NONE, BARRIER, FLOWMOD, TABLEMOD, PACKETOUT;
397 class MockConnectionAdapter implements ConnectionAdapter {
399 private MessageType messageType;
400 private ConnectionReadyListener connectionReadyListener;
402 public MockConnectionAdapter() {
403 setMessageType(MessageType.NONE);
407 public Future<RpcResult<BarrierOutput>> barrier(BarrierInput input) {
408 setMessageType(MessageType.BARRIER);
413 public Future<RpcResult<EchoOutput>> echo(EchoInput input) {
414 // TODO Auto-generated method stub
419 public Future<RpcResult<Void>> echoReply(EchoReplyInput input) {
420 // TODO Auto-generated method stub
425 public Future<RpcResult<Void>> experimenter(ExperimenterInput input) {
426 // TODO Auto-generated method stub
431 public Future<RpcResult<Void>> flowMod(FlowModInput input) {
432 setMessageType(MessageType.FLOWMOD);
437 public Future<RpcResult<GetAsyncOutput>> getAsync(GetAsyncInput input) {
438 // TODO Auto-generated method stub
443 public Future<RpcResult<GetConfigOutput>> getConfig(GetConfigInput input) {
444 // TODO Auto-generated method stub
449 public Future<RpcResult<GetFeaturesOutput>> getFeatures(GetFeaturesInput input) {
450 // TODO Auto-generated method stub
455 public Future<RpcResult<GetQueueConfigOutput>> getQueueConfig(GetQueueConfigInput input) {
456 // TODO Auto-generated method stub
461 public Future<RpcResult<Void>> groupMod(GroupModInput input) {
462 // TODO Auto-generated method stub
467 public Future<RpcResult<Void>> hello(HelloInput input) {
468 // TODO Auto-generated method stub
473 public Future<RpcResult<Void>> meterMod(MeterModInput input) {
474 // TODO Auto-generated method stub
479 public Future<RpcResult<Void>> packetOut(PacketOutInput input) {
480 setMessageType(MessageType.PACKETOUT);
485 public Future<RpcResult<Void>> portMod(PortModInput input) {
486 // TODO Auto-generated method stub
491 public Future<RpcResult<RoleRequestOutput>> roleRequest(RoleRequestInput input) {
492 // TODO Auto-generated method stub
497 public Future<RpcResult<Void>> setAsync(SetAsyncInput input) {
498 // TODO Auto-generated method stub
503 public Future<RpcResult<Void>> setConfig(SetConfigInput input) {
504 // TODO Auto-generated method stub
509 public Future<RpcResult<Void>> tableMod(TableModInput input) {
510 setMessageType(MessageType.TABLEMOD);
515 public Future<Boolean> disconnect() {
516 // TODO Auto-generated method stub
521 public boolean isAlive() {
522 // TODO Auto-generated method stub
527 public void setMessageListener(OpenflowProtocolListener messageListener) {
528 // TODO Auto-generated method stub
533 public void setSystemListener(SystemNotificationsListener systemListener) {
534 // TODO Auto-generated method stub
539 public void checkListeners() {
540 // TODO Auto-generated method stub
545 * @return the messageType
547 public MessageType getMessageType() {
553 * the messageType to set
555 public void setMessageType(MessageType messageType) {
556 this.messageType = messageType;
560 public void fireConnectionReadyNotification() {
561 connectionReadyListener.onConnectionReady();
565 public void setConnectionReadyListener(
566 ConnectionReadyListener connectionReadyListener) {
567 this.connectionReadyListener = connectionReadyListener;
571 public Future<RpcResult<Void>> multipartRequest(
572 MultipartRequestInput input) {
573 // TODO Auto-generated method stub