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.math.BigInteger;
11 import java.util.HashMap;
12 import java.util.List;
14 import java.util.Map.Entry;
16 import java.util.concurrent.Future;
18 import junit.framework.Assert;
20 import com.google.common.cache.Cache;
21 import org.junit.After;
22 import org.junit.Before;
23 import org.junit.Test;
24 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
25 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionReadyListener;
26 import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor;
27 import org.opendaylight.openflowplugin.openflow.md.core.ErrorHandler;
28 import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
29 import org.opendaylight.openflowplugin.openflow.md.queue.QueueKeeper;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInputBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoInput;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoOutput;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoReplyInput;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInput;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncInput;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutput;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigInput;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigOutput;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesInput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigInput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigOutput;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInput;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInputBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortGrouping;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestInput;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestOutput;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInput;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetConfigInput;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.TableModInput;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
62 import org.opendaylight.yangtools.yang.binding.DataObject;
63 import org.opendaylight.yangtools.yang.common.RpcResult;
65 public class MessageDispatchServiceImplTest {
67 MockSessionContext session;
70 * @throws java.lang.Exception
73 public void setUp() throws Exception {
74 session = new MockSessionContext(0);
79 * @throws java.lang.Exception
82 public void tearDown() throws Exception {
87 * Test barrier message for null cookie
92 public void testBarrierMessageForPrimary() throws Exception {
93 MockConnectionConductor conductor = new MockConnectionConductor(1);
94 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
95 BarrierInputBuilder barrierMsg = new BarrierInputBuilder();
96 session.getMessageDispatchService().barrier(barrierMsg.build(), cookie);
97 Assert.assertEquals(MessageType.BARRIER, session.getPrimaryConductor().getMessageType());
101 * Test packet out message for primary connection
106 public void testPacketOutMessageForPrimary() throws Exception {
107 session.getMessageDispatchService().packetOut(null, null);
108 Assert.assertEquals(MessageType.PACKETOUT, session.getPrimaryConductor().getMessageType());
112 * Test packet out message for auxiliary connection
117 public void testPacketOutMessageForAuxiliary() throws Exception {
118 MockConnectionConductor conductor = new MockConnectionConductor(1);
119 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
120 session.addAuxiliaryConductor(cookie, conductor);
121 session.getMessageDispatchService().packetOut(null, cookie);
122 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
123 conductor = (MockConnectionConductor) session.getAuxiliaryConductor(cookie);
124 Assert.assertEquals(MessageType.PACKETOUT, conductor.getMessageType());
128 * Test packet out message when multiple auxiliary connection exist
133 public void testPacketOutMessageForMultipleAuxiliary() throws Exception {
134 MockConnectionConductor conductor1 = new MockConnectionConductor(1);
135 SwitchConnectionDistinguisher cookie1 = conductor1.getAuxiliaryKey();
136 session.addAuxiliaryConductor(cookie1, conductor1);
137 MockConnectionConductor conductor2 = new MockConnectionConductor(2);
138 SwitchConnectionDistinguisher cookie2 = conductor2.getAuxiliaryKey();
139 session.addAuxiliaryConductor(cookie2, conductor2);
140 MockConnectionConductor conductor3 = new MockConnectionConductor(3);
141 SwitchConnectionDistinguisher cookie3 = conductor3.getAuxiliaryKey();
142 session.addAuxiliaryConductor(cookie3, conductor3);
143 PacketOutInputBuilder builder = new PacketOutInputBuilder();
145 session.getMessageDispatchService().packetOut(builder.build(), cookie2);
147 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
149 conductor3 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie3);
150 Assert.assertEquals(MessageType.NONE, conductor3.getMessageType());
152 conductor2 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie2);
153 Assert.assertEquals(MessageType.PACKETOUT, conductor2.getMessageType());
155 conductor1 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie1);
156 Assert.assertEquals(MessageType.NONE, conductor1.getMessageType());
161 * Test for invalid session
166 public void testInvalidSession() throws Exception {
167 session.setValid(false);
169 session.getMessageDispatchService().packetOut(null, null);
170 Assert.assertTrue(false);
171 } catch (IllegalArgumentException ex) {
172 Assert.assertTrue(true);
178 class MockSessionContext implements SessionContext {
179 private MockConnectionConductor conductor;
180 private Map<SwitchConnectionDistinguisher, ConnectionConductor> map;
181 private IMessageDispatchService messageService;
182 private boolean isValid = true;
184 MockSessionContext(int conductorNum) {
185 conductor = new MockConnectionConductor(conductorNum);
186 map = new HashMap<SwitchConnectionDistinguisher, ConnectionConductor>();
187 messageService = new MessageDispatchServiceImpl(this);
191 public MockConnectionConductor getPrimaryConductor() {
192 // TODO Auto-generated method stub
197 public GetFeaturesOutput getFeatures() {
198 // TODO Auto-generated method stub
203 public ConnectionConductor getAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey) {
205 return map.get(auxiliaryKey);
209 public Set<Entry<SwitchConnectionDistinguisher, ConnectionConductor>> getAuxiliaryConductors() {
210 // TODO Auto-generated method stub
215 public void addAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey, ConnectionConductor conductor) {
216 map.put(auxiliaryKey, conductor);
220 public ConnectionConductor removeAuxiliaryConductor(SwitchConnectionDistinguisher connectionCookie) {
221 return map.remove(connectionCookie);
225 public boolean isValid() {
226 // TODO Auto-generated method stub
231 public void setValid(boolean valid) {
236 public SwitchConnectionDistinguisher getSessionKey() {
237 // TODO Auto-generated method stub
242 public Cache<TransactionKey, Object> getbulkTransactionCache() {
247 public IMessageDispatchService getMessageDispatchService() {
248 // TODO Auto-generated method stub
249 return messageService;
253 public Long getNextXid() {
254 // TODO Auto-generated method stub
259 public Map<Long, PortGrouping> getPhysicalPorts() {
260 // TODO Auto-generated method stub
265 public Set<Long> getPorts() {
266 // TODO Auto-generated method stub
271 public PortGrouping getPhysicalPort(Long portNumber) {
272 // TODO Auto-generated method stub
277 public Boolean getPortBandwidth(Long portNumber) {
278 // TODO Auto-generated method stub
283 public boolean isPortEnabled(long portNumber) {
284 // TODO Auto-generated method stub
289 public boolean isPortEnabled(PortGrouping port) {
290 // TODO Auto-generated method stub
295 public List<PortGrouping> getEnabledPorts() {
296 // TODO Auto-generated method stub
301 public Map<Long, Boolean> getPortsBandwidth() {
302 // TODO Auto-generated method stub
308 class MockConnectionConductor implements ConnectionConductor {
310 private int conductorNum;
311 private MockConnectionAdapter adapter;
313 public MockConnectionConductor(int conductorNumber) {
314 conductorNum = conductorNumber;
315 adapter = new MockConnectionAdapter();
320 // TODO Auto-generated method stub
325 public Short getVersion() {
326 // TODO Auto-generated method stub
331 public CONDUCTOR_STATE getConductorState() {
332 // TODO Auto-generated method stub
337 public void setConductorState(CONDUCTOR_STATE conductorState) {
338 // TODO Auto-generated method stub
343 public Future<Boolean> disconnect() {
344 // TODO Auto-generated method stub
349 public void setSessionContext(SessionContext context) {
350 // TODO Auto-generated method stub
355 public void setConnectionCookie(SwitchConnectionDistinguisher auxiliaryKey) {
356 // TODO Auto-generated method stub
361 public SessionContext getSessionContext() {
362 // TODO Auto-generated method stub
367 public SwitchConnectionDistinguisher getAuxiliaryKey() {
368 if (0 != conductorNum) {
369 SwitchConnectionCookieOFImpl key = new SwitchConnectionCookieOFImpl();
370 key.setDatapathId(BigInteger.valueOf(10L));
371 key.setAuxiliaryId((short) conductorNum);
379 public ConnectionAdapter getConnectionAdapter() {
380 // TODO Auto-generated method stub
384 public MessageType getMessageType() {
385 return adapter.getMessageType();
389 public void setQueueKeeper(QueueKeeper<OfHeader, DataObject> queueKeeper) {
394 public void setErrorHandler(ErrorHandler errorHandler) {
399 NONE, BARRIER, FLOWMOD, TABLEMOD, PACKETOUT;
402 class MockConnectionAdapter implements ConnectionAdapter {
404 private MessageType messageType;
405 private ConnectionReadyListener connectionReadyListener;
407 public MockConnectionAdapter() {
408 setMessageType(MessageType.NONE);
412 public Future<RpcResult<BarrierOutput>> barrier(BarrierInput input) {
413 setMessageType(MessageType.BARRIER);
418 public Future<RpcResult<EchoOutput>> echo(EchoInput input) {
419 // TODO Auto-generated method stub
424 public Future<RpcResult<Void>> echoReply(EchoReplyInput input) {
425 // TODO Auto-generated method stub
430 public Future<RpcResult<Void>> experimenter(ExperimenterInput input) {
431 // TODO Auto-generated method stub
436 public Future<RpcResult<Void>> flowMod(FlowModInput input) {
437 setMessageType(MessageType.FLOWMOD);
442 public Future<RpcResult<GetAsyncOutput>> getAsync(GetAsyncInput input) {
443 // TODO Auto-generated method stub
448 public Future<RpcResult<GetConfigOutput>> getConfig(GetConfigInput input) {
449 // TODO Auto-generated method stub
454 public Future<RpcResult<GetFeaturesOutput>> getFeatures(GetFeaturesInput input) {
455 // TODO Auto-generated method stub
460 public Future<RpcResult<GetQueueConfigOutput>> getQueueConfig(GetQueueConfigInput input) {
461 // TODO Auto-generated method stub
466 public Future<RpcResult<Void>> groupMod(GroupModInput input) {
467 // TODO Auto-generated method stub
472 public Future<RpcResult<Void>> hello(HelloInput input) {
473 // TODO Auto-generated method stub
478 public Future<RpcResult<Void>> meterMod(MeterModInput input) {
479 // TODO Auto-generated method stub
484 public Future<RpcResult<Void>> packetOut(PacketOutInput input) {
485 setMessageType(MessageType.PACKETOUT);
490 public Future<RpcResult<Void>> portMod(PortModInput input) {
491 // TODO Auto-generated method stub
496 public Future<RpcResult<RoleRequestOutput>> roleRequest(RoleRequestInput input) {
497 // TODO Auto-generated method stub
502 public Future<RpcResult<Void>> setAsync(SetAsyncInput input) {
503 // TODO Auto-generated method stub
508 public Future<RpcResult<Void>> setConfig(SetConfigInput input) {
509 // TODO Auto-generated method stub
514 public Future<RpcResult<Void>> tableMod(TableModInput input) {
515 setMessageType(MessageType.TABLEMOD);
520 public Future<Boolean> disconnect() {
521 // TODO Auto-generated method stub
526 public boolean isAlive() {
527 // TODO Auto-generated method stub
532 public void setMessageListener(OpenflowProtocolListener messageListener) {
533 // TODO Auto-generated method stub
538 public void setSystemListener(SystemNotificationsListener systemListener) {
539 // TODO Auto-generated method stub
544 public void checkListeners() {
545 // TODO Auto-generated method stub
550 * @return the messageType
552 public MessageType getMessageType() {
558 * the messageType to set
560 public void setMessageType(MessageType messageType) {
561 this.messageType = messageType;
565 public void fireConnectionReadyNotification() {
566 connectionReadyListener.onConnectionReady();
570 public void setConnectionReadyListener(
571 ConnectionReadyListener connectionReadyListener) {
572 this.connectionReadyListener = connectionReadyListener;
576 public Future<RpcResult<Void>> multipartRequest(
577 MultipartRequestInput input) {
578 // TODO Auto-generated method stub