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;
29 import java.util.Map.Entry;
30 import java.util.concurrent.Future;
33 * test for {@link MessageDispatchServiceImpl}
35 public class MessageDispatchServiceImplTest {
37 MockSessionContext session;
40 * @throws java.lang.Exception
43 public void setUp() throws Exception {
44 session = new MockSessionContext(0);
49 * Test barrier message for null cookie
54 public void testBarrierMessageForPrimary() throws Exception {
55 MockConnectionConductor conductor = new MockConnectionConductor(1);
56 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
57 BarrierInputBuilder barrierMsg = new BarrierInputBuilder();
58 session.getMessageDispatchService().barrier(barrierMsg.build(), cookie);
59 Assert.assertEquals(MessageType.BARRIER, session.getPrimaryConductor().getMessageType());
63 * Test packet out message for primary connection
68 public void testPacketOutMessageForPrimary() throws Exception {
69 session.getMessageDispatchService().packetOut(null, null);
70 Assert.assertEquals(MessageType.PACKETOUT, session.getPrimaryConductor().getMessageType());
74 * Test packet out message for auxiliary connection
79 public void testPacketOutMessageForAuxiliary() throws Exception {
80 MockConnectionConductor conductor = new MockConnectionConductor(1);
81 SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
82 session.addAuxiliaryConductor(cookie, conductor);
83 session.getMessageDispatchService().packetOut(null, cookie);
84 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
85 conductor = (MockConnectionConductor) session.getAuxiliaryConductor(cookie);
86 Assert.assertEquals(MessageType.PACKETOUT, conductor.getMessageType());
90 * Test packet out message when multiple auxiliary connection exist
95 public void testPacketOutMessageForMultipleAuxiliary() throws Exception {
96 MockConnectionConductor conductor1 = new MockConnectionConductor(1);
97 SwitchConnectionDistinguisher cookie1 = conductor1.getAuxiliaryKey();
98 session.addAuxiliaryConductor(cookie1, conductor1);
99 MockConnectionConductor conductor2 = new MockConnectionConductor(2);
100 SwitchConnectionDistinguisher cookie2 = conductor2.getAuxiliaryKey();
101 session.addAuxiliaryConductor(cookie2, conductor2);
102 MockConnectionConductor conductor3 = new MockConnectionConductor(3);
103 SwitchConnectionDistinguisher cookie3 = conductor3.getAuxiliaryKey();
104 session.addAuxiliaryConductor(cookie3, conductor3);
105 PacketOutInputBuilder builder = new PacketOutInputBuilder();
107 session.getMessageDispatchService().packetOut(builder.build(), cookie2);
109 Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType());
111 conductor3 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie3);
112 Assert.assertEquals(MessageType.NONE, conductor3.getMessageType());
114 conductor2 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie2);
115 Assert.assertEquals(MessageType.PACKETOUT, conductor2.getMessageType());
117 conductor1 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie1);
118 Assert.assertEquals(MessageType.NONE, conductor1.getMessageType());
123 * Test for invalid session
128 public void testInvalidSession() throws Exception {
129 session.setValid(false);
130 Future<RpcResult<Void>> resultFuture = session.getMessageDispatchService().packetOut(null, null);
131 if (resultFuture.isDone()) {
132 RpcResult<Void> rpcResult = resultFuture.get();
133 Assert.assertTrue(!rpcResult.getErrors().isEmpty());
135 Iterator<RpcError> it = rpcResult.getErrors().iterator();
136 RpcError rpcError = it.next();
138 Assert.assertTrue(rpcError.getApplicationTag().equals(OFConstants.APPLICATION_TAG));
139 Assert.assertTrue(rpcError.getTag().equals(OFConstants.ERROR_TAG_TIMEOUT));
140 Assert.assertTrue(rpcError.getErrorType().equals(RpcError.ErrorType.TRANSPORT));
146 class MockSessionContext implements SessionContext {
147 private MockConnectionConductor conductor;
148 private Map<SwitchConnectionDistinguisher, ConnectionConductor> map;
149 private IMessageDispatchService messageService;
150 private boolean isValid = true;
151 private CompositeObjectRegistration<ModelDrivenSwitch> registration;
154 MockSessionContext(int conductorNum) {
155 conductor = new MockConnectionConductor(conductorNum);
156 map = new HashMap<SwitchConnectionDistinguisher, ConnectionConductor>();
157 messageService = new MessageDispatchServiceImpl(this);
161 public MockConnectionConductor getPrimaryConductor() {
162 // TODO Auto-generated method stub
167 public GetFeaturesOutput getFeatures() {
168 // TODO Auto-generated method stub
173 public ConnectionConductor getAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey) {
175 return map.get(auxiliaryKey);
179 public Set<Entry<SwitchConnectionDistinguisher, ConnectionConductor>> getAuxiliaryConductors() {
180 // TODO Auto-generated method stub
185 public void addAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey, ConnectionConductor conductorArg) {
186 map.put(auxiliaryKey, conductorArg);
190 public ConnectionConductor removeAuxiliaryConductor(SwitchConnectionDistinguisher connectionCookie) {
191 return map.remove(connectionCookie);
195 public boolean isValid() {
196 // TODO Auto-generated method stub
201 public void setValid(boolean valid) {
206 public SwitchSessionKeyOF getSessionKey() {
207 // TODO Auto-generated method stub
212 public IMessageDispatchService getMessageDispatchService() {
213 // TODO Auto-generated method stub
214 return messageService;
218 public Long getNextXid() {
219 // TODO Auto-generated method stub
224 public Map<Long, PortGrouping> getPhysicalPorts() {
225 // TODO Auto-generated method stub
230 public Set<Long> getPorts() {
231 // TODO Auto-generated method stub
236 public PortGrouping getPhysicalPort(Long portNumber) {
237 // TODO Auto-generated method stub
242 public Boolean getPortBandwidth(Long portNumber) {
243 // TODO Auto-generated method stub
248 public boolean isPortEnabled(long portNumber) {
249 // TODO Auto-generated method stub
254 public boolean isPortEnabled(PortGrouping port) {
255 // TODO Auto-generated method stub
260 public List<PortGrouping> getEnabledPorts() {
261 // TODO Auto-generated method stub
266 public Map<Long, Boolean> getPortsBandwidth() {
267 // TODO Auto-generated method stub
272 public CompositeObjectRegistration<ModelDrivenSwitch> getProviderRegistration() {
277 public void setProviderRegistration(
278 CompositeObjectRegistration<ModelDrivenSwitch> registration) {
279 this.registration = registration;
283 public int getSeed() {
288 * @param seed the seed to set
290 public void setSeed(int seed) {
295 class MockConnectionConductor implements ConnectionConductor {
297 private int conductorNum;
298 private MockConnectionAdapter adapter;
300 public MockConnectionConductor(int conductorNumber) {
301 conductorNum = conductorNumber;
302 adapter = new MockConnectionAdapter();
307 // TODO Auto-generated method stub
312 public Short getVersion() {
313 // TODO Auto-generated method stub
318 public CONDUCTOR_STATE getConductorState() {
319 // TODO Auto-generated method stub
324 public void setConductorState(CONDUCTOR_STATE conductorState) {
325 // TODO Auto-generated method stub
330 public Future<Boolean> disconnect() {
331 // TODO Auto-generated method stub
336 public void setSessionContext(SessionContext context) {
337 // TODO Auto-generated method stub
342 public void setConnectionCookie(SwitchConnectionDistinguisher auxiliaryKey) {
343 // TODO Auto-generated method stub
348 public SessionContext getSessionContext() {
349 // TODO Auto-generated method stub
354 public SwitchConnectionDistinguisher getAuxiliaryKey() {
355 if (0 != conductorNum) {
356 SwitchConnectionCookieOFImpl key = new SwitchConnectionCookieOFImpl();
357 key.setAuxiliaryId((short) conductorNum);
365 public ConnectionAdapter getConnectionAdapter() {
366 // TODO Auto-generated method stub
370 public MessageType getMessageType() {
371 return adapter.getMessageType();
375 public void setQueueProcessor(QueueProcessor<OfHeader, DataObject> queueKeeper) {
380 public void setErrorHandler(ErrorHandler errorHandler) {
385 public void setId(int conductorId) {
391 NONE, BARRIER, FLOWMOD, TABLEMOD, PACKETOUT;
394 class MockConnectionAdapter implements ConnectionAdapter {
396 private MessageType messageType;
397 private ConnectionReadyListener connectionReadyListener;
399 public MockConnectionAdapter() {
400 setMessageType(MessageType.NONE);
404 public Future<RpcResult<BarrierOutput>> barrier(BarrierInput input) {
405 setMessageType(MessageType.BARRIER);
410 public Future<RpcResult<EchoOutput>> echo(EchoInput input) {
411 // TODO Auto-generated method stub
416 public Future<RpcResult<Void>> echoReply(EchoReplyInput input) {
417 // TODO Auto-generated method stub
422 public Future<RpcResult<Void>> experimenter(ExperimenterInput input) {
423 // TODO Auto-generated method stub
428 public Future<RpcResult<Void>> flowMod(FlowModInput input) {
429 setMessageType(MessageType.FLOWMOD);
434 public Future<RpcResult<GetAsyncOutput>> getAsync(GetAsyncInput input) {
435 // TODO Auto-generated method stub
440 public Future<RpcResult<GetConfigOutput>> getConfig(GetConfigInput input) {
441 // TODO Auto-generated method stub
446 public Future<RpcResult<GetFeaturesOutput>> getFeatures(GetFeaturesInput input) {
447 // TODO Auto-generated method stub
452 public Future<RpcResult<GetQueueConfigOutput>> getQueueConfig(GetQueueConfigInput input) {
453 // TODO Auto-generated method stub
458 public Future<RpcResult<Void>> groupMod(GroupModInput input) {
459 // TODO Auto-generated method stub
464 public Future<RpcResult<Void>> hello(HelloInput input) {
465 // TODO Auto-generated method stub
470 public Future<RpcResult<Void>> meterMod(MeterModInput input) {
471 // TODO Auto-generated method stub
476 public Future<RpcResult<Void>> packetOut(PacketOutInput input) {
477 setMessageType(MessageType.PACKETOUT);
482 public Future<RpcResult<Void>> portMod(PortModInput input) {
483 // TODO Auto-generated method stub
488 public Future<RpcResult<RoleRequestOutput>> roleRequest(RoleRequestInput input) {
489 // TODO Auto-generated method stub
494 public Future<RpcResult<Void>> setAsync(SetAsyncInput input) {
495 // TODO Auto-generated method stub
500 public Future<RpcResult<Void>> setConfig(SetConfigInput input) {
501 // TODO Auto-generated method stub
506 public Future<RpcResult<Void>> tableMod(TableModInput input) {
507 setMessageType(MessageType.TABLEMOD);
512 public Future<Boolean> disconnect() {
513 // TODO Auto-generated method stub
518 public boolean isAlive() {
519 // TODO Auto-generated method stub
524 public void setMessageListener(OpenflowProtocolListener messageListener) {
525 // TODO Auto-generated method stub
530 public void setSystemListener(SystemNotificationsListener systemListener) {
531 // TODO Auto-generated method stub
536 public void checkListeners() {
537 // TODO Auto-generated method stub
542 * @return the messageType
544 public MessageType getMessageType() {
549 * @param messageType the messageType to set
551 public void setMessageType(MessageType messageType) {
552 this.messageType = messageType;
556 public void fireConnectionReadyNotification() {
557 connectionReadyListener.onConnectionReady();
561 public void setConnectionReadyListener(
562 ConnectionReadyListener connectionReadyListener) {
563 this.connectionReadyListener = connectionReadyListener;
567 public Future<RpcResult<Void>> multipartRequest(
568 MultipartRequestInput input) {
569 // TODO Auto-generated method stub