1 package org.opendaylight.openflowplugin.openflow.md.core.session;
3 import java.math.BigInteger;
4 import java.util.HashMap;
7 import java.util.Map.Entry;
9 import java.util.concurrent.Future;
11 import junit.framework.Assert;
13 import org.junit.After;
14 import org.junit.Before;
15 import org.junit.Test;
16 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
17 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionReadyListener;
18 import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor;
19 import org.opendaylight.openflowplugin.openflow.md.core.ErrorHandler;
20 import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
21 import org.opendaylight.openflowplugin.openflow.md.queue.QueueKeeper;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoInput;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoOutput;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoReplyInput;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInput;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncInput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigInput;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigOutput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesInput;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigInput;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigOutput;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInput;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInputBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.Port;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatus;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestInput;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestOutput;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInput;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetConfigInput;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.TableModInput;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
53 import org.opendaylight.yangtools.yang.binding.DataObject;
54 import org.opendaylight.yangtools.yang.common.RpcResult;
56 public class MessageDispatchServiceImplTest {
58 MockSessionContext session;
61 * @throws java.lang.Exception
64 public void setUp() throws Exception {
65 session = new MockSessionContext(0);
70 * @throws java.lang.Exception
73 public void tearDown() throws Exception {
78 * Test barrier message for null cookie
83 public void testBarrierMessageForPrimary() throws Exception {
84 session.getMessageDispatchService().barrier(null, null);
85 Assert.assertEquals(MessageType.BARRIER, session.getPrimaryConductor().getMessageType());
89 * Test packet out message for primary connection
94 public void testPacketOutMessageForPrimary() throws Exception {
95 session.getMessageDispatchService().packetOut(null, null);
96 Assert.assertEquals(MessageType.PACKETOUT, session.getPrimaryConductor().getMessageType());
100 * Test packet out message for auxiliary connection
105 public void testPacketOutMessageForAuxiliary() throws Exception {
106 MockConnectionConductor conductor = new MockConnectionConductor(1);
107 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
108 session.addAuxiliaryConductor(cookie, conductor);
109 session.getMessageDispatchService().packetOut(null, cookie);
110 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
111 conductor = (MockConnectionConductor) session.getAuxiliaryConductor(cookie);
112 Assert.assertEquals(MessageType.PACKETOUT, conductor.getMessageType());
116 * Test packet out message when multiple auxiliary connection exist
121 public void testPacketOutMessageForMultipleAuxiliary() throws Exception {
122 MockConnectionConductor conductor1 = new MockConnectionConductor(1);
123 SwitchConnectionDistinguisher cookie1 = conductor1.getAuxiliaryKey();
124 session.addAuxiliaryConductor(cookie1, conductor1);
125 MockConnectionConductor conductor2 = new MockConnectionConductor(2);
126 SwitchConnectionDistinguisher cookie2 = conductor2.getAuxiliaryKey();
127 session.addAuxiliaryConductor(cookie2, conductor2);
128 MockConnectionConductor conductor3 = new MockConnectionConductor(3);
129 SwitchConnectionDistinguisher cookie3 = conductor3.getAuxiliaryKey();
130 session.addAuxiliaryConductor(cookie3, conductor3);
131 PacketOutInputBuilder builder = new PacketOutInputBuilder();
133 session.getMessageDispatchService().packetOut(builder.build(), cookie2);
135 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
137 conductor3 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie3);
138 Assert.assertEquals(MessageType.NONE, conductor3.getMessageType());
140 conductor2 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie2);
141 Assert.assertEquals(MessageType.PACKETOUT, conductor2.getMessageType());
143 conductor1 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie1);
144 Assert.assertEquals(MessageType.NONE, conductor1.getMessageType());
149 * Test for invalid session
154 public void testInvalidSession() throws Exception {
155 session.setValid(false);
157 session.getMessageDispatchService().packetOut(null, null);
158 Assert.assertTrue(false);
159 } catch (IllegalArgumentException ex) {
160 Assert.assertTrue(true);
166 class MockSessionContext implements SessionContext {
167 private MockConnectionConductor conductor;
168 private Map<SwitchConnectionDistinguisher, ConnectionConductor> map;
169 private IMessageDispatchService messageService;
170 private boolean isValid = true;
172 MockSessionContext(int conductorNum) {
173 conductor = new MockConnectionConductor(conductorNum);
174 map = new HashMap<SwitchConnectionDistinguisher, ConnectionConductor>();
175 messageService = new MessageDispatchServiceImpl(this);
179 public MockConnectionConductor getPrimaryConductor() {
180 // TODO Auto-generated method stub
185 public GetFeaturesOutput getFeatures() {
186 // TODO Auto-generated method stub
191 public ConnectionConductor getAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey) {
193 return map.get(auxiliaryKey);
197 public Set<Entry<SwitchConnectionDistinguisher, ConnectionConductor>> getAuxiliaryConductors() {
198 // TODO Auto-generated method stub
203 public void addAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey, ConnectionConductor conductor) {
204 map.put(auxiliaryKey, conductor);
208 public ConnectionConductor removeAuxiliaryConductor(SwitchConnectionDistinguisher connectionCookie) {
209 return map.remove(connectionCookie);
213 public boolean isValid() {
214 // TODO Auto-generated method stub
219 public void setValid(boolean valid) {
224 public SwitchConnectionDistinguisher getSessionKey() {
225 // TODO Auto-generated method stub
230 public IMessageDispatchService getMessageDispatchService() {
231 // TODO Auto-generated method stub
232 return messageService;
236 public Long getNextXid() {
237 // TODO Auto-generated method stub
242 public Map<Long, Port> getPhysicalPorts() {
243 // TODO Auto-generated method stub
248 public Set<Long> getPorts() {
249 // TODO Auto-generated method stub
254 public Port getPhysicalPort(Long portNumber) {
255 // TODO Auto-generated method stub
260 public Boolean getPortBandwidth(Long portNumber) {
261 // TODO Auto-generated method stub
266 public boolean isPortEnabled(long portNumber) {
267 // TODO Auto-generated method stub
272 public boolean isPortEnabled(Port port) {
273 // TODO Auto-generated method stub
278 public List<Port> getEnabledPorts() {
279 // TODO Auto-generated method stub
284 public void processPortStatusMsg(PortStatus arg0) {
285 // TODO Auto-generated method stub
291 class MockConnectionConductor implements ConnectionConductor {
293 private int conductorNum;
294 private MockConnectionAdapter adapter;
296 public MockConnectionConductor(int conductorNumber) {
297 conductorNum = conductorNumber;
298 adapter = new MockConnectionAdapter();
303 // TODO Auto-generated method stub
308 public Short getVersion() {
309 // TODO Auto-generated method stub
314 public CONDUCTOR_STATE getConductorState() {
315 // TODO Auto-generated method stub
320 public void setConductorState(CONDUCTOR_STATE conductorState) {
321 // TODO Auto-generated method stub
326 public Future<Boolean> disconnect() {
327 // TODO Auto-generated method stub
332 public void setSessionContext(SessionContext context) {
333 // TODO Auto-generated method stub
338 public void setConnectionCookie(SwitchConnectionDistinguisher auxiliaryKey) {
339 // TODO Auto-generated method stub
344 public SessionContext getSessionContext() {
345 // TODO Auto-generated method stub
350 public SwitchConnectionDistinguisher getAuxiliaryKey() {
351 if (0 != conductorNum) {
352 SwitchConnectionCookieOFImpl key = new SwitchConnectionCookieOFImpl();
353 key.setDatapathId(BigInteger.valueOf(10L));
354 key.setAuxiliaryId((short) conductorNum);
362 public ConnectionAdapter getConnectionAdapter() {
363 // TODO Auto-generated method stub
367 public MessageType getMessageType() {
368 return adapter.getMessageType();
372 public void setQueueKeeper(QueueKeeper<OfHeader, DataObject> queueKeeper) {
377 public void setErrorHandler(ErrorHandler errorHandler) {
382 NONE, BARRIER, FLOWMOD, TABLEMOD, PACKETOUT;
385 class MockConnectionAdapter implements ConnectionAdapter {
387 private MessageType messageType;
388 private ConnectionReadyListener connectionReadyListener;
390 public MockConnectionAdapter() {
391 setMessageType(MessageType.NONE);
395 public Future<RpcResult<BarrierOutput>> barrier(BarrierInput input) {
396 setMessageType(MessageType.BARRIER);
401 public Future<RpcResult<EchoOutput>> echo(EchoInput input) {
402 // TODO Auto-generated method stub
407 public Future<RpcResult<Void>> echoReply(EchoReplyInput input) {
408 // TODO Auto-generated method stub
413 public Future<RpcResult<Void>> experimenter(ExperimenterInput input) {
414 // TODO Auto-generated method stub
419 public Future<RpcResult<Void>> flowMod(FlowModInput input) {
420 setMessageType(MessageType.FLOWMOD);
425 public Future<RpcResult<GetAsyncOutput>> getAsync(GetAsyncInput input) {
426 // TODO Auto-generated method stub
431 public Future<RpcResult<GetConfigOutput>> getConfig(GetConfigInput input) {
432 // TODO Auto-generated method stub
437 public Future<RpcResult<GetFeaturesOutput>> getFeatures(GetFeaturesInput input) {
438 // TODO Auto-generated method stub
443 public Future<RpcResult<GetQueueConfigOutput>> getQueueConfig(GetQueueConfigInput input) {
444 // TODO Auto-generated method stub
449 public Future<RpcResult<Void>> groupMod(GroupModInput input) {
450 // TODO Auto-generated method stub
455 public Future<RpcResult<Void>> hello(HelloInput input) {
456 // TODO Auto-generated method stub
461 public Future<RpcResult<Void>> meterMod(MeterModInput input) {
462 // TODO Auto-generated method stub
467 public Future<RpcResult<Void>> packetOut(PacketOutInput input) {
468 setMessageType(MessageType.PACKETOUT);
473 public Future<RpcResult<Void>> portMod(PortModInput input) {
474 // TODO Auto-generated method stub
479 public Future<RpcResult<RoleRequestOutput>> roleRequest(RoleRequestInput input) {
480 // TODO Auto-generated method stub
485 public Future<RpcResult<Void>> setAsync(SetAsyncInput input) {
486 // TODO Auto-generated method stub
491 public Future<RpcResult<Void>> setConfig(SetConfigInput input) {
492 // TODO Auto-generated method stub
497 public Future<RpcResult<Void>> tableMod(TableModInput input) {
498 setMessageType(MessageType.TABLEMOD);
503 public Future<Boolean> disconnect() {
504 // TODO Auto-generated method stub
509 public boolean isAlive() {
510 // TODO Auto-generated method stub
515 public void setMessageListener(OpenflowProtocolListener messageListener) {
516 // TODO Auto-generated method stub
521 public void setSystemListener(SystemNotificationsListener systemListener) {
522 // TODO Auto-generated method stub
527 public void checkListeners() {
528 // TODO Auto-generated method stub
533 * @return the messageType
535 public MessageType getMessageType() {
541 * the messageType to set
543 public void setMessageType(MessageType messageType) {
544 this.messageType = messageType;
548 public void fireConnectionReadyNotification() {
549 connectionReadyListener.onConnectionReady();
553 public void setConnectionReadyListener(
554 ConnectionReadyListener connectionReadyListener) {
555 this.connectionReadyListener = connectionReadyListener;