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.MultipartRequestInput;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInputBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.Port;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatus;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestInput;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestOutput;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInput;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetConfigInput;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.TableModInput;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
54 import org.opendaylight.yangtools.yang.binding.DataObject;
55 import org.opendaylight.yangtools.yang.common.RpcResult;
57 public class MessageDispatchServiceImplTest {
59 MockSessionContext session;
62 * @throws java.lang.Exception
65 public void setUp() throws Exception {
66 session = new MockSessionContext(0);
71 * @throws java.lang.Exception
74 public void tearDown() throws Exception {
79 * Test barrier message for null cookie
84 public void testBarrierMessageForPrimary() throws Exception {
85 session.getMessageDispatchService().barrier(null, null);
86 Assert.assertEquals(MessageType.BARRIER, session.getPrimaryConductor().getMessageType());
90 * Test packet out message for primary connection
95 public void testPacketOutMessageForPrimary() throws Exception {
96 session.getMessageDispatchService().packetOut(null, null);
97 Assert.assertEquals(MessageType.PACKETOUT, session.getPrimaryConductor().getMessageType());
101 * Test packet out message for auxiliary connection
106 public void testPacketOutMessageForAuxiliary() throws Exception {
107 MockConnectionConductor conductor = new MockConnectionConductor(1);
108 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
109 session.addAuxiliaryConductor(cookie, conductor);
110 session.getMessageDispatchService().packetOut(null, cookie);
111 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
112 conductor = (MockConnectionConductor) session.getAuxiliaryConductor(cookie);
113 Assert.assertEquals(MessageType.PACKETOUT, conductor.getMessageType());
117 * Test packet out message when multiple auxiliary connection exist
122 public void testPacketOutMessageForMultipleAuxiliary() throws Exception {
123 MockConnectionConductor conductor1 = new MockConnectionConductor(1);
124 SwitchConnectionDistinguisher cookie1 = conductor1.getAuxiliaryKey();
125 session.addAuxiliaryConductor(cookie1, conductor1);
126 MockConnectionConductor conductor2 = new MockConnectionConductor(2);
127 SwitchConnectionDistinguisher cookie2 = conductor2.getAuxiliaryKey();
128 session.addAuxiliaryConductor(cookie2, conductor2);
129 MockConnectionConductor conductor3 = new MockConnectionConductor(3);
130 SwitchConnectionDistinguisher cookie3 = conductor3.getAuxiliaryKey();
131 session.addAuxiliaryConductor(cookie3, conductor3);
132 PacketOutInputBuilder builder = new PacketOutInputBuilder();
134 session.getMessageDispatchService().packetOut(builder.build(), cookie2);
136 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
138 conductor3 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie3);
139 Assert.assertEquals(MessageType.NONE, conductor3.getMessageType());
141 conductor2 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie2);
142 Assert.assertEquals(MessageType.PACKETOUT, conductor2.getMessageType());
144 conductor1 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie1);
145 Assert.assertEquals(MessageType.NONE, conductor1.getMessageType());
150 * Test for invalid session
155 public void testInvalidSession() throws Exception {
156 session.setValid(false);
158 session.getMessageDispatchService().packetOut(null, null);
159 Assert.assertTrue(false);
160 } catch (IllegalArgumentException ex) {
161 Assert.assertTrue(true);
167 class MockSessionContext implements SessionContext {
168 private MockConnectionConductor conductor;
169 private Map<SwitchConnectionDistinguisher, ConnectionConductor> map;
170 private IMessageDispatchService messageService;
171 private boolean isValid = true;
173 MockSessionContext(int conductorNum) {
174 conductor = new MockConnectionConductor(conductorNum);
175 map = new HashMap<SwitchConnectionDistinguisher, ConnectionConductor>();
176 messageService = new MessageDispatchServiceImpl(this);
180 public MockConnectionConductor getPrimaryConductor() {
181 // TODO Auto-generated method stub
186 public GetFeaturesOutput getFeatures() {
187 // TODO Auto-generated method stub
192 public ConnectionConductor getAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey) {
194 return map.get(auxiliaryKey);
198 public Set<Entry<SwitchConnectionDistinguisher, ConnectionConductor>> getAuxiliaryConductors() {
199 // TODO Auto-generated method stub
204 public void addAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey, ConnectionConductor conductor) {
205 map.put(auxiliaryKey, conductor);
209 public ConnectionConductor removeAuxiliaryConductor(SwitchConnectionDistinguisher connectionCookie) {
210 return map.remove(connectionCookie);
214 public boolean isValid() {
215 // TODO Auto-generated method stub
220 public void setValid(boolean valid) {
225 public SwitchConnectionDistinguisher getSessionKey() {
226 // TODO Auto-generated method stub
231 public IMessageDispatchService getMessageDispatchService() {
232 // TODO Auto-generated method stub
233 return messageService;
237 public Long getNextXid() {
238 // TODO Auto-generated method stub
243 public Map<Long, Port> getPhysicalPorts() {
244 // TODO Auto-generated method stub
249 public Set<Long> getPorts() {
250 // TODO Auto-generated method stub
255 public Port getPhysicalPort(Long portNumber) {
256 // TODO Auto-generated method stub
261 public Boolean getPortBandwidth(Long portNumber) {
262 // TODO Auto-generated method stub
267 public boolean isPortEnabled(long portNumber) {
268 // TODO Auto-generated method stub
273 public boolean isPortEnabled(Port port) {
274 // TODO Auto-generated method stub
279 public List<Port> getEnabledPorts() {
280 // TODO Auto-generated method stub
285 public Map<Long, Boolean> getPortsBandwidth() {
286 // TODO Auto-generated method stub
292 class MockConnectionConductor implements ConnectionConductor {
294 private int conductorNum;
295 private MockConnectionAdapter adapter;
297 public MockConnectionConductor(int conductorNumber) {
298 conductorNum = conductorNumber;
299 adapter = new MockConnectionAdapter();
304 // TODO Auto-generated method stub
309 public Short getVersion() {
310 // TODO Auto-generated method stub
315 public CONDUCTOR_STATE getConductorState() {
316 // TODO Auto-generated method stub
321 public void setConductorState(CONDUCTOR_STATE conductorState) {
322 // TODO Auto-generated method stub
327 public Future<Boolean> disconnect() {
328 // TODO Auto-generated method stub
333 public void setSessionContext(SessionContext context) {
334 // TODO Auto-generated method stub
339 public void setConnectionCookie(SwitchConnectionDistinguisher auxiliaryKey) {
340 // TODO Auto-generated method stub
345 public SessionContext getSessionContext() {
346 // TODO Auto-generated method stub
351 public SwitchConnectionDistinguisher getAuxiliaryKey() {
352 if (0 != conductorNum) {
353 SwitchConnectionCookieOFImpl key = new SwitchConnectionCookieOFImpl();
354 key.setDatapathId(BigInteger.valueOf(10L));
355 key.setAuxiliaryId((short) conductorNum);
363 public ConnectionAdapter getConnectionAdapter() {
364 // TODO Auto-generated method stub
368 public MessageType getMessageType() {
369 return adapter.getMessageType();
373 public void setQueueKeeper(QueueKeeper<OfHeader, DataObject> queueKeeper) {
378 public void setErrorHandler(ErrorHandler errorHandler) {
383 NONE, BARRIER, FLOWMOD, TABLEMOD, PACKETOUT;
386 class MockConnectionAdapter implements ConnectionAdapter {
388 private MessageType messageType;
389 private ConnectionReadyListener connectionReadyListener;
391 public MockConnectionAdapter() {
392 setMessageType(MessageType.NONE);
396 public Future<RpcResult<BarrierOutput>> barrier(BarrierInput input) {
397 setMessageType(MessageType.BARRIER);
402 public Future<RpcResult<EchoOutput>> echo(EchoInput input) {
403 // TODO Auto-generated method stub
408 public Future<RpcResult<Void>> echoReply(EchoReplyInput input) {
409 // TODO Auto-generated method stub
414 public Future<RpcResult<Void>> experimenter(ExperimenterInput input) {
415 // TODO Auto-generated method stub
420 public Future<RpcResult<Void>> flowMod(FlowModInput input) {
421 setMessageType(MessageType.FLOWMOD);
426 public Future<RpcResult<GetAsyncOutput>> getAsync(GetAsyncInput input) {
427 // TODO Auto-generated method stub
432 public Future<RpcResult<GetConfigOutput>> getConfig(GetConfigInput input) {
433 // TODO Auto-generated method stub
438 public Future<RpcResult<GetFeaturesOutput>> getFeatures(GetFeaturesInput input) {
439 // TODO Auto-generated method stub
444 public Future<RpcResult<GetQueueConfigOutput>> getQueueConfig(GetQueueConfigInput input) {
445 // TODO Auto-generated method stub
450 public Future<RpcResult<Void>> groupMod(GroupModInput input) {
451 // TODO Auto-generated method stub
456 public Future<RpcResult<Void>> hello(HelloInput input) {
457 // TODO Auto-generated method stub
462 public Future<RpcResult<Void>> meterMod(MeterModInput input) {
463 // TODO Auto-generated method stub
468 public Future<RpcResult<Void>> packetOut(PacketOutInput input) {
469 setMessageType(MessageType.PACKETOUT);
474 public Future<RpcResult<Void>> portMod(PortModInput input) {
475 // TODO Auto-generated method stub
480 public Future<RpcResult<RoleRequestOutput>> roleRequest(RoleRequestInput input) {
481 // TODO Auto-generated method stub
486 public Future<RpcResult<Void>> setAsync(SetAsyncInput input) {
487 // TODO Auto-generated method stub
492 public Future<RpcResult<Void>> setConfig(SetConfigInput input) {
493 // TODO Auto-generated method stub
498 public Future<RpcResult<Void>> tableMod(TableModInput input) {
499 setMessageType(MessageType.TABLEMOD);
504 public Future<Boolean> disconnect() {
505 // TODO Auto-generated method stub
510 public boolean isAlive() {
511 // TODO Auto-generated method stub
516 public void setMessageListener(OpenflowProtocolListener messageListener) {
517 // TODO Auto-generated method stub
522 public void setSystemListener(SystemNotificationsListener systemListener) {
523 // TODO Auto-generated method stub
528 public void checkListeners() {
529 // TODO Auto-generated method stub
534 * @return the messageType
536 public MessageType getMessageType() {
542 * the messageType to set
544 public void setMessageType(MessageType messageType) {
545 this.messageType = messageType;
549 public void fireConnectionReadyNotification() {
550 connectionReadyListener.onConnectionReady();
554 public void setConnectionReadyListener(
555 ConnectionReadyListener connectionReadyListener) {
556 this.connectionReadyListener = connectionReadyListener;
560 public Future<RpcResult<Void>> multipartRequest(
561 MultipartRequestInput input) {
562 // TODO Auto-generated method stub