X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin%2Fsrc%2Ftest%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fopenflow%2Fmd%2Fcore%2Fsession%2FMessageDispatchServiceImplTest.java;h=bb20b31aa1bd5b6d216b3d5f8325de5e47b2246b;hb=ecb084d1839da3acf6ad6d9660abb7ca07ad4020;hp=d4074d13b64d2983ab071b2fc99d4a9c2d1137e9;hpb=b688bcc4a8d359a221bf61ee3a6a59002f3807ae;p=openflowplugin.git diff --git a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/session/MessageDispatchServiceImplTest.java b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/session/MessageDispatchServiceImplTest.java index d4074d13b6..bb20b31aa1 100644 --- a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/session/MessageDispatchServiceImplTest.java +++ b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/session/MessageDispatchServiceImplTest.java @@ -1,50 +1,87 @@ +/** + * 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.net.InetSocketAddress; import java.util.HashMap; +import java.util.Iterator; +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.openflowplugin.openflow.md.core.ConnectionConductor; -import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher; +import org.opendaylight.openflowjava.protocol.api.connection.ConnectionReadyListener; +import org.opendaylight.openflowplugin.api.OFConstants; +import org.opendaylight.openflowplugin.api.openflow.md.ModelDrivenSwitch; +import org.opendaylight.openflowplugin.api.openflow.md.core.ConnectionConductor; +import org.opendaylight.openflowplugin.api.openflow.md.core.ErrorHandler; +import org.opendaylight.openflowplugin.api.openflow.md.core.NotificationEnqueuer; +import org.opendaylight.openflowplugin.api.openflow.md.core.NotificationQueueWrapper; +import org.opendaylight.openflowplugin.api.openflow.md.core.SwitchConnectionDistinguisher; +import org.opendaylight.openflowplugin.api.openflow.md.core.session.IMessageDispatchService; +import org.opendaylight.openflowplugin.api.openflow.md.core.session.SessionContext; +import org.opendaylight.openflowplugin.api.openflow.md.core.session.SwitchSessionKeyOF; +import org.opendaylight.openflowplugin.api.openflow.md.queue.QueueProcessor; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ControllerRole; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInputBuilder; 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.ExperimenterInputBuilder; 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.GetAsyncInputBuilder; 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.GetConfigInputBuilder; 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.GetFeaturesInputBuilder; 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.GetQueueConfigInputBuilder; 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.MultipartRequestInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; 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.PortGrouping; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestInputBuilder; 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.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.TableModInputBuilder; 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; +/** + * test for {@link MessageDispatchServiceImpl} + */ public class MessageDispatchServiceImplTest { MockSessionContext session; @@ -59,38 +96,147 @@ public class MessageDispatchServiceImplTest { } /** - * @throws java.lang.Exception + * Test barrier message for null cookie + * + * @throws Exception */ - @After - public void tearDown() throws Exception { + @Test + public void testBarrierMessageForPrimary() throws Exception { + 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 experimenter message for null cookie + */ + @Test + public void testExperimenter() { + MockConnectionConductor conductor = new MockConnectionConductor(1); + SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey(); + ExperimenterInputBuilder experimenterInputBuilder = new ExperimenterInputBuilder(); + session.getMessageDispatchService().experimenter( + experimenterInputBuilder.build(), cookie); + Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor() + .getMessageType()); } /** - * Test barrier message for null cookie - * - * @throws Exception + * Test get async input with null cookie */ @Test - public void testBarrierMessageForPrimary() throws Exception { - session.getMessageDispatchService().barrier(null, null); - Assert.assertEquals(MessageType.BARRIER, session.getPrimaryConductor().getMessageType()); + public void testGetAsync() { + MockConnectionConductor conductor = new MockConnectionConductor(1); + SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey(); + GetAsyncInputBuilder getAsyncInputBuilder = new GetAsyncInputBuilder(); + session.getMessageDispatchService().getAsync( + getAsyncInputBuilder.build(), cookie); + Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor() + .getMessageType()); + } + + /** + * Test get async output with null cookie + */ + @Test + public void testGetConfig() { + MockConnectionConductor conductor = new MockConnectionConductor(1); + SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey(); + GetConfigInputBuilder getConfigInputBuilder = new GetConfigInputBuilder(); + session.getMessageDispatchService().getConfig( + getConfigInputBuilder.build(), cookie); + Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor() + .getMessageType()); + } + + /** + * Test get features with null cookie + */ + @Test + public void testGetFeatures() { + MockConnectionConductor conductor = new MockConnectionConductor(1); + SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey(); + GetFeaturesInputBuilder getFeaturesInputBuilder = new GetFeaturesInputBuilder(); + session.getMessageDispatchService().getFeatures( + getFeaturesInputBuilder.build(), cookie); + Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor() + .getMessageType()); + } + + /** + * Test get queue config with null cookie + */ + @Test + public void testGetQueueConfig() { + MockConnectionConductor conductor = new MockConnectionConductor(1); + SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey(); + GetQueueConfigInputBuilder getQueueConfigInputBuilder = new GetQueueConfigInputBuilder(); + session.getMessageDispatchService().getQueueConfig( + getQueueConfigInputBuilder.build(), cookie); + Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor() + .getMessageType()); + } + + /** + * Test multipart request with null cookie + */ + @Test + public void testGetMultipart() { + MockConnectionConductor conductor = new MockConnectionConductor(1); + SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey(); + MultipartRequestInputBuilder multipartRequestInputBuilder = new MultipartRequestInputBuilder(); + session.getMessageDispatchService().multipartRequest( + multipartRequestInputBuilder.build(), cookie); + Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor() + .getMessageType()); + } + + /** + * Test role request with null cookie + */ + @Test + public void testRoleRequest() { + MockConnectionConductor conductor = new MockConnectionConductor(1); + SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey(); + RoleRequestInputBuilder roleRequestInputBuilder = new RoleRequestInputBuilder(); + session.getMessageDispatchService().roleRequest( + roleRequestInputBuilder.build(), cookie); + Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor() + .getMessageType()); + } + + /** + * Test table mod with null cookie + */ + @Test + public void testTableMod() { + MockConnectionConductor conductor = new MockConnectionConductor(1); + SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey(); + TableModInputBuilder tableModInputBuilder = new TableModInputBuilder(); + session.getMessageDispatchService().tableMod( + tableModInputBuilder.build(), cookie); + Assert.assertEquals(MessageType.TABLEMOD, session.getPrimaryConductor() + .getMessageType()); } /** * Test packet out message for primary connection - * + * * @throws Exception */ @Test public void testPacketOutMessageForPrimary() throws Exception { session.getMessageDispatchService().packetOut(null, null); - Assert.assertEquals(MessageType.PACKETOUT, session.getPrimaryConductor().getMessageType()); + Assert.assertEquals(MessageType.PACKETOUT, session + .getPrimaryConductor().getMessageType()); } /** * Test packet out message for auxiliary connection - * + * * @throws Exception */ @Test @@ -99,14 +245,16 @@ public class MessageDispatchServiceImplTest { SwitchConnectionDistinguisher cookie = conductor.getAuxiliaryKey(); session.addAuxiliaryConductor(cookie, conductor); session.getMessageDispatchService().packetOut(null, cookie); - Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType()); - conductor = (MockConnectionConductor) session.getAuxiliaryConductor(cookie); + Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor() + .getMessageType()); + conductor = (MockConnectionConductor) session + .getAuxiliaryConductor(cookie); Assert.assertEquals(MessageType.PACKETOUT, conductor.getMessageType()); } /** * Test packet out message when multiple auxiliary connection exist - * + * * @throws Exception */ @Test @@ -124,32 +272,46 @@ public class MessageDispatchServiceImplTest { // send message session.getMessageDispatchService().packetOut(builder.build(), cookie2); - Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor().getMessageType()); + Assert.assertEquals(MessageType.NONE, session.getPrimaryConductor() + .getMessageType()); - conductor3 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie3); + conductor3 = (MockConnectionConductor) session + .getAuxiliaryConductor(cookie3); Assert.assertEquals(MessageType.NONE, conductor3.getMessageType()); - conductor2 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie2); + conductor2 = (MockConnectionConductor) session + .getAuxiliaryConductor(cookie2); Assert.assertEquals(MessageType.PACKETOUT, conductor2.getMessageType()); - conductor1 = (MockConnectionConductor) session.getAuxiliaryConductor(cookie1); + conductor1 = (MockConnectionConductor) session + .getAuxiliaryConductor(cookie1); Assert.assertEquals(MessageType.NONE, conductor1.getMessageType()); } /** * Test for invalid session - * + * * @throws Exception */ @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> resultFuture = session + .getMessageDispatchService().packetOut(null, null); + if (resultFuture.isDone()) { + RpcResult rpcResult = resultFuture.get(); + Assert.assertTrue(!rpcResult.getErrors().isEmpty()); + + Iterator 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)); } } @@ -160,11 +322,16 @@ class MockSessionContext implements SessionContext { private Map map; private IMessageDispatchService messageService; private boolean isValid = true; + private CompositeObjectRegistration registration; + private int seed; + private SwitchSessionKeyOF sessionKey; MockSessionContext(int conductorNum) { conductor = new MockConnectionConductor(conductorNum); - map = new HashMap(); + map = new HashMap<>(); messageService = new MessageDispatchServiceImpl(this); + sessionKey = new SwitchSessionKeyOF(); + sessionKey.setDatapathId(new BigInteger("0")); } @Override @@ -180,7 +347,8 @@ class MockSessionContext implements SessionContext { } @Override - public ConnectionConductor getAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey) { + public ConnectionConductor getAuxiliaryConductor( + SwitchConnectionDistinguisher auxiliaryKey) { return map.get(auxiliaryKey); } @@ -192,12 +360,15 @@ class MockSessionContext implements SessionContext { } @Override - public void addAuxiliaryConductor(SwitchConnectionDistinguisher auxiliaryKey, ConnectionConductor conductor) { - map.put(auxiliaryKey, conductor); + public void addAuxiliaryConductor( + SwitchConnectionDistinguisher auxiliaryKey, + ConnectionConductor conductorArg) { + map.put(auxiliaryKey, conductorArg); } @Override - public ConnectionConductor removeAuxiliaryConductor(SwitchConnectionDistinguisher connectionCookie) { + public ConnectionConductor removeAuxiliaryConductor( + SwitchConnectionDistinguisher connectionCookie) { return map.remove(connectionCookie); } @@ -213,9 +384,8 @@ class MockSessionContext implements SessionContext { } @Override - public SwitchConnectionDistinguisher getSessionKey() { - // TODO Auto-generated method stub - return null; + public SwitchSessionKeyOF getSessionKey() { + return sessionKey; } @Override @@ -230,9 +400,96 @@ class MockSessionContext implements SessionContext { return null; } + @Override + public Map getPhysicalPorts() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Set getPorts() { + // TODO Auto-generated method stub + return null; + } + + @Override + public PortGrouping getPhysicalPort(Long portNumber) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Boolean getPortBandwidth(Long portNumber) { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean isPortEnabled(long portNumber) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean isPortEnabled(PortGrouping port) { + // TODO Auto-generated method stub + return false; + } + + @Override + public List getEnabledPorts() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Map getPortsBandwidth() { + // TODO Auto-generated method stub + return null; + } + + @Override + public CompositeObjectRegistration getProviderRegistration() { + return registration; + } + + @Override + public void setProviderRegistration( + CompositeObjectRegistration registration) { + this.registration = registration; + } + + @Override + public int getSeed() { + return seed; + } + + /** + * @param seed + * the seed to set + */ + public void setSeed(int seed) { + this.seed = seed; + } + + @Override + public NotificationEnqueuer getNotificationEnqueuer() { + return conductor; + } + + @Override + public ControllerRole getRoleOnDevice() { + return null; + } + + @Override + public void setRoleOnDevice(ControllerRole roleOnDevice) { + // NOOP + } } -class MockConnectionConductor implements ConnectionConductor { +class MockConnectionConductor implements ConnectionConductor, + NotificationEnqueuer { private int conductorNum; private MockConnectionAdapter adapter; @@ -294,9 +551,8 @@ 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; @@ -312,6 +568,26 @@ class MockConnectionConductor implements ConnectionConductor { return adapter.getMessageType(); } + @Override + public void setQueueProcessor( + QueueProcessor queueKeeper) { + // NOOP + } + + @Override + public void setErrorHandler(ErrorHandler errorHandler) { + // NOOP + } + + @Override + public void setId(int conductorId) { + // NOOP + } + + @Override + public void enqueueNotification(NotificationQueueWrapper notification) { + // NOOP + } } enum MessageType { @@ -321,6 +597,7 @@ enum MessageType { class MockConnectionAdapter implements ConnectionAdapter { private MessageType messageType; + private ConnectionReadyListener connectionReadyListener; public MockConnectionAdapter() { setMessageType(MessageType.NONE); @@ -369,13 +646,15 @@ class MockConnectionAdapter implements ConnectionAdapter { } @Override - public Future> getFeatures(GetFeaturesInput input) { + public Future> getFeatures( + GetFeaturesInput input) { // TODO Auto-generated method stub return null; } @Override - public Future> getQueueConfig(GetQueueConfigInput input) { + public Future> getQueueConfig( + GetQueueConfigInput input) { // TODO Auto-generated method stub return null; } @@ -411,7 +690,8 @@ class MockConnectionAdapter implements ConnectionAdapter { } @Override - public Future> roleRequest(RoleRequestInput input) { + public Future> roleRequest( + RoleRequestInput input) { // TODO Auto-generated method stub return null; } @@ -479,4 +759,45 @@ class MockConnectionAdapter implements ConnectionAdapter { this.messageType = messageType; } + @Override + public void fireConnectionReadyNotification() { + connectionReadyListener.onConnectionReady(); + } + + @Override + public void setConnectionReadyListener( + ConnectionReadyListener connectionReadyListener) { + this.connectionReadyListener = connectionReadyListener; + } + + @Override + public Future> 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; + } + + @Override + public boolean isAutoRead() { + // TODO Auto-generated method stub + return false; + } + + @Override + public void setAutoRead(boolean arg0) { + // TODO Auto-generated method stub + + } }