Improved unit test coverage (covered some untested branches) 57/11957/1
authorMichal Polkorab <michal.polkorab@pantheon.sk>
Tue, 26 Aug 2014 08:55:25 +0000 (10:55 +0200)
committerMichal Polkorab <michal.polkorab@pantheon.sk>
Tue, 14 Oct 2014 15:46:57 +0000 (17:46 +0200)
 - Fixed a typo in EncodeConstants javadoc
 - added access to Cache in ConnectionAdapterImpl (only for testing purposes)
 - removed check from SerializationFactory#messageToBuffer
   as it is done in SerializerRegistryImpl

Change-Id: I2e752a883a296f6e097084243aca0b109dd62c27
Signed-off-by: Michal Polkorab <michal.polkorab@pantheon.sk>
15 files changed:
openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/util/EncodeConstants.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/connection/ConnectionAdapterImpl.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/SerializationFactory.java
openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/connection/ConnectionAdapterImplTest.java [new file with mode: 0644]
openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/connection/SimpleRpcListenerTest.java
openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/deserialization/match/OxmIpv6ExtHdrDeserializerTest.java [new file with mode: 0644]
openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/deserialization/match/OxmIpv6FlabelDeserializerTest.java [new file with mode: 0644]
openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/deserialization/match/OxmMetadataDeserializerTest.java [new file with mode: 0644]
openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/deserialization/match/OxmMplsBosDeserializerTest.java [new file with mode: 0644]
openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/deserialization/match/OxmPbbIsidDeserializerTest.java [new file with mode: 0644]
openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/deserialization/match/OxmVlanVidDeserializerTest.java [new file with mode: 0644]
openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/util/ActionsDeserializerTest.java
openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/util/MatchDeserializerTest.java
openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/util/OF13ActionsSerializerTest.java
openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/util/OF13MatchSerializerTest.java

index b3f6dff511b092771c57699d6129e0ee8880765a..bbd881e2a0ddd67f00c6a98f138242c6bc3754d8 100644 (file)
@@ -18,7 +18,7 @@ public abstract class EncodeConstants {
     public static final byte PADDING = 8;
     /** OpenFlow v1.0 wire protocol number */
     public static final byte OF10_VERSION_ID = 0x01;
-    /** OpenFlow v1.0 wire protocol number */
+    /** OpenFlow v1.3 wire protocol number */
     public static final byte OF13_VERSION_ID = 0x04;
     /** Index of length in Openflow header */
     public static final int OFHEADER_LENGTH_INDEX = 2;
index 9fe040fcc4fbb630966a21f45ec8949e030a7bf2..19baa930432b29f80ccf510394165ccd5092e612 100644 (file)
@@ -108,7 +108,7 @@ public class ConnectionAdapterImpl implements ConnectionFacade {
     };
 
     /** expiring cache for future rpcResponses */
-    private final Cache<RpcResponseKey, ResponseExpectedRpcListener<?>> responseCache;
+    private Cache<RpcResponseKey, ResponseExpectedRpcListener<?>> responseCache;
 
     private final ChannelOutboundQueue output;
     private final Channel channel;
@@ -465,7 +465,6 @@ public class ConnectionAdapterImpl implements ConnectionFacade {
         }).start();
     }
 
-
     @Override
     public void setConnectionReadyListener(
             final ConnectionReadyListener connectionReadyListener) {
@@ -476,4 +475,12 @@ public class ConnectionAdapterImpl implements ConnectionFacade {
     public InetSocketAddress getRemoteAddress() {
         return (InetSocketAddress) channel.remoteAddress();
     }
-}
+
+    /**
+     * Used only for testing purposes
+     * @param cache
+     */
+    public void setResponseCache(Cache<RpcResponseKey, ResponseExpectedRpcListener<?>> cache) {
+        this.responseCache = cache;
+    }
+}
\ No newline at end of file
index 34f4fb19eaebd5e6de833eb8f60f4268915c27de..e318c683069cf39bc0938c9ae834c94b7be83ab9 100644 (file)
@@ -32,9 +32,7 @@ public class SerializationFactory {
     public void messageToBuffer(short version, ByteBuf out, DataObject message) {
         OFSerializer<DataObject> serializer = registry.getSerializer(
                 new MessageTypeKey<>(version, message.getImplementedInterface()));
-        if (serializer != null) {
-            serializer.serialize(message, out);
-        }
+        serializer.serialize(message, out);
     }
 
     /**
diff --git a/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/connection/ConnectionAdapterImplTest.java b/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/connection/ConnectionAdapterImplTest.java
new file mode 100644 (file)
index 0000000..0435b3b
--- /dev/null
@@ -0,0 +1,177 @@
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.connection;\r
+\r
+import static org.mockito.Matchers.any;\r
+import static org.mockito.Mockito.times;\r
+import static org.mockito.Mockito.verify;\r
+import static org.mockito.Mockito.when;\r
+import io.netty.channel.ChannelPipeline;\r
+import io.netty.channel.socket.SocketChannel;\r
+\r
+import java.net.InetSocketAddress;\r
+import java.util.concurrent.TimeUnit;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Before;\r
+import org.junit.Test;\r
+import org.mockito.Mock;\r
+import org.mockito.MockitoAnnotations;\r
+import org.opendaylight.openflowjava.protocol.api.connection.ConnectionReadyListener;\r
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInputBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutputBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoRequestMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoRequestMessageBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessageBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterMessageBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowRemovedMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowRemovedMessageBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloMessageBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessageBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OpenflowProtocolListener;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessageBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessageBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.DisconnectEvent;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.DisconnectEventBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SwitchIdleEvent;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SwitchIdleEventBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.system.rev130927.SystemNotificationsListener;\r
+import org.opendaylight.yangtools.yang.binding.DataObject;\r
+\r
+import com.google.common.cache.Cache;\r
+import com.google.common.cache.CacheBuilder;\r
+import com.google.common.cache.RemovalListener;\r
+import com.google.common.cache.RemovalNotification;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class ConnectionAdapterImplTest {\r
+\r
+    private static final int RPC_RESPONSE_EXPIRATION = 1;\r
+    private static final RemovalListener<RpcResponseKey, ResponseExpectedRpcListener<?>> REMOVAL_LISTENER =\r
+            new RemovalListener<RpcResponseKey, ResponseExpectedRpcListener<?>>() {\r
+        @Override\r
+        public void onRemoval(\r
+                final RemovalNotification<RpcResponseKey, ResponseExpectedRpcListener<?>> notification) {\r
+            notification.getValue().discard();\r
+        }\r
+    };\r
+\r
+    @Mock SocketChannel channel;\r
+    @Mock ChannelPipeline pipeline;\r
+    @Mock OpenflowProtocolListener messageListener;\r
+    @Mock SystemNotificationsListener systemListener;\r
+    @Mock ConnectionReadyListener readyListener;\r
+    @Mock Cache<RpcResponseKey, ResponseExpectedRpcListener<?>> mockCache;\r
+\r
+    private ConnectionAdapterImpl adapter;\r
+    private Cache<RpcResponseKey, ResponseExpectedRpcListener<?>> cache;\r
+\r
+    /**\r
+     * Initializes ConnectionAdapter\r
+     */\r
+    @Before\r
+    public void setUp() {\r
+        MockitoAnnotations.initMocks(this);\r
+        when(channel.pipeline()).thenReturn(pipeline);\r
+        adapter = new ConnectionAdapterImpl(channel, InetSocketAddress.createUnresolved("10.0.0.1", 6653));\r
+        adapter.setMessageListener(messageListener);\r
+        adapter.setSystemListener(systemListener);\r
+        adapter.setConnectionReadyListener(readyListener);\r
+        cache = CacheBuilder.newBuilder().concurrencyLevel(1).expireAfterWrite(RPC_RESPONSE_EXPIRATION, TimeUnit.MINUTES)\r
+                .removalListener(REMOVAL_LISTENER).build();\r
+        adapter.setResponseCache(cache);\r
+    }\r
+\r
+    /**\r
+     * Tests {@link ConnectionAdapterImpl#consume(DataObject)} with notifications\r
+     */\r
+    @Test\r
+    public void testConsume() {\r
+        DataObject message = new EchoRequestMessageBuilder().build();\r
+        adapter.consume(message);\r
+        verify(messageListener, times(1)).onEchoRequestMessage((EchoRequestMessage) message);\r
+        message = new ErrorMessageBuilder().build();\r
+        adapter.consume(message);\r
+        verify(messageListener, times(1)).onErrorMessage((ErrorMessage) message);\r
+        message = new ExperimenterMessageBuilder().build();\r
+        adapter.consume(message);\r
+        verify(messageListener, times(1)).onExperimenterMessage((ExperimenterMessage) message);\r
+        message = new FlowRemovedMessageBuilder().build();\r
+        adapter.consume(message);\r
+        verify(messageListener, times(1)).onFlowRemovedMessage((FlowRemovedMessage) message);\r
+        message = new HelloMessageBuilder().build();\r
+        adapter.consume(message);\r
+        verify(messageListener, times(1)).onHelloMessage((HelloMessage) message);\r
+        message = new MultipartReplyMessageBuilder().build();\r
+        adapter.consume(message);\r
+        verify(messageListener, times(1)).onMultipartReplyMessage((MultipartReplyMessage) message);\r
+        message = new PacketInMessageBuilder().build();\r
+        adapter.consume(message);\r
+        verify(messageListener, times(1)).onPacketInMessage((PacketInMessage) message);\r
+        message = new PortStatusMessageBuilder().build();\r
+        adapter.consume(message);\r
+        verify(messageListener, times(1)).onPortStatusMessage((PortStatusMessage) message);\r
+        message = new SwitchIdleEventBuilder().build();\r
+        adapter.consume(message);\r
+        verify(systemListener, times(1)).onSwitchIdleEvent((SwitchIdleEvent) message);\r
+        message = new DisconnectEventBuilder().build();\r
+        adapter.consume(message);\r
+        verify(systemListener, times(1)).onDisconnectEvent((DisconnectEvent) message);\r
+        message = new EchoRequestMessageBuilder().build();\r
+        adapter.consume(message);\r
+        verify(messageListener, times(1)).onEchoRequestMessage((EchoRequestMessage) message);\r
+    }\r
+\r
+    /**\r
+     * Tests {@link ConnectionAdapterImpl#consume(DataObject)} with unexpected rpc\r
+     */\r
+    @Test\r
+    public void testConsume2() {\r
+        adapter.setResponseCache(mockCache);\r
+        BarrierOutputBuilder barrierBuilder = new BarrierOutputBuilder();\r
+        barrierBuilder.setXid(42L);\r
+        BarrierOutput barrier = barrierBuilder.build();\r
+        adapter.consume(barrier);\r
+        verify(mockCache, times(1)).getIfPresent(any(RpcResponseKey.class));\r
+    }\r
+\r
+    /**\r
+     * Tests {@link ConnectionAdapterImpl#consume(DataObject)} with expected rpc\r
+     */\r
+    @Test\r
+    public void testConsume3() {\r
+        BarrierInputBuilder inputBuilder = new BarrierInputBuilder();\r
+        inputBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);\r
+        inputBuilder.setXid(42L);\r
+        BarrierInput barrierInput = inputBuilder.build();\r
+        RpcResponseKey key = new RpcResponseKey(42L, "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput");\r
+        ResponseExpectedRpcListener<OfHeader> listener = new ResponseExpectedRpcListener<>(barrierInput,\r
+                "failure", mockCache, key);\r
+        cache.put(key, listener);\r
+        BarrierOutputBuilder barrierBuilder = new BarrierOutputBuilder();\r
+        barrierBuilder.setXid(42L);\r
+        BarrierOutput barrierOutput = barrierBuilder.build();\r
+        adapter.consume(barrierOutput);\r
+        ResponseExpectedRpcListener<?> ifPresent = cache.getIfPresent(key);\r
+        Assert.assertNull("Listener was not discarded", ifPresent);\r
+    }\r
+}
\ No newline at end of file
index db9d689ea9a47e5256c4bacadae54a28e36ec96b..3f49196e2c059383c446b48fb3abaabd942e416c 100644 (file)
@@ -9,12 +9,19 @@
 package org.opendaylight.openflowjava.protocol.impl.connection;\r
 \r
 import static org.junit.Assert.fail;\r
+import static org.mockito.Mockito.times;\r
+import static org.mockito.Mockito.verify;\r
+import static org.mockito.Mockito.when;\r
+import io.netty.util.concurrent.Future;\r
 \r
 import java.util.Collections;\r
 import java.util.concurrent.ExecutionException;\r
 \r
 import org.junit.Assert;\r
+import org.junit.Before;\r
 import org.junit.Test;\r
+import org.mockito.Mock;\r
+import org.mockito.MockitoAnnotations;\r
 import org.opendaylight.controller.sal.common.util.Rpcs;\r
 import org.opendaylight.yangtools.yang.common.RpcError;\r
 import org.opendaylight.yangtools.yang.common.RpcResult;\r
@@ -27,6 +34,16 @@ import com.google.common.util.concurrent.SettableFuture;
  */\r
 public class SimpleRpcListenerTest {\r
 \r
+    @Mock Future<Void> future;\r
+\r
+    /**\r
+     * Initializes mocks\r
+     */\r
+    @Before\r
+    public void startUp() {\r
+        MockitoAnnotations.initMocks(this);\r
+    }\r
+\r
     /**\r
      * Test SimpleRpcListener creation\r
      */\r
@@ -54,4 +71,37 @@ public class SimpleRpcListenerTest {
             fail("Problem accessing result");\r
         }\r
     }\r
+\r
+    /**\r
+     * Test rpc success\r
+     */\r
+    @Test\r
+    public void testOperationComplete() {\r
+        when(future.isSuccess()).thenReturn(false);\r
+        SimpleRpcListener listener = new SimpleRpcListener("MESSAGE", "Failed to send message");\r
+        listener.operationComplete(future);\r
+        verify(future, times(1)).cause();\r
+        try {\r
+            Assert.assertEquals("Wrong result", 1, listener.getResult().get().getErrors().size());\r
+        } catch (InterruptedException | ExecutionException e) {\r
+            Assert.fail();\r
+        }\r
+    }\r
+\r
+    /**\r
+     * Test rpc success\r
+     */\r
+    @Test\r
+    public void testOperationComplete2() {\r
+        when(future.isSuccess()).thenReturn(true);\r
+        SimpleRpcListener listener = new SimpleRpcListener("MESSAGE", "Failed to send message");\r
+        listener.operationComplete(future);\r
+        verify(future, times(0)).cause();\r
+        try {\r
+            Assert.assertEquals("Wrong result", 0, listener.getResult().get().getErrors().size());\r
+            Assert.assertEquals("Wrong result", true, listener.getResult().get().isSuccessful());\r
+        } catch (InterruptedException | ExecutionException e) {\r
+            Assert.fail();\r
+        }\r
+    }\r
 }
\ No newline at end of file
diff --git a/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/deserialization/match/OxmIpv6ExtHdrDeserializerTest.java b/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/deserialization/match/OxmIpv6ExtHdrDeserializerTest.java
new file mode 100644 (file)
index 0000000..49b1187
--- /dev/null
@@ -0,0 +1,49 @@
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.deserialization.match;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Test;\r
+import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaskMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PseudoFieldMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Ipv6ExthdrFlags;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Exthdr;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class OxmIpv6ExtHdrDeserializerTest {\r
+\r
+    /**\r
+     * Tests {@link OxmIpv6ExtHdrDeserializer#deserialize(ByteBuf)}\r
+     */\r
+    @Test\r
+    public void test() {\r
+        ByteBuf buffer = BufferHelper.buildBuffer("80 00 4E 02 01 FF");\r
+\r
+        buffer.skipBytes(4); // skip XID\r
+        OxmIpv6ExtHdrDeserializer deserializer = new OxmIpv6ExtHdrDeserializer();\r
+        MatchEntries entry = deserializer.deserialize(buffer);\r
+\r
+        Assert.assertEquals("Wrong entry class", OpenflowBasicClass.class, entry.getOxmClass());\r
+        Assert.assertEquals("Wrong entry field", Ipv6Exthdr.class, entry.getOxmMatchField());\r
+        Assert.assertEquals("Wrong entry hasMask", false, entry.isHasMask());\r
+        Assert.assertEquals("Wrong entry value",\r
+                new Ipv6ExthdrFlags(true, true, true, true, true, true, true, true, true),\r
+                entry.getAugmentation(PseudoFieldMatchEntry.class).getPseudoField());\r
+        Assert.assertEquals("Wrong entry mask", null, entry.getAugmentation(MaskMatchEntry.class));\r
+        Assert.assertTrue("Unread data", buffer.readableBytes() == 0);\r
+    }\r
+}
\ No newline at end of file
diff --git a/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/deserialization/match/OxmIpv6FlabelDeserializerTest.java b/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/deserialization/match/OxmIpv6FlabelDeserializerTest.java
new file mode 100644 (file)
index 0000000..9b0d1a4
--- /dev/null
@@ -0,0 +1,44 @@
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.deserialization.match;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Test;\r
+import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6FlabelMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Flabel;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class OxmIpv6FlabelDeserializerTest {\r
+\r
+    /**\r
+     * Tests {@link OxmIpv6FlabelDeserializer#deserialize(ByteBuf)}\r
+     */\r
+    @Test\r
+    public void test() {\r
+        ByteBuf buffer = BufferHelper.buildBuffer("80 00 38 04 00 00 00 02");\r
+\r
+        buffer.skipBytes(4); // skip XID\r
+        OxmIpv6FlabelDeserializer deserializer = new OxmIpv6FlabelDeserializer();\r
+        MatchEntries entry = deserializer.deserialize(buffer);\r
+\r
+        Assert.assertEquals("Wrong entry class", OpenflowBasicClass.class, entry.getOxmClass());\r
+        Assert.assertEquals("Wrong entry field", Ipv6Flabel.class, entry.getOxmMatchField());\r
+        Assert.assertEquals("Wrong entry hasMask", false, entry.isHasMask());\r
+        Assert.assertEquals("Wrong entry value", 2, \r
+                entry.getAugmentation(Ipv6FlabelMatchEntry.class).getIpv6Flabel().getValue().intValue());\r
+    }\r
+}
\ No newline at end of file
diff --git a/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/deserialization/match/OxmMetadataDeserializerTest.java b/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/deserialization/match/OxmMetadataDeserializerTest.java
new file mode 100644 (file)
index 0000000..0cf6283
--- /dev/null
@@ -0,0 +1,45 @@
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.deserialization.match;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Test;\r
+import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;\r
+import org.opendaylight.openflowjava.util.ByteBufUtils;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MetadataMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Metadata;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class OxmMetadataDeserializerTest {\r
+\r
+    /**\r
+     * Tests {@link OxmMetadataDeserializer#deserialize(ByteBuf)}\r
+     */\r
+    @Test\r
+    public void test() {\r
+        ByteBuf buffer = BufferHelper.buildBuffer("80 00 04 08 00 00 00 00 00 00 00 03");\r
+\r
+        buffer.skipBytes(4); // skip XID\r
+        OxmMetadataDeserializer deserializer = new OxmMetadataDeserializer();\r
+        MatchEntries entry = deserializer.deserialize(buffer);\r
+\r
+        Assert.assertEquals("Wrong entry class", OpenflowBasicClass.class, entry.getOxmClass());\r
+        Assert.assertEquals("Wrong entry field", Metadata.class, entry.getOxmMatchField());\r
+        Assert.assertEquals("Wrong entry hasMask", false, entry.isHasMask());\r
+        Assert.assertArrayEquals("Wrong entry value", ByteBufUtils.hexStringToBytes("00 00 00 00 00 00 00 03"), \r
+                entry.getAugmentation(MetadataMatchEntry.class).getMetadata());\r
+    }\r
+}
\ No newline at end of file
diff --git a/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/deserialization/match/OxmMplsBosDeserializerTest.java b/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/deserialization/match/OxmMplsBosDeserializerTest.java
new file mode 100644 (file)
index 0000000..e8a379c
--- /dev/null
@@ -0,0 +1,43 @@
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.deserialization.match;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Test;\r
+import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.BosMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsBos;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class OxmMplsBosDeserializerTest {\r
+\r
+    /**\r
+     * Tests {@link OxmMplsBosDeserializer#deserialize(ByteBuf)}\r
+     */\r
+    @Test\r
+    public void test() {\r
+        ByteBuf buffer = BufferHelper.buildBuffer("80 00 48 01 00");\r
+\r
+        buffer.skipBytes(4); // skip XID\r
+        OxmMplsBosDeserializer deserializer = new OxmMplsBosDeserializer();\r
+        MatchEntries entry = deserializer.deserialize(buffer);\r
+\r
+        Assert.assertEquals("Wrong entry class", OpenflowBasicClass.class, entry.getOxmClass());\r
+        Assert.assertEquals("Wrong entry field", MplsBos.class, entry.getOxmMatchField());\r
+        Assert.assertEquals("Wrong entry hasMask", false, entry.isHasMask());\r
+        Assert.assertEquals("Wrong entry value", false, entry.getAugmentation(BosMatchEntry.class).isBos());\r
+    }\r
+}
\ No newline at end of file
diff --git a/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/deserialization/match/OxmPbbIsidDeserializerTest.java b/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/deserialization/match/OxmPbbIsidDeserializerTest.java
new file mode 100644 (file)
index 0000000..b33c8a2
--- /dev/null
@@ -0,0 +1,43 @@
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.deserialization.match;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Test;\r
+import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IsidMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.PbbIsid;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class OxmPbbIsidDeserializerTest {\r
+\r
+    /**\r
+     * Tests {@link OxmPbbIsidDeserializer#deserialize(ByteBuf)}\r
+     */\r
+    @Test\r
+    public void test() {\r
+        ByteBuf buffer = BufferHelper.buildBuffer("80 00 4A 03 00 00 02");\r
+\r
+        buffer.skipBytes(4); // skip XID\r
+        OxmPbbIsidDeserializer deserializer = new OxmPbbIsidDeserializer();\r
+        MatchEntries entry = deserializer.deserialize(buffer);\r
+\r
+        Assert.assertEquals("Wrong entry class", OpenflowBasicClass.class, entry.getOxmClass());\r
+        Assert.assertEquals("Wrong entry field", PbbIsid.class, entry.getOxmMatchField());\r
+        Assert.assertEquals("Wrong entry hasMask", false, entry.isHasMask());\r
+        Assert.assertEquals("Wrong entry value", 2, entry.getAugmentation(IsidMatchEntry.class).getIsid().intValue());\r
+    }\r
+}
\ No newline at end of file
diff --git a/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/deserialization/match/OxmVlanVidDeserializerTest.java b/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/deserialization/match/OxmVlanVidDeserializerTest.java
new file mode 100644 (file)
index 0000000..a51cc12
--- /dev/null
@@ -0,0 +1,46 @@
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowjava.protocol.impl.deserialization.match;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Test;\r
+import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanVid;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class OxmVlanVidDeserializerTest {\r
+\r
+    /**\r
+     * Tests {@link OxmVlanVidDeserializer#deserialize(ByteBuf)}\r
+     */\r
+    @Test\r
+    public void test() {\r
+        ByteBuf buffer = BufferHelper.buildBuffer("80 00 0C 02 20 0A");\r
+\r
+        buffer.skipBytes(4); // skip XID\r
+        OxmVlanVidDeserializer deserializer = new OxmVlanVidDeserializer();\r
+        MatchEntries entry = deserializer.deserialize(buffer);\r
+\r
+        Assert.assertEquals("Wrong entry class", OpenflowBasicClass.class, entry.getOxmClass());\r
+        Assert.assertEquals("Wrong entry field", VlanVid.class, entry.getOxmMatchField());\r
+        Assert.assertEquals("Wrong entry hasMask", false, entry.isHasMask());\r
+        Assert.assertEquals("Wrong entry value", 10,\r
+                entry.getAugmentation(VlanVidMatchEntry.class).getVlanVid().intValue());\r
+        Assert.assertEquals("Wrong entry value", false, \r
+                entry.getAugmentation(VlanVidMatchEntry.class).isCfiBit());\r
+    }\r
+}
\ No newline at end of file
index 06fbe466563b18ffcddeca3b7378a6ec1b1353d3..e0dfb8f70d1261ede3a73b9da076a12da6b5c01c 100644 (file)
@@ -17,6 +17,7 @@ import org.junit.Test;
 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;\r
 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
 import org.opendaylight.openflowjava.protocol.impl.deserialization.DeserializerRegistryImpl;\r
+import org.opendaylight.openflowjava.protocol.impl.deserialization.action.AbstractActionDeserializer;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeAction;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdAction;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;\r
@@ -142,4 +143,24 @@ public class ActionsDeserializerTest {
         Assert.assertTrue("Unread data in message", message.readableBytes() == 0);\r
     }\r
 \r
+    /**\r
+     * Tests {@link AbstractActionDeserializer#deserializeHeader(ByteBuf)}\r
+     */\r
+    @Test\r
+    public void testDeserializeHeader() {\r
+        ByteBuf message = BufferHelper.buildBuffer("00 00 00 04 00 19 00 04");\r
+\r
+        message.skipBytes(4); // skip XID\r
+        CodeKeyMaker keyMaker = CodeKeyMakerFactory.createActionsKeyMaker(EncodeConstants.OF13_VERSION_ID);\r
+        List<Action> actions = ListDeserializer.deserializeHeaders(EncodeConstants.OF13_VERSION_ID,\r
+                message.readableBytes(), message, keyMaker, registry);\r
+\r
+        Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight."\r
+                + "openflow.common.action.rev130731.Output", actions.get(0).getType().getName());\r
+        Assert.assertEquals("Wrong action port", null, actions.get(0).getAugmentation(PortAction.class));\r
+        Assert.assertEquals("Wrong action max-length", null, actions.get(0).getAugmentation(MaxLengthAction.class));\r
+        Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight."\r
+                + "openflow.common.action.rev130731.SetField", actions.get(1).getType().getName());\r
+        Assert.assertEquals("Wrong action oxm field", null, actions.get(1).getAugmentation(OxmFieldsAction.class));\r
+    }\r
 }\r
index b0db8353bc589441f90beeef1f68e9ee237d2f33..c9021b2857dfc957c60618096d0f6af2a8d7c7c9 100644 (file)
@@ -15,6 +15,7 @@ import org.junit.Assert;
 import org.junit.Before;\r
 import org.junit.Test;\r
 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;\r
+import org.opendaylight.openflowjava.protocol.api.extensibility.HeaderDeserializer;\r
 import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;\r
 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;\r
 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey;\r
@@ -194,7 +195,7 @@ public class MatchDeserializerTest {
                 + "80 00 48 01 01 "\r
                 + "80 00 4B 06 00 00 02 00 00 01 "\r
                 + "80 00 4D 10 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 FF "\r
-                + "80 00 4F 04 01 66 03 04 "\r
+                + "80 00 4F 04 00 00 03 04 "\r
                 + "00 00 00 00");\r
 \r
         Match match = matchDeserializer.deserialize(buffer);\r
@@ -474,11 +475,28 @@ public class MatchDeserializerTest {
         Assert.assertEquals("Wrong entry field", Ipv6Exthdr.class, entry39.getOxmMatchField());\r
         Assert.assertEquals("Wrong entry hasMask", true, entry39.isHasMask());\r
         Assert.assertEquals("Wrong entry value",\r
-                new Ipv6ExthdrFlags(true, false, true, false, true, false, true, false, true),\r
+                new Ipv6ExthdrFlags(false, false, false, false, false, false, false, false, false),\r
                 entry39.getAugmentation(PseudoFieldMatchEntry.class).getPseudoField());\r
         Assert.assertArrayEquals("Wrong entry mask", ByteBufUtils.hexStringToBytes("03 04"),\r
                 entry39.getAugmentation(MaskMatchEntry.class).getMask());\r
         Assert.assertTrue("Unread data", buffer.readableBytes() == 0);\r
     }\r
 \r
-}\r
+    /**\r
+     * Testing header deserialization\r
+     */\r
+    @Test\r
+    public void testHeaders() {\r
+        ByteBuf buffer = ByteBufUtils.hexStringToByteBuf("80 00 18 04 00 01 02 03");\r
+\r
+        MatchEntryDeserializerKey key = new MatchEntryDeserializerKey(EncodeConstants.OF13_VERSION_ID,\r
+                0x8000, 12);\r
+        key.setExperimenterId(null);\r
+        HeaderDeserializer<MatchEntries> entryDeserializer = registry.getDeserializer(key);\r
+        MatchEntries entry = entryDeserializer.deserializeHeader(buffer);\r
+        Assert.assertEquals("Wrong entry class", OpenflowBasicClass.class, entry.getOxmClass());\r
+        Assert.assertEquals("Wrong entry field", Ipv4Dst.class, entry.getOxmMatchField());\r
+        Assert.assertEquals("Wrong entry hasMask", false, entry.isHasMask());\r
+        Assert.assertEquals("Wrong Ipv4 address", null, entry.getAugmentation(Ipv4AddressMatchEntry.class));\r
+    }\r
+}
\ No newline at end of file
index bcc335c32272c20a6280d189ff6ad30567c19b2a..f801dee381f041ac61f91d76859a45caa20ed2fe 100644 (file)
@@ -243,4 +243,45 @@ public class OF13ActionsSerializerTest {
         Assert.assertTrue("Unread data", out.readableBytes() == 0);\r
     }\r
 \r
-}\r
+    /**\r
+     * Testing correct serialization of actions\r
+     */\r
+    @Test\r
+    public void testHeaders() {\r
+        List<Action> actions = new ArrayList<>();\r
+        ActionBuilder actionBuilder = new ActionBuilder();\r
+        actionBuilder.setType(Output.class);\r
+        PortActionBuilder port = new PortActionBuilder();\r
+        port.setPort(new PortNumber(42L));\r
+        actionBuilder.addAugmentation(PortAction.class, port.build());\r
+        MaxLengthActionBuilder maxLen = new MaxLengthActionBuilder();\r
+        maxLen.setMaxLength(52);\r
+        actionBuilder.addAugmentation(MaxLengthAction.class, maxLen.build());\r
+        actions.add(actionBuilder.build());\r
+        actionBuilder = new ActionBuilder();\r
+        actionBuilder.setType(SetField.class);\r
+        OxmFieldsActionBuilder matchEntries = new OxmFieldsActionBuilder();\r
+        List<MatchEntries> entries = new ArrayList<>();\r
+        MatchEntriesBuilder matchBuilder = new MatchEntriesBuilder();\r
+        matchBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        matchBuilder.setOxmMatchField(InPort.class);\r
+        matchBuilder.setHasMask(false);\r
+        PortNumberMatchEntryBuilder portBuilder = new PortNumberMatchEntryBuilder();\r
+        portBuilder.setPortNumber(new PortNumber(1L));\r
+        matchBuilder.addAugmentation(PortNumberMatchEntry.class, portBuilder.build());\r
+        entries.add(matchBuilder.build());\r
+        matchEntries.setMatchEntries(entries);\r
+        actionBuilder.addAugmentation(OxmFieldsAction.class, matchEntries.build());\r
+        actions.add(actionBuilder.build());\r
+\r
+        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
+        ListSerializer.serializeHeaderList(actions, TypeKeyMakerFactory\r
+                .createActionKeyMaker(EncodeConstants.OF13_VERSION_ID), registry, out);\r
+\r
+        Assert.assertEquals("Wrong action type", 0, out.readUnsignedShort());\r
+        Assert.assertEquals("Wrong action length", 4, out.readUnsignedShort());\r
+        Assert.assertEquals("Wrong action type", 25, out.readUnsignedShort());\r
+        Assert.assertEquals("Wrong action length", 4, out.readUnsignedShort());\r
+        Assert.assertTrue("Unread data", out.readableBytes() == 0);\r
+    }\r
+}
\ No newline at end of file
index 17bc3267e358bedcd9b77aa7feeb593bffb25df8..453662e52b6ce74bdd748647713d5d4f6968917b 100644 (file)
@@ -106,7 +106,7 @@ public class OF13MatchSerializerTest {
     /**
      * Test for correct serialization of Ipv6Address match entry
      */
-    @Test
+    @Test(expected=IllegalStateException.class)
     public void testIpv6Various() {
         MatchBuilder builder = new MatchBuilder();
         builder.setType(OxmMatchType.class);
@@ -165,6 +165,15 @@ public class OF13MatchSerializerTest {
         addressBuilder.setIpv6Address(new Ipv6Address("1:2:3:4:5:6:7:8:9"));
         entriesBuilder.addAugmentation(Ipv6AddressMatchEntry.class, addressBuilder.build());
         entries.add(entriesBuilder.build());
+        // ipv6 match entry with too abbreviated Ipv6 address
+        entriesBuilder = new MatchEntriesBuilder();
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);
+        entriesBuilder.setOxmMatchField(Ipv6NdTarget.class);
+        entriesBuilder.setHasMask(false);
+        addressBuilder = new Ipv6AddressMatchEntryBuilder();
+        addressBuilder.setIpv6Address(new Ipv6Address("1:2::::8"));
+        entriesBuilder.addAugmentation(Ipv6AddressMatchEntry.class, addressBuilder.build());
+        entries.add(entriesBuilder.build());
         builder.setMatchEntries(entries);
         Match match = builder.build();
         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();