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 org.junit.Assert;
11 import org.junit.Before;
12 import org.junit.Test;
13 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
14 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionReadyListener;
15 import org.opendaylight.openflowplugin.openflow.md.ModelDrivenSwitch;
16 import org.opendaylight.openflowplugin.openflow.md.OFConstants;
17 import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor;
18 import org.opendaylight.openflowplugin.openflow.md.core.ErrorHandler;
19 import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
20 import org.opendaylight.openflowplugin.openflow.md.queue.QueueProcessor;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.*;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
23 import org.opendaylight.yangtools.concepts.CompositeObjectRegistration;
24 import org.opendaylight.yangtools.yang.binding.DataObject;
25 import org.opendaylight.yangtools.yang.common.RpcError;
26 import org.opendaylight.yangtools.yang.common.RpcResult;
28 import java.net.InetSocketAddress;
30 import java.util.Map.Entry;
31 import java.util.concurrent.Future;
34 * test for {@link MessageDispatchServiceImpl}
36 public class MessageDispatchServiceImplTest {
38 MockSessionContext session;
41 * @throws java.lang.Exception
44 public void setUp() throws Exception {
45 session = new MockSessionContext(0);
50 * Test barrier message for null cookie
55 public void testBarrierMessageForPrimary() throws Exception {
56 MockConnectionConductor conductor = new MockConnectionConductor(1);
57 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
58 BarrierInputBuilder barrierMsg = new BarrierInputBuilder();
59 session.getMessageDispatchService().barrier(barrierMsg.build(), cookie);
60 Assert.assertEquals(MessageType.BARRIER, session.getPrimaryConductor().getMessageType());
64 * Test packet out message for primary connection
69 public void testPacketOutMessageForPrimary() throws Exception {
70 session.getMessageDispatchService().packetOut(null, null);
71 Assert.assertEquals(MessageType.PACKETOUT, session.getPrimaryConductor().getMessageType());
75 * Test packet out message for auxiliary connection
80 public void testPacketOutMessageForAuxiliary() throws Exception {
81 MockConnectionConductor conductor = new MockConnectionConductor(1);
82 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
83 session.addAuxiliaryConductor(cookie, conductor);
84 session.getMessageDispatchService().packetOut(null, cookie);
85 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
86 conductor = (MockConnectionConductor) session.getAuxiliaryConductor(cookie);
87 Assert.assertEquals(MessageType.PACKETOUT, conductor.getMessageType());
91 * Test packet out message when multiple auxiliary connection exist
96 public void testPacketOutMessageForMultipleAuxiliary() throws Exception {
97 MockConnectionConductor conductor1 = new MockConnectionConductor(1);
98 SwitchConnectionDistinguisher cookie1 = conductor1.getAuxiliaryKey();
99 session.addAuxiliaryConductor(cookie1, conductor1);
100 MockConnectionConductor conductor2 = new MockConnectionConductor(2);
101 SwitchConnectionDistinguisher cookie2 = conductor2.getAuxiliaryKey();
102 session.addAuxiliaryConductor(cookie2, conductor2);
103 MockConnectionConductor conductor3 = new MockConnectionConductor(3);
104 SwitchConnectionDistinguisher cookie3 = conductor3.getAuxiliaryKey();
105 session.addAuxiliaryConductor(cookie3, conductor3);
106 PacketOutInputBuilder builder = new PacketOutInputBuilder();
108 session.getMessageDispatchService().packetOut(builder.build(), cookie2);
110 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
112 conductor3 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie3);
113 Assert.assertEquals(MessageType.NONE, conductor3.getMessageType());
115 conductor2 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie2);
116 Assert.assertEquals(MessageType.PACKETOUT, conductor2.getMessageType());
118 conductor1 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie1);
119 Assert.assertEquals(MessageType.NONE, conductor1.getMessageType());
124 * Test for invalid session
129 public void testInvalidSession() throws Exception {
130 session.setValid(false);
131 Future<RpcResult<Void>> resultFuture = session.getMessageDispatchService().packetOut(null, null);
132 if (resultFuture.isDone()) {
133 RpcResult<Void> rpcResult = resultFuture.get();
134 Assert.assertTrue(!rpcResult.getErrors().isEmpty());
136 Iterator<RpcError> it = rpcResult.getErrors().iterator();
137 RpcError rpcError = it.next();
139 Assert.assertTrue(rpcError.getApplicationTag().equals(OFConstants.APPLICATION_TAG));
140 Assert.assertTrue(rpcError.getTag().equals(OFConstants.ERROR_TAG_TIMEOUT));
141 Assert.assertTrue(rpcError.getErrorType().equals(RpcError.ErrorType.TRANSPORT));
147 class MockSessionContext implements SessionContext {
148 private MockConnectionConductor conductor;
149 private Map<SwitchConnectionDistinguisher, ConnectionConductor> map;
150 private IMessageDispatchService messageService;
151 private boolean isValid = true;
152 private CompositeObjectRegistration<ModelDrivenSwitch> registration;
155 MockSessionContext(int conductorNum) {
156 conductor = new MockConnectionConductor(conductorNum);
157 map = new HashMap<SwitchConnectionDistinguisher, ConnectionConductor>();
158 messageService = new MessageDispatchServiceImpl(this);
162 public MockConnectionConductor getPrimaryConductor() {
163 // TODO Auto-generated method stub
168 public GetFeaturesOutput getFeatures() {
169 // TODO Auto-generated method stub
174 public ConnectionConductor getAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey) {
176 return map.get(auxiliaryKey);
180 public Set<Entry<SwitchConnectionDistinguisher, ConnectionConductor>> getAuxiliaryConductors() {
181 // TODO Auto-generated method stub
186 public void addAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey, ConnectionConductor conductorArg) {
187 map.put(auxiliaryKey, conductorArg);
191 public ConnectionConductor removeAuxiliaryConductor(SwitchConnectionDistinguisher connectionCookie) {
192 return map.remove(connectionCookie);
196 public boolean isValid() {
197 // TODO Auto-generated method stub
202 public void setValid(boolean valid) {
207 public SwitchSessionKeyOF getSessionKey() {
208 // TODO Auto-generated method stub
213 public IMessageDispatchService getMessageDispatchService() {
214 // TODO Auto-generated method stub
215 return messageService;
219 public Long getNextXid() {
220 // TODO Auto-generated method stub
225 public Map<Long, PortGrouping> getPhysicalPorts() {
226 // TODO Auto-generated method stub
231 public Set<Long> getPorts() {
232 // TODO Auto-generated method stub
237 public PortGrouping getPhysicalPort(Long portNumber) {
238 // TODO Auto-generated method stub
243 public Boolean getPortBandwidth(Long portNumber) {
244 // TODO Auto-generated method stub
249 public boolean isPortEnabled(long portNumber) {
250 // TODO Auto-generated method stub
255 public boolean isPortEnabled(PortGrouping port) {
256 // TODO Auto-generated method stub
261 public List<PortGrouping> getEnabledPorts() {
262 // TODO Auto-generated method stub
267 public Map<Long, Boolean> getPortsBandwidth() {
268 // TODO Auto-generated method stub
273 public CompositeObjectRegistration<ModelDrivenSwitch> getProviderRegistration() {
278 public void setProviderRegistration(
279 CompositeObjectRegistration<ModelDrivenSwitch> registration) {
280 this.registration = registration;
284 public int getSeed() {
289 * @param seed the seed to set
291 public void setSeed(int seed) {
296 class MockConnectionConductor implements ConnectionConductor {
298 private int conductorNum;
299 private MockConnectionAdapter adapter;
301 public MockConnectionConductor(int conductorNumber) {
302 conductorNum = conductorNumber;
303 adapter = new MockConnectionAdapter();
308 // TODO Auto-generated method stub
313 public Short getVersion() {
314 // TODO Auto-generated method stub
319 public CONDUCTOR_STATE getConductorState() {
320 // TODO Auto-generated method stub
325 public void setConductorState(CONDUCTOR_STATE conductorState) {
326 // TODO Auto-generated method stub
331 public Future<Boolean> disconnect() {
332 // TODO Auto-generated method stub
337 public void setSessionContext(SessionContext context) {
338 // TODO Auto-generated method stub
343 public void setConnectionCookie(SwitchConnectionDistinguisher auxiliaryKey) {
344 // TODO Auto-generated method stub
349 public SessionContext getSessionContext() {
350 // TODO Auto-generated method stub
355 public SwitchConnectionDistinguisher getAuxiliaryKey() {
356 if (0 != conductorNum) {
357 SwitchConnectionCookieOFImpl key = new SwitchConnectionCookieOFImpl();
358 key.setAuxiliaryId((short) conductorNum);
366 public ConnectionAdapter getConnectionAdapter() {
367 // TODO Auto-generated method stub
371 public MessageType getMessageType() {
372 return adapter.getMessageType();
376 public void setQueueProcessor(QueueProcessor<OfHeader, DataObject> queueKeeper) {
381 public void setErrorHandler(ErrorHandler errorHandler) {
386 public void setId(int conductorId) {
392 NONE, BARRIER, FLOWMOD, TABLEMOD, PACKETOUT;
395 class MockConnectionAdapter implements ConnectionAdapter {
397 private MessageType messageType;
398 private ConnectionReadyListener connectionReadyListener;
400 public MockConnectionAdapter() {
401 setMessageType(MessageType.NONE);
405 public Future<RpcResult<BarrierOutput>> barrier(BarrierInput input) {
406 setMessageType(MessageType.BARRIER);
411 public Future<RpcResult<EchoOutput>> echo(EchoInput input) {
412 // TODO Auto-generated method stub
417 public Future<RpcResult<Void>> echoReply(EchoReplyInput input) {
418 // TODO Auto-generated method stub
423 public Future<RpcResult<Void>> experimenter(ExperimenterInput input) {
424 // TODO Auto-generated method stub
429 public Future<RpcResult<Void>> flowMod(FlowModInput input) {
430 setMessageType(MessageType.FLOWMOD);
435 public Future<RpcResult<GetAsyncOutput>> getAsync(GetAsyncInput input) {
436 // TODO Auto-generated method stub
441 public Future<RpcResult<GetConfigOutput>> getConfig(GetConfigInput input) {
442 // TODO Auto-generated method stub
447 public Future<RpcResult<GetFeaturesOutput>> getFeatures(GetFeaturesInput input) {
448 // TODO Auto-generated method stub
453 public Future<RpcResult<GetQueueConfigOutput>> getQueueConfig(GetQueueConfigInput input) {
454 // TODO Auto-generated method stub
459 public Future<RpcResult<Void>> groupMod(GroupModInput input) {
460 // TODO Auto-generated method stub
465 public Future<RpcResult<Void>> hello(HelloInput input) {
466 // TODO Auto-generated method stub
471 public Future<RpcResult<Void>> meterMod(MeterModInput input) {
472 // TODO Auto-generated method stub
477 public Future<RpcResult<Void>> packetOut(PacketOutInput input) {
478 setMessageType(MessageType.PACKETOUT);
483 public Future<RpcResult<Void>> portMod(PortModInput input) {
484 // TODO Auto-generated method stub
489 public Future<RpcResult<RoleRequestOutput>> roleRequest(RoleRequestInput input) {
490 // TODO Auto-generated method stub
495 public Future<RpcResult<Void>> setAsync(SetAsyncInput input) {
496 // TODO Auto-generated method stub
501 public Future<RpcResult<Void>> setConfig(SetConfigInput input) {
502 // TODO Auto-generated method stub
507 public Future<RpcResult<Void>> tableMod(TableModInput input) {
508 setMessageType(MessageType.TABLEMOD);
513 public Future<Boolean> disconnect() {
514 // TODO Auto-generated method stub
519 public boolean isAlive() {
520 // TODO Auto-generated method stub
525 public void setMessageListener(OpenflowProtocolListener messageListener) {
526 // TODO Auto-generated method stub
531 public void setSystemListener(SystemNotificationsListener systemListener) {
532 // TODO Auto-generated method stub
537 public void checkListeners() {
538 // TODO Auto-generated method stub
543 * @return the messageType
545 public MessageType getMessageType() {
550 * @param messageType the messageType to set
552 public void setMessageType(MessageType messageType) {
553 this.messageType = messageType;
557 public void fireConnectionReadyNotification() {
558 connectionReadyListener.onConnectionReady();
562 public void setConnectionReadyListener(
563 ConnectionReadyListener connectionReadyListener) {
564 this.connectionReadyListener = connectionReadyListener;
568 public Future<RpcResult<Void>> multipartRequest(
569 MultipartRequestInput input) {
570 // TODO Auto-generated method stub
575 * @see org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter#getRemoteAddress()
578 public InetSocketAddress getRemoteAddress() {
579 // TODO Auto-generated method stub