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.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoInput;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoOutput;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoReplyInput;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInput;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncInput;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutput;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigInput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigOutput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesInput;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigInput;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigOutput;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInput;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInputBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.Port;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatus;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestInput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestOutput;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetConfigInput;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.TableModInput;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
50 import org.opendaylight.yangtools.yang.common.RpcResult;
52 public class MessageDispatchServiceImplTest {
54 MockSessionContext session;
57 * @throws java.lang.Exception
60 public void setUp() throws Exception {
61 session = new MockSessionContext(0);
66 * @throws java.lang.Exception
69 public void tearDown() throws Exception {
74 * Test barrier message for null cookie
79 public void testBarrierMessageForPrimary() throws Exception {
80 session.getMessageDispatchService().barrier(null, null);
81 Assert.assertEquals(MessageType.BARRIER, session.getPrimaryConductor().getMessageType());
85 * Test packet out message for primary connection
90 public void testPacketOutMessageForPrimary() throws Exception {
91 session.getMessageDispatchService().packetOut(null, null);
92 Assert.assertEquals(MessageType.PACKETOUT, session.getPrimaryConductor().getMessageType());
96 * Test packet out message for auxiliary connection
101 public void testPacketOutMessageForAuxiliary() throws Exception {
102 MockConnectionConductor conductor = new MockConnectionConductor(1);
103 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
104 session.addAuxiliaryConductor(cookie, conductor);
105 session.getMessageDispatchService().packetOut(null, cookie);
106 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
107 conductor = (MockConnectionConductor) session.getAuxiliaryConductor(cookie);
108 Assert.assertEquals(MessageType.PACKETOUT, conductor.getMessageType());
112 * Test packet out message when multiple auxiliary connection exist
117 public void testPacketOutMessageForMultipleAuxiliary() throws Exception {
118 MockConnectionConductor conductor1 = new MockConnectionConductor(1);
119 SwitchConnectionDistinguisher cookie1 = conductor1.getAuxiliaryKey();
120 session.addAuxiliaryConductor(cookie1, conductor1);
121 MockConnectionConductor conductor2 = new MockConnectionConductor(2);
122 SwitchConnectionDistinguisher cookie2 = conductor2.getAuxiliaryKey();
123 session.addAuxiliaryConductor(cookie2, conductor2);
124 MockConnectionConductor conductor3 = new MockConnectionConductor(3);
125 SwitchConnectionDistinguisher cookie3 = conductor3.getAuxiliaryKey();
126 session.addAuxiliaryConductor(cookie3, conductor3);
127 PacketOutInputBuilder builder = new PacketOutInputBuilder();
129 session.getMessageDispatchService().packetOut(builder.build(), cookie2);
131 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
133 conductor3 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie3);
134 Assert.assertEquals(MessageType.NONE, conductor3.getMessageType());
136 conductor2 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie2);
137 Assert.assertEquals(MessageType.PACKETOUT, conductor2.getMessageType());
139 conductor1 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie1);
140 Assert.assertEquals(MessageType.NONE, conductor1.getMessageType());
145 * Test for invalid session
150 public void testInvalidSession() throws Exception {
151 session.setValid(false);
153 session.getMessageDispatchService().packetOut(null, null);
154 Assert.assertTrue(false);
155 } catch (IllegalArgumentException ex) {
156 Assert.assertTrue(true);
162 class MockSessionContext implements SessionContext {
163 private MockConnectionConductor conductor;
164 private Map<SwitchConnectionDistinguisher, ConnectionConductor> map;
165 private IMessageDispatchService messageService;
166 private boolean isValid = true;
168 MockSessionContext(int conductorNum) {
169 conductor = new MockConnectionConductor(conductorNum);
170 map = new HashMap<SwitchConnectionDistinguisher, ConnectionConductor>();
171 messageService = new MessageDispatchServiceImpl(this);
175 public MockConnectionConductor getPrimaryConductor() {
176 // TODO Auto-generated method stub
181 public GetFeaturesOutput getFeatures() {
182 // TODO Auto-generated method stub
187 public ConnectionConductor getAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey) {
189 return map.get(auxiliaryKey);
193 public Set<Entry<SwitchConnectionDistinguisher, ConnectionConductor>> getAuxiliaryConductors() {
194 // TODO Auto-generated method stub
199 public void addAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey, ConnectionConductor conductor) {
200 map.put(auxiliaryKey, conductor);
204 public ConnectionConductor removeAuxiliaryConductor(SwitchConnectionDistinguisher connectionCookie) {
205 return map.remove(connectionCookie);
209 public boolean isValid() {
210 // TODO Auto-generated method stub
215 public void setValid(boolean valid) {
220 public SwitchConnectionDistinguisher getSessionKey() {
221 // TODO Auto-generated method stub
226 public IMessageDispatchService getMessageDispatchService() {
227 // TODO Auto-generated method stub
228 return messageService;
232 public Long getNextXid() {
233 // TODO Auto-generated method stub
238 public Map<Long, Port> getPhysicalPorts() {
239 // TODO Auto-generated method stub
244 public Set<Long> getPorts() {
245 // TODO Auto-generated method stub
250 public Port getPhysicalPort(Long portNumber) {
251 // TODO Auto-generated method stub
256 public Boolean getPortBandwidth(Long portNumber) {
257 // TODO Auto-generated method stub
262 public boolean isPortEnabled(long portNumber) {
263 // TODO Auto-generated method stub
268 public boolean isPortEnabled(Port port) {
269 // TODO Auto-generated method stub
274 public List<Port> getEnabledPorts() {
275 // TODO Auto-generated method stub
280 public void processPortStatusMsg(PortStatus arg0) {
281 // TODO Auto-generated method stub
287 class MockConnectionConductor implements ConnectionConductor {
289 private int conductorNum;
290 private MockConnectionAdapter adapter;
292 public MockConnectionConductor(int conductorNumber) {
293 conductorNum = conductorNumber;
294 adapter = new MockConnectionAdapter();
299 // TODO Auto-generated method stub
304 public Short getVersion() {
305 // TODO Auto-generated method stub
310 public CONDUCTOR_STATE getConductorState() {
311 // TODO Auto-generated method stub
316 public void setConductorState(CONDUCTOR_STATE conductorState) {
317 // TODO Auto-generated method stub
322 public Future<Boolean> disconnect() {
323 // TODO Auto-generated method stub
328 public void setSessionContext(SessionContext context) {
329 // TODO Auto-generated method stub
334 public void setConnectionCookie(SwitchConnectionDistinguisher auxiliaryKey) {
335 // TODO Auto-generated method stub
340 public SessionContext getSessionContext() {
341 // TODO Auto-generated method stub
346 public SwitchConnectionDistinguisher getAuxiliaryKey() {
347 if (0 != conductorNum) {
348 SwitchConnectionCookieOFImpl key = new SwitchConnectionCookieOFImpl();
349 key.setDatapathId(BigInteger.valueOf(10L));
350 key.setAuxiliaryId((short) conductorNum);
358 public ConnectionAdapter getConnectionAdapter() {
359 // TODO Auto-generated method stub
363 public MessageType getMessageType() {
364 return adapter.getMessageType();
369 NONE, BARRIER, FLOWMOD, TABLEMOD, PACKETOUT;
372 class MockConnectionAdapter implements ConnectionAdapter {
374 private MessageType messageType;
375 private ConnectionReadyListener connectionReadyListener;
377 public MockConnectionAdapter() {
378 setMessageType(MessageType.NONE);
382 public Future<RpcResult<BarrierOutput>> barrier(BarrierInput input) {
383 setMessageType(MessageType.BARRIER);
388 public Future<RpcResult<EchoOutput>> echo(EchoInput input) {
389 // TODO Auto-generated method stub
394 public Future<RpcResult<Void>> echoReply(EchoReplyInput input) {
395 // TODO Auto-generated method stub
400 public Future<RpcResult<Void>> experimenter(ExperimenterInput input) {
401 // TODO Auto-generated method stub
406 public Future<RpcResult<Void>> flowMod(FlowModInput input) {
407 setMessageType(MessageType.FLOWMOD);
412 public Future<RpcResult<GetAsyncOutput>> getAsync(GetAsyncInput input) {
413 // TODO Auto-generated method stub
418 public Future<RpcResult<GetConfigOutput>> getConfig(GetConfigInput input) {
419 // TODO Auto-generated method stub
424 public Future<RpcResult<GetFeaturesOutput>> getFeatures(GetFeaturesInput input) {
425 // TODO Auto-generated method stub
430 public Future<RpcResult<GetQueueConfigOutput>> getQueueConfig(GetQueueConfigInput input) {
431 // TODO Auto-generated method stub
436 public Future<RpcResult<Void>> groupMod(GroupModInput input) {
437 // TODO Auto-generated method stub
442 public Future<RpcResult<Void>> hello(HelloInput input) {
443 // TODO Auto-generated method stub
448 public Future<RpcResult<Void>> meterMod(MeterModInput input) {
449 // TODO Auto-generated method stub
454 public Future<RpcResult<Void>> packetOut(PacketOutInput input) {
455 setMessageType(MessageType.PACKETOUT);
460 public Future<RpcResult<Void>> portMod(PortModInput input) {
461 // TODO Auto-generated method stub
466 public Future<RpcResult<RoleRequestOutput>> roleRequest(RoleRequestInput input) {
467 // TODO Auto-generated method stub
472 public Future<RpcResult<Void>> setAsync(SetAsyncInput input) {
473 // TODO Auto-generated method stub
478 public Future<RpcResult<Void>> setConfig(SetConfigInput input) {
479 // TODO Auto-generated method stub
484 public Future<RpcResult<Void>> tableMod(TableModInput input) {
485 setMessageType(MessageType.TABLEMOD);
490 public Future<Boolean> disconnect() {
491 // TODO Auto-generated method stub
496 public boolean isAlive() {
497 // TODO Auto-generated method stub
502 public void setMessageListener(OpenflowProtocolListener messageListener) {
503 // TODO Auto-generated method stub
508 public void setSystemListener(SystemNotificationsListener systemListener) {
509 // TODO Auto-generated method stub
514 public void checkListeners() {
515 // TODO Auto-generated method stub
520 * @return the messageType
522 public MessageType getMessageType() {
528 * the messageType to set
530 public void setMessageType(MessageType messageType) {
531 this.messageType = messageType;
535 public void fireConnectionReadyNotification() {
536 connectionReadyListener.onConnectionReady();
540 public void setConnectionReadyListener(
541 ConnectionReadyListener connectionReadyListener) {
542 this.connectionReadyListener = connectionReadyListener;