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 org.junit.After;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
24 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionReadyListener;
25 import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor;
26 import org.opendaylight.openflowplugin.openflow.md.core.ErrorHandler;
27 import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
28 import org.opendaylight.openflowplugin.openflow.md.queue.QueueKeeper;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInputBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoInput;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoOutput;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoReplyInput;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInput;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncInput;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutput;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigInput;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigOutput;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesInput;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigInput;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigOutput;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInput;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInputBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortGrouping;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestInput;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestOutput;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInput;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetConfigInput;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.TableModInput;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
61 import org.opendaylight.yangtools.yang.binding.DataObject;
62 import org.opendaylight.yangtools.yang.common.RpcResult;
64 public class MessageDispatchServiceImplTest {
66 MockSessionContext session;
69 * @throws java.lang.Exception
72 public void setUp() throws Exception {
73 session = new MockSessionContext(0);
78 * @throws java.lang.Exception
81 public void tearDown() throws Exception {
86 * Test barrier message for null cookie
91 public void testBarrierMessageForPrimary() throws Exception {
92 MockConnectionConductor conductor = new MockConnectionConductor(1);
93 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
94 BarrierInputBuilder barrierMsg = new BarrierInputBuilder();
95 session.getMessageDispatchService().barrier(barrierMsg.build(), cookie);
96 Assert.assertEquals(MessageType.BARRIER, session.getPrimaryConductor().getMessageType());
100 * Test packet out message for primary connection
105 public void testPacketOutMessageForPrimary() throws Exception {
106 session.getMessageDispatchService().packetOut(null, null);
107 Assert.assertEquals(MessageType.PACKETOUT, session.getPrimaryConductor().getMessageType());
111 * Test packet out message for auxiliary connection
116 public void testPacketOutMessageForAuxiliary() throws Exception {
117 MockConnectionConductor conductor = new MockConnectionConductor(1);
118 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
119 session.addAuxiliaryConductor(cookie, conductor);
120 session.getMessageDispatchService().packetOut(null, cookie);
121 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
122 conductor = (MockConnectionConductor) session.getAuxiliaryConductor(cookie);
123 Assert.assertEquals(MessageType.PACKETOUT, conductor.getMessageType());
127 * Test packet out message when multiple auxiliary connection exist
132 public void testPacketOutMessageForMultipleAuxiliary() throws Exception {
133 MockConnectionConductor conductor1 = new MockConnectionConductor(1);
134 SwitchConnectionDistinguisher cookie1 = conductor1.getAuxiliaryKey();
135 session.addAuxiliaryConductor(cookie1, conductor1);
136 MockConnectionConductor conductor2 = new MockConnectionConductor(2);
137 SwitchConnectionDistinguisher cookie2 = conductor2.getAuxiliaryKey();
138 session.addAuxiliaryConductor(cookie2, conductor2);
139 MockConnectionConductor conductor3 = new MockConnectionConductor(3);
140 SwitchConnectionDistinguisher cookie3 = conductor3.getAuxiliaryKey();
141 session.addAuxiliaryConductor(cookie3, conductor3);
142 PacketOutInputBuilder builder = new PacketOutInputBuilder();
144 session.getMessageDispatchService().packetOut(builder.build(), cookie2);
146 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
148 conductor3 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie3);
149 Assert.assertEquals(MessageType.NONE, conductor3.getMessageType());
151 conductor2 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie2);
152 Assert.assertEquals(MessageType.PACKETOUT, conductor2.getMessageType());
154 conductor1 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie1);
155 Assert.assertEquals(MessageType.NONE, conductor1.getMessageType());
160 * Test for invalid session
165 public void testInvalidSession() throws Exception {
166 session.setValid(false);
168 session.getMessageDispatchService().packetOut(null, null);
169 Assert.assertTrue(false);
170 } catch (IllegalArgumentException ex) {
171 Assert.assertTrue(true);
177 class MockSessionContext implements SessionContext {
178 private MockConnectionConductor conductor;
179 private Map<SwitchConnectionDistinguisher, ConnectionConductor> map;
180 private IMessageDispatchService messageService;
181 private boolean isValid = true;
183 MockSessionContext(int conductorNum) {
184 conductor = new MockConnectionConductor(conductorNum);
185 map = new HashMap<SwitchConnectionDistinguisher, ConnectionConductor>();
186 messageService = new MessageDispatchServiceImpl(this);
190 public MockConnectionConductor getPrimaryConductor() {
191 // TODO Auto-generated method stub
196 public GetFeaturesOutput getFeatures() {
197 // TODO Auto-generated method stub
202 public ConnectionConductor getAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey) {
204 return map.get(auxiliaryKey);
208 public Set<Entry<SwitchConnectionDistinguisher, ConnectionConductor>> getAuxiliaryConductors() {
209 // TODO Auto-generated method stub
214 public void addAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey, ConnectionConductor conductor) {
215 map.put(auxiliaryKey, conductor);
219 public ConnectionConductor removeAuxiliaryConductor(SwitchConnectionDistinguisher connectionCookie) {
220 return map.remove(connectionCookie);
224 public boolean isValid() {
225 // TODO Auto-generated method stub
230 public void setValid(boolean valid) {
235 public SwitchConnectionDistinguisher getSessionKey() {
236 // TODO Auto-generated method stub
241 public IMessageDispatchService getMessageDispatchService() {
242 // TODO Auto-generated method stub
243 return messageService;
247 public Long getNextXid() {
248 // TODO Auto-generated method stub
253 public Map<Long, PortGrouping> getPhysicalPorts() {
254 // TODO Auto-generated method stub
259 public Set<Long> getPorts() {
260 // TODO Auto-generated method stub
265 public PortGrouping getPhysicalPort(Long portNumber) {
266 // TODO Auto-generated method stub
271 public Boolean getPortBandwidth(Long portNumber) {
272 // TODO Auto-generated method stub
277 public boolean isPortEnabled(long portNumber) {
278 // TODO Auto-generated method stub
283 public boolean isPortEnabled(PortGrouping port) {
284 // TODO Auto-generated method stub
289 public List<PortGrouping> getEnabledPorts() {
290 // TODO Auto-generated method stub
295 public Map<Long, Boolean> getPortsBandwidth() {
296 // TODO Auto-generated method stub
302 class MockConnectionConductor implements ConnectionConductor {
304 private int conductorNum;
305 private MockConnectionAdapter adapter;
307 public MockConnectionConductor(int conductorNumber) {
308 conductorNum = conductorNumber;
309 adapter = new MockConnectionAdapter();
314 // TODO Auto-generated method stub
319 public Short getVersion() {
320 // TODO Auto-generated method stub
325 public CONDUCTOR_STATE getConductorState() {
326 // TODO Auto-generated method stub
331 public void setConductorState(CONDUCTOR_STATE conductorState) {
332 // TODO Auto-generated method stub
337 public Future<Boolean> disconnect() {
338 // TODO Auto-generated method stub
343 public void setSessionContext(SessionContext context) {
344 // TODO Auto-generated method stub
349 public void setConnectionCookie(SwitchConnectionDistinguisher auxiliaryKey) {
350 // TODO Auto-generated method stub
355 public SessionContext getSessionContext() {
356 // TODO Auto-generated method stub
361 public SwitchConnectionDistinguisher getAuxiliaryKey() {
362 if (0 != conductorNum) {
363 SwitchConnectionCookieOFImpl key = new SwitchConnectionCookieOFImpl();
364 key.setDatapathId(BigInteger.valueOf(10L));
365 key.setAuxiliaryId((short) conductorNum);
373 public ConnectionAdapter getConnectionAdapter() {
374 // TODO Auto-generated method stub
378 public MessageType getMessageType() {
379 return adapter.getMessageType();
383 public void setQueueKeeper(QueueKeeper<OfHeader, DataObject> queueKeeper) {
388 public void setErrorHandler(ErrorHandler errorHandler) {
393 NONE, BARRIER, FLOWMOD, TABLEMOD, PACKETOUT;
396 class MockConnectionAdapter implements ConnectionAdapter {
398 private MessageType messageType;
399 private ConnectionReadyListener connectionReadyListener;
401 public MockConnectionAdapter() {
402 setMessageType(MessageType.NONE);
406 public Future<RpcResult<BarrierOutput>> barrier(BarrierInput input) {
407 setMessageType(MessageType.BARRIER);
412 public Future<RpcResult<EchoOutput>> echo(EchoInput input) {
413 // TODO Auto-generated method stub
418 public Future<RpcResult<Void>> echoReply(EchoReplyInput input) {
419 // TODO Auto-generated method stub
424 public Future<RpcResult<Void>> experimenter(ExperimenterInput input) {
425 // TODO Auto-generated method stub
430 public Future<RpcResult<Void>> flowMod(FlowModInput input) {
431 setMessageType(MessageType.FLOWMOD);
436 public Future<RpcResult<GetAsyncOutput>> getAsync(GetAsyncInput input) {
437 // TODO Auto-generated method stub
442 public Future<RpcResult<GetConfigOutput>> getConfig(GetConfigInput input) {
443 // TODO Auto-generated method stub
448 public Future<RpcResult<GetFeaturesOutput>> getFeatures(GetFeaturesInput input) {
449 // TODO Auto-generated method stub
454 public Future<RpcResult<GetQueueConfigOutput>> getQueueConfig(GetQueueConfigInput input) {
455 // TODO Auto-generated method stub
460 public Future<RpcResult<Void>> groupMod(GroupModInput input) {
461 // TODO Auto-generated method stub
466 public Future<RpcResult<Void>> hello(HelloInput input) {
467 // TODO Auto-generated method stub
472 public Future<RpcResult<Void>> meterMod(MeterModInput input) {
473 // TODO Auto-generated method stub
478 public Future<RpcResult<Void>> packetOut(PacketOutInput input) {
479 setMessageType(MessageType.PACKETOUT);
484 public Future<RpcResult<Void>> portMod(PortModInput input) {
485 // TODO Auto-generated method stub
490 public Future<RpcResult<RoleRequestOutput>> roleRequest(RoleRequestInput input) {
491 // TODO Auto-generated method stub
496 public Future<RpcResult<Void>> setAsync(SetAsyncInput input) {
497 // TODO Auto-generated method stub
502 public Future<RpcResult<Void>> setConfig(SetConfigInput input) {
503 // TODO Auto-generated method stub
508 public Future<RpcResult<Void>> tableMod(TableModInput input) {
509 setMessageType(MessageType.TABLEMOD);
514 public Future<Boolean> disconnect() {
515 // TODO Auto-generated method stub
520 public boolean isAlive() {
521 // TODO Auto-generated method stub
526 public void setMessageListener(OpenflowProtocolListener messageListener) {
527 // TODO Auto-generated method stub
532 public void setSystemListener(SystemNotificationsListener systemListener) {
533 // TODO Auto-generated method stub
538 public void checkListeners() {
539 // TODO Auto-generated method stub
544 * @return the messageType
546 public MessageType getMessageType() {
552 * the messageType to set
554 public void setMessageType(MessageType messageType) {
555 this.messageType = messageType;
559 public void fireConnectionReadyNotification() {
560 connectionReadyListener.onConnectionReady();
564 public void setConnectionReadyListener(
565 ConnectionReadyListener connectionReadyListener) {
566 this.connectionReadyListener = connectionReadyListener;
570 public Future<RpcResult<Void>> multipartRequest(
571 MultipartRequestInput input) {
572 // TODO Auto-generated method stub