add unit test for criterion codec

Change-Id: I0797c164dbbc03cd46a9d861e758f85cd27845d6
diff --git a/web/api/src/test/java/org/onosproject/codec/impl/CriterionCodecTest.java b/web/api/src/test/java/org/onosproject/codec/impl/CriterionCodecTest.java
index 15aca45..64f8114 100644
--- a/web/api/src/test/java/org/onosproject/codec/impl/CriterionCodecTest.java
+++ b/web/api/src/test/java/org/onosproject/codec/impl/CriterionCodecTest.java
@@ -17,9 +17,20 @@
 
 import java.util.EnumMap;
 
+import org.junit.Before;
 import org.junit.Test;
+import org.onlab.packet.Ip6Address;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.flow.criteria.Criteria;
 import org.onosproject.net.flow.criteria.Criterion;
 
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
 import static org.onlab.junit.TestUtils.getField;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.*;
@@ -29,13 +40,32 @@
  */
 public class CriterionCodecTest {
 
+    CodecContext context;
+    JsonCodec<Criterion> criterionCodec;
+    final PortNumber port = PortNumber.portNumber(1);
+    final IpPrefix ipPrefix4 = IpPrefix.valueOf("10.1.1.0/24");
+    final IpPrefix ipPrefix6 = IpPrefix.valueOf("fe80::/64");
+    final MacAddress mac1 = MacAddress.valueOf("00:00:11:00:00:01");
+
+    /**
+     * Sets up for each test.  Creates a context and fetches the criterion
+     * codec.
+     */
+    @Before
+    public void setUp() {
+        context = new MockCodecContext();
+        criterionCodec = context.codec(Criterion.class);
+        assertThat(criterionCodec, notNullValue());
+    }
+
+
     /**
      * Checks that all criterion types are covered by the codec.
      */
     @Test
     public void checkCriterionTypes() throws Exception {
-        CriterionCodec codec = new CriterionCodec();
-        EnumMap<Criterion.Type, Object> formatMap = getField(codec, "formatMap");
+        EnumMap<Criterion.Type, Object> formatMap =
+                getField(criterionCodec, "formatMap");
         assertThat(formatMap, notNullValue());
 
         for (Criterion.Type type : Criterion.Type.values()) {
@@ -43,4 +73,359 @@
                     formatMap.get(type), notNullValue());
         }
     }
+
+    /**
+     * Tests in port criterion.
+     */
+    @Test
+    public void matchInPortTest() {
+        Criterion criterion = Criteria.matchInPort(port);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("port").asLong(), is(port.toLong()));
+    }
+
+    /**
+     * Tests in physical port criterion.
+     */
+    @Test
+    public void matchInPhyPortTest() {
+        Criterion criterion = Criteria.matchInPhyPort(port);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("port").asLong(), is(port.toLong()));
+    }
+
+    /**
+     * Tests metadata criterion.
+     */
+    @Test
+    public void matchMetadataTest() {
+        Criterion criterion = Criteria.matchMetadata(0xabcdL);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("metadata").asLong(), is(0xabcdL));
+    }
+
+    /**
+     * Tests ethernet destination criterion.
+     */
+    @Test
+    public void matchEthDstTest() {
+        Criterion criterion = Criteria.matchEthDst(mac1);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("mac").asText(), is(mac1.toString()));
+    }
+
+    /**
+     * Tests ethernet source criterion.
+     */
+    @Test
+    public void matchEthSrcTest() {
+        Criterion criterion = Criteria.matchEthSrc(mac1);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("mac").asText(), is(mac1.toString()));
+    }
+
+    /**
+     * Tests ethernet type criterion.
+     */
+    @Test
+    public void matchEthTypeTest() {
+        Criterion criterion = Criteria.matchEthType((short) 3);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("ethType").asInt(), is(3));
+    }
+
+    /**
+     * Tests VLAN Id criterion.
+     */
+    @Test
+    public void matchVlanIdTest() {
+        Criterion criterion = Criteria.matchVlanId(VlanId.ANY);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat((short) result.get("vlanId").asInt(), is(VlanId.ANY.toShort()));
+    }
+
+    /**
+     * Tests VLAN PCP criterion.
+     */
+    @Test
+    public void matchVlanPcpTest() {
+        Criterion criterion = Criteria.matchVlanPcp((byte) 4);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("priority").asInt(), is(4));
+    }
+
+    /**
+     * Tests IP DSCP criterion.
+     */
+    @Test
+    public void matchIPDscpTest() {
+        Criterion criterion = Criteria.matchIPDscp((byte) 5);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("ipDscp").asInt(), is(5));
+    }
+
+    /**
+     * Tests IP ECN criterion.
+     */
+    @Test
+    public void matchIPEcnTest() {
+        Criterion criterion = Criteria.matchIPEcn((byte) 2);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("ipEcn").asInt(), is(2));
+    }
+
+    /**
+     * Tests IP protocol criterion.
+     */
+    @Test
+    public void matchIPProtocolTest() {
+        Criterion criterion = Criteria.matchIPProtocol((byte) 7);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("protocol").asInt(), is(7));
+    }
+
+    /**
+     * Tests IP source criterion.
+     */
+    @Test
+    public void matchIPSrcTest() {
+        Criterion criterion = Criteria.matchIPSrc(ipPrefix4);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("ip").asText(), is(ipPrefix4.toString()));
+    }
+
+    /**
+     * Tests IP destination criterion.
+     */
+    @Test
+    public void matchIPDstTest() {
+        Criterion criterion = Criteria.matchIPDst(ipPrefix4);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("ip").asText(), is(ipPrefix4.toString()));
+    }
+
+    /**
+     * Tests source TCP port criterion.
+     */
+    @Test
+    public void matchTcpSrcTest() {
+        Criterion criterion = Criteria.matchTcpSrc((short) 22);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("tcpPort").asInt(), is(22));
+    }
+
+    /**
+     * Tests destination TCP port criterion.
+     */
+    @Test
+    public void matchTcpDstTest() {
+        Criterion criterion = Criteria.matchTcpDst((short) 22);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("tcpPort").asInt(), is(22));
+    }
+
+    /**
+     * Tests source UDP port criterion.
+     */
+    @Test
+    public void matchUdpSrcTest() {
+        Criterion criterion = Criteria.matchUdpSrc((short) 22);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("udpPort").asInt(), is(22));
+    }
+
+    /**
+     * Tests destination UDP criterion.
+     */
+    @Test
+    public void matchUdpDstTest() {
+        Criterion criterion = Criteria.matchUdpDst((short) 22);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("udpPort").asInt(), is(22));
+    }
+
+    /**
+     * Tests source SCTP criterion.
+     */
+    @Test
+    public void matchSctpSrcTest() {
+        Criterion criterion = Criteria.matchSctpSrc((short) 22);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("sctpPort").asInt(), is(22));
+    }
+
+    /**
+     * Tests destination SCTP criterion.
+     */
+    @Test
+    public void matchSctpDstTest() {
+        Criterion criterion = Criteria.matchSctpDst((short) 22);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("sctpPort").asInt(), is(22));
+    }
+
+    /**
+     * Tests ICMP type criterion.
+     */
+    @Test
+    public void matchIcmpTypeTest() {
+        Criterion criterion = Criteria.matchIcmpType((byte) 6);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("icmpType").asInt(), is(6));
+    }
+
+    /**
+     * Tests ICMP code criterion.
+     */
+    @Test
+    public void matchIcmpCodeTest() {
+        Criterion criterion = Criteria.matchIcmpCode((byte) 6);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("icmpCode").asInt(), is(6));
+    }
+
+    /**
+     * Tests IPv6 source criterion.
+     */
+    @Test
+    public void matchIPv6SrcTest() {
+        Criterion criterion = Criteria.matchIPv6Src(ipPrefix6);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("ip").asText(), is(ipPrefix6.toString()));
+    }
+
+    /**
+     * Tests IPv6 destination criterion.
+     */
+    @Test
+    public void matchIPv6DstTest() {
+        Criterion criterion = Criteria.matchIPv6Dst(ipPrefix6);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("ip").asText(), is(ipPrefix6.toString()));
+    }
+
+    /**
+     * Tests IPv6 flow label criterion.
+     */
+    @Test
+    public void matchIPv6FlowLabelTest() {
+        Criterion criterion = Criteria.matchIPv6FlowLabel(7);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("flowLabel").asInt(), is(7));
+    }
+
+    /**
+     * Tests ICMP v6 type criterion.
+     */
+    @Test
+    public void matchIcmpv6TypeTest() {
+        Criterion criterion = Criteria.matchIcmpv6Type((byte) 15);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("icmpv6Type").asInt(), is(15));
+    }
+
+    /**
+     * Tests ICMP v6 code criterion.
+     */
+    @Test
+    public void matchIcmpv6CodeTest() {
+        Criterion criterion = Criteria.matchIcmpv6Code((byte) 17);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("icmpv6Code").asInt(), is(17));
+    }
+
+    /**
+     * Tests IPV6 target address criterion.
+     */
+    @Test
+    public void matchIPv6NDTargetAddressTest() {
+        Criterion criterion =
+                Criteria.matchIPv6NDTargetAddress(
+                        Ip6Address.valueOf("1111:2222::"));
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("targetAddress").asText(), is("1111:2222::"));
+    }
+
+    /**
+     * Tests IPV6 SLL criterion.
+     */
+    @Test
+    public void matchIPv6NDSourceLinkLayerAddressTest() {
+        Criterion criterion = Criteria.matchIPv6NDSourceLinkLayerAddress(mac1);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("mac").asText(), is(mac1.toString()));
+    }
+
+    /**
+     * Tests IPV6 TLL criterion.
+     */
+    @Test
+    public void matchIPv6NDTargetLinkLayerAddressTest() {
+        Criterion criterion = Criteria.matchIPv6NDTargetLinkLayerAddress(mac1);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("mac").asText(), is(mac1.toString()));
+    }
+
+    /**
+     * Tests MPLS label criterion.
+     */
+    @Test
+    public void matchMplsLabelTest() {
+        Criterion criterion = Criteria.matchMplsLabel(88);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("label").asInt(), is(88));
+    }
+
+    /**
+     * Tests lambda criterion.
+     */
+    @Test
+    public void matchLambdaTest() {
+        Criterion criterion = Criteria.matchLambda((short) 9);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("lambda").asInt(), is(9));
+    }
+
+    /**
+     * Tests optical signal type criterion.
+     */
+    @Test
+    public void matchOpticalSignalTypeTest() {
+        Criterion criterion = Criteria.matchOpticalSignalType((short) 11);
+        ObjectNode result = criterionCodec.encode(criterion, context);
+        assertThat(result.get("type").textValue(), is(criterion.type().toString()));
+        assertThat(result.get("signalType").asInt(), is(11));
+    }
+
 }