+/**
+ * Copyright IBM Corporation, 2013. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
package org.opendaylight.openflowplugin.openflow.md.core.session;
-import java.math.BigInteger;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.concurrent.Future;
-
-import junit.framework.Assert;
-
-import org.junit.After;
+import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter;
+import org.opendaylight.openflowjava.protocol.api.connection.ConnectionReadyListener;
+import org.opendaylight.openflowplugin.openflow.md.ModelDrivenSwitch;
+import org.opendaylight.openflowplugin.openflow.md.OFConstants;
import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor;
+import org.opendaylight.openflowplugin.openflow.md.core.ErrorHandler;
import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoReplyInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.Port;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatus;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestOutput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetConfigInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.TableModInput;
+import org.opendaylight.openflowplugin.openflow.md.queue.QueueProcessor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.*;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;
+import org.opendaylight.yangtools.concepts.CompositeObjectRegistration;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.common.RpcError;
import org.opendaylight.yangtools.yang.common.RpcResult;
+import java.net.InetSocketAddress;
+import java.util.*;
+import java.util.Map.Entry;
+import java.util.concurrent.Future;
+
+/**
+ * test for {@link MessageDispatchServiceImpl}
+ */
public class MessageDispatchServiceImplTest {
MockSessionContext session;
}
- /**
- * @throws java.lang.Exception
- */
- @After
- public void tearDown() throws Exception {
-
- }
-
/**
* Test barrier message for null cookie
*
*/
@Test
public void testBarrierMessageForPrimary() throws Exception {
- session.getMessageDispatchService().barrier(null, null);
+ MockConnectionConductor conductor = new MockConnectionConductor(1);
+ SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey();
+ BarrierInputBuilder barrierMsg = new BarrierInputBuilder();
+ session.getMessageDispatchService().barrier(barrierMsg.build(), cookie);
Assert.assertEquals(MessageType.BARRIER, session.getPrimaryConductor().getMessageType());
}
@Test
public void testInvalidSession() throws Exception {
session.setValid(false);
- try {
- session.getMessageDispatchService().packetOut(null, null);
- Assert.assertTrue(false);
- } catch (IllegalArgumentException ex) {
- Assert.assertTrue(true);
+ Future<RpcResult<Void>> resultFuture = session.getMessageDispatchService().packetOut(null, null);
+ if (resultFuture.isDone()) {
+ RpcResult<Void> rpcResult = resultFuture.get();
+ Assert.assertTrue(!rpcResult.getErrors().isEmpty());
+
+ Iterator<RpcError> it = rpcResult.getErrors().iterator();
+ RpcError rpcError = it.next();
+
+ Assert.assertTrue(rpcError.getApplicationTag().equals(OFConstants.APPLICATION_TAG));
+ Assert.assertTrue(rpcError.getTag().equals(OFConstants.ERROR_TAG_TIMEOUT));
+ Assert.assertTrue(rpcError.getErrorType().equals(RpcError.ErrorType.TRANSPORT));
}
}
private Map<SwitchConnectionDistinguisher, ConnectionConductor> map;
private IMessageDispatchService messageService;
private boolean isValid = true;
+ private CompositeObjectRegistration<ModelDrivenSwitch> registration;
+ private int seed;
MockSessionContext(int conductorNum) {
conductor = new MockConnectionConductor(conductorNum);
}
@Override
- public void addAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey, ConnectionConductor conductor) {
- map.put(auxiliaryKey, conductor);
+ public void addAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey, ConnectionConductor conductorArg) {
+ map.put(auxiliaryKey, conductorArg);
}
@Override
}
@Override
- public SwitchConnectionDistinguisher getSessionKey() {
+ public SwitchSessionKeyOF getSessionKey() {
// TODO Auto-generated method stub
return null;
}
}
@Override
- public Map<Long, Port> getPhysicalPorts() {
+ public Map<Long, PortGrouping> getPhysicalPorts() {
// TODO Auto-generated method stub
return null;
}
}
@Override
- public Port getPhysicalPort(Long portNumber) {
+ public PortGrouping getPhysicalPort(Long portNumber) {
// TODO Auto-generated method stub
return null;
}
}
@Override
- public boolean isPortEnabled(Port port) {
+ public boolean isPortEnabled(PortGrouping port) {
// TODO Auto-generated method stub
return false;
}
@Override
- public List<Port> getEnabledPorts() {
+ public List<PortGrouping> getEnabledPorts() {
// TODO Auto-generated method stub
return null;
}
@Override
- public void processPortStatusMsg(PortStatus arg0) {
+ public Map<Long, Boolean> getPortsBandwidth() {
// TODO Auto-generated method stub
+ return null;
+ }
+ @Override
+ public CompositeObjectRegistration<ModelDrivenSwitch> getProviderRegistration() {
+ return registration;
}
+ @Override
+ public void setProviderRegistration(
+ CompositeObjectRegistration<ModelDrivenSwitch> registration) {
+ this.registration = registration;
+ }
+
+ @Override
+ public int getSeed() {
+ return seed;
+ }
+
+ /**
+ * @param seed the seed to set
+ */
+ public void setSeed(int seed) {
+ this.seed = seed;
+ }
}
class MockConnectionConductor implements ConnectionConductor {
public SwitchConnectionDistinguisher getAuxiliaryKey() {
if (0 != conductorNum) {
SwitchConnectionCookieOFImpl key = new SwitchConnectionCookieOFImpl();
- key.setDatapathId(BigInteger.valueOf(10L));
key.setAuxiliaryId((short) conductorNum);
- key.initId();
+ key.init(42);
return key;
}
return null;
return adapter.getMessageType();
}
+ @Override
+ public void setQueueProcessor(QueueProcessor<OfHeader, DataObject> queueKeeper) {
+ // NOOP
+ }
+
+ @Override
+ public void setErrorHandler(ErrorHandler errorHandler) {
+ // NOOP
+ }
+
+ @Override
+ public void setId(int conductorId) {
+ // NOOP
+ }
}
enum MessageType {
class MockConnectionAdapter implements ConnectionAdapter {
private MessageType messageType;
+ private ConnectionReadyListener connectionReadyListener;
public MockConnectionAdapter() {
setMessageType(MessageType.NONE);
}
/**
- * @param messageType
- * the messageType to set
+ * @param messageType the messageType to set
*/
public void setMessageType(MessageType messageType) {
this.messageType = messageType;
}
+ @Override
+ public void fireConnectionReadyNotification() {
+ connectionReadyListener.onConnectionReady();
+ }
+
+ @Override
+ public void setConnectionReadyListener(
+ ConnectionReadyListener connectionReadyListener) {
+ this.connectionReadyListener = connectionReadyListener;
+ }
+
+ @Override
+ public Future<RpcResult<Void>> multipartRequest(
+ MultipartRequestInput input) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter#getRemoteAddress()
+ */
+ @Override
+ public InetSocketAddress getRemoteAddress() {
+ // TODO Auto-generated method stub
+ return null;
+ }
}