Stores and gets IP address of a flow capable node
[openflowplugin.git] / openflowplugin / src / test / java / org / opendaylight / openflowplugin / openflow / md / core / session / MessageDispatchServiceImplTest.java
index d4074d13b64d2983ab071b2fc99d4a9c2d1137e9..1dfa06d713f03d6721d3444ee4d2fc3d96915625 100644 (file)
@@ -1,50 +1,38 @@
+/**
+ * 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.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.PortModInput;
-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;
@@ -58,14 +46,6 @@ public class MessageDispatchServiceImplTest {
 
     }
 
-    /**
-     * @throws java.lang.Exception
-     */
-    @After
-    public void tearDown() throws Exception {
-
-    }
-
     /**
      * Test barrier message for null cookie
      *
@@ -73,7 +53,10 @@ public class MessageDispatchServiceImplTest {
      */
     @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());
     }
 
@@ -145,11 +128,17 @@ public class MessageDispatchServiceImplTest {
     @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));
         }
     }
 
@@ -160,6 +149,8 @@ class MockSessionContext implements SessionContext {
     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);
@@ -192,8 +183,8 @@ 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
@@ -213,7 +204,7 @@ class MockSessionContext implements SessionContext {
     }
 
     @Override
-    public SwitchConnectionDistinguisher getSessionKey() {
+    public SwitchSessionKeyOF getSessionKey() {
         // TODO Auto-generated method stub
         return null;
     }
@@ -230,6 +221,76 @@ class MockSessionContext implements SessionContext {
         return null;
     }
 
+    @Override
+    public Map<Long, PortGrouping> getPhysicalPorts() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Set<Long> 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<PortGrouping> getEnabledPorts() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    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 {
@@ -294,9 +355,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 +372,20 @@ class MockConnectionConductor implements ConnectionConductor {
         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 {
@@ -321,6 +395,7 @@ enum MessageType {
 class MockConnectionAdapter implements ConnectionAdapter {
 
     private MessageType messageType;
+    private ConnectionReadyListener connectionReadyListener;
 
     public MockConnectionAdapter() {
         setMessageType(MessageType.NONE);
@@ -472,11 +547,36 @@ class MockConnectionAdapter implements ConnectionAdapter {
     }
 
     /**
-     * @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;
+    }
 }