2 * Copyright IBM Corporation, 2013. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.openflowplugin.openflow.md.core.session;
10 import java.util.HashMap;
11 import java.util.List;
13 import java.util.Map.Entry;
15 import java.util.concurrent.Future;
17 import org.junit.Assert;
18 import org.junit.Before;
19 import org.junit.Test;
20 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
21 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionReadyListener;
22 import org.opendaylight.openflowplugin.openflow.md.ModelDrivenSwitch;
23 import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor;
24 import org.opendaylight.openflowplugin.openflow.md.core.ErrorHandler;
25 import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
26 import org.opendaylight.openflowplugin.openflow.md.queue.QueueKeeper;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInputBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoInput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoOutput;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoReplyInput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInput;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncInput;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutput;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigInput;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigOutput;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesInput;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigInput;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigOutput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInputBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortGrouping;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestInput;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestOutput;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInput;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetConfigInput;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.TableModInput;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
59 import org.opendaylight.yangtools.concepts.CompositeObjectRegistration;
60 import org.opendaylight.yangtools.yang.binding.DataObject;
61 import org.opendaylight.yangtools.yang.common.RpcResult;
64 * test for {@link MessageDispatchServiceImpl}
66 public class MessageDispatchServiceImplTest {
68 MockSessionContext session;
71 * @throws java.lang.Exception
74 public void setUp() throws Exception {
75 session = new MockSessionContext(0);
80 * Test barrier message for null cookie
85 public void testBarrierMessageForPrimary() throws Exception {
86 MockConnectionConductor conductor = new MockConnectionConductor(1);
87 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
88 BarrierInputBuilder barrierMsg = new BarrierInputBuilder();
89 session.getMessageDispatchService().barrier(barrierMsg.build(), cookie);
90 Assert.assertEquals(MessageType.BARRIER, session.getPrimaryConductor().getMessageType());
94 * Test packet out message for primary connection
99 public void testPacketOutMessageForPrimary() throws Exception {
100 session.getMessageDispatchService().packetOut(null, null);
101 Assert.assertEquals(MessageType.PACKETOUT, session.getPrimaryConductor().getMessageType());
105 * Test packet out message for auxiliary connection
110 public void testPacketOutMessageForAuxiliary() throws Exception {
111 MockConnectionConductor conductor = new MockConnectionConductor(1);
112 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
113 session.addAuxiliaryConductor(cookie, conductor);
114 session.getMessageDispatchService().packetOut(null, cookie);
115 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
116 conductor = (MockConnectionConductor) session.getAuxiliaryConductor(cookie);
117 Assert.assertEquals(MessageType.PACKETOUT, conductor.getMessageType());
121 * Test packet out message when multiple auxiliary connection exist
126 public void testPacketOutMessageForMultipleAuxiliary() throws Exception {
127 MockConnectionConductor conductor1 = new MockConnectionConductor(1);
128 SwitchConnectionDistinguisher cookie1 = conductor1.getAuxiliaryKey();
129 session.addAuxiliaryConductor(cookie1, conductor1);
130 MockConnectionConductor conductor2 = new MockConnectionConductor(2);
131 SwitchConnectionDistinguisher cookie2 = conductor2.getAuxiliaryKey();
132 session.addAuxiliaryConductor(cookie2, conductor2);
133 MockConnectionConductor conductor3 = new MockConnectionConductor(3);
134 SwitchConnectionDistinguisher cookie3 = conductor3.getAuxiliaryKey();
135 session.addAuxiliaryConductor(cookie3, conductor3);
136 PacketOutInputBuilder builder = new PacketOutInputBuilder();
138 session.getMessageDispatchService().packetOut(builder.build(), cookie2);
140 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
142 conductor3 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie3);
143 Assert.assertEquals(MessageType.NONE, conductor3.getMessageType());
145 conductor2 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie2);
146 Assert.assertEquals(MessageType.PACKETOUT, conductor2.getMessageType());
148 conductor1 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie1);
149 Assert.assertEquals(MessageType.NONE, conductor1.getMessageType());
154 * Test for invalid session
159 public void testInvalidSession() throws Exception {
160 session.setValid(false);
162 session.getMessageDispatchService().packetOut(null, null);
163 Assert.assertTrue(false);
164 } catch (IllegalArgumentException ex) {
165 Assert.assertTrue(true);
171 class MockSessionContext implements SessionContext {
172 private MockConnectionConductor conductor;
173 private Map<SwitchConnectionDistinguisher, ConnectionConductor> map;
174 private IMessageDispatchService messageService;
175 private boolean isValid = true;
176 private CompositeObjectRegistration<ModelDrivenSwitch> registration;
179 MockSessionContext(int conductorNum) {
180 conductor = new MockConnectionConductor(conductorNum);
181 map = new HashMap<SwitchConnectionDistinguisher, ConnectionConductor>();
182 messageService = new MessageDispatchServiceImpl(this);
186 public MockConnectionConductor getPrimaryConductor() {
187 // TODO Auto-generated method stub
192 public GetFeaturesOutput getFeatures() {
193 // TODO Auto-generated method stub
198 public ConnectionConductor getAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey) {
200 return map.get(auxiliaryKey);
204 public Set<Entry<SwitchConnectionDistinguisher, ConnectionConductor>> getAuxiliaryConductors() {
205 // TODO Auto-generated method stub
210 public void addAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey, ConnectionConductor conductorArg) {
211 map.put(auxiliaryKey, conductorArg);
215 public ConnectionConductor removeAuxiliaryConductor(SwitchConnectionDistinguisher connectionCookie) {
216 return map.remove(connectionCookie);
220 public boolean isValid() {
221 // TODO Auto-generated method stub
226 public void setValid(boolean valid) {
231 public SwitchSessionKeyOF getSessionKey() {
232 // TODO Auto-generated method stub
237 public IMessageDispatchService getMessageDispatchService() {
238 // TODO Auto-generated method stub
239 return messageService;
243 public Long getNextXid() {
244 // TODO Auto-generated method stub
249 public Map<Long, PortGrouping> getPhysicalPorts() {
250 // TODO Auto-generated method stub
255 public Set<Long> getPorts() {
256 // TODO Auto-generated method stub
261 public PortGrouping getPhysicalPort(Long portNumber) {
262 // TODO Auto-generated method stub
267 public Boolean getPortBandwidth(Long portNumber) {
268 // TODO Auto-generated method stub
273 public boolean isPortEnabled(long portNumber) {
274 // TODO Auto-generated method stub
279 public boolean isPortEnabled(PortGrouping port) {
280 // TODO Auto-generated method stub
285 public List<PortGrouping> getEnabledPorts() {
286 // TODO Auto-generated method stub
291 public Map<Long, Boolean> getPortsBandwidth() {
292 // TODO Auto-generated method stub
297 public CompositeObjectRegistration<ModelDrivenSwitch> getProviderRegistration() {
302 public void setProviderRegistration(
303 CompositeObjectRegistration<ModelDrivenSwitch> registration) {
304 this.registration = registration;
308 public int getSeed() {
313 * @param seed the seed to set
315 public void setSeed(int seed) {
320 class MockConnectionConductor implements ConnectionConductor {
322 private int conductorNum;
323 private MockConnectionAdapter adapter;
325 public MockConnectionConductor(int conductorNumber) {
326 conductorNum = conductorNumber;
327 adapter = new MockConnectionAdapter();
332 // TODO Auto-generated method stub
337 public Short getVersion() {
338 // TODO Auto-generated method stub
343 public CONDUCTOR_STATE getConductorState() {
344 // TODO Auto-generated method stub
349 public void setConductorState(CONDUCTOR_STATE conductorState) {
350 // TODO Auto-generated method stub
355 public Future<Boolean> disconnect() {
356 // TODO Auto-generated method stub
361 public void setSessionContext(SessionContext context) {
362 // TODO Auto-generated method stub
367 public void setConnectionCookie(SwitchConnectionDistinguisher auxiliaryKey) {
368 // TODO Auto-generated method stub
373 public SessionContext getSessionContext() {
374 // TODO Auto-generated method stub
379 public SwitchConnectionDistinguisher getAuxiliaryKey() {
380 if (0 != conductorNum) {
381 SwitchConnectionCookieOFImpl key = new SwitchConnectionCookieOFImpl();
382 key.setAuxiliaryId((short) conductorNum);
390 public ConnectionAdapter getConnectionAdapter() {
391 // TODO Auto-generated method stub
395 public MessageType getMessageType() {
396 return adapter.getMessageType();
400 public void setQueueKeeper(QueueKeeper<OfHeader, DataObject> queueKeeper) {
405 public void setErrorHandler(ErrorHandler errorHandler) {
411 NONE, BARRIER, FLOWMOD, TABLEMOD, PACKETOUT;
414 class MockConnectionAdapter implements ConnectionAdapter {
416 private MessageType messageType;
417 private ConnectionReadyListener connectionReadyListener;
419 public MockConnectionAdapter() {
420 setMessageType(MessageType.NONE);
424 public Future<RpcResult<BarrierOutput>> barrier(BarrierInput input) {
425 setMessageType(MessageType.BARRIER);
430 public Future<RpcResult<EchoOutput>> echo(EchoInput input) {
431 // TODO Auto-generated method stub
436 public Future<RpcResult<Void>> echoReply(EchoReplyInput input) {
437 // TODO Auto-generated method stub
442 public Future<RpcResult<Void>> experimenter(ExperimenterInput input) {
443 // TODO Auto-generated method stub
448 public Future<RpcResult<Void>> flowMod(FlowModInput input) {
449 setMessageType(MessageType.FLOWMOD);
454 public Future<RpcResult<GetAsyncOutput>> getAsync(GetAsyncInput input) {
455 // TODO Auto-generated method stub
460 public Future<RpcResult<GetConfigOutput>> getConfig(GetConfigInput input) {
461 // TODO Auto-generated method stub
466 public Future<RpcResult<GetFeaturesOutput>> getFeatures(GetFeaturesInput input) {
467 // TODO Auto-generated method stub
472 public Future<RpcResult<GetQueueConfigOutput>> getQueueConfig(GetQueueConfigInput input) {
473 // TODO Auto-generated method stub
478 public Future<RpcResult<Void>> groupMod(GroupModInput input) {
479 // TODO Auto-generated method stub
484 public Future<RpcResult<Void>> hello(HelloInput input) {
485 // TODO Auto-generated method stub
490 public Future<RpcResult<Void>> meterMod(MeterModInput input) {
491 // TODO Auto-generated method stub
496 public Future<RpcResult<Void>> packetOut(PacketOutInput input) {
497 setMessageType(MessageType.PACKETOUT);
502 public Future<RpcResult<Void>> portMod(PortModInput input) {
503 // TODO Auto-generated method stub
508 public Future<RpcResult<RoleRequestOutput>> roleRequest(RoleRequestInput input) {
509 // TODO Auto-generated method stub
514 public Future<RpcResult<Void>> setAsync(SetAsyncInput input) {
515 // TODO Auto-generated method stub
520 public Future<RpcResult<Void>> setConfig(SetConfigInput input) {
521 // TODO Auto-generated method stub
526 public Future<RpcResult<Void>> tableMod(TableModInput input) {
527 setMessageType(MessageType.TABLEMOD);
532 public Future<Boolean> disconnect() {
533 // TODO Auto-generated method stub
538 public boolean isAlive() {
539 // TODO Auto-generated method stub
544 public void setMessageListener(OpenflowProtocolListener messageListener) {
545 // TODO Auto-generated method stub
550 public void setSystemListener(SystemNotificationsListener systemListener) {
551 // TODO Auto-generated method stub
556 public void checkListeners() {
557 // TODO Auto-generated method stub
562 * @return the messageType
564 public MessageType getMessageType() {
570 * the messageType to set
572 public void setMessageType(MessageType messageType) {
573 this.messageType = messageType;
577 public void fireConnectionReadyNotification() {
578 connectionReadyListener.onConnectionReady();
582 public void setConnectionReadyListener(
583 ConnectionReadyListener connectionReadyListener) {
584 this.connectionReadyListener = connectionReadyListener;
588 public Future<RpcResult<Void>> multipartRequest(
589 MultipartRequestInput input) {
590 // TODO Auto-generated method stub