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.OpenflowProtocolListener;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInputBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.Port;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatus;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestInput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestOutput;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInput;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetConfigInput;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.TableModInput;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
52 import org.opendaylight.yangtools.yang.common.RpcResult;
54 public class MessageDispatchServiceImplTest {
56 MockSessionContext session;
59 * @throws java.lang.Exception
62 public void setUp() throws Exception {
63 session = new MockSessionContext(0);
68 * @throws java.lang.Exception
71 public void tearDown() throws Exception {
76 * Test barrier message for null cookie
81 public void testBarrierMessageForPrimary() throws Exception {
82 session.getMessageDispatchService().barrier(null, null);
83 Assert.assertEquals(MessageType.BARRIER, session.getPrimaryConductor().getMessageType());
87 * Test packet out message for primary connection
92 public void testPacketOutMessageForPrimary() throws Exception {
93 session.getMessageDispatchService().packetOut(null, null);
94 Assert.assertEquals(MessageType.PACKETOUT, session.getPrimaryConductor().getMessageType());
98 * Test packet out message for auxiliary connection
103 public void testPacketOutMessageForAuxiliary() throws Exception {
104 MockConnectionConductor conductor = new MockConnectionConductor(1);
105 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
106 session.addAuxiliaryConductor(cookie, conductor);
107 session.getMessageDispatchService().packetOut(null, cookie);
108 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
109 conductor = (MockConnectionConductor) session.getAuxiliaryConductor(cookie);
110 Assert.assertEquals(MessageType.PACKETOUT, conductor.getMessageType());
114 * Test packet out message when multiple auxiliary connection exist
119 public void testPacketOutMessageForMultipleAuxiliary() throws Exception {
120 MockConnectionConductor conductor1 = new MockConnectionConductor(1);
121 SwitchConnectionDistinguisher cookie1 = conductor1.getAuxiliaryKey();
122 session.addAuxiliaryConductor(cookie1, conductor1);
123 MockConnectionConductor conductor2 = new MockConnectionConductor(2);
124 SwitchConnectionDistinguisher cookie2 = conductor2.getAuxiliaryKey();
125 session.addAuxiliaryConductor(cookie2, conductor2);
126 MockConnectionConductor conductor3 = new MockConnectionConductor(3);
127 SwitchConnectionDistinguisher cookie3 = conductor3.getAuxiliaryKey();
128 session.addAuxiliaryConductor(cookie3, conductor3);
129 PacketOutInputBuilder builder = new PacketOutInputBuilder();
131 session.getMessageDispatchService().packetOut(builder.build(), cookie2);
133 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
135 conductor3 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie3);
136 Assert.assertEquals(MessageType.NONE, conductor3.getMessageType());
138 conductor2 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie2);
139 Assert.assertEquals(MessageType.PACKETOUT, conductor2.getMessageType());
141 conductor1 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie1);
142 Assert.assertEquals(MessageType.NONE, conductor1.getMessageType());
147 * Test for invalid session
152 public void testInvalidSession() throws Exception {
153 session.setValid(false);
155 session.getMessageDispatchService().packetOut(null, null);
156 Assert.assertTrue(false);
157 } catch (IllegalArgumentException ex) {
158 Assert.assertTrue(true);
164 class MockSessionContext implements SessionContext {
165 private MockConnectionConductor conductor;
166 private Map<SwitchConnectionDistinguisher, ConnectionConductor> map;
167 private IMessageDispatchService messageService;
168 private boolean isValid = true;
170 MockSessionContext(int conductorNum) {
171 conductor = new MockConnectionConductor(conductorNum);
172 map = new HashMap<SwitchConnectionDistinguisher, ConnectionConductor>();
173 messageService = new MessageDispatchServiceImpl(this);
177 public MockConnectionConductor getPrimaryConductor() {
178 // TODO Auto-generated method stub
183 public GetFeaturesOutput getFeatures() {
184 // TODO Auto-generated method stub
189 public ConnectionConductor getAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey) {
191 return map.get(auxiliaryKey);
195 public Set<Entry<SwitchConnectionDistinguisher, ConnectionConductor>> getAuxiliaryConductors() {
196 // TODO Auto-generated method stub
201 public void addAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey, ConnectionConductor conductor) {
202 map.put(auxiliaryKey, conductor);
206 public ConnectionConductor removeAuxiliaryConductor(SwitchConnectionDistinguisher connectionCookie) {
207 return map.remove(connectionCookie);
211 public boolean isValid() {
212 // TODO Auto-generated method stub
217 public void setValid(boolean valid) {
222 public SwitchConnectionDistinguisher getSessionKey() {
223 // TODO Auto-generated method stub
228 public IMessageDispatchService getMessageDispatchService() {
229 // TODO Auto-generated method stub
230 return messageService;
234 public Long getNextXid() {
235 // TODO Auto-generated method stub
240 public Map<Long, Port> getPhysicalPorts() {
241 // TODO Auto-generated method stub
246 public Set<Long> getPorts() {
247 // TODO Auto-generated method stub
252 public Port getPhysicalPort(Long portNumber) {
253 // TODO Auto-generated method stub
258 public Boolean getPortBandwidth(Long portNumber) {
259 // TODO Auto-generated method stub
264 public boolean isPortEnabled(long portNumber) {
265 // TODO Auto-generated method stub
270 public boolean isPortEnabled(Port port) {
271 // TODO Auto-generated method stub
276 public List<Port> getEnabledPorts() {
277 // TODO Auto-generated method stub
282 public void processPortStatusMsg(PortStatus arg0) {
283 // TODO Auto-generated method stub
289 class MockConnectionConductor implements ConnectionConductor {
291 private int conductorNum;
292 private MockConnectionAdapter adapter;
294 public MockConnectionConductor(int conductorNumber) {
295 conductorNum = conductorNumber;
296 adapter = new MockConnectionAdapter();
301 // TODO Auto-generated method stub
306 public Short getVersion() {
307 // TODO Auto-generated method stub
312 public CONDUCTOR_STATE getConductorState() {
313 // TODO Auto-generated method stub
318 public void setConductorState(CONDUCTOR_STATE conductorState) {
319 // TODO Auto-generated method stub
324 public Future<Boolean> disconnect() {
325 // TODO Auto-generated method stub
330 public void setSessionContext(SessionContext context) {
331 // TODO Auto-generated method stub
336 public void setConnectionCookie(SwitchConnectionDistinguisher auxiliaryKey) {
337 // TODO Auto-generated method stub
342 public SessionContext getSessionContext() {
343 // TODO Auto-generated method stub
348 public SwitchConnectionDistinguisher getAuxiliaryKey() {
349 if (0 != conductorNum) {
350 SwitchConnectionCookieOFImpl key = new SwitchConnectionCookieOFImpl();
351 key.setDatapathId(BigInteger.valueOf(10L));
352 key.setAuxiliaryId((short) conductorNum);
360 public ConnectionAdapter getConnectionAdapter() {
361 // TODO Auto-generated method stub
365 public MessageType getMessageType() {
366 return adapter.getMessageType();
369 public void setQueueKeeper(QueueKeeper<Object> queueKeeper) {
374 public void setErrorHandler(ErrorHandler errorHandler) {
379 NONE, BARRIER, FLOWMOD, TABLEMOD, PACKETOUT;
382 class MockConnectionAdapter implements ConnectionAdapter {
384 private MessageType messageType;
385 private ConnectionReadyListener connectionReadyListener;
387 public MockConnectionAdapter() {
388 setMessageType(MessageType.NONE);
392 public Future<RpcResult<BarrierOutput>> barrier(BarrierInput input) {
393 setMessageType(MessageType.BARRIER);
398 public Future<RpcResult<EchoOutput>> echo(EchoInput input) {
399 // TODO Auto-generated method stub
404 public Future<RpcResult<Void>> echoReply(EchoReplyInput input) {
405 // TODO Auto-generated method stub
410 public Future<RpcResult<Void>> experimenter(ExperimenterInput input) {
411 // TODO Auto-generated method stub
416 public Future<RpcResult<Void>> flowMod(FlowModInput input) {
417 setMessageType(MessageType.FLOWMOD);
422 public Future<RpcResult<GetAsyncOutput>> getAsync(GetAsyncInput input) {
423 // TODO Auto-generated method stub
428 public Future<RpcResult<GetConfigOutput>> getConfig(GetConfigInput input) {
429 // TODO Auto-generated method stub
434 public Future<RpcResult<GetFeaturesOutput>> getFeatures(GetFeaturesInput input) {
435 // TODO Auto-generated method stub
440 public Future<RpcResult<GetQueueConfigOutput>> getQueueConfig(GetQueueConfigInput input) {
441 // TODO Auto-generated method stub
446 public Future<RpcResult<Void>> groupMod(GroupModInput input) {
447 // TODO Auto-generated method stub
452 public Future<RpcResult<Void>> hello(HelloInput input) {
453 // TODO Auto-generated method stub
458 public Future<RpcResult<Void>> meterMod(MeterModInput input) {
459 // TODO Auto-generated method stub
464 public Future<RpcResult<Void>> packetOut(PacketOutInput input) {
465 setMessageType(MessageType.PACKETOUT);
470 public Future<RpcResult<Void>> portMod(PortModInput input) {
471 // TODO Auto-generated method stub
476 public Future<RpcResult<RoleRequestOutput>> roleRequest(RoleRequestInput input) {
477 // TODO Auto-generated method stub
482 public Future<RpcResult<Void>> setAsync(SetAsyncInput input) {
483 // TODO Auto-generated method stub
488 public Future<RpcResult<Void>> setConfig(SetConfigInput input) {
489 // TODO Auto-generated method stub
494 public Future<RpcResult<Void>> tableMod(TableModInput input) {
495 setMessageType(MessageType.TABLEMOD);
500 public Future<Boolean> disconnect() {
501 // TODO Auto-generated method stub
506 public boolean isAlive() {
507 // TODO Auto-generated method stub
512 public void setMessageListener(OpenflowProtocolListener messageListener) {
513 // TODO Auto-generated method stub
518 public void setSystemListener(SystemNotificationsListener systemListener) {
519 // TODO Auto-generated method stub
524 public void checkListeners() {
525 // TODO Auto-generated method stub
530 * @return the messageType
532 public MessageType getMessageType() {
538 * the messageType to set
540 public void setMessageType(MessageType messageType) {
541 this.messageType = messageType;
545 public void fireConnectionReadyNotification() {
546 connectionReadyListener.onConnectionReady();
550 public void setConnectionReadyListener(
551 ConnectionReadyListener connectionReadyListener) {
552 this.connectionReadyListener = connectionReadyListener;