Merge "OF1.3 matchSerializer (Ipv6 address) fix + test"
[openflowjava.git] / openflow-protocol-impl / src / test / java / org / opendaylight / openflowjava / protocol / impl / util / MatchSerializerTest.java
1 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
2 package org.opendaylight.openflowjava.protocol.impl.util;\r
3 \r
4 import io.netty.buffer.ByteBuf;\r
5 import io.netty.buffer.UnpooledByteBufAllocator;\r
6 \r
7 import java.util.ArrayList;\r
8 import java.util.List;\r
9 \r
10 import org.junit.Assert;\r
11 import org.junit.Test;\r
12 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;\r
13 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;\r
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv4AddressMatchEntry;\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv4AddressMatchEntryBuilder;\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6AddressMatchEntry;\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6AddressMatchEntryBuilder;\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Src;\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Dst;\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdTarget;\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Src;\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm0Class;\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Nxm1Class;\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmMatchType;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntries;\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntriesBuilder;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.match.grouping.Match;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.match.grouping.MatchBuilder;\r
30 \r
31 /**\r
32  * @author michal.polkorab\r
33  *\r
34  */\r
35 public class MatchSerializerTest {\r
36 \r
37     /**\r
38      * Test for correct serialization of Ipv4Address match entry\r
39      */\r
40     @Test\r
41     public void test() {\r
42         MatchBuilder builder = new MatchBuilder();\r
43         builder.setType(OxmMatchType.class);\r
44         List<MatchEntries> entries = new ArrayList<>();\r
45         MatchEntriesBuilder entriesBuilder = new MatchEntriesBuilder();\r
46         entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
47         entriesBuilder.setOxmMatchField(Ipv4Src.class);\r
48         entriesBuilder.setHasMask(false);\r
49         Ipv4AddressMatchEntryBuilder addressBuilder = new Ipv4AddressMatchEntryBuilder();\r
50         addressBuilder.setIpv4Address(new Ipv4Address("1.2.3.4"));\r
51         entriesBuilder.addAugmentation(Ipv4AddressMatchEntry.class, addressBuilder.build());\r
52         entries.add(entriesBuilder.build());\r
53         builder.setMatchEntries(entries);\r
54         Match match = builder.build();\r
55         \r
56         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
57         MatchSerializer.encodeMatch(match, out);\r
58         \r
59         Assert.assertEquals("Wrong type", 1, out.readUnsignedShort());\r
60         out.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES);\r
61         Assert.assertEquals("Wrong class", 0x8000, out.readUnsignedShort());\r
62         Assert.assertEquals("Wrong field and mask", 22, out.readUnsignedByte());\r
63         out.skipBytes(EncodeConstants.SIZE_OF_BYTE_IN_BYTES);\r
64         Assert.assertEquals("Wrong ip address (first number)", 1, out.readUnsignedByte());\r
65         Assert.assertEquals("Wrong ip address (second number)", 2, out.readUnsignedByte());\r
66         Assert.assertEquals("Wrong ip address (third number)", 3, out.readUnsignedByte());\r
67         Assert.assertEquals("Wrong ip address (fourth number)", 4, out.readUnsignedByte());\r
68     }\r
69     \r
70     /**\r
71      * Test for correct serialization of Ipv6Address match entry\r
72      */\r
73     @Test\r
74     public void test2() {\r
75         MatchBuilder builder = new MatchBuilder();\r
76         builder.setType(OxmMatchType.class);\r
77         List<MatchEntries> entries = new ArrayList<>();\r
78         // ipv6 match entry with correct Ipv6 address\r
79         MatchEntriesBuilder entriesBuilder = new MatchEntriesBuilder();\r
80         entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
81         entriesBuilder.setOxmMatchField(Ipv6Src.class);\r
82         entriesBuilder.setHasMask(false);\r
83         Ipv6AddressMatchEntryBuilder addressBuilder = new Ipv6AddressMatchEntryBuilder();\r
84         addressBuilder.setIpv6Address(new Ipv6Address("1:2:3:4:5:6:7:8"));\r
85         entriesBuilder.addAugmentation(Ipv6AddressMatchEntry.class, addressBuilder.build());\r
86         entries.add(entriesBuilder.build());\r
87         // ipv6 match entry with abbreviated Ipv6 address\r
88         entriesBuilder = new MatchEntriesBuilder();\r
89         entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
90         entriesBuilder.setOxmMatchField(Ipv6NdTarget.class);\r
91         entriesBuilder.setHasMask(false);\r
92         addressBuilder = new Ipv6AddressMatchEntryBuilder();\r
93         addressBuilder.setIpv6Address(new Ipv6Address("1:2::6:7:8"));\r
94         entriesBuilder.addAugmentation(Ipv6AddressMatchEntry.class, addressBuilder.build());\r
95         entries.add(entriesBuilder.build());\r
96         // ipv6 match entry with abbreviated Ipv6 address\r
97         entriesBuilder = new MatchEntriesBuilder();\r
98         entriesBuilder.setOxmClass(Nxm1Class.class);\r
99         entriesBuilder.setOxmMatchField(Ipv6Dst.class);\r
100         entriesBuilder.setHasMask(false);\r
101         addressBuilder = new Ipv6AddressMatchEntryBuilder();\r
102         addressBuilder.setIpv6Address(new Ipv6Address("1::8"));\r
103         entriesBuilder.addAugmentation(Ipv6AddressMatchEntry.class, addressBuilder.build());\r
104         entries.add(entriesBuilder.build());\r
105         // ipv6 match entry with abbreviated Ipv6 address\r
106         entriesBuilder = new MatchEntriesBuilder();\r
107         entriesBuilder.setOxmClass(Nxm1Class.class);\r
108         entriesBuilder.setOxmMatchField(Ipv6Dst.class);\r
109         entriesBuilder.setHasMask(false);\r
110         addressBuilder = new Ipv6AddressMatchEntryBuilder();\r
111         addressBuilder.setIpv6Address(new Ipv6Address("::1"));\r
112         entriesBuilder.addAugmentation(Ipv6AddressMatchEntry.class, addressBuilder.build());\r
113         entries.add(entriesBuilder.build());\r
114         // ipv6 match entry with abbreviated Ipv6 address\r
115         entriesBuilder = new MatchEntriesBuilder();\r
116         entriesBuilder.setOxmClass(Nxm0Class.class);\r
117         entriesBuilder.setOxmMatchField(Ipv6Dst.class);\r
118         entriesBuilder.setHasMask(false);\r
119         addressBuilder = new Ipv6AddressMatchEntryBuilder();\r
120         addressBuilder.setIpv6Address(new Ipv6Address("::"));\r
121         entriesBuilder.addAugmentation(Ipv6AddressMatchEntry.class, addressBuilder.build());\r
122         entries.add(entriesBuilder.build());\r
123         // ipv6 match entry with incorrect Ipv6 address (longer)\r
124         entriesBuilder = new MatchEntriesBuilder();\r
125         entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
126         entriesBuilder.setOxmMatchField(Ipv6Dst.class);\r
127         entriesBuilder.setHasMask(false);\r
128         addressBuilder = new Ipv6AddressMatchEntryBuilder();\r
129         addressBuilder.setIpv6Address(new Ipv6Address("1:2:3:4:5:6:7:8:9"));\r
130         entriesBuilder.addAugmentation(Ipv6AddressMatchEntry.class, addressBuilder.build());\r
131         entries.add(entriesBuilder.build());\r
132         builder.setMatchEntries(entries);\r
133         Match match = builder.build();\r
134         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
135         MatchSerializer.encodeMatch(match, out);\r
136         \r
137         Assert.assertEquals("Wrong type", 1, out.readUnsignedShort());\r
138         out.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES);\r
139         Assert.assertEquals("Wrong class", 0x8000, out.readUnsignedShort());\r
140         Assert.assertEquals("Wrong field and mask", 52, out.readUnsignedByte());\r
141         Assert.assertEquals("Wrong entry length", 16, out.readUnsignedByte());\r
142         Assert.assertEquals("Wrong ipv6 address", 1, out.readUnsignedShort());\r
143         Assert.assertEquals("Wrong ipv6 address", 2, out.readUnsignedShort());\r
144         Assert.assertEquals("Wrong ipv6 address", 3, out.readUnsignedShort());\r
145         Assert.assertEquals("Wrong ipv6 address", 4, out.readUnsignedShort());\r
146         Assert.assertEquals("Wrong ipv6 address", 5, out.readUnsignedShort());\r
147         Assert.assertEquals("Wrong ipv6 address", 6, out.readUnsignedShort());\r
148         Assert.assertEquals("Wrong ipv6 address", 7, out.readUnsignedShort());\r
149         Assert.assertEquals("Wrong ipv6 address", 8, out.readUnsignedShort());\r
150         Assert.assertEquals("Wrong class", 0x8000, out.readUnsignedShort());\r
151         Assert.assertEquals("Wrong field and mask", 62, out.readUnsignedByte());\r
152         Assert.assertEquals("Wrong entry length", 16, out.readUnsignedByte());\r
153         Assert.assertEquals("Wrong ipv6 address", 1, out.readUnsignedShort());\r
154         Assert.assertEquals("Wrong ipv6 address", 2, out.readUnsignedShort());\r
155         Assert.assertEquals("Wrong ipv6 address", 0, out.readUnsignedShort());\r
156         Assert.assertEquals("Wrong ipv6 address", 0, out.readUnsignedShort());\r
157         Assert.assertEquals("Wrong ipv6 address", 0, out.readUnsignedShort());\r
158         Assert.assertEquals("Wrong ipv6 address", 6, out.readUnsignedShort());\r
159         Assert.assertEquals("Wrong ipv6 address", 7, out.readUnsignedShort());\r
160         Assert.assertEquals("Wrong ipv6 address", 8, out.readUnsignedShort());\r
161         Assert.assertEquals("Wrong class", 0x0001, out.readUnsignedShort());\r
162         Assert.assertEquals("Wrong field and mask", 54, out.readUnsignedByte());\r
163         Assert.assertEquals("Wrong entry length", 16, out.readUnsignedByte());\r
164         Assert.assertEquals("Wrong ipv6 address", 1, out.readUnsignedShort());\r
165         Assert.assertEquals("Wrong ipv6 address", 0, out.readUnsignedShort());\r
166         Assert.assertEquals("Wrong ipv6 address", 0, out.readUnsignedShort());\r
167         Assert.assertEquals("Wrong ipv6 address", 0, out.readUnsignedShort());\r
168         Assert.assertEquals("Wrong ipv6 address", 0, out.readUnsignedShort());\r
169         Assert.assertEquals("Wrong ipv6 address", 0, out.readUnsignedShort());\r
170         Assert.assertEquals("Wrong ipv6 address", 0, out.readUnsignedShort());\r
171         Assert.assertEquals("Wrong ipv6 address", 8, out.readUnsignedShort());\r
172         Assert.assertEquals("Wrong class", 0x0001, out.readUnsignedShort());\r
173         Assert.assertEquals("Wrong field and mask", 54, out.readUnsignedByte());\r
174         Assert.assertEquals("Wrong entry length", 16, out.readUnsignedByte());\r
175         Assert.assertEquals("Wrong ipv6 address", 0, out.readUnsignedShort());\r
176         Assert.assertEquals("Wrong ipv6 address", 0, out.readUnsignedShort());\r
177         Assert.assertEquals("Wrong ipv6 address", 0, out.readUnsignedShort());\r
178         Assert.assertEquals("Wrong ipv6 address", 0, out.readUnsignedShort());\r
179         Assert.assertEquals("Wrong ipv6 address", 0, out.readUnsignedShort());\r
180         Assert.assertEquals("Wrong ipv6 address", 0, out.readUnsignedShort());\r
181         Assert.assertEquals("Wrong ipv6 address", 0, out.readUnsignedShort());\r
182         Assert.assertEquals("Wrong ipv6 address", 1, out.readUnsignedShort());\r
183         Assert.assertEquals("Wrong class", 0x0000, out.readUnsignedShort());\r
184         Assert.assertEquals("Wrong field and mask", 54, out.readUnsignedByte());\r
185         Assert.assertEquals("Wrong entry length", 16, out.readUnsignedByte());\r
186         Assert.assertEquals("Wrong ipv6 address", 0, out.readUnsignedShort());\r
187         Assert.assertEquals("Wrong ipv6 address", 0, out.readUnsignedShort());\r
188         Assert.assertEquals("Wrong ipv6 address", 0, out.readUnsignedShort());\r
189         Assert.assertEquals("Wrong ipv6 address", 0, out.readUnsignedShort());\r
190         Assert.assertEquals("Wrong ipv6 address", 0, out.readUnsignedShort());\r
191         Assert.assertEquals("Wrong ipv6 address", 0, out.readUnsignedShort());\r
192         Assert.assertEquals("Wrong ipv6 address", 0, out.readUnsignedShort());\r
193         Assert.assertEquals("Wrong ipv6 address", 0, out.readUnsignedShort());\r
194         Assert.assertEquals("Wrong class", 0x8000, out.readUnsignedShort());\r
195         Assert.assertEquals("Wrong field and mask", 54, out.readUnsignedByte());\r
196         Assert.assertEquals("Wrong entry length", 16, out.readUnsignedByte());\r
197         Assert.assertEquals("Wrong ipv6 address", 1, out.readUnsignedShort());\r
198         Assert.assertEquals("Wrong ipv6 address", 2, out.readUnsignedShort());\r
199         Assert.assertEquals("Wrong ipv6 address", 3, out.readUnsignedShort());\r
200         Assert.assertEquals("Wrong ipv6 address", 4, out.readUnsignedShort());\r
201         Assert.assertEquals("Wrong ipv6 address", 5, out.readUnsignedShort());\r
202         Assert.assertEquals("Wrong ipv6 address", 6, out.readUnsignedShort());\r
203         Assert.assertEquals("Wrong ipv6 address", 7, out.readUnsignedShort());\r
204         Assert.assertEquals("Wrong ipv6 address", 8, out.readUnsignedShort());\r
205     }\r
206 \r
207 }\r