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.SwitchConnectionDistinguisher;
20 import org.opendaylight.openflowplugin.openflow.md.queue.QueueKeeper;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoInput;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoOutput;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoReplyInput;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInput;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncInput;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigInput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigOutput;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesInput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigInput;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigOutput;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInput;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInputBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.Port;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatus;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestInput;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestOutput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInput;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetConfigInput;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.TableModInput;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
51 import org.opendaylight.yangtools.yang.common.RpcResult;
53 public class MessageDispatchServiceImplTest {
55 MockSessionContext session;
58 * @throws java.lang.Exception
61 public void setUp() throws Exception {
62 session = new MockSessionContext(0);
67 * @throws java.lang.Exception
70 public void tearDown() throws Exception {
75 * Test barrier message for null cookie
80 public void testBarrierMessageForPrimary() throws Exception {
81 session.getMessageDispatchService().barrier(null, null);
82 Assert.assertEquals(MessageType.BARRIER, session.getPrimaryConductor().getMessageType());
86 * Test packet out message for primary connection
91 public void testPacketOutMessageForPrimary() throws Exception {
92 session.getMessageDispatchService().packetOut(null, null);
93 Assert.assertEquals(MessageType.PACKETOUT, session.getPrimaryConductor().getMessageType());
97 * Test packet out message for auxiliary connection
102 public void testPacketOutMessageForAuxiliary() throws Exception {
103 MockConnectionConductor conductor = new MockConnectionConductor(1);
104 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
105 session.addAuxiliaryConductor(cookie, conductor);
106 session.getMessageDispatchService().packetOut(null, cookie);
107 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
108 conductor = (MockConnectionConductor) session.getAuxiliaryConductor(cookie);
109 Assert.assertEquals(MessageType.PACKETOUT, conductor.getMessageType());
113 * Test packet out message when multiple auxiliary connection exist
118 public void testPacketOutMessageForMultipleAuxiliary() throws Exception {
119 MockConnectionConductor conductor1 = new MockConnectionConductor(1);
120 SwitchConnectionDistinguisher cookie1 = conductor1.getAuxiliaryKey();
121 session.addAuxiliaryConductor(cookie1, conductor1);
122 MockConnectionConductor conductor2 = new MockConnectionConductor(2);
123 SwitchConnectionDistinguisher cookie2 = conductor2.getAuxiliaryKey();
124 session.addAuxiliaryConductor(cookie2, conductor2);
125 MockConnectionConductor conductor3 = new MockConnectionConductor(3);
126 SwitchConnectionDistinguisher cookie3 = conductor3.getAuxiliaryKey();
127 session.addAuxiliaryConductor(cookie3, conductor3);
128 PacketOutInputBuilder builder = new PacketOutInputBuilder();
130 session.getMessageDispatchService().packetOut(builder.build(), cookie2);
132 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
134 conductor3 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie3);
135 Assert.assertEquals(MessageType.NONE, conductor3.getMessageType());
137 conductor2 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie2);
138 Assert.assertEquals(MessageType.PACKETOUT, conductor2.getMessageType());
140 conductor1 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie1);
141 Assert.assertEquals(MessageType.NONE, conductor1.getMessageType());
146 * Test for invalid session
151 public void testInvalidSession() throws Exception {
152 session.setValid(false);
154 session.getMessageDispatchService().packetOut(null, null);
155 Assert.assertTrue(false);
156 } catch (IllegalArgumentException ex) {
157 Assert.assertTrue(true);
163 class MockSessionContext implements SessionContext {
164 private MockConnectionConductor conductor;
165 private Map<SwitchConnectionDistinguisher, ConnectionConductor> map;
166 private IMessageDispatchService messageService;
167 private boolean isValid = true;
169 MockSessionContext(int conductorNum) {
170 conductor = new MockConnectionConductor(conductorNum);
171 map = new HashMap<SwitchConnectionDistinguisher, ConnectionConductor>();
172 messageService = new MessageDispatchServiceImpl(this);
176 public MockConnectionConductor getPrimaryConductor() {
177 // TODO Auto-generated method stub
182 public GetFeaturesOutput getFeatures() {
183 // TODO Auto-generated method stub
188 public ConnectionConductor getAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey) {
190 return map.get(auxiliaryKey);
194 public Set<Entry<SwitchConnectionDistinguisher, ConnectionConductor>> getAuxiliaryConductors() {
195 // TODO Auto-generated method stub
200 public void addAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey, ConnectionConductor conductor) {
201 map.put(auxiliaryKey, conductor);
205 public ConnectionConductor removeAuxiliaryConductor(SwitchConnectionDistinguisher connectionCookie) {
206 return map.remove(connectionCookie);
210 public boolean isValid() {
211 // TODO Auto-generated method stub
216 public void setValid(boolean valid) {
221 public SwitchConnectionDistinguisher getSessionKey() {
222 // TODO Auto-generated method stub
227 public IMessageDispatchService getMessageDispatchService() {
228 // TODO Auto-generated method stub
229 return messageService;
233 public Long getNextXid() {
234 // TODO Auto-generated method stub
239 public Map<Long, Port> getPhysicalPorts() {
240 // TODO Auto-generated method stub
245 public Set<Long> getPorts() {
246 // TODO Auto-generated method stub
251 public Port getPhysicalPort(Long portNumber) {
252 // TODO Auto-generated method stub
257 public Boolean getPortBandwidth(Long portNumber) {
258 // TODO Auto-generated method stub
263 public boolean isPortEnabled(long portNumber) {
264 // TODO Auto-generated method stub
269 public boolean isPortEnabled(Port port) {
270 // TODO Auto-generated method stub
275 public List<Port> getEnabledPorts() {
276 // TODO Auto-generated method stub
281 public void processPortStatusMsg(PortStatus arg0) {
282 // TODO Auto-generated method stub
288 class MockConnectionConductor implements ConnectionConductor {
290 private int conductorNum;
291 private MockConnectionAdapter adapter;
293 public MockConnectionConductor(int conductorNumber) {
294 conductorNum = conductorNumber;
295 adapter = new MockConnectionAdapter();
300 // TODO Auto-generated method stub
305 public Short getVersion() {
306 // TODO Auto-generated method stub
311 public CONDUCTOR_STATE getConductorState() {
312 // TODO Auto-generated method stub
317 public void setConductorState(CONDUCTOR_STATE conductorState) {
318 // TODO Auto-generated method stub
323 public Future<Boolean> disconnect() {
324 // TODO Auto-generated method stub
329 public void setSessionContext(SessionContext context) {
330 // TODO Auto-generated method stub
335 public void setConnectionCookie(SwitchConnectionDistinguisher auxiliaryKey) {
336 // TODO Auto-generated method stub
341 public SessionContext getSessionContext() {
342 // TODO Auto-generated method stub
347 public SwitchConnectionDistinguisher getAuxiliaryKey() {
348 if (0 != conductorNum) {
349 SwitchConnectionCookieOFImpl key = new SwitchConnectionCookieOFImpl();
350 key.setDatapathId(BigInteger.valueOf(10L));
351 key.setAuxiliaryId((short) conductorNum);
359 public ConnectionAdapter getConnectionAdapter() {
360 // TODO Auto-generated method stub
364 public MessageType getMessageType() {
365 return adapter.getMessageType();
368 public void setQueueKeeper(QueueKeeper<Object> queueKeeper) {
374 NONE, BARRIER, FLOWMOD, TABLEMOD, PACKETOUT;
377 class MockConnectionAdapter implements ConnectionAdapter {
379 private MessageType messageType;
380 private ConnectionReadyListener connectionReadyListener;
382 public MockConnectionAdapter() {
383 setMessageType(MessageType.NONE);
387 public Future<RpcResult<BarrierOutput>> barrier(BarrierInput input) {
388 setMessageType(MessageType.BARRIER);
393 public Future<RpcResult<EchoOutput>> echo(EchoInput input) {
394 // TODO Auto-generated method stub
399 public Future<RpcResult<Void>> echoReply(EchoReplyInput input) {
400 // TODO Auto-generated method stub
405 public Future<RpcResult<Void>> experimenter(ExperimenterInput input) {
406 // TODO Auto-generated method stub
411 public Future<RpcResult<Void>> flowMod(FlowModInput input) {
412 setMessageType(MessageType.FLOWMOD);
417 public Future<RpcResult<GetAsyncOutput>> getAsync(GetAsyncInput input) {
418 // TODO Auto-generated method stub
423 public Future<RpcResult<GetConfigOutput>> getConfig(GetConfigInput input) {
424 // TODO Auto-generated method stub
429 public Future<RpcResult<GetFeaturesOutput>> getFeatures(GetFeaturesInput input) {
430 // TODO Auto-generated method stub
435 public Future<RpcResult<GetQueueConfigOutput>> getQueueConfig(GetQueueConfigInput input) {
436 // TODO Auto-generated method stub
441 public Future<RpcResult<Void>> groupMod(GroupModInput input) {
442 // TODO Auto-generated method stub
447 public Future<RpcResult<Void>> hello(HelloInput input) {
448 // TODO Auto-generated method stub
453 public Future<RpcResult<Void>> meterMod(MeterModInput input) {
454 // TODO Auto-generated method stub
459 public Future<RpcResult<Void>> packetOut(PacketOutInput input) {
460 setMessageType(MessageType.PACKETOUT);
465 public Future<RpcResult<Void>> portMod(PortModInput input) {
466 // TODO Auto-generated method stub
471 public Future<RpcResult<RoleRequestOutput>> roleRequest(RoleRequestInput input) {
472 // TODO Auto-generated method stub
477 public Future<RpcResult<Void>> setAsync(SetAsyncInput input) {
478 // TODO Auto-generated method stub
483 public Future<RpcResult<Void>> setConfig(SetConfigInput input) {
484 // TODO Auto-generated method stub
489 public Future<RpcResult<Void>> tableMod(TableModInput input) {
490 setMessageType(MessageType.TABLEMOD);
495 public Future<Boolean> disconnect() {
496 // TODO Auto-generated method stub
501 public boolean isAlive() {
502 // TODO Auto-generated method stub
507 public void setMessageListener(OpenflowProtocolListener messageListener) {
508 // TODO Auto-generated method stub
513 public void setSystemListener(SystemNotificationsListener systemListener) {
514 // TODO Auto-generated method stub
519 public void checkListeners() {
520 // TODO Auto-generated method stub
525 * @return the messageType
527 public MessageType getMessageType() {
533 * the messageType to set
535 public void setMessageType(MessageType messageType) {
536 this.messageType = messageType;
540 public void fireConnectionReadyNotification() {
541 connectionReadyListener.onConnectionReady();
545 public void setConnectionReadyListener(
546 ConnectionReadyListener connectionReadyListener) {
547 this.connectionReadyListener = connectionReadyListener;