1983b1d96677b4269d843288db7c057492e41616
[openflowjava.git] / openflow-protocol-impl / src / test / java / org / opendaylight / openflowjava / protocol / impl / serialization / match / OxmIpv6ExtHdrSerializerTest.java
1 /*\r
2  * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 \r
9 package org.opendaylight.openflowjava.protocol.impl.serialization.match;\r
10 \r
11 import static org.junit.Assert.assertEquals;\r
12 import static org.junit.Assert.assertTrue;\r
13 import io.netty.buffer.ByteBuf;\r
14 import io.netty.buffer.PooledByteBufAllocator;\r
15 \r
16 import org.junit.Assert;\r
17 import org.junit.Test;\r
18 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
19 import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants;\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaskMatchEntry;\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaskMatchEntryBuilder;\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PseudoFieldMatchEntry;\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PseudoFieldMatchEntryBuilder;\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Ipv6ExthdrFlags;\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Exthdr;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder;\r
28 \r
29 /**\r
30  * @author michal.polkorab\r
31  *\r
32  */\r
33 public class OxmIpv6ExtHdrSerializerTest {\r
34 \r
35     OxmIpv6ExtHdrSerializer serializer = new OxmIpv6ExtHdrSerializer();\r
36 \r
37     /**\r
38      * Test correct serialization\r
39      */\r
40     @Test\r
41     public void testSerializeWithMask() {\r
42         MatchEntriesBuilder builder = prepareIpv6ExtHdrMatchEntry(false,\r
43                 new Ipv6ExthdrFlags(true, false, true, false, true, false, true, false, true));\r
44         \r
45         ByteBuf buffer = PooledByteBufAllocator.DEFAULT.buffer();\r
46         serializer.serialize(builder.build(), buffer);\r
47 \r
48         checkHeader(buffer, false);\r
49         assertEquals("Wrong value", 358, buffer.readUnsignedShort());\r
50         assertTrue("Unexpected data", buffer.readableBytes() == 0);\r
51     }\r
52 \r
53     /**\r
54      * Test correct serialization\r
55      */\r
56     @Test\r
57     public void testSerializeWithoutMask() {\r
58         MatchEntriesBuilder builder = prepareIpv6ExtHdrMatchEntry(true,\r
59                 new Ipv6ExthdrFlags(false, true, false, true, false, true, false, true, false));\r
60         \r
61         ByteBuf buffer = PooledByteBufAllocator.DEFAULT.buffer();\r
62         serializer.serialize(builder.build(), buffer);\r
63 \r
64         checkHeader(buffer, true);\r
65         assertEquals("Wrong value", 153, buffer.readUnsignedShort());\r
66         byte[] tmp = new byte[2];\r
67         buffer.readBytes(tmp);\r
68         Assert.assertArrayEquals("Wrong mask", new byte[]{0, 15}, tmp);\r
69         assertTrue("Unexpected data", buffer.readableBytes() == 0);\r
70     }\r
71 \r
72     /**\r
73      * Test correct header serialization\r
74      */\r
75     @Test\r
76     public void testSerializeHeaderWithoutMask() {\r
77         MatchEntriesBuilder builder = prepareIpv6ExtHdrHeader(false);\r
78         \r
79         ByteBuf buffer = PooledByteBufAllocator.DEFAULT.buffer();\r
80         serializer.serializeHeader(builder.build(), buffer);\r
81 \r
82         checkHeader(buffer, false);\r
83         assertTrue("Unexpected data", buffer.readableBytes() == 0);\r
84     }\r
85 \r
86     /**\r
87      * Test correct header serialization\r
88      */\r
89     @Test\r
90     public void testSerializeHeaderWithMask() {\r
91         MatchEntriesBuilder builder = prepareIpv6ExtHdrHeader(true);\r
92         \r
93         ByteBuf buffer = PooledByteBufAllocator.DEFAULT.buffer();\r
94         serializer.serializeHeader(builder.build(), buffer);\r
95 \r
96         checkHeader(buffer, true);\r
97         assertTrue("Unexpected data", buffer.readableBytes() == 0);\r
98     }\r
99 \r
100     /**\r
101      * Test correct oxm-class return value\r
102      */\r
103     @Test\r
104     public void testGetOxmClassCode() {\r
105         assertEquals("Wrong oxm-class", OxmMatchConstants.OPENFLOW_BASIC_CLASS, serializer.getOxmClassCode());\r
106     }\r
107 \r
108     /**\r
109      * Test correct oxm-field return value\r
110      */\r
111     @Test\r
112     public void getOxmFieldCode() {\r
113         assertEquals("Wrong oxm-class", OxmMatchConstants.IPV6_EXTHDR, serializer.getOxmFieldCode());\r
114     }\r
115 \r
116     /**\r
117      * Test correct value length return value\r
118      */\r
119     @Test\r
120     public void testGetValueLength() {\r
121         assertEquals("Wrong value length", EncodeConstants.SIZE_OF_SHORT_IN_BYTES, serializer.getValueLength());\r
122     }\r
123 \r
124     \r
125     private static MatchEntriesBuilder prepareIpv6ExtHdrMatchEntry(boolean hasMask, Ipv6ExthdrFlags flags) {\r
126         MatchEntriesBuilder builder = prepareIpv6ExtHdrHeader(hasMask);\r
127         if (hasMask) {\r
128             MaskMatchEntryBuilder maskBuilder = new MaskMatchEntryBuilder();\r
129             maskBuilder.setMask(new byte[]{0, 15});\r
130             builder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
131         }\r
132         PseudoFieldMatchEntryBuilder pseudoBuilder = new PseudoFieldMatchEntryBuilder();\r
133         pseudoBuilder.setPseudoField(flags);\r
134         builder.addAugmentation(PseudoFieldMatchEntry.class, pseudoBuilder.build());\r
135         return builder;\r
136     }\r
137 \r
138     private static MatchEntriesBuilder prepareIpv6ExtHdrHeader(boolean hasMask) {\r
139         MatchEntriesBuilder builder = new MatchEntriesBuilder();\r
140         builder.setOxmClass(OpenflowBasicClass.class);\r
141         builder.setOxmMatchField(Ipv6Exthdr.class);\r
142         builder.setHasMask(hasMask);\r
143         return builder;\r
144     }\r
145 \r
146     private static void checkHeader(ByteBuf buffer, boolean hasMask) {\r
147         assertEquals("Wrong oxm-class", OxmMatchConstants.OPENFLOW_BASIC_CLASS, buffer.readUnsignedShort());\r
148         short fieldAndMask = buffer.readUnsignedByte();\r
149         assertEquals("Wrong oxm-field", OxmMatchConstants.IPV6_EXTHDR, fieldAndMask >>> 1);\r
150         assertEquals("Wrong hasMask", hasMask, (fieldAndMask & 1) != 0);\r
151         if (hasMask) {\r
152             assertEquals("Wrong length", EncodeConstants.SIZE_OF_INT_IN_BYTES, buffer.readUnsignedByte());\r
153         } else {\r
154             assertEquals("Wrong length", EncodeConstants.SIZE_OF_SHORT_IN_BYTES, buffer.readUnsignedByte());\r
155         }\r
156     }\r
157 }