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