new serialization factories and tests 63/1663/3
authorTimotej Kubas <timotej.kubas@pantheon.sk>
Tue, 1 Oct 2013 12:24:06 +0000 (14:24 +0200)
committerTimotej Kubas <timotej.kubas@pantheon.sk>
Fri, 4 Oct 2013 08:40:59 +0000 (10:40 +0200)
Change-Id: I33dcb69226129bafa8811c3ed1ffd4c2db590f33
Signed-off-by: Timotej Kubas <timotej.kubas@pantheon.sk>
13 files changed:
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/DecoderTable.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/EncoderTable.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/FlowModInputMessageFactory.java [new file with mode: 0644]
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/GroupModInputMessageFactory.java [new file with mode: 0644]
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MeterModInputMessageFactory.java [new file with mode: 0644]
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/SetAsyncInputMessageFactory.java [new file with mode: 0644]
openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/FlowModInputMessageFactoryTest.java [new file with mode: 0644]
openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/GetaAsyncRequestMessageFactoryTest.java
openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/GroupModInputMessageFactoryTest.java [new file with mode: 0644]
openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MeterModInputMessageFactoryTest.java [new file with mode: 0644]
openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/PortModInputMessageFactoryTest.java
openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/SetAsyncInputMessageFactoryTest.java [new file with mode: 0644]
openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/TableModInputMessageFactoryTest.java

index 364f7f3151d62d9d30e5a17282eff0e3d803c996..ba59351e04cff1f7f85f0f3ff158288a57c5dfc7 100644 (file)
@@ -8,9 +8,17 @@ import org.opendaylight.openflowjava.protocol.impl.core.OFVersionDetector;
 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.BarrierReplyMessageFactory;\r
 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.EchoReplyMessageFactory;\r
 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.EchoRequestMessageFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.ErrorMessageFactory;\r
 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.ExperimenterMessageFactory;\r
 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.FeaturesReplyMessageFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.FlowRemovedMessageFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.GetConfigReplyMessageFactory;\r
 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.HelloMessageFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.MultipartReplyMessageFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.PacketInMessageFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.PortStatusMessageFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.QueueGetConfigReplyMessageFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.RoleReplyMessageFactory;\r
 \r
 /**\r
  * @author michal.polkorab\r
@@ -79,11 +87,19 @@ public class DecoderTable {
     public void init() {\r
         table = new HashMap<>();\r
         table.put(new MessageTypeCodeKey(OF13, (short) 0), HelloMessageFactory.getInstance());\r
+        table.put(new MessageTypeCodeKey(OF13, (short) 1), ErrorMessageFactory.getInstance());\r
         table.put(new MessageTypeCodeKey(OF13, (short) 2), EchoRequestMessageFactory.getInstance());\r
         table.put(new MessageTypeCodeKey(OF13, (short) 3), EchoReplyMessageFactory.getInstance());\r
         table.put(new MessageTypeCodeKey(OF13, (short) 4), ExperimenterMessageFactory.getInstance());\r
         table.put(new MessageTypeCodeKey(OF13, (short) 6), FeaturesReplyMessageFactory.getInstance());\r
+        table.put(new MessageTypeCodeKey(OF13, (short) 8), GetConfigReplyMessageFactory.getInstance());\r
+        table.put(new MessageTypeCodeKey(OF13, (short) 10), PacketInMessageFactory.getInstance());\r
+        table.put(new MessageTypeCodeKey(OF13, (short) 11), FlowRemovedMessageFactory.getInstance());\r
+        table.put(new MessageTypeCodeKey(OF13, (short) 12), PortStatusMessageFactory.getInstance());\r
+        table.put(new MessageTypeCodeKey(OF13, (short) 19), MultipartReplyMessageFactory.getInstance());\r
         table.put(new MessageTypeCodeKey(OF13, (short) 21), BarrierReplyMessageFactory.getInstance());\r
+        table.put(new MessageTypeCodeKey(OF13, (short) 23), QueueGetConfigReplyMessageFactory.getInstance());\r
+        table.put(new MessageTypeCodeKey(OF13, (short) 25), RoleReplyMessageFactory.getInstance());\r
     }\r
     \r
     /**\r
index e196d8786adbc4806425944a42d6438c6ff0eccf..088fa8feb482f4b184db70f1db64700a8b21bdb7 100644 (file)
@@ -5,8 +5,42 @@ import java.util.HashMap;
 import java.util.Map;\r
 \r
 import org.opendaylight.openflowjava.protocol.impl.core.OFVersionDetector;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.factories.BarrierInputMessageFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.factories.EchoInputMessageFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.factories.EchoReplyInputMessageFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.factories.ExperimenterInputMessageFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.factories.FlowModInputMessageFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.factories.GetAsyncRequestMessageFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.factories.GetConfigInputMessageFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.factories.GetFeaturesInputMessageFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.factories.GetQueueConfigInputMessageFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.factories.GroupModInputMessageFactory;\r
 import org.opendaylight.openflowjava.protocol.impl.serialization.factories.HelloInputMessageFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.factories.MeterModInputMessageFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.factories.PacketOutInputMessageFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.factories.PortModInputMessageFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.factories.RoleRequestInputMessageFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.factories.SetAsyncInputMessageFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.factories.SetConfigMessageFactory;\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.factories.TableModInputMessageFactory;\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.EchoInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoReplyInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ExperimenterInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetConfigInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetQueueConfigInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketOutInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetConfigInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.TableModInput;\r
 import org.opendaylight.yangtools.yang.binding.DataObject;\r
 \r
 /**\r
@@ -42,7 +76,24 @@ public class EncoderTable {
      */\r
     public void init() {\r
         table = new HashMap<>();\r
+        table.put(new MessageTypeKey<>(OF13, BarrierInput.class), BarrierInputMessageFactory.getInstance());\r
+        table.put(new MessageTypeKey<>(OF13, EchoInput.class), EchoInputMessageFactory.getInstance());\r
+        table.put(new MessageTypeKey<>(OF13, EchoReplyInput.class), EchoReplyInputMessageFactory.getInstance());\r
+        table.put(new MessageTypeKey<>(OF13, ExperimenterInput.class), ExperimenterInputMessageFactory.getInstance());\r
+        table.put(new MessageTypeKey<>(OF13, FlowModInput.class), FlowModInputMessageFactory.getInstance());\r
+        table.put(new MessageTypeKey<>(OF13, GetAsyncInput.class), GetAsyncRequestMessageFactory.getInstance());\r
+        table.put(new MessageTypeKey<>(OF13, GetConfigInput.class), GetConfigInputMessageFactory.getInstance());\r
+        table.put(new MessageTypeKey<>(OF13, GetFeaturesInput.class), GetFeaturesInputMessageFactory.getInstance());\r
+        table.put(new MessageTypeKey<>(OF13, GetQueueConfigInput.class), GetQueueConfigInputMessageFactory.getInstance());\r
+        table.put(new MessageTypeKey<>(OF13, GroupModInput.class), GroupModInputMessageFactory.getInstance());\r
         table.put(new MessageTypeKey<>(OF13, HelloInput.class), HelloInputMessageFactory.getInstance());\r
+        table.put(new MessageTypeKey<>(OF13, MeterModInput.class), MeterModInputMessageFactory.getInstance());\r
+        table.put(new MessageTypeKey<>(OF13, PacketOutInput.class), PacketOutInputMessageFactory.getInstance());\r
+        table.put(new MessageTypeKey<>(OF13, PortModInput.class), PortModInputMessageFactory.getInstance());\r
+        table.put(new MessageTypeKey<>(OF13, RoleRequestInput.class), RoleRequestInputMessageFactory.getInstance());\r
+        table.put(new MessageTypeKey<>(OF13, SetAsyncInput.class), SetAsyncInputMessageFactory.getInstance());\r
+        table.put(new MessageTypeKey<>(OF13, SetConfigInput.class), SetConfigMessageFactory.getInstance());\r
+        table.put(new MessageTypeKey<>(OF13, TableModInput.class), TableModInputMessageFactory.getInstance());\r
     }\r
     \r
     /**\r
diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/FlowModInputMessageFactory.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/FlowModInputMessageFactory.java
new file mode 100644 (file)
index 0000000..d42cf34
--- /dev/null
@@ -0,0 +1,78 @@
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.opendaylight.openflowjava.protocol.impl.serialization.factories;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.OFSerializer;\r
+import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlags;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;\r
+\r
+/**\r
+ * @author timotej.kubas\r
+ * @author michal.polkorab\r
+ */\r
+public class FlowModInputMessageFactory implements OFSerializer<FlowModInput> {\r
+    private static final byte MESSAGE_TYPE = 14;\r
+    private static final byte PADDING_IN_FLOW_MOD_MESSAGE = 2;\r
+    private static final int MESSAGE_LENGTH = 48; //flags\r
+    private static FlowModInputMessageFactory instance;\r
+   \r
+    private FlowModInputMessageFactory() {\r
+        // singleton\r
+    }\r
+    \r
+    /**\r
+     * @return singleton factory\r
+     */\r
+    public static FlowModInputMessageFactory getInstance() {\r
+        if(instance == null) {\r
+            instance = new FlowModInputMessageFactory();\r
+        }\r
+        return instance;\r
+    }\r
+    \r
+    @Override\r
+    public void messageToBuffer(short version, ByteBuf out, FlowModInput message) {\r
+        ByteBufUtils.writeOFHeader(instance, message, out);\r
+        out.writeLong(message.getCookie().longValue());\r
+        out.writeLong(message.getCookieMask().longValue());\r
+        out.writeByte(message.getTableId().getValue().byteValue());\r
+        out.writeByte(message.getCommand().getIntValue());\r
+        out.writeShort(message.getIdleTimeout().intValue());\r
+        out.writeShort(message.getHardTimeout().intValue());\r
+        out.writeShort(message.getPriority());\r
+        out.writeInt(message.getOutPort().getValue().intValue());\r
+        out.writeInt(message.getOutGroup().intValue());\r
+        out.writeShort(createFlowModFlagsBitmask(message.getFlags()));\r
+        ByteBufUtils.padBuffer(PADDING_IN_FLOW_MOD_MESSAGE, out);\r
+        // TODO implementation of match structure\r
+        // TODO implementation of instructions\r
+    }\r
+\r
+    @Override\r
+    public int computeLength() {\r
+        return MESSAGE_LENGTH;\r
+    }\r
+\r
+    @Override\r
+    public byte getMessageType() {\r
+        return MESSAGE_TYPE;\r
+    }\r
+    \r
+    private static int createFlowModFlagsBitmask(FlowModFlags flags) {\r
+        int flowModFlagBitmask = 0;\r
+        Map<Integer, Boolean> flowModFlagsMap = new HashMap<>();\r
+        flowModFlagsMap.put(0, flags.isOFPFFSENDFLOWREM());\r
+        flowModFlagsMap.put(1, flags.isOFPFFCHECKOVERLAP());\r
+        flowModFlagsMap.put(2, flags.isOFPFFRESETCOUNTS());\r
+        flowModFlagsMap.put(3, flags.isOFPFFNOPKTCOUNTS());\r
+        flowModFlagsMap.put(4, flags.isOFPFFNOBYTCOUNTS());\r
+        \r
+        flowModFlagBitmask = ByteBufUtils.fillBitMaskFromMap(flowModFlagsMap);\r
+        return flowModFlagBitmask;\r
+    }\r
+}\r
diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/GroupModInputMessageFactory.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/GroupModInputMessageFactory.java
new file mode 100644 (file)
index 0000000..19b9041
--- /dev/null
@@ -0,0 +1,73 @@
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.opendaylight.openflowjava.protocol.impl.serialization.factories;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import java.util.Iterator;\r
+import java.util.List;\r
+\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.OFSerializer;\r
+import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.group.mod.Buckets;\r
+\r
+/**\r
+ * @author timotej.kubas\r
+ * @author michal.polkorab\r
+ */\r
+public class GroupModInputMessageFactory implements OFSerializer<GroupModInput> {\r
+    private static final byte MESSAGE_TYPE = 15;\r
+    private static final byte PADDING_IN_GROUP_MOD_MESSAGE = 1;\r
+    private static final int MESSAGE_LENGTH = 16; \r
+    private static GroupModInputMessageFactory instance;\r
+    \r
+    private GroupModInputMessageFactory() {\r
+        // singleton\r
+    }\r
+    \r
+    /**\r
+     * @return singleton factory\r
+     */\r
+    public static GroupModInputMessageFactory getInstance() {\r
+        if (instance == null) {\r
+            instance = new GroupModInputMessageFactory();\r
+        }\r
+        return instance;\r
+    }\r
+    \r
+    @Override\r
+    public void messageToBuffer(short version, ByteBuf out,\r
+            GroupModInput message) {\r
+        ByteBufUtils.writeOFHeader(instance, message, out);\r
+        out.writeShort(message.getCommand().getIntValue());\r
+        out.writeByte(message.getType().getIntValue());\r
+        ByteBufUtils.padBuffer(PADDING_IN_GROUP_MOD_MESSAGE, out);\r
+        out.writeInt(message.getGroupId().intValue());\r
+        encodeBuckets(message.getBuckets(), out);\r
+    }\r
+\r
+    @Override\r
+    public int computeLength() {\r
+        return MESSAGE_LENGTH;\r
+    }\r
+\r
+    @Override\r
+    public byte getMessageType() {\r
+        return MESSAGE_TYPE;\r
+    }\r
+    \r
+    private static void encodeBuckets(List<Buckets> buckets, ByteBuf outBuffer) {\r
+        final byte PADDING_IN_BUCKET = 4;\r
+        \r
+        for (Iterator<Buckets> iterator = buckets.iterator(); iterator.hasNext();) {\r
+            Buckets currentBucket = iterator.next();\r
+            // TODO get method for field length missing\r
+            outBuffer.writeShort(currentBucket.getWeight().intValue());\r
+            outBuffer.writeInt(currentBucket.getWatchPort().getValue().intValue());\r
+            outBuffer.writeInt(currentBucket.getWatchGroup().intValue());\r
+            ByteBufUtils.padBuffer(PADDING_IN_BUCKET, outBuffer);\r
+            // TODO actions structure missing\r
+        }\r
+    }\r
+\r
+}\r
diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MeterModInputMessageFactory.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MeterModInputMessageFactory.java
new file mode 100644 (file)
index 0000000..aed6014
--- /dev/null
@@ -0,0 +1,83 @@
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.opendaylight.openflowjava.protocol.impl.serialization.factories;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import java.util.HashMap;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.OFSerializer;\r
+import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.Bands;\r
+\r
+/**\r
+ * @author timotej.kubas\r
+ * @author michal.polkorab\r
+ */\r
+public class MeterModInputMessageFactory implements OFSerializer<MeterModInput> {\r
+    private static final byte MESSAGE_TYPE = 29;\r
+    private static final int MESSAGE_LENGTH = 16; \r
+    private static MeterModInputMessageFactory instance;\r
+    \r
+    private MeterModInputMessageFactory() {\r
+        // singleton\r
+    }\r
+    \r
+    /**\r
+     * @return singleton factory\r
+     */\r
+    public static MeterModInputMessageFactory getInstance() {\r
+        if (instance == null) {\r
+            instance = new MeterModInputMessageFactory();\r
+        }\r
+        return instance;\r
+    }\r
+    \r
+    @Override\r
+    public void messageToBuffer(short version, ByteBuf out,\r
+            MeterModInput message) {\r
+        ByteBufUtils.writeOFHeader(instance, message, out);\r
+        out.writeShort(message.getCommand().getIntValue());\r
+        out.writeShort(createMeterFlagsBitmask(message.getFlags()));\r
+        out.writeInt(message.getMeterId().getValue().intValue());\r
+        encodeBands(message.getBands(), out);\r
+    }\r
+\r
+    @Override\r
+    public int computeLength() {\r
+        return MESSAGE_LENGTH;\r
+    }\r
+\r
+    @Override\r
+    public byte getMessageType() {\r
+        return MESSAGE_TYPE;\r
+    }\r
+\r
+    private static int createMeterFlagsBitmask(MeterFlags flags) {\r
+        int meterFlagBitmask = 0;\r
+        Map<Integer, Boolean> meterModFlagsMap = new HashMap<>();\r
+        meterModFlagsMap.put(0, flags.isOFPMFKBPS());\r
+        meterModFlagsMap.put(1, flags.isOFPMFPKTPS());\r
+        meterModFlagsMap.put(2, flags.isOFPMFBURST());\r
+        meterModFlagsMap.put(3, flags.isOFPMFSTATS());\r
+        \r
+        meterFlagBitmask = ByteBufUtils.fillBitMaskFromMap(meterModFlagsMap);\r
+        return meterFlagBitmask;\r
+    }\r
+    \r
+    private static void encodeBands(List<Bands> bands, ByteBuf outBuffer) {\r
+        for (Iterator<Bands> iterator = bands.iterator(); iterator.hasNext();) {\r
+            Bands currentBands = iterator.next();\r
+            outBuffer.writeShort(currentBands.getType().getIntValue());\r
+            // TODO outBuffer.writeShort(currentBands.get); length is missing\r
+            outBuffer.writeInt(currentBands.getRate().intValue());\r
+            outBuffer.writeInt(currentBands.getBurstSize().intValue());\r
+            // TODO what to do with ofp_meter_band_drop?\r
+        }\r
+    }\r
+    \r
+}\r
diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/SetAsyncInputMessageFactory.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/SetAsyncInputMessageFactory.java
new file mode 100644 (file)
index 0000000..d72e25f
--- /dev/null
@@ -0,0 +1,152 @@
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.opendaylight.openflowjava.protocol.impl.serialization.factories;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import java.util.HashMap;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.opendaylight.openflowjava.protocol.impl.serialization.OFSerializer;\r
+import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowRemovedReason;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PacketInReason;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortReason;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInput;\r
+\r
+/**\r
+ * @author timotej.kubas\r
+ * @author michal.polkorab\r
+ */\r
+public class SetAsyncInputMessageFactory implements OFSerializer<SetAsyncInput> {\r
+    private static final byte MESSAGE_TYPE = 28;\r
+    private static final int MESSAGE_LENGTH = 32; \r
+    private static SetAsyncInputMessageFactory instance;\r
+    \r
+    private SetAsyncInputMessageFactory() {\r
+        // singleton\r
+    }\r
+    \r
+    /**\r
+     * @return singleton factory\r
+     */\r
+    public static SetAsyncInputMessageFactory getInstance() {\r
+        if (instance == null) {\r
+            instance = new SetAsyncInputMessageFactory();\r
+        }\r
+        return instance;\r
+    }\r
+    \r
+    @Override\r
+    public void messageToBuffer(short version, ByteBuf out,\r
+            SetAsyncInput message) {\r
+        ByteBufUtils.writeOFHeader(instance, message, out);\r
+        encodePacketInMask(message.getPacketInMask(), out);\r
+        encodePortStatusMask(message.getPortStatusMask(), out);\r
+        encodeFlowRemovedMask(message.getFlowRemovedMask(), out);\r
+    }\r
+\r
+    @Override\r
+    public int computeLength() {\r
+        return MESSAGE_LENGTH;\r
+    }\r
+\r
+    @Override\r
+    public byte getMessageType() {\r
+        return MESSAGE_TYPE;\r
+    }\r
+    \r
+    private static void encodePacketInMask(List<PacketInReason> packetInMask, ByteBuf outBuffer) {\r
+        for (Iterator<PacketInReason> iterator = packetInMask.iterator(); iterator.hasNext();) {\r
+            PacketInReason currentPacketInReason = iterator.next();\r
+            outBuffer.writeInt(packetInReasonToBitmask(currentPacketInReason.getIntValue()));\r
+        }\r
+    }\r
+    \r
+    private static void encodePortStatusMask(List<PortReason> portStatusMask, ByteBuf outBuffer) {\r
+        for (Iterator<PortReason> iterator = portStatusMask.iterator(); iterator.hasNext();) {\r
+            PortReason currentPortReason = iterator.next();\r
+            outBuffer.writeInt(portReasonToBitmask(currentPortReason.getIntValue()));\r
+        }\r
+    }\r
+    \r
+    private static void encodeFlowRemovedMask(List<FlowRemovedReason> flowRemovedMask, ByteBuf outBuffer) {\r
+        for (Iterator<FlowRemovedReason> iterator = flowRemovedMask.iterator(); iterator.hasNext();) {\r
+            FlowRemovedReason currentFlowRemovedReason = iterator.next();\r
+            outBuffer.writeInt(flowRemovedReasonToBitmask(currentFlowRemovedReason.getIntValue()));\r
+        }\r
+    }\r
+    \r
+    private static int packetInReasonToBitmask(int option) {\r
+        Boolean OFPRNOMATCH = false;\r
+        Boolean OFPRACTION = false;\r
+        Boolean OFPRINVALIDTTL = false;\r
+        int packetInReasonBitmask = 0;\r
+        \r
+        switch(option) {\r
+        case 0: OFPRNOMATCH = true; break;\r
+        case 1: OFPRACTION = true; break;\r
+        case 2: OFPRINVALIDTTL = true; break;\r
+        default: break;\r
+        }\r
+        \r
+        Map<Integer, Boolean> packetInReasonMap = new HashMap<>();\r
+        packetInReasonMap.put(0, OFPRNOMATCH);\r
+        packetInReasonMap.put(1, OFPRACTION);\r
+        packetInReasonMap.put(2, OFPRINVALIDTTL);\r
+        \r
+        packetInReasonBitmask = ByteBufUtils.fillBitMaskFromMap(packetInReasonMap);\r
+        \r
+        return packetInReasonBitmask;\r
+    }\r
+    \r
+    private static int portReasonToBitmask(int option) {\r
+        Boolean OFPPRADD = false;\r
+        Boolean OFPPRDELETE = false;\r
+        Boolean OFPPRMODIFY = false;\r
+        int portReasonBitmask = 0;\r
+        \r
+        switch(option) {\r
+        case 0: OFPPRADD = true; break;\r
+        case 1: OFPPRDELETE = true; break;\r
+        case 2: OFPPRMODIFY = true; break;\r
+        default: break;\r
+        }\r
+        \r
+        Map<Integer, Boolean> portReasonMap = new HashMap<>();\r
+        portReasonMap.put(0, OFPPRADD);\r
+        portReasonMap.put(1, OFPPRDELETE);\r
+        portReasonMap.put(2, OFPPRMODIFY);\r
+        \r
+        portReasonBitmask = ByteBufUtils.fillBitMaskFromMap(portReasonMap);\r
+        \r
+        return portReasonBitmask;\r
+    }\r
+    \r
+    private static int flowRemovedReasonToBitmask(int option) {\r
+        Boolean OFPRRIDLETIMEOUT = false;\r
+        Boolean OFPRRHARDTIMEOUT = false;\r
+        Boolean OFPRRDELETE = false;\r
+        Boolean OFPRRGROUPDELETE = false;\r
+        int flowRemovedReasonBitmask = 0;\r
+        \r
+        switch(option) {\r
+        case 0: OFPRRIDLETIMEOUT = true; break;\r
+        case 1: OFPRRHARDTIMEOUT = true; break;\r
+        case 2: OFPRRDELETE = true; break;\r
+        case 3: OFPRRGROUPDELETE = true; break;\r
+        default: break;\r
+        }\r
+        \r
+        Map<Integer, Boolean> portReasonMap = new HashMap<>();\r
+        portReasonMap.put(0, OFPRRIDLETIMEOUT);\r
+        portReasonMap.put(1, OFPRRHARDTIMEOUT);\r
+        portReasonMap.put(2, OFPRRDELETE);\r
+        portReasonMap.put(3, OFPRRGROUPDELETE);\r
+        \r
+        flowRemovedReasonBitmask = ByteBufUtils.fillBitMaskFromMap(portReasonMap);\r
+        \r
+        return flowRemovedReasonBitmask;\r
+    }\r
+}\r
diff --git a/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/FlowModInputMessageFactoryTest.java b/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/FlowModInputMessageFactoryTest.java
new file mode 100644 (file)
index 0000000..646c256
--- /dev/null
@@ -0,0 +1,81 @@
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.opendaylight.openflowjava.protocol.impl.serialization.factories;\r
+\r
+import static org.junit.Assert.*;\r
+import io.netty.buffer.ByteBuf;\r
+import io.netty.buffer.UnpooledByteBufAllocator;\r
+\r
+import java.math.BigInteger;\r
+\r
+import junit.framework.Assert;\r
+\r
+import org.junit.Test;\r
+import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.HelloMessageFactoryTest;\r
+import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ControllerRole;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModCommand;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlags;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortConfig;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInputBuilder;\r
+\r
+/**\r
+ * @author timotej.kubas\r
+ * @author michal.polkorab\r
+ */\r
+public class FlowModInputMessageFactoryTest {\r
+    private static final byte PADDING_IN_FLOW_MOD_MESSAGE = 2;\r
+    /**\r
+     * @throws Exception \r
+     * Testing of {@link FlowModInputMessageFactory} for correct translation from POJO\r
+     */\r
+    @Test\r
+    public void testFlowModInputMessageFactory() throws Exception {\r
+        FlowModInputBuilder builder = new FlowModInputBuilder();\r
+        BufferHelper.setupHeader(builder);\r
+        byte[] cookie = new byte[]{0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};\r
+        builder.setCookie(new BigInteger(cookie));\r
+        byte[] cookieMask = new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\r
+        builder.setCookieMask(new BigInteger(cookieMask));\r
+        builder.setTableId(new TableId(65L));\r
+        builder.setCommand(FlowModCommand.forValue(2));\r
+        builder.setIdleTimeout(12);\r
+        builder.setHardTimeout(0);\r
+        builder.setPriority(126);\r
+        builder.setOutPort(new PortNumber(4422L));\r
+        builder.setOutGroup(98L);\r
+        builder.setFlags(new FlowModFlags(true, false, true, false, true));\r
+        FlowModInput message = builder.build();\r
+        \r
+        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
+        FlowModInputMessageFactory factory = FlowModInputMessageFactory.getInstance();\r
+        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
+        \r
+        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength());\r
+        Assert.assertEquals("Wrong cookie", message.getCookie().longValue(), out.readLong());\r
+        Assert.assertEquals("Wrong cookieMask", message.getCookieMask().longValue(), out.readLong());\r
+        Assert.assertEquals("Wrong tableId", message.getTableId().getValue().intValue(), out.readByte());\r
+        Assert.assertEquals("Wrong command", message.getCommand().getIntValue(), out.readByte());\r
+        Assert.assertEquals("Wrong idleTimeOut", message.getIdleTimeout().intValue(), out.readShort());\r
+        Assert.assertEquals("Wrong hardTimeOut", message.getHardTimeout().intValue(), out.readShort());\r
+        Assert.assertEquals("Wrong priority", message.getPriority().intValue(), out.readShort());\r
+        Assert.assertEquals("Wrong outPort", message.getOutPort().getValue().intValue(), out.readUnsignedInt());\r
+        Assert.assertEquals("Wrong outGroup", message.getOutGroup().intValue(), out.readUnsignedInt());\r
+        Assert.assertEquals("Wrong flags", message.getFlags(), createFlowModFalgsFromBitmap(out.readShort()));\r
+        out.skipBytes(PADDING_IN_FLOW_MOD_MESSAGE);\r
+        // TODO implementation of match structure\r
+        // TODO implementation of instructions\r
+    }\r
+    \r
+    private static FlowModFlags createFlowModFalgsFromBitmap(short input){\r
+        final Boolean _oFPFFSENDFLOWREM = (input & (1 << 0)) > 0;\r
+        final Boolean _oFPFFCHECKOVERLAP = (input & (1 << 1)) > 0;\r
+        final Boolean _oFPFFRESETCOUNTS = (input & (1 << 2)) > 0; \r
+        final Boolean _oFPFFNOPKTCOUNTS = (input & (1 << 3)) > 0;\r
+        final Boolean _oFPFFNOBYTCOUNTS = (input & (1 << 4)) > 0;\r
+        return new FlowModFlags(_oFPFFCHECKOVERLAP, _oFPFFNOBYTCOUNTS, _oFPFFNOPKTCOUNTS, _oFPFFRESETCOUNTS, _oFPFFSENDFLOWREM);\r
+    }\r
+\r
+}\r
index 902afdbf08348d03654eb6067447dbbb9045a330..fa63cdabd3f437c7f85ea4e4507ed26f4af70f5a 100644 (file)
@@ -19,11 +19,11 @@ public class GetaAsyncRequestMessageFactoryTest {
     private static final int MESSAGE_LENGTH = 8;\r
     \r
     /**\r
-     * Testing of {@link GetaAsyncRequestMessageFactory} for correct translation from POJO\r
+     * Testing of {@link GetAsyncRequestMessageFactory} for correct translation from POJO\r
      * @throws Exception \r
      */\r
     @Test\r
-    public void testGetaAsyncReques() throws Exception {\r
+    public void testGetAsyncReques() throws Exception {\r
         GetAsyncInputBuilder builder = new GetAsyncInputBuilder();\r
         BufferHelper.setupHeader(builder);\r
         GetAsyncInput message = builder.build();\r
diff --git a/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/GroupModInputMessageFactoryTest.java b/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/GroupModInputMessageFactoryTest.java
new file mode 100644 (file)
index 0000000..5379488
--- /dev/null
@@ -0,0 +1,110 @@
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.opendaylight.openflowjava.protocol.impl.serialization.factories;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+import io.netty.buffer.UnpooledByteBufAllocator;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import junit.framework.Assert;\r
+\r
+import org.junit.Test;\r
+import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.HelloMessageFactoryTest;\r
+import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupModCommand;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupType;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInputBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.group.mod.Buckets;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.group.mod.BucketsBuilder;\r
+\r
+/**\r
+ * @author timotej.kubas\r
+ *\r
+ */\r
+public class GroupModInputMessageFactoryTest {\r
+    private static final byte PADDING_IN_GROUP_MOD_MESSAGE = 1;\r
+    \r
+    /**\r
+     * @throws Exception\r
+     * Testing of {@link GroupModInputMessageFactory} for correct translation from POJO\r
+     */\r
+    @Test\r
+    public void testGroupModInputMessage() throws Exception {\r
+        GroupModInputBuilder builder = new GroupModInputBuilder();\r
+        BufferHelper.setupHeader(builder);\r
+        builder.setCommand(GroupModCommand.forValue(2));\r
+        builder.setType(GroupType.forValue(3));\r
+        builder.setGroupId(256L);\r
+        builder.setBuckets(createBucketsList());\r
+        GroupModInput message = builder.build();\r
+        \r
+        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
+        GroupModInputMessageFactory factory = GroupModInputMessageFactory.getInstance();\r
+        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
+        \r
+        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength());\r
+        Assert.assertEquals("Wrong command", message.getCommand().getIntValue(), out.readShort());\r
+        Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readByte());\r
+        out.skipBytes(PADDING_IN_GROUP_MOD_MESSAGE);\r
+        Assert.assertEquals("Wrong groupId", message.getGroupId().intValue(), out.readUnsignedInt());\r
+        Assert.assertEquals("Wrong bucketList", true, compareBucketsLists(createBucketsList(), createBucketsListFromBufer(out)));\r
+    }\r
+    \r
+    private static List<Buckets> createBucketsList(){\r
+        List<Buckets> bucketsList = new ArrayList<Buckets>();\r
+        BucketsBuilder bucketsBuilder = new BucketsBuilder();\r
+        Buckets bucket;\r
+        bucketsBuilder.setWeight(10);\r
+        bucketsBuilder.setWatchPort(new PortNumber(65L));\r
+        bucketsBuilder.setWatchGroup(22L);\r
+        bucket = bucketsBuilder.build();\r
+        bucketsList.add(bucket);\r
+        return bucketsList;\r
+    }\r
+    \r
+    private static List<Buckets> createBucketsListFromBufer(ByteBuf out){\r
+        List<Buckets> bucketsList = new ArrayList<Buckets>();\r
+        BucketsBuilder bucketsBuilder = new BucketsBuilder();\r
+        Buckets bucket;\r
+        bucketsBuilder.setWeight((int) out.readShort());\r
+        bucketsBuilder.setWatchPort(new PortNumber(out.readUnsignedInt()));\r
+        bucketsBuilder.setWatchGroup(out.readUnsignedInt());\r
+        out.skipBytes(4);\r
+        bucket = bucketsBuilder.build();\r
+        bucketsList.add(bucket);\r
+        return bucketsList;\r
+    }\r
+    \r
+    private static boolean compareBucketsLists(List<Buckets> bucketsFromMessage, List<Buckets> bucketsFromBuffer) {\r
+        boolean result = false;\r
+        int bucketsFromMessageLength = bucketsFromMessage.size();\r
+        for (int i = 0; i < bucketsFromMessageLength; i++) {\r
+            if (bucketsFromMessage.get(i).getWeight().equals(bucketsFromBuffer.get(i).getWeight())) {\r
+                result = true;\r
+            } else {\r
+                result = false;\r
+                break;\r
+            }\r
+            if (bucketsFromMessage.get(i).getWatchPort()\r
+                    .equals(bucketsFromBuffer.get(i).getWatchPort())) {\r
+                result = true;\r
+            } else {\r
+                result = false;\r
+                break;\r
+            }\r
+            if (bucketsFromMessage.get(i).getWatchGroup()\r
+                    .equals(bucketsFromBuffer.get(i).getWatchGroup())) {\r
+                result = true;\r
+            } else {\r
+                result = false;\r
+                break;\r
+            }\r
+        }\r
+     // TODO get method for field length missing\r
+     // TODO actions structure missing\r
+        return result;\r
+    }\r
+}\r
diff --git a/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MeterModInputMessageFactoryTest.java b/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MeterModInputMessageFactoryTest.java
new file mode 100644 (file)
index 0000000..c8a5b76
--- /dev/null
@@ -0,0 +1,116 @@
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.opendaylight.openflowjava.protocol.impl.serialization.factories;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+import io.netty.buffer.UnpooledByteBufAllocator;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import junit.framework.Assert;\r
+\r
+import org.junit.Test;\r
+import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.HelloMessageFactoryTest;\r
+import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandType;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModCommand;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInputBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.Bands;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.BandsBuilder;\r
+\r
+/**\r
+ * @author timotej.kubas\r
+ * @author michal.polkorab\r
+ */\r
+public class MeterModInputMessageFactoryTest {\r
+\r
+    /**\r
+     * @throws Exception \r
+     * Testing of {@link MeterModInputMessageFactory} for correct translation from POJO\r
+     */\r
+    @Test\r
+    public void testMeterModInputMessage() throws Exception {\r
+        MeterModInputBuilder builder = new MeterModInputBuilder();\r
+        BufferHelper.setupHeader(builder);\r
+        builder.setCommand(MeterModCommand.forValue(1));\r
+        builder.setFlags(new MeterFlags(false, true, true, false));\r
+        builder.setMeterId(new MeterId(2248L));\r
+        builder.setBands(createBandsList());\r
+        MeterModInput message = builder.build();\r
+        \r
+        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
+        MeterModInputMessageFactory factory = MeterModInputMessageFactory.getInstance();\r
+        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
+        \r
+        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength());\r
+        Assert.assertEquals("Wrong meterModCommand", message.getCommand().getIntValue(), out.readShort());\r
+        Assert.assertEquals("Wrong meterFlags", message.getFlags(), decodeMeterModFlags(out.readShort()));\r
+        Assert.assertEquals("Wrong meterId", message.getMeterId().getValue().intValue(), out.readUnsignedInt());\r
+        Assert.assertEquals("Wrong bands", true, compareBandsLists(createBandsList(), decodeBandsList(out)));\r
+    }\r
+    \r
+    private static MeterFlags decodeMeterModFlags(short input){\r
+        final Boolean _oFPMFKBPS = (input & (1 << 0)) > 0;\r
+        final Boolean _oFPMFPKTPS = (input & (1 << 1)) > 0;\r
+        final Boolean _oFPMFBURST = (input & (1 << 2)) > 0; \r
+        final Boolean _oFPMFSTATS = (input & (1 << 3)) > 0;\r
+        return new MeterFlags(_oFPMFBURST, _oFPMFKBPS, _oFPMFPKTPS, _oFPMFSTATS);\r
+    }\r
+    \r
+    private static List<Bands> createBandsList(){\r
+        List<Bands> bandsList = new ArrayList<Bands>();\r
+        BandsBuilder bandsBuilder = new BandsBuilder();\r
+        Bands band;\r
+        bandsBuilder.setType(MeterBandType.forValue(1));\r
+        bandsBuilder.setRate(2254L);\r
+        bandsBuilder.setBurstSize(12L);\r
+        band = bandsBuilder.build();\r
+        bandsList.add(band);\r
+        return bandsList;\r
+    }\r
+    \r
+    private static List<Bands> decodeBandsList(ByteBuf input){\r
+        List<Bands> bandsList = new ArrayList<Bands>();\r
+        BandsBuilder bandsBuilder = new BandsBuilder();\r
+        Bands band;\r
+        bandsBuilder.setType(MeterBandType.forValue(input.readShort()));\r
+        bandsBuilder.setRate(input.readUnsignedInt());\r
+        bandsBuilder.setBurstSize(input.readUnsignedInt());\r
+        band = bandsBuilder.build();\r
+        bandsList.add(band);\r
+        return bandsList;\r
+    }\r
+    \r
+    private static boolean compareBandsLists(List<Bands> bandsFromMessage, List<Bands> bandsFromBuffer) {\r
+        boolean result = false;\r
+        int bandsFromMessageLength = bandsFromMessage.size();\r
+        for (int i = 0; i < bandsFromMessageLength; i++) {\r
+            if (bandsFromMessage.get(i).getType().equals(bandsFromBuffer.get(i).getType())) {\r
+                result = true;\r
+            } else {\r
+                result = false;\r
+                break;\r
+            }\r
+            if (bandsFromMessage.get(i).getRate()\r
+                    .equals(bandsFromBuffer.get(i).getRate())) {\r
+                result = true;\r
+            } else {\r
+                result = false;\r
+                break;\r
+            }\r
+            if (bandsFromMessage.get(i).getBurstSize()\r
+                    .equals(bandsFromBuffer.get(i).getBurstSize())) {\r
+                result = true;\r
+            } else {\r
+                result = false;\r
+                break;\r
+            }\r
+        }\r
+     // TODO get method for field length missing\r
+     // TODO actions structure missing\r
+        return result;\r
+    }\r
+}\r
index 6a657032f8cd200d3130227b402f0bb43aa7c7df..e3d837986a64c1729c9eb83ee7be387f3f793eed 100644 (file)
@@ -60,32 +60,32 @@ public class PortModInputMessageFactoryTest {
     }\r
 \r
     private static PortConfig createPortConfig(long input){\r
-        final Boolean _portDown   = ((input) & 0x01) > 0;\r
-        final Boolean _noRecv    = ((input) & 0x04) > 0;\r
-        final Boolean _noFwd       = ((input) & 0x20) > 0;\r
-        final Boolean _noPacketIn = ((input) & 0x40) > 0;\r
-        return new PortConfig(_portDown, _noRecv, _noFwd, _noPacketIn);\r
+        final Boolean _portDown   = ((input) & (1<<0)) > 0;\r
+        final Boolean _noRecv    = ((input) & (1<<2)) > 0;\r
+        final Boolean _noFwd       = ((input) & (1<<5)) > 0;\r
+        final Boolean _noPacketIn = ((input) & (1<<6)) > 0;\r
+        return new PortConfig(_noFwd, _noPacketIn, _noRecv, _portDown);\r
     }\r
     \r
     private static PortFeatures createPortFeatures(long input){\r
-        final Boolean _10mbHd = ((input) & 0x01) > 0;\r
-        final Boolean _10mbFd = ((input) & 0x02) > 0;\r
-        final Boolean _100mbHd = ((input) & 0x04) > 0;\r
-        final Boolean _100mbFd = ((input) & 0x08) > 0;\r
-        final Boolean _1gbHd = ((input) & 0x10) > 0;\r
-        final Boolean _1gbFd = ((input) & 0x20) > 0;\r
-        final Boolean _10gbFd = ((input) & 0x40) > 0;\r
-        final Boolean _40gbFd = ((input) & 0x80) > 0;\r
-        final Boolean _100gbFd = ((input) & 0x100) > 0;\r
-        final Boolean _1tbFd = ((input) & 0x200) > 0;\r
-        final Boolean _other = ((input) & 0x400) > 0;\r
-        final Boolean _copper = ((input) & 0x800) > 0;\r
-        final Boolean _fiber = ((input) & 0x1000) > 0;\r
-        final Boolean _autoneg = ((input) & 0x2000) > 0;\r
-        final Boolean _pause = ((input) & 0x4000) > 0;\r
-        final Boolean _pauseAsym = ((input) & 0x8000) > 0;\r
-        return new PortFeatures(_10mbHd, _10mbFd, _100mbHd, _100mbFd, _1gbHd, _1gbFd, _10gbFd,\r
-                _40gbFd, _100gbFd, _1tbFd, _other, _copper, _fiber, _autoneg, _pause, _pauseAsym);\r
+        final Boolean _10mbHd = ((input) & (1<<0)) > 0;\r
+        final Boolean _10mbFd = ((input) & (1<<1)) > 0;\r
+        final Boolean _100mbHd = ((input) & (1<<2)) > 0;\r
+        final Boolean _100mbFd = ((input) & (1<<3)) > 0;\r
+        final Boolean _1gbHd = ((input) & (1<<4)) > 0;\r
+        final Boolean _1gbFd = ((input) & (1<<5)) > 0;\r
+        final Boolean _10gbFd = ((input) & (1<<6)) > 0;\r
+        final Boolean _40gbFd = ((input) & (1<<7)) > 0;\r
+        final Boolean _100gbFd = ((input) & (1<<8)) > 0;\r
+        final Boolean _1tbFd = ((input) & (1<<9)) > 0;\r
+        final Boolean _other = ((input) & (1<<10)) > 0;\r
+        final Boolean _copper = ((input) & (1<<11)) > 0;\r
+        final Boolean _fiber = ((input) & (1<<12)) > 0;\r
+        final Boolean _autoneg = ((input) & (1<<13)) > 0;\r
+        final Boolean _pause = ((input) & (1<<14)) > 0;\r
+        final Boolean _pauseAsym = ((input) & (1<<15)) > 0;\r
+        return new PortFeatures(_100gbFd, _100mbFd,  _100mbHd, _10gbFd, _10mbFd, _10mbHd, \r
+                _1gbFd, _1gbHd, _1tbFd, _40gbFd, _autoneg, _copper, _fiber, _other, _pause, _pauseAsym);\r
     }\r
     \r
     private static String makeMacAddress(ByteBuf input) {\r
diff --git a/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/SetAsyncInputMessageFactoryTest.java b/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/SetAsyncInputMessageFactoryTest.java
new file mode 100644 (file)
index 0000000..c9952e8
--- /dev/null
@@ -0,0 +1,196 @@
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.opendaylight.openflowjava.protocol.impl.serialization.factories;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+import io.netty.buffer.UnpooledByteBufAllocator;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Test;\r
+import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.HelloMessageFactoryTest;\r
+import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowRemovedReason;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PacketInReason;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortReason;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInputBuilder;\r
+\r
+/**\r
+ * @author timotej.kubas\r
+ * @author michal.polkorab\r
+ */\r
+public class SetAsyncInputMessageFactoryTest {\r
+\r
+    /**\r
+     * @throws Exception \r
+     * Testing of {@link SetAsyncInputMessageFactory} for correct translation from POJO\r
+     */\r
+    @Test\r
+    public void testSetAsyncInputMessage() throws Exception {\r
+        SetAsyncInputBuilder builder = new SetAsyncInputBuilder();\r
+        BufferHelper.setupHeader(builder);\r
+        builder.setPacketInMask(createPacketInMask());\r
+        builder.setPortStatusMask(createPortStatusMask());\r
+        builder.setFlowRemovedMask(createFlowRemowedMask());\r
+        SetAsyncInput message = builder.build();\r
+        \r
+        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
+        SetAsyncInputMessageFactory factory = SetAsyncInputMessageFactory.getInstance();\r
+        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
+        \r
+        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength());\r
+        Assert.assertTrue("Wrong packetInMask", comparePIRLists(message.getPacketInMask(), readPacketInMask(out)));\r
+        Assert.assertTrue("Wrong packetInMask", comparePortReasonLists(message.getPortStatusMask(), readPortStatusMask(out)));\r
+        Assert.assertTrue("Wrong packetInMask", compareFlowRemovedReasonLists(message.getFlowRemovedMask(), readFlowRemovedReasonMask(out)));\r
+        \r
+    }\r
+    \r
+    private static List<PacketInReason> createPacketInMask() {\r
+        List<PacketInReason> packetInReasonList = new ArrayList<PacketInReason>();\r
+        packetInReasonList.add(PacketInReason.forValue(1));\r
+        packetInReasonList.add(PacketInReason.forValue(2));\r
+        return packetInReasonList;\r
+    }\r
+    \r
+    private static List<PortReason> createPortStatusMask() {\r
+        List<PortReason> portReasonList = new ArrayList<PortReason>();\r
+        portReasonList.add(PortReason.forValue(1));\r
+        portReasonList.add(PortReason.forValue(2));\r
+        return portReasonList;\r
+    }\r
+    \r
+    private static List<FlowRemovedReason> createFlowRemowedMask() {\r
+        List<FlowRemovedReason> flowRemovedReasonList = new ArrayList<FlowRemovedReason>();\r
+        flowRemovedReasonList.add(FlowRemovedReason.forValue(2));\r
+        flowRemovedReasonList.add(FlowRemovedReason.forValue(3));\r
+        return flowRemovedReasonList;\r
+    }\r
+    \r
+    private static List<PacketInReason> readPacketInMask(ByteBuf outputBuf) {\r
+        List<PacketInReason> readPIRList = new ArrayList<PacketInReason>();\r
+        readPIRList.add(readPacketInReason((int) outputBuf.readUnsignedInt()));\r
+        readPIRList.add(readPacketInReason((int) outputBuf.readUnsignedInt()));\r
+        return readPIRList;\r
+    }\r
+    \r
+    private static List<PortReason> readPortStatusMask(ByteBuf outputBuf) {\r
+        List<PortReason> readPortReasonList = new ArrayList<PortReason>();\r
+        readPortReasonList.add(readPortReason((int) outputBuf.readUnsignedInt()));\r
+        readPortReasonList.add(readPortReason((int) outputBuf.readUnsignedInt()));\r
+        return readPortReasonList;\r
+    }\r
+    \r
+    private static List<FlowRemovedReason> readFlowRemovedReasonMask(ByteBuf outputBuf) {\r
+        List<FlowRemovedReason> readFlowRemovedReasonList = new ArrayList<FlowRemovedReason>();\r
+        readFlowRemovedReasonList.add(readFlowRemovedReason((int) outputBuf.readUnsignedInt()));\r
+        readFlowRemovedReasonList.add(readFlowRemovedReason((int) outputBuf.readUnsignedInt()));\r
+        return readFlowRemovedReasonList;\r
+    }\r
+    \r
+    private static PacketInReason readPacketInReason(int input) {\r
+        PacketInReason reason = null;\r
+        Boolean OFPRNOMATCH = (input & (1 << 0)) > 0;\r
+        Boolean OFPRACTION = (input & (1 << 1)) > 0;\r
+        Boolean OFPRINVALIDTTL = (input & (1 << 2)) > 0;\r
+        \r
+        if (OFPRNOMATCH) {\r
+            return PacketInReason.forValue(0);\r
+            }\r
+        if (OFPRACTION) {\r
+            return PacketInReason.forValue(1);\r
+            }\r
+        if (OFPRINVALIDTTL) {\r
+            return PacketInReason.forValue(2);\r
+            }\r
+        \r
+        return reason;\r
+    }\r
+    \r
+    private static PortReason readPortReason(int input) {\r
+        PortReason reason = null;\r
+        Boolean OFPPRADD = (input & (1 << 0)) > 0;\r
+        Boolean OFPPRDELETE = (input & (1 << 1)) > 0;\r
+        Boolean OFPPRMODIFY = (input & (1 << 2)) > 0;\r
+        \r
+        if (OFPPRADD) {\r
+            return PortReason.forValue(0);\r
+            }\r
+        if (OFPPRDELETE) {\r
+            return PortReason.forValue(1);\r
+            }\r
+        if (OFPPRMODIFY) {\r
+            return PortReason.forValue(2);\r
+            }\r
+        \r
+        return reason;\r
+    }\r
+    \r
+    private static FlowRemovedReason readFlowRemovedReason(int input) {\r
+        FlowRemovedReason reason = null;\r
+        Boolean OFPRRIDLETIMEOUT = (input & (1 << 0)) > 0;\r
+        Boolean OFPRRHARDTIMEOUT = (input & (1 << 1)) > 0;\r
+        Boolean OFPRRDELETE = (input & (1 << 2)) > 0;\r
+        Boolean OFPRRGROUPDELETE = (input & (1 << 3)) > 0;\r
+        \r
+        if (OFPRRIDLETIMEOUT) {\r
+            return FlowRemovedReason.forValue(0);\r
+            }\r
+        if (OFPRRHARDTIMEOUT) {\r
+            return FlowRemovedReason.forValue(1);\r
+            }\r
+        if (OFPRRDELETE) {\r
+            return FlowRemovedReason.forValue(2);\r
+            }\r
+        if (OFPRRGROUPDELETE) {\r
+            return FlowRemovedReason.forValue(3);\r
+            }\r
+        \r
+        return reason;\r
+    }\r
+    \r
+    private static boolean comparePIRLists(List<PacketInReason> fromMessage, List<PacketInReason> fromBuffer) {\r
+        boolean result = false;\r
+        int romMessageLength = fromMessage.size();\r
+        for (int i = 0; i < romMessageLength; i++) {\r
+            if ((fromMessage.get(i).getIntValue()) == (fromBuffer.get(i).getIntValue())) {\r
+                result = true;\r
+            } else {\r
+                result = false;\r
+                break;\r
+            }\r
+        }\r
+        return result;\r
+    }\r
+    \r
+    private static boolean comparePortReasonLists(List<PortReason> fromMessage, \r
+            List<PortReason> fromBuffer) {\r
+        boolean result = false;\r
+        int fromMessageLength = fromMessage.size();\r
+        for (int i = 0; i < fromMessageLength; i++) {\r
+            if ((fromMessage.get(i).getIntValue()) == (fromBuffer.get(i).getIntValue())) {\r
+                result = true;\r
+            } else {\r
+                result = false;\r
+                break;\r
+            }\r
+        }\r
+        return result;\r
+    }\r
+    \r
+    private static boolean compareFlowRemovedReasonLists(List<FlowRemovedReason> fromMessage, \r
+            List<FlowRemovedReason> fromBuffer) {\r
+        boolean result = false;\r
+        int fromMessageLength = fromMessage.size();\r
+        for (int i = 0; i < fromMessageLength; i++) {\r
+            if ((fromMessage.get(i).getIntValue()) == (fromBuffer.get(i).getIntValue())) {\r
+                result = true;\r
+            } else {\r
+                result = false;\r
+                break;\r
+            }\r
+        }\r
+        return result;\r
+    }\r
+}\r
index ad17ce487355640eed2707732d56151587ab310a..501453bd02066badc21bf313fe98b4a5617a20eb 100644 (file)
@@ -38,8 +38,16 @@ public class TableModInputMessageFactoryTest {
         factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
         \r
         BufferHelper.checkHeaderV13(out, MESSAGE_TYPE, 16);\r
-        Assert.assertEquals("Wrong TableID", 0x09, out.readByte());\r
+        Assert.assertEquals("Wrong TableID", message.getTableId().getValue().intValue(), out.readByte());\r
         out.skipBytes(PADDING_IN_TABLE_MOD_MESSAGE);\r
-        Assert.assertEquals("Wrong PortConfig", 33, out.readInt());\r
+        Assert.assertEquals("Wrong PortConfig", message.getConfig(), createPortConfig(out.readInt()));\r
+    }\r
+    \r
+    private static PortConfig createPortConfig(long input){\r
+        final Boolean _portDown   = ((input) & (1<<0)) > 0;\r
+        final Boolean _noRecv    = ((input) & (1<<2)) > 0;\r
+        final Boolean _noFwd       = ((input) & (1<<5)) > 0;\r
+        final Boolean _noPacketIn = ((input) & (1<<6)) > 0;\r
+        return new PortConfig(_noFwd, _noPacketIn, _noRecv, _portDown);\r
     }\r
 }\r