Extensibility support (serialization part)
[openflowjava.git] / openflow-protocol-impl / src / test / java / org / opendaylight / openflowjava / protocol / impl / util / OF13MatchSerializerTest2.java
1 /*\r
2  * Copyright (c) 2013 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 package org.opendaylight.openflowjava.protocol.impl.util;\r
9 \r
10 import io.netty.buffer.ByteBuf;\r
11 import io.netty.buffer.UnpooledByteBufAllocator;\r
12 \r
13 import java.util.ArrayList;\r
14 import java.util.List;\r
15 \r
16 import org.junit.Assert;\r
17 import org.junit.Before;\r
18 import org.junit.Test;\r
19 import org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey;\r
20 import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;\r
21 import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;\r
22 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializerRegistryImpl;\r
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Dscp;\r
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;\r
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;\r
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6FlowLabel;\r
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.BosMatchEntry;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.BosMatchEntryBuilder;\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DscpMatchEntry;\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DscpMatchEntryBuilder;\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EcnMatchEntry;\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EcnMatchEntryBuilder;\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthTypeMatchEntry;\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthTypeMatchEntryBuilder;\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv4CodeMatchEntry;\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv4CodeMatchEntryBuilder;\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv4TypeMatchEntry;\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv4TypeMatchEntryBuilder;\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv6CodeMatchEntry;\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv6CodeMatchEntryBuilder;\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv6TypeMatchEntry;\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv6TypeMatchEntryBuilder;\r
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv4AddressMatchEntry;\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv4AddressMatchEntryBuilder;\r
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6AddressMatchEntry;\r
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6AddressMatchEntryBuilder;\r
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6FlabelMatchEntry;\r
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6FlabelMatchEntryBuilder;\r
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IsidMatchEntry;\r
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IsidMatchEntryBuilder;\r
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MacAddressMatchEntry;\r
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MacAddressMatchEntryBuilder;\r
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaskMatchEntry;\r
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaskMatchEntryBuilder;\r
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MetadataMatchEntry;\r
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MetadataMatchEntryBuilder;\r
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsLabelMatchEntry;\r
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsLabelMatchEntryBuilder;\r
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OpCodeMatchEntry;\r
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OpCodeMatchEntryBuilder;\r
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortMatchEntry;\r
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortMatchEntryBuilder;\r
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortNumberMatchEntry;\r
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortNumberMatchEntryBuilder;\r
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ProtocolNumberMatchEntry;\r
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ProtocolNumberMatchEntryBuilder;\r
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PseudoFieldMatchEntry;\r
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PseudoFieldMatchEntryBuilder;\r
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TcMatchEntry;\r
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TcMatchEntryBuilder;\r
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpMatchEntry;\r
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpMatchEntryBuilder;\r
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidMatchEntry;\r
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidMatchEntryBuilder;\r
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;\r
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Ipv6ExthdrFlags;\r
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;\r
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpOp;\r
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpSha;\r
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpSpa;\r
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpTha;\r
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpTpa;\r
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthDst;\r
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthSrc;\r
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthType;\r
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv4Code;\r
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv4Type;\r
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv6Code;\r
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv6Type;\r
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPhyPort;\r
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPort;\r
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpDscp;\r
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpEcn;\r
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpProto;\r
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Dst;\r
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Src;\r
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Dst;\r
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Exthdr;\r
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Flabel;\r
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdSll;\r
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdTarget;\r
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdTll;\r
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Src;\r
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Metadata;\r
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsBos;\r
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsLabel;\r
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsTc;\r
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;\r
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmMatchType;\r
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.PbbIsid;\r
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpDst;\r
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpSrc;\r
114 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpDst;\r
115 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpSrc;\r
116 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TunnelId;\r
117 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpDst;\r
118 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpSrc;\r
119 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanPcp;\r
120 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanVid;\r
121 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.grouping.Match;\r
122 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.grouping.MatchBuilder;\r
123 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;\r
124 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder;\r
125 \r
126 /**\r
127  * @author michal.polkorab\r
128  *\r
129  */\r
130 public class OF13MatchSerializerTest2 {\r
131 \r
132     private SerializerRegistry registry;\r
133     private OFSerializer<Match> matchSerializer;\r
134 \r
135     /**\r
136      * Initializes serializer table and stores correct factory in field\r
137      */\r
138     @Before\r
139     public void startUp() {\r
140         registry = new SerializerRegistryImpl();\r
141         registry.init();\r
142         matchSerializer = registry.getSerializer(\r
143                 new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, Match.class));\r
144     }\r
145 \r
146     /**\r
147      * Testing serialization of match\r
148      */\r
149     @Test\r
150     public void testEmptyMatch() {\r
151         MatchBuilder builder = new MatchBuilder();\r
152         builder.setType(OxmMatchType.class);\r
153         Match match = builder.build();\r
154         \r
155         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
156         matchSerializer.serialize(match, out);\r
157         \r
158         Assert.assertEquals("Wrong match type", 1, out.readUnsignedShort());\r
159         Assert.assertEquals("Wrong match length", 4, out.readUnsignedShort());\r
160         Assert.assertTrue("Wrong padding", out.readableBytes() == 4);\r
161     }\r
162     \r
163     /**\r
164      * Testing serialization of match\r
165      */\r
166     @Test\r
167     public void test() {\r
168         MatchBuilder builder = new MatchBuilder();\r
169         builder.setType(OxmMatchType.class);\r
170         List<MatchEntries> entries = new ArrayList<>();\r
171         MatchEntriesBuilder entryBuilder = new MatchEntriesBuilder();\r
172         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
173         entryBuilder.setOxmMatchField(InPort.class);\r
174         entryBuilder.setHasMask(false);\r
175         PortNumberMatchEntryBuilder portNumberBuilder = new PortNumberMatchEntryBuilder();\r
176         portNumberBuilder.setPortNumber(new PortNumber(42L));\r
177         entryBuilder.addAugmentation(PortNumberMatchEntry.class, portNumberBuilder.build());\r
178         entries.add(entryBuilder.build());\r
179         entryBuilder = new MatchEntriesBuilder();\r
180         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
181         entryBuilder.setOxmMatchField(InPhyPort.class);\r
182         entryBuilder.setHasMask(false);\r
183         portNumberBuilder = new PortNumberMatchEntryBuilder();\r
184         portNumberBuilder.setPortNumber(new PortNumber(43L));\r
185         entryBuilder.addAugmentation(PortNumberMatchEntry.class, portNumberBuilder.build());\r
186         entries.add(entryBuilder.build());\r
187         entryBuilder = new MatchEntriesBuilder();\r
188         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
189         entryBuilder.setOxmMatchField(Metadata.class);\r
190         entryBuilder.setHasMask(true);\r
191         MetadataMatchEntryBuilder metadataBuilder = new MetadataMatchEntryBuilder();\r
192         metadataBuilder.setMetadata(new byte[]{0,0,0,0,0,0,0,1});\r
193         entryBuilder.addAugmentation(MetadataMatchEntry.class, metadataBuilder.build());\r
194         MaskMatchEntryBuilder maskBuilder = new MaskMatchEntryBuilder();\r
195         maskBuilder.setMask(new byte[]{0,0,0,0,0,0,0,2});\r
196         entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
197         entries.add(entryBuilder.build());\r
198         entryBuilder = new MatchEntriesBuilder();\r
199         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
200         entryBuilder.setOxmMatchField(EthDst.class);\r
201         entryBuilder.setHasMask(true);\r
202         MacAddressMatchEntryBuilder macBuilder = new MacAddressMatchEntryBuilder();\r
203         macBuilder.setMacAddress(new MacAddress("01:00:03:00:00:06"));\r
204         entryBuilder.addAugmentation(MacAddressMatchEntry.class, macBuilder.build());\r
205         maskBuilder = new MaskMatchEntryBuilder();\r
206         maskBuilder.setMask(new byte[]{0,0,0,0,0,5});\r
207         entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
208         entries.add(entryBuilder.build());\r
209         entryBuilder = new MatchEntriesBuilder();\r
210         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
211         entryBuilder.setOxmMatchField(EthSrc.class);\r
212         entryBuilder.setHasMask(true);\r
213         macBuilder = new MacAddressMatchEntryBuilder();\r
214         macBuilder.setMacAddress(new MacAddress("04:00:02:00:00:08"));\r
215         entryBuilder.addAugmentation(MacAddressMatchEntry.class, macBuilder.build());\r
216         maskBuilder = new MaskMatchEntryBuilder();\r
217         maskBuilder.setMask(new byte[]{0,0,0,0,0,2});\r
218         entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
219         entries.add(entryBuilder.build());\r
220         entryBuilder = new MatchEntriesBuilder();\r
221         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
222         entryBuilder.setOxmMatchField(EthType.class);\r
223         entryBuilder.setHasMask(false);\r
224         EthTypeMatchEntryBuilder ethBuilder = new EthTypeMatchEntryBuilder();\r
225         ethBuilder.setEthType(new EtherType(46));\r
226         entryBuilder.addAugmentation(EthTypeMatchEntry.class, ethBuilder.build());\r
227         entries.add(entryBuilder.build());\r
228         entryBuilder = new MatchEntriesBuilder();\r
229         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
230         entryBuilder.setOxmMatchField(VlanVid.class);\r
231         entryBuilder.setHasMask(true);\r
232         VlanVidMatchEntryBuilder vidBuilder = new VlanVidMatchEntryBuilder();\r
233         vidBuilder.setCfiBit(true);\r
234         vidBuilder.setVlanVid(45);\r
235         entryBuilder.addAugmentation(VlanVidMatchEntry.class, vidBuilder.build());\r
236         maskBuilder = new MaskMatchEntryBuilder();\r
237         maskBuilder.setMask(new byte[]{0,9});\r
238         entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
239         entries.add(entryBuilder.build());\r
240         entryBuilder = new MatchEntriesBuilder();\r
241         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
242         entryBuilder.setOxmMatchField(VlanPcp.class);\r
243         entryBuilder.setHasMask(false);\r
244         VlanPcpMatchEntryBuilder pcpBuilder = new VlanPcpMatchEntryBuilder();\r
245         pcpBuilder.setVlanPcp((short) 14);\r
246         entryBuilder.addAugmentation(VlanPcpMatchEntry.class, pcpBuilder.build());\r
247         entries.add(entryBuilder.build());\r
248         entryBuilder = new MatchEntriesBuilder();\r
249         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
250         entryBuilder.setOxmMatchField(IpDscp.class);\r
251         entryBuilder.setHasMask(false);\r
252         DscpMatchEntryBuilder dscpBuilder = new DscpMatchEntryBuilder();\r
253         dscpBuilder.setDscp(new Dscp((short) 48));\r
254         entryBuilder.addAugmentation(DscpMatchEntry.class, dscpBuilder.build());\r
255         entries.add(entryBuilder.build());\r
256         entryBuilder = new MatchEntriesBuilder();\r
257         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
258         entryBuilder.setOxmMatchField(IpEcn.class);\r
259         entryBuilder.setHasMask(false);\r
260         EcnMatchEntryBuilder ecnBuilder = new EcnMatchEntryBuilder();\r
261         ecnBuilder.setEcn((short) 49);\r
262         entryBuilder.addAugmentation(EcnMatchEntry.class, ecnBuilder.build());\r
263         entries.add(entryBuilder.build());\r
264         entryBuilder = new MatchEntriesBuilder();\r
265         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
266         entryBuilder.setOxmMatchField(IpProto.class);\r
267         entryBuilder.setHasMask(false);\r
268         ProtocolNumberMatchEntryBuilder protoBuilder = new ProtocolNumberMatchEntryBuilder();\r
269         protoBuilder.setProtocolNumber((short) 50);\r
270         entryBuilder.addAugmentation(ProtocolNumberMatchEntry.class, protoBuilder.build());\r
271         entries.add(entryBuilder.build());\r
272         entryBuilder = new MatchEntriesBuilder();\r
273         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
274         entryBuilder.setOxmMatchField(Ipv4Src.class);\r
275         entryBuilder.setHasMask(true);\r
276         Ipv4AddressMatchEntryBuilder ipv4Builder = new Ipv4AddressMatchEntryBuilder();\r
277         ipv4Builder.setIpv4Address(new Ipv4Address("10.0.0.1"));\r
278         entryBuilder.addAugmentation(Ipv4AddressMatchEntry.class, ipv4Builder.build());\r
279         maskBuilder = new MaskMatchEntryBuilder();\r
280         maskBuilder.setMask(new byte[]{0,0,0,14});\r
281         entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
282         entries.add(entryBuilder.build());\r
283         entryBuilder = new MatchEntriesBuilder();\r
284         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
285         entryBuilder.setOxmMatchField(Ipv4Dst.class);\r
286         entryBuilder.setHasMask(true);\r
287         ipv4Builder = new Ipv4AddressMatchEntryBuilder();\r
288         ipv4Builder.setIpv4Address(new Ipv4Address("10.0.0.2"));\r
289         entryBuilder.addAugmentation(Ipv4AddressMatchEntry.class, ipv4Builder.build());\r
290         maskBuilder = new MaskMatchEntryBuilder();\r
291         maskBuilder.setMask(new byte[]{0,0,0,15});\r
292         entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
293         entries.add(entryBuilder.build());\r
294         entryBuilder = new MatchEntriesBuilder();\r
295         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
296         entryBuilder.setOxmMatchField(TcpSrc.class);\r
297         entryBuilder.setHasMask(false);\r
298         PortMatchEntryBuilder portBuilder = new PortMatchEntryBuilder();\r
299         portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params\r
300                 .xml.ns.yang.ietf.inet.types.rev100924.PortNumber(6653));\r
301         entryBuilder.addAugmentation(PortMatchEntry.class, portBuilder.build());\r
302         entries.add(entryBuilder.build());\r
303         entryBuilder = new MatchEntriesBuilder();\r
304         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
305         entryBuilder.setOxmMatchField(TcpDst.class);\r
306         entryBuilder.setHasMask(false);\r
307         portBuilder = new PortMatchEntryBuilder();\r
308         portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params\r
309                 .xml.ns.yang.ietf.inet.types.rev100924.PortNumber(6654));\r
310         entryBuilder.addAugmentation(PortMatchEntry.class, portBuilder.build());\r
311         entries.add(entryBuilder.build());\r
312         entryBuilder = new MatchEntriesBuilder();\r
313         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
314         entryBuilder.setOxmMatchField(UdpSrc.class);\r
315         entryBuilder.setHasMask(false);\r
316         portBuilder = new PortMatchEntryBuilder();\r
317         portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params\r
318                 .xml.ns.yang.ietf.inet.types.rev100924.PortNumber(6655));\r
319         entryBuilder.addAugmentation(PortMatchEntry.class, portBuilder.build());\r
320         entries.add(entryBuilder.build());\r
321         entryBuilder = new MatchEntriesBuilder();\r
322         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
323         entryBuilder.setOxmMatchField(UdpDst.class);\r
324         entryBuilder.setHasMask(false);\r
325         portBuilder = new PortMatchEntryBuilder();\r
326         portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params\r
327                 .xml.ns.yang.ietf.inet.types.rev100924.PortNumber(6656));\r
328         entryBuilder.addAugmentation(PortMatchEntry.class, portBuilder.build());\r
329         entries.add(entryBuilder.build());\r
330         entryBuilder = new MatchEntriesBuilder();\r
331         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
332         entryBuilder.setOxmMatchField(SctpSrc.class);\r
333         entryBuilder.setHasMask(false);\r
334         portBuilder = new PortMatchEntryBuilder();\r
335         portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params\r
336                 .xml.ns.yang.ietf.inet.types.rev100924.PortNumber(6657));\r
337         entryBuilder.addAugmentation(PortMatchEntry.class, portBuilder.build());\r
338         entries.add(entryBuilder.build());\r
339         entryBuilder = new MatchEntriesBuilder();\r
340         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
341         entryBuilder.setOxmMatchField(SctpDst.class);\r
342         entryBuilder.setHasMask(false);\r
343         portBuilder = new PortMatchEntryBuilder();\r
344         portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params\r
345                 .xml.ns.yang.ietf.inet.types.rev100924.PortNumber(6658));\r
346         entryBuilder.addAugmentation(PortMatchEntry.class, portBuilder.build());\r
347         entries.add(entryBuilder.build());\r
348         entryBuilder = new MatchEntriesBuilder();\r
349         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
350         entryBuilder.setOxmMatchField(Icmpv4Type.class);\r
351         entryBuilder.setHasMask(false);\r
352         Icmpv4TypeMatchEntryBuilder icmpv4typeBuilder = new Icmpv4TypeMatchEntryBuilder();\r
353         icmpv4typeBuilder.setIcmpv4Type((short) 51);\r
354         entryBuilder.addAugmentation(Icmpv4TypeMatchEntry.class, icmpv4typeBuilder.build());\r
355         entries.add(entryBuilder.build());\r
356         entryBuilder = new MatchEntriesBuilder();\r
357         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
358         entryBuilder.setOxmMatchField(Icmpv4Code.class);\r
359         entryBuilder.setHasMask(false);\r
360         Icmpv4CodeMatchEntryBuilder icmpv4CodeBuilder = new Icmpv4CodeMatchEntryBuilder();\r
361         icmpv4CodeBuilder.setIcmpv4Code((short) 52);\r
362         entryBuilder.addAugmentation(Icmpv4CodeMatchEntry.class, icmpv4CodeBuilder.build());\r
363         entries.add(entryBuilder.build());\r
364         entryBuilder = new MatchEntriesBuilder();\r
365         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
366         entryBuilder.setOxmMatchField(ArpOp.class);\r
367         entryBuilder.setHasMask(false);\r
368         OpCodeMatchEntryBuilder opBuilder = new OpCodeMatchEntryBuilder();\r
369         opBuilder.setOpCode(53);\r
370         entryBuilder.addAugmentation(OpCodeMatchEntry.class, opBuilder.build());\r
371         entries.add(entryBuilder.build());\r
372         entryBuilder = new MatchEntriesBuilder();\r
373         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
374         entryBuilder.setOxmMatchField(ArpSpa.class);\r
375         entryBuilder.setHasMask(true);\r
376         ipv4Builder = new Ipv4AddressMatchEntryBuilder();\r
377         ipv4Builder.setIpv4Address(new Ipv4Address("10.0.0.4"));\r
378         entryBuilder.addAugmentation(Ipv4AddressMatchEntry.class, ipv4Builder.build());\r
379         maskBuilder = new MaskMatchEntryBuilder();\r
380         maskBuilder.setMask(new byte[]{0,0,0,16});\r
381         entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
382         entries.add(entryBuilder.build());\r
383         entryBuilder = new MatchEntriesBuilder();\r
384         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
385         entryBuilder.setOxmMatchField(ArpTpa.class);\r
386         entryBuilder.setHasMask(true);\r
387         ipv4Builder = new Ipv4AddressMatchEntryBuilder();\r
388         ipv4Builder.setIpv4Address(new Ipv4Address("10.0.0.5"));\r
389         entryBuilder.addAugmentation(Ipv4AddressMatchEntry.class, ipv4Builder.build());\r
390         maskBuilder = new MaskMatchEntryBuilder();\r
391         maskBuilder.setMask(new byte[]{0,0,0,17});\r
392         entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
393         entries.add(entryBuilder.build());\r
394         entryBuilder = new MatchEntriesBuilder();\r
395         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
396         entryBuilder.setOxmMatchField(ArpSha.class);\r
397         entryBuilder.setHasMask(true);\r
398         macBuilder = new MacAddressMatchEntryBuilder();\r
399         macBuilder.setMacAddress(new MacAddress("00:01:02:03:04:05"));\r
400         entryBuilder.addAugmentation(MacAddressMatchEntry.class, macBuilder.build());\r
401         maskBuilder = new MaskMatchEntryBuilder();\r
402         maskBuilder.setMask(new byte[]{0,0,4,0,0,6});\r
403         entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
404         entries.add(entryBuilder.build());\r
405         entryBuilder = new MatchEntriesBuilder();\r
406         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
407         entryBuilder.setOxmMatchField(ArpTha.class);\r
408         entryBuilder.setHasMask(true);\r
409         macBuilder = new MacAddressMatchEntryBuilder();\r
410         macBuilder.setMacAddress(new MacAddress("00:00:00:00:00:03"));\r
411         entryBuilder.addAugmentation(MacAddressMatchEntry.class, macBuilder.build());\r
412         maskBuilder = new MaskMatchEntryBuilder();\r
413         maskBuilder.setMask(new byte[]{0,0,6,0,0,4});\r
414         entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
415         entries.add(entryBuilder.build());\r
416         entryBuilder = new MatchEntriesBuilder();\r
417         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
418         entryBuilder.setOxmMatchField(Ipv6Src.class);\r
419         entryBuilder.setHasMask(true);\r
420         Ipv6AddressMatchEntryBuilder ipv6Builder = new Ipv6AddressMatchEntryBuilder();\r
421         ipv6Builder.setIpv6Address(new Ipv6Address("0:0:0:0:0:0:0:1"));\r
422         entryBuilder.addAugmentation(Ipv6AddressMatchEntry.class, ipv6Builder.build());\r
423         maskBuilder = new MaskMatchEntryBuilder();\r
424         maskBuilder.setMask(new byte[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1});\r
425         entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
426         entries.add(entryBuilder.build());\r
427         entryBuilder = new MatchEntriesBuilder();\r
428         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
429         entryBuilder.setOxmMatchField(Ipv6Dst.class);\r
430         entryBuilder.setHasMask(true);\r
431         ipv6Builder = new Ipv6AddressMatchEntryBuilder();\r
432         ipv6Builder.setIpv6Address(new Ipv6Address("0:0:1:0:1:0:0:1"));\r
433         entryBuilder.addAugmentation(Ipv6AddressMatchEntry.class, ipv6Builder.build());\r
434         maskBuilder = new MaskMatchEntryBuilder();\r
435         maskBuilder.setMask(new byte[]{0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1});\r
436         entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
437         entries.add(entryBuilder.build());\r
438         entryBuilder = new MatchEntriesBuilder();\r
439         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
440         entryBuilder.setOxmMatchField(Ipv6Flabel.class);\r
441         entryBuilder.setHasMask(true);\r
442         Ipv6FlabelMatchEntryBuilder flabelBuilder = new Ipv6FlabelMatchEntryBuilder();\r
443         flabelBuilder.setIpv6Flabel(new Ipv6FlowLabel(58L));\r
444         entryBuilder.addAugmentation(Ipv6FlabelMatchEntry.class, flabelBuilder.build());\r
445         maskBuilder = new MaskMatchEntryBuilder();\r
446         maskBuilder.setMask(new byte[]{0,1,0,2});\r
447         entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
448         entries.add(entryBuilder.build());\r
449         entryBuilder = new MatchEntriesBuilder();\r
450         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
451         entryBuilder.setOxmMatchField(Icmpv6Type.class);\r
452         entryBuilder.setHasMask(false);\r
453         Icmpv6TypeMatchEntryBuilder icmpv6TypeBuilder = new Icmpv6TypeMatchEntryBuilder();\r
454         icmpv6TypeBuilder.setIcmpv6Type((short) 59);\r
455         entryBuilder.addAugmentation(Icmpv6TypeMatchEntry.class, icmpv6TypeBuilder.build());\r
456         entries.add(entryBuilder.build());\r
457         entryBuilder = new MatchEntriesBuilder();\r
458         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
459         entryBuilder.setOxmMatchField(Icmpv6Code.class);\r
460         entryBuilder.setHasMask(false);\r
461         Icmpv6CodeMatchEntryBuilder icmpv6CodeBuilder = new Icmpv6CodeMatchEntryBuilder();\r
462         icmpv6CodeBuilder.setIcmpv6Code((short) 60);\r
463         entryBuilder.addAugmentation(Icmpv6CodeMatchEntry.class, icmpv6CodeBuilder.build());\r
464         entries.add(entryBuilder.build());\r
465         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
466         entryBuilder.setOxmMatchField(Ipv6NdTarget.class);\r
467         entryBuilder.setHasMask(false);\r
468         ipv6Builder = new Ipv6AddressMatchEntryBuilder();\r
469         ipv6Builder.setIpv6Address(new Ipv6Address("F:0:0::0:0:0:1"));\r
470         entryBuilder.addAugmentation(Ipv6AddressMatchEntry.class, ipv6Builder.build());\r
471         entries.add(entryBuilder.build());\r
472         entryBuilder = new MatchEntriesBuilder();\r
473         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
474         entryBuilder.setOxmMatchField(Ipv6NdSll.class);\r
475         entryBuilder.setHasMask(false);\r
476         macBuilder = new MacAddressMatchEntryBuilder();\r
477         macBuilder.setMacAddress(new MacAddress("01:00:03:00:00:06"));\r
478         entryBuilder.addAugmentation(MacAddressMatchEntry.class, macBuilder.build());\r
479         entries.add(entryBuilder.build());\r
480         entryBuilder = new MatchEntriesBuilder();\r
481         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
482         entryBuilder.setOxmMatchField(Ipv6NdTll.class);\r
483         entryBuilder.setHasMask(false);\r
484         macBuilder = new MacAddressMatchEntryBuilder();\r
485         macBuilder.setMacAddress(new MacAddress("04:00:02:00:00:08"));\r
486         entryBuilder.addAugmentation(MacAddressMatchEntry.class, macBuilder.build());\r
487         entries.add(entryBuilder.build());\r
488         entryBuilder = new MatchEntriesBuilder();\r
489         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
490         entryBuilder.setOxmMatchField(MplsLabel.class);\r
491         entryBuilder.setHasMask(false);\r
492         MplsLabelMatchEntryBuilder labelBuilder = new MplsLabelMatchEntryBuilder();\r
493         labelBuilder.setMplsLabel(61L);\r
494         entryBuilder.addAugmentation(MplsLabelMatchEntry.class, labelBuilder.build());\r
495         entries.add(entryBuilder.build());\r
496         entryBuilder = new MatchEntriesBuilder();\r
497         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
498         entryBuilder.setOxmMatchField(MplsTc.class);\r
499         entryBuilder.setHasMask(false);\r
500         TcMatchEntryBuilder tcBuilder = new TcMatchEntryBuilder();\r
501         tcBuilder.setTc((short) 62);\r
502         entryBuilder.addAugmentation(TcMatchEntry.class, tcBuilder.build());\r
503         entries.add(entryBuilder.build());\r
504         entryBuilder = new MatchEntriesBuilder();\r
505         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
506         entryBuilder.setOxmMatchField(MplsBos.class);\r
507         entryBuilder.setHasMask(false);\r
508         BosMatchEntryBuilder bosBuilder = new BosMatchEntryBuilder();\r
509         bosBuilder.setBos(true);\r
510         entryBuilder.addAugmentation(BosMatchEntry.class, bosBuilder.build());\r
511         entries.add(entryBuilder.build());\r
512         \r
513         entryBuilder = new MatchEntriesBuilder();\r
514         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
515         entryBuilder.setOxmMatchField(PbbIsid.class);\r
516         entryBuilder.setHasMask(true);\r
517         IsidMatchEntryBuilder isidBuilder = new IsidMatchEntryBuilder();\r
518         isidBuilder.setIsid(64L);\r
519         entryBuilder.addAugmentation(IsidMatchEntry.class, isidBuilder.build());\r
520         maskBuilder = new MaskMatchEntryBuilder();\r
521         maskBuilder.setMask(new byte[]{0,1,2});\r
522         entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
523         entries.add(entryBuilder.build());\r
524         \r
525         entryBuilder = new MatchEntriesBuilder();\r
526         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
527         entryBuilder.setOxmMatchField(TunnelId.class);\r
528         entryBuilder.setHasMask(true);\r
529         metadataBuilder = new MetadataMatchEntryBuilder();\r
530         metadataBuilder.setMetadata(new byte[]{0,0,0,0,0,0,0,1});\r
531         entryBuilder.addAugmentation(MetadataMatchEntry.class, metadataBuilder.build());\r
532         maskBuilder = new MaskMatchEntryBuilder();\r
533         maskBuilder.setMask(new byte[]{0,0,0,0,0,0,0,2});\r
534         entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
535         entries.add(entryBuilder.build());\r
536         \r
537         entryBuilder = new MatchEntriesBuilder();\r
538         entryBuilder.setOxmClass(OpenflowBasicClass.class);\r
539         entryBuilder.setOxmMatchField(Ipv6Exthdr.class);\r
540         entryBuilder.setHasMask(true);\r
541         PseudoFieldMatchEntryBuilder pseudoBuilder = new PseudoFieldMatchEntryBuilder();\r
542         pseudoBuilder.setPseudoField(new Ipv6ExthdrFlags(true, false, true, false, true, false, true, false, true));\r
543         entryBuilder.addAugmentation(PseudoFieldMatchEntry.class, pseudoBuilder.build());\r
544         maskBuilder = new MaskMatchEntryBuilder();\r
545         maskBuilder.setMask(new byte[]{0,2});\r
546         entryBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
547         entries.add(entryBuilder.build());\r
548         \r
549         \r
550         \r
551         builder.setMatchEntries(entries);\r
552         Match match = builder.build();\r
553         \r
554         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
555         matchSerializer.serialize(match, out);\r
556         \r
557         Assert.assertEquals("Wrong match type", 1, out.readUnsignedShort());\r
558         Assert.assertEquals("Wrong match length", 428, out.readUnsignedShort());\r
559         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
560         Assert.assertEquals("Wrong match entry field & hasMask", 0, out.readUnsignedByte());\r
561         Assert.assertEquals("Wrong match entry length", 4, out.readUnsignedByte());\r
562         Assert.assertEquals("Wrong match entry value", 42, out.readUnsignedInt());\r
563         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
564         Assert.assertEquals("Wrong match entry field & hasMask", 2, out.readUnsignedByte());\r
565         Assert.assertEquals("Wrong match entry length", 4, out.readUnsignedByte());\r
566         Assert.assertEquals("Wrong match entry value", 43, out.readUnsignedInt());\r
567         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
568         Assert.assertEquals("Wrong match entry field & hasMask", 5, out.readUnsignedByte());\r
569         Assert.assertEquals("Wrong match entry length", 16, out.readUnsignedByte());\r
570         Assert.assertEquals("Wrong match entry value", 1L, out.readLong());\r
571         Assert.assertEquals("Wrong match entry mask", 2L, out.readLong());\r
572         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
573         Assert.assertEquals("Wrong match entry field & hasMask", 7, out.readUnsignedByte());\r
574         Assert.assertEquals("Wrong match entry length", 12, out.readUnsignedByte());\r
575         byte[] array = new byte[6];\r
576         out.readBytes(array);\r
577         Assert.assertArrayEquals("Wrong match entry value", new byte[]{1,0,3,0,0,6}, array);\r
578         array = new byte[6];\r
579         out.readBytes(array);\r
580         Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,0,0,0,5}, array);\r
581         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
582         Assert.assertEquals("Wrong match entry field & hasMask", 9, out.readUnsignedByte());\r
583         Assert.assertEquals("Wrong match entry length", 12, out.readUnsignedByte());\r
584         array = new byte[6];\r
585         out.readBytes(array);\r
586         Assert.assertArrayEquals("Wrong match entry value", new byte[]{4,0,2,0,0,8}, array);\r
587         array = new byte[6];\r
588         out.readBytes(array);\r
589         Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,0,0,0,2}, array);\r
590         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
591         Assert.assertEquals("Wrong match entry field & hasMask", 10, out.readUnsignedByte());\r
592         Assert.assertEquals("Wrong match entry length", 2, out.readUnsignedByte());\r
593         Assert.assertEquals("Wrong match entry value", 46, out.readUnsignedShort());\r
594         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
595         Assert.assertEquals("Wrong match entry field & hasMask", 13, out.readUnsignedByte());\r
596         Assert.assertEquals("Wrong match entry length", 4, out.readUnsignedByte());\r
597         Assert.assertEquals("Wrong match entry value", 4141, out.readUnsignedShort());\r
598         array = new byte[2];\r
599         out.readBytes(array);\r
600         Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,9}, array);\r
601         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
602         Assert.assertEquals("Wrong match entry field & hasMask", 14, out.readUnsignedByte());\r
603         Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());\r
604         Assert.assertEquals("Wrong match entry value", 14, out.readUnsignedByte());\r
605         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
606         Assert.assertEquals("Wrong match entry field & hasMask", 16, out.readUnsignedByte());\r
607         Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());\r
608         Assert.assertEquals("Wrong match entry value", 48, out.readUnsignedByte());\r
609         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
610         Assert.assertEquals("Wrong match entry field & hasMask", 18, out.readUnsignedByte());\r
611         Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());\r
612         Assert.assertEquals("Wrong match entry value", 49, out.readUnsignedByte());\r
613         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
614         Assert.assertEquals("Wrong match entry field & hasMask", 20, out.readUnsignedByte());\r
615         Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());\r
616         Assert.assertEquals("Wrong match entry value", 50, out.readUnsignedByte());\r
617         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
618         Assert.assertEquals("Wrong match entry field & hasMask", 23, out.readUnsignedByte());\r
619         Assert.assertEquals("Wrong match entry length", 8, out.readUnsignedByte());\r
620         array = new byte[4];\r
621         out.readBytes(array);\r
622         Assert.assertArrayEquals("Wrong match entry value", new byte[]{10,0,0,1}, array);\r
623         array = new byte[4];\r
624         out.readBytes(array);\r
625         Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,0,14}, array);\r
626         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
627         Assert.assertEquals("Wrong match entry field & hasMask", 25, out.readUnsignedByte());\r
628         Assert.assertEquals("Wrong match entry length", 8, out.readUnsignedByte());\r
629         array = new byte[4];\r
630         out.readBytes(array);\r
631         Assert.assertArrayEquals("Wrong match entry value", new byte[]{10,0,0,2}, array);\r
632         array = new byte[4];\r
633         out.readBytes(array);\r
634         Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,0,15}, array);\r
635         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
636         Assert.assertEquals("Wrong match entry field & hasMask", 26, out.readUnsignedByte());\r
637         Assert.assertEquals("Wrong match entry length", 2, out.readUnsignedByte());\r
638         Assert.assertEquals("Wrong match entry value", 6653, out.readUnsignedShort());\r
639         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
640         Assert.assertEquals("Wrong match entry field & hasMask", 28, out.readUnsignedByte());\r
641         Assert.assertEquals("Wrong match entry length", 2, out.readUnsignedByte());\r
642         Assert.assertEquals("Wrong match entry value", 6654, out.readUnsignedShort());\r
643         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
644         Assert.assertEquals("Wrong match entry field & hasMask", 30, out.readUnsignedByte());\r
645         Assert.assertEquals("Wrong match entry length", 2, out.readUnsignedByte());\r
646         Assert.assertEquals("Wrong match entry value", 6655, out.readUnsignedShort());\r
647         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
648         Assert.assertEquals("Wrong match entry field & hasMask", 32, out.readUnsignedByte());\r
649         Assert.assertEquals("Wrong match entry length", 2, out.readUnsignedByte());\r
650         Assert.assertEquals("Wrong match entry value", 6656, out.readUnsignedShort());\r
651         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
652         Assert.assertEquals("Wrong match entry field & hasMask", 34, out.readUnsignedByte());\r
653         Assert.assertEquals("Wrong match entry length", 2, out.readUnsignedByte());\r
654         Assert.assertEquals("Wrong match entry value", 6657, out.readUnsignedShort());\r
655         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
656         Assert.assertEquals("Wrong match entry field & hasMask", 36, out.readUnsignedByte());\r
657         Assert.assertEquals("Wrong match entry length", 2, out.readUnsignedByte());\r
658         Assert.assertEquals("Wrong match entry value", 6658, out.readUnsignedShort());\r
659         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
660         Assert.assertEquals("Wrong match entry field & hasMask", 38, out.readUnsignedByte());\r
661         Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());\r
662         Assert.assertEquals("Wrong match entry value", 51, out.readUnsignedByte());\r
663         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
664         Assert.assertEquals("Wrong match entry field & hasMask", 40, out.readUnsignedByte());\r
665         Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());\r
666         Assert.assertEquals("Wrong match entry value", 52, out.readUnsignedByte());\r
667         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
668         Assert.assertEquals("Wrong match entry field & hasMask", 42, out.readUnsignedByte());\r
669         Assert.assertEquals("Wrong match entry length", 2, out.readUnsignedByte());\r
670         Assert.assertEquals("Wrong match entry value", 53, out.readUnsignedShort());\r
671         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
672         Assert.assertEquals("Wrong match entry field & hasMask", 45, out.readUnsignedByte());\r
673         Assert.assertEquals("Wrong match entry length", 8, out.readUnsignedByte());\r
674         array = new byte[4];\r
675         out.readBytes(array);\r
676         Assert.assertArrayEquals("Wrong match entry value", new byte[]{10,0,0,4}, array);\r
677         array = new byte[4];\r
678         out.readBytes(array);\r
679         Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,0,16}, array);\r
680         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
681         Assert.assertEquals("Wrong match entry field & hasMask", 47, out.readUnsignedByte());\r
682         Assert.assertEquals("Wrong match entry length", 8, out.readUnsignedByte());\r
683         array = new byte[4];\r
684         out.readBytes(array);\r
685         Assert.assertArrayEquals("Wrong match entry value", new byte[]{10,0,0,5}, array);\r
686         array = new byte[4];\r
687         out.readBytes(array);\r
688         Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,0,17}, array);\r
689         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
690         Assert.assertEquals("Wrong match entry field & hasMask", 49, out.readUnsignedByte());\r
691         Assert.assertEquals("Wrong match entry length", 12, out.readUnsignedByte());\r
692         array = new byte[6];\r
693         out.readBytes(array);\r
694         Assert.assertArrayEquals("Wrong match entry value", new byte[]{0,1,2,3,4,5}, array);\r
695         array = new byte[6];\r
696         out.readBytes(array);\r
697         Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,4,0,0,6}, array);\r
698         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
699         Assert.assertEquals("Wrong match entry field & hasMask", 51, out.readUnsignedByte());\r
700         Assert.assertEquals("Wrong match entry length", 12, out.readUnsignedByte());\r
701         array = new byte[6];\r
702         out.readBytes(array);\r
703         Assert.assertArrayEquals("Wrong match entry value", new byte[]{0,0,0,0,0,3}, array);\r
704         array = new byte[6];\r
705         out.readBytes(array);\r
706         Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,6,0,0,4}, array);\r
707         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
708         Assert.assertEquals("Wrong match entry field & hasMask", 53, out.readUnsignedByte());\r
709         Assert.assertEquals("Wrong match entry length", 32, out.readUnsignedByte());\r
710         array = new byte[16];\r
711         out.readBytes(array);\r
712         Assert.assertArrayEquals("Wrong match entry value", new byte[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, array);\r
713         array = new byte[16];\r
714         out.readBytes(array);\r
715         Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, array);\r
716         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
717         Assert.assertEquals("Wrong match entry field & hasMask", 55, out.readUnsignedByte());\r
718         Assert.assertEquals("Wrong match entry length", 32, out.readUnsignedByte());\r
719         array = new byte[16];\r
720         out.readBytes(array);\r
721         Assert.assertArrayEquals("Wrong match entry value", new byte[]{0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1}, array);\r
722         array = new byte[16];\r
723         out.readBytes(array);\r
724         Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1}, array);\r
725         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
726         Assert.assertEquals("Wrong match entry field & hasMask", 57, out.readUnsignedByte());\r
727         Assert.assertEquals("Wrong match entry length", 8, out.readUnsignedByte());\r
728         Assert.assertEquals("Wrong match entry value", 58, out.readUnsignedInt());\r
729         array = new byte[4];\r
730         out.readBytes(array);\r
731         Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,1,0,2}, array);\r
732         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
733         Assert.assertEquals("Wrong match entry field & hasMask", 58, out.readUnsignedByte());\r
734         Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());\r
735         Assert.assertEquals("Wrong match entry value", 59, out.readUnsignedByte());\r
736         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
737         Assert.assertEquals("Wrong match entry field & hasMask", 60, out.readUnsignedByte());\r
738         Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());\r
739         Assert.assertEquals("Wrong match entry value", 60, out.readUnsignedByte());\r
740         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
741         Assert.assertEquals("Wrong match entry field & hasMask", 62, out.readUnsignedByte());\r
742         Assert.assertEquals("Wrong match entry length", 16, out.readUnsignedByte());\r
743         array = new byte[16];\r
744         out.readBytes(array);\r
745         Assert.assertArrayEquals("Wrong match entry value", new byte[]{0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,1}, array);\r
746         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
747         Assert.assertEquals("Wrong match entry field & hasMask", 64, out.readUnsignedByte());\r
748         Assert.assertEquals("Wrong match entry length", 6, out.readUnsignedByte());\r
749         array = new byte[6];\r
750         out.readBytes(array);\r
751         Assert.assertArrayEquals("Wrong match entry value", new byte[]{1,0,3,0,0,6}, array);\r
752         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
753         Assert.assertEquals("Wrong match entry field & hasMask", 66, out.readUnsignedByte());\r
754         Assert.assertEquals("Wrong match entry length", 6, out.readUnsignedByte());\r
755         array = new byte[6];\r
756         out.readBytes(array);\r
757         Assert.assertArrayEquals("Wrong match entry value", new byte[]{4,0,2,0,0,8}, array);\r
758         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
759         Assert.assertEquals("Wrong match entry field & hasMask", 68, out.readUnsignedByte());\r
760         Assert.assertEquals("Wrong match entry length", 4, out.readUnsignedByte());\r
761         Assert.assertEquals("Wrong match entry value", 61, out.readUnsignedInt());\r
762         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
763         Assert.assertEquals("Wrong match entry field & hasMask", 70, out.readUnsignedByte());\r
764         Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());\r
765         Assert.assertEquals("Wrong match entry value", 62, out.readUnsignedByte());\r
766         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
767         Assert.assertEquals("Wrong match entry field & hasMask", 72, out.readUnsignedByte());\r
768         Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());\r
769         Assert.assertEquals("Wrong match entry value", 1, out.readUnsignedByte());\r
770         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
771         Assert.assertEquals("Wrong match entry field & hasMask", 75, out.readUnsignedByte());\r
772         Assert.assertEquals("Wrong match entry length", 6, out.readUnsignedByte());\r
773         Assert.assertEquals("Wrong match entry value", 64, out.readUnsignedMedium());\r
774         array = new byte[3];\r
775         out.readBytes(array);\r
776         Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,1,2}, array);\r
777         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
778         Assert.assertEquals("Wrong match entry field & hasMask", 77, out.readUnsignedByte());\r
779         Assert.assertEquals("Wrong match entry length", 16, out.readUnsignedByte());\r
780         Assert.assertEquals("Wrong match entry value", 1L, out.readLong());\r
781         Assert.assertEquals("Wrong match entry mask", 2L, out.readLong());\r
782         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());\r
783         Assert.assertEquals("Wrong match entry field & hasMask", 79, out.readUnsignedByte());\r
784         Assert.assertEquals("Wrong match entry length", 4, out.readUnsignedByte());\r
785         Assert.assertEquals("Wrong match entry value", 358, out.readUnsignedShort());\r
786         array = new byte[2];\r
787         out.readBytes(array);\r
788         Assert.assertArrayEquals("Wrong match entry value", new byte[]{0,2}, array);\r
789         Assert.assertTrue("Wrong padding", out.readableBytes() == 4);\r
790     }\r
791 \r
792 }\r