Remove EncodeConstants.SIZE_OF_{BYTE,SHORT,INT,LONG}_IN_BYTES
[openflowplugin.git] / openflowjava / 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 import java.util.ArrayList;
13 import java.util.List;
14 import org.junit.Assert;
15 import org.junit.Before;
16 import org.junit.Test;
17 import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
18 import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
19 import org.opendaylight.openflowjava.protocol.api.keys.MessageTypeKey;
20 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
21 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializerRegistryImpl;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Dscp;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6FlowLabel;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Ipv6ExthdrFlags;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpOp;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpSha;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpSpa;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpTha;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpTpa;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthDst;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthSrc;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthType;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Code;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Type;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Code;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Type;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPhyPort;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPort;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpDscp;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpEcn;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpProto;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Dst;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Src;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Dst;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Exthdr;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Flabel;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdSll;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdTarget;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdTll;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Src;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsBos;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsLabel;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsTc;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmMatchType;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.PacketType;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.PbbIsid;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.SctpDst;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.SctpSrc;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TcpDst;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TcpSrc;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TunnelId;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.UdpDst;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.UdpSrc;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanPcp;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanVid;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntryBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpOpCaseBuilder;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpShaCaseBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpSpaCaseBuilder;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpThaCaseBuilder;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpTpaCaseBuilder;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthDstCaseBuilder;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthSrcCaseBuilder;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthTypeCaseBuilder;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4CodeCaseBuilder;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4TypeCaseBuilder;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6CodeCaseBuilder;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6TypeCaseBuilder;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPhyPortCaseBuilder;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPortCaseBuilder;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpDscpCaseBuilder;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpEcnCaseBuilder;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpProtoCaseBuilder;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4DstCaseBuilder;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4SrcCaseBuilder;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6DstCaseBuilder;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6ExthdrCaseBuilder;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6FlabelCaseBuilder;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdSllCaseBuilder;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTargetCaseBuilder;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTllCaseBuilder;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6SrcCaseBuilder;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MetadataCaseBuilder;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsBosCaseBuilder;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsLabelCaseBuilder;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsTcCaseBuilder;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.PacketTypeCaseBuilder;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.PbbIsidCaseBuilder;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpDstCaseBuilder;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpSrcCaseBuilder;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpDstCaseBuilder;
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpSrcCaseBuilder;
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TunnelIdCaseBuilder;
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpDstCaseBuilder;
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpSrcCaseBuilder;
114 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanPcpCaseBuilder;
115 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanVidCaseBuilder;
116 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.op._case.ArpOpBuilder;
117 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.sha._case.ArpShaBuilder;
118 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.spa._case.ArpSpaBuilder;
119 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.tha._case.ArpThaBuilder;
120 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.tpa._case.ArpTpaBuilder;
121 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.dst._case.EthDstBuilder;
122 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.src._case.EthSrcBuilder;
123 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.type._case.EthTypeBuilder;
124 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv4.code._case.Icmpv4CodeBuilder;
125 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv4.type._case.Icmpv4TypeBuilder;
126 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv6.code._case.Icmpv6CodeBuilder;
127 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv6.type._case.Icmpv6TypeBuilder;
128 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.in.phy.port._case.InPhyPortBuilder;
129 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.in.port._case.InPortBuilder;
130 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.dscp._case.IpDscpBuilder;
131 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.ecn._case.IpEcnBuilder;
132 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.proto._case.IpProtoBuilder;
133 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.dst._case.Ipv4DstBuilder;
134 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.src._case.Ipv4SrcBuilder;
135 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.dst._case.Ipv6DstBuilder;
136 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.exthdr._case.Ipv6ExthdrBuilder;
137 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.flabel._case.Ipv6FlabelBuilder;
138 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.nd.sll._case.Ipv6NdSllBuilder;
139 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.nd.target._case.Ipv6NdTargetBuilder;
140 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.nd.tll._case.Ipv6NdTllBuilder;
141 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.src._case.Ipv6SrcBuilder;
142 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.metadata._case.MetadataBuilder;
143 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.bos._case.MplsBosBuilder;
144 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.label._case.MplsLabelBuilder;
145 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.tc._case.MplsTcBuilder;
146 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.packet.type._case.PacketTypeBuilder;
147 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.pbb.isid._case.PbbIsidBuilder;
148 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.sctp.dst._case.SctpDstBuilder;
149 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.sctp.src._case.SctpSrcBuilder;
150 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tcp.dst._case.TcpDstBuilder;
151 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tcp.src._case.TcpSrcBuilder;
152 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tunnel.id._case.TunnelIdBuilder;
153 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.udp.dst._case.UdpDstBuilder;
154 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.udp.src._case.UdpSrcBuilder;
155 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.vlan.pcp._case.VlanPcpBuilder;
156 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.vlan.vid._case.VlanVidBuilder;
157 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match;
158 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.MatchBuilder;
159
160 /**
161  * Unit tests for OF13MatchSerializer02.
162  *
163  * @author michal.polkorab
164  */
165 public class OF13MatchSerializer02Test {
166
167     private SerializerRegistry registry;
168     private OFSerializer<Match> matchSerializer;
169
170     /**
171      * Initializes serializer table and stores correct factory in field.
172      */
173     @Before
174     public void startUp() {
175         registry = new SerializerRegistryImpl();
176         registry.init();
177         matchSerializer = registry.getSerializer(
178                 new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, Match.class));
179     }
180
181     /**
182      * Testing serialization of match.
183      */
184     @Test
185     public void testEmptyMatch() {
186         MatchBuilder builder = new MatchBuilder();
187         builder.setType(OxmMatchType.class);
188         Match match = builder.build();
189
190         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
191         matchSerializer.serialize(match, out);
192
193         Assert.assertEquals("Wrong match type", 1, out.readUnsignedShort());
194         Assert.assertEquals("Wrong match length", 4, out.readUnsignedShort());
195         Assert.assertTrue("Wrong padding", out.readableBytes() == 4);
196     }
197
198     /**
199      * Testing serialization of match.
200      */
201     @Test
202     public void test() {
203         MatchBuilder builder = new MatchBuilder();
204         builder.setType(OxmMatchType.class);
205         final List<MatchEntry> entries = new ArrayList<>();
206         MatchEntryBuilder entryBuilder = new MatchEntryBuilder();
207         entryBuilder.setOxmClass(OpenflowBasicClass.class);
208         entryBuilder.setOxmMatchField(InPort.class);
209         entryBuilder.setHasMask(false);
210         InPortCaseBuilder inPortCaseBuilder = new InPortCaseBuilder();
211         InPortBuilder inPortBuilder = new InPortBuilder();
212         inPortBuilder.setPortNumber(new PortNumber(42L));
213         inPortCaseBuilder.setInPort(inPortBuilder.build());
214         entryBuilder.setMatchEntryValue(inPortCaseBuilder.build());
215         entries.add(entryBuilder.build());
216         entryBuilder = new MatchEntryBuilder();
217         entryBuilder.setOxmClass(OpenflowBasicClass.class);
218         entryBuilder.setOxmMatchField(InPhyPort.class);
219         entryBuilder.setHasMask(false);
220         InPhyPortCaseBuilder inPhyPortCaseBuilder = new InPhyPortCaseBuilder();
221         InPhyPortBuilder inPhyPortBuilder = new InPhyPortBuilder();
222         inPhyPortBuilder.setPortNumber(new PortNumber(43L));
223         inPhyPortCaseBuilder.setInPhyPort(inPhyPortBuilder.build());
224         entryBuilder.setMatchEntryValue(inPhyPortCaseBuilder.build());
225         entries.add(entryBuilder.build());
226         entryBuilder = new MatchEntryBuilder();
227         entryBuilder.setOxmClass(OpenflowBasicClass.class);
228         entryBuilder.setOxmMatchField(Metadata.class);
229         entryBuilder.setHasMask(true);
230         MetadataCaseBuilder metaCaseBuilder = new MetadataCaseBuilder();
231         MetadataBuilder metadataBuilder = new MetadataBuilder();
232         metadataBuilder.setMetadata(new byte[]{0,0,0,0,0,0,0,1});
233         metadataBuilder.setMask(new byte[]{0,0,0,0,0,0,0,2});
234         metaCaseBuilder.setMetadata(metadataBuilder.build());
235         entryBuilder.setMatchEntryValue(metaCaseBuilder.build());
236         entries.add(entryBuilder.build());
237         entryBuilder = new MatchEntryBuilder();
238         entryBuilder.setOxmClass(OpenflowBasicClass.class);
239         entryBuilder.setOxmMatchField(EthDst.class);
240         entryBuilder.setHasMask(true);
241         EthDstCaseBuilder ethDstCaseBuilder = new EthDstCaseBuilder();
242         EthDstBuilder ethDstBuilder = new EthDstBuilder();
243         ethDstBuilder.setMacAddress(new MacAddress("01:00:03:00:00:06"));
244         ethDstBuilder.setMask(new byte[]{0,0,0,0,0,5});
245         ethDstCaseBuilder.setEthDst(ethDstBuilder.build());
246         entryBuilder.setMatchEntryValue(ethDstCaseBuilder.build());
247         entries.add(entryBuilder.build());
248         entryBuilder = new MatchEntryBuilder();
249         entryBuilder.setOxmClass(OpenflowBasicClass.class);
250         entryBuilder.setOxmMatchField(EthSrc.class);
251         entryBuilder.setHasMask(true);
252         EthSrcCaseBuilder ethSrcCaseBuilder = new EthSrcCaseBuilder();
253         EthSrcBuilder ethSrcBuilder = new EthSrcBuilder();
254         ethSrcBuilder.setMacAddress(new MacAddress("04:00:02:00:00:08"));
255         ethSrcBuilder.setMask(new byte[]{0,0,0,0,0,2});
256         ethSrcCaseBuilder.setEthSrc(ethSrcBuilder.build());
257         entryBuilder.setMatchEntryValue(ethSrcCaseBuilder.build());
258         entries.add(entryBuilder.build());
259         entryBuilder = new MatchEntryBuilder();
260         entryBuilder.setOxmClass(OpenflowBasicClass.class);
261         entryBuilder.setOxmMatchField(EthType.class);
262         entryBuilder.setHasMask(false);
263         EthTypeCaseBuilder ethTypeCaseBuilder = new EthTypeCaseBuilder();
264         EthTypeBuilder ethTypeBuilder = new EthTypeBuilder();
265         ethTypeBuilder.setEthType(new EtherType(46));
266         ethTypeCaseBuilder.setEthType(ethTypeBuilder.build());
267         entryBuilder.setMatchEntryValue(ethTypeCaseBuilder.build());
268         entries.add(entryBuilder.build());
269         entryBuilder = new MatchEntryBuilder();
270         entryBuilder.setOxmClass(OpenflowBasicClass.class);
271         entryBuilder.setOxmMatchField(VlanVid.class);
272         entryBuilder.setHasMask(true);
273         final VlanVidCaseBuilder vlanVidCaseBuilder = new VlanVidCaseBuilder();
274         VlanVidBuilder vlanVidBuilder = new VlanVidBuilder();
275         vlanVidBuilder.setVlanVid(45);
276         vlanVidBuilder.setCfiBit(true);
277         vlanVidBuilder.setMask(new byte[]{0,9});
278         vlanVidCaseBuilder.setVlanVid(vlanVidBuilder.build());
279         entryBuilder.setMatchEntryValue(vlanVidCaseBuilder.build());
280         entries.add(entryBuilder.build());
281         entryBuilder = new MatchEntryBuilder();
282         entryBuilder.setOxmClass(OpenflowBasicClass.class);
283         entryBuilder.setOxmMatchField(VlanPcp.class);
284         entryBuilder.setHasMask(false);
285         VlanPcpCaseBuilder vlanPcpCaseBuilder = new VlanPcpCaseBuilder();
286         VlanPcpBuilder vlanPcpBuilder = new VlanPcpBuilder();
287         vlanPcpBuilder.setVlanPcp((short) 14);
288         vlanPcpCaseBuilder.setVlanPcp(vlanPcpBuilder.build());
289         entryBuilder.setMatchEntryValue(vlanPcpCaseBuilder.build());
290         entries.add(entryBuilder.build());
291         entryBuilder = new MatchEntryBuilder();
292         entryBuilder.setOxmClass(OpenflowBasicClass.class);
293         entryBuilder.setOxmMatchField(IpDscp.class);
294         entryBuilder.setHasMask(false);
295         IpDscpCaseBuilder ipDscpCaseBuilder = new IpDscpCaseBuilder();
296         IpDscpBuilder ipDscpBuilder = new IpDscpBuilder();
297         ipDscpBuilder.setDscp(new Dscp((short) 48));
298         ipDscpCaseBuilder.setIpDscp(ipDscpBuilder.build());
299         entryBuilder.setMatchEntryValue(ipDscpCaseBuilder.build());
300         entries.add(entryBuilder.build());
301         entryBuilder = new MatchEntryBuilder();
302         entryBuilder.setOxmClass(OpenflowBasicClass.class);
303         entryBuilder.setOxmMatchField(IpEcn.class);
304         entryBuilder.setHasMask(false);
305         IpEcnCaseBuilder ipEcnCaseBuilder = new IpEcnCaseBuilder();
306         IpEcnBuilder ipEcnBuilder = new IpEcnBuilder();
307         ipEcnBuilder.setEcn((short) 49);
308         ipEcnCaseBuilder.setIpEcn(ipEcnBuilder.build());
309         entryBuilder.setMatchEntryValue(ipEcnCaseBuilder.build());
310         entries.add(entryBuilder.build());
311         entryBuilder = new MatchEntryBuilder();
312         entryBuilder.setOxmClass(OpenflowBasicClass.class);
313         entryBuilder.setOxmMatchField(IpProto.class);
314         entryBuilder.setHasMask(false);
315         IpProtoCaseBuilder ipProtoCaseBuilder = new IpProtoCaseBuilder();
316         IpProtoBuilder ipProtoBuilder = new IpProtoBuilder();
317         ipProtoBuilder.setProtocolNumber((short) 50);
318         ipProtoCaseBuilder.setIpProto(ipProtoBuilder.build());
319         entryBuilder.setMatchEntryValue(ipProtoCaseBuilder.build());
320         entries.add(entryBuilder.build());
321         entryBuilder = new MatchEntryBuilder();
322         entryBuilder.setOxmClass(OpenflowBasicClass.class);
323         entryBuilder.setOxmMatchField(Ipv4Src.class);
324         entryBuilder.setHasMask(true);
325         Ipv4SrcCaseBuilder ipv4SrcCaseBuilder = new Ipv4SrcCaseBuilder();
326         Ipv4SrcBuilder ipv4SrcBuilder = new Ipv4SrcBuilder();
327         ipv4SrcBuilder.setIpv4Address(new Ipv4Address("10.0.0.1"));
328         ipv4SrcBuilder.setMask(new byte[]{0,0,0,14});
329         ipv4SrcCaseBuilder.setIpv4Src(ipv4SrcBuilder.build());
330         entryBuilder.setMatchEntryValue(ipv4SrcCaseBuilder.build());
331         entries.add(entryBuilder.build());
332         entryBuilder = new MatchEntryBuilder();
333         entryBuilder.setOxmClass(OpenflowBasicClass.class);
334         entryBuilder.setOxmMatchField(Ipv4Dst.class);
335         entryBuilder.setHasMask(true);
336         Ipv4DstCaseBuilder ipv4DstCaseBuilder = new Ipv4DstCaseBuilder();
337         Ipv4DstBuilder ipv4DstBuilder = new Ipv4DstBuilder();
338         ipv4DstBuilder.setIpv4Address(new Ipv4Address("10.0.0.2"));
339         ipv4DstBuilder.setMask(new byte[]{0,0,0,15});
340         ipv4DstCaseBuilder.setIpv4Dst(ipv4DstBuilder.build());
341         entryBuilder.setMatchEntryValue(ipv4DstCaseBuilder.build());
342         entries.add(entryBuilder.build());
343         entryBuilder = new MatchEntryBuilder();
344         entryBuilder.setOxmClass(OpenflowBasicClass.class);
345         entryBuilder.setOxmMatchField(TcpSrc.class);
346         entryBuilder.setHasMask(false);
347         TcpSrcCaseBuilder tcpSrcCaseBuilder = new TcpSrcCaseBuilder();
348         TcpSrcBuilder tcpSrcBuilder = new TcpSrcBuilder();
349         tcpSrcBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params
350                 .xml.ns.yang.ietf.inet.types.rev130715.PortNumber(6653));
351         tcpSrcCaseBuilder.setTcpSrc(tcpSrcBuilder.build());
352         entryBuilder.setMatchEntryValue(tcpSrcCaseBuilder.build());
353         entries.add(entryBuilder.build());
354         entryBuilder = new MatchEntryBuilder();
355         entryBuilder.setOxmClass(OpenflowBasicClass.class);
356         entryBuilder.setOxmMatchField(TcpDst.class);
357         entryBuilder.setHasMask(false);
358         TcpDstCaseBuilder tcpDstCaseBuilder = new TcpDstCaseBuilder();
359         TcpDstBuilder tcpDstBuilder = new TcpDstBuilder();
360         tcpDstBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params
361                 .xml.ns.yang.ietf.inet.types.rev130715.PortNumber(6654));
362         tcpDstCaseBuilder.setTcpDst(tcpDstBuilder.build());
363         entryBuilder.setMatchEntryValue(tcpDstCaseBuilder.build());
364         entries.add(entryBuilder.build());
365         entryBuilder = new MatchEntryBuilder();
366         entryBuilder.setOxmClass(OpenflowBasicClass.class);
367         entryBuilder.setOxmMatchField(UdpSrc.class);
368         entryBuilder.setHasMask(false);
369         UdpSrcCaseBuilder udpSrcCaseBuilder = new UdpSrcCaseBuilder();
370         UdpSrcBuilder udpSrcBuilder = new UdpSrcBuilder();
371         udpSrcBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params
372                 .xml.ns.yang.ietf.inet.types.rev130715.PortNumber(6655));
373         udpSrcCaseBuilder.setUdpSrc(udpSrcBuilder.build());
374         entryBuilder.setMatchEntryValue(udpSrcCaseBuilder.build());
375         entries.add(entryBuilder.build());
376         entryBuilder = new MatchEntryBuilder();
377         entryBuilder.setOxmClass(OpenflowBasicClass.class);
378         entryBuilder.setOxmMatchField(UdpDst.class);
379         entryBuilder.setHasMask(false);
380         UdpDstCaseBuilder udpDstCaseBuilder = new UdpDstCaseBuilder();
381         UdpDstBuilder udpDstBuilder = new UdpDstBuilder();
382         udpDstBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params
383                 .xml.ns.yang.ietf.inet.types.rev130715.PortNumber(6656));
384         udpDstCaseBuilder.setUdpDst(udpDstBuilder.build());
385         entryBuilder.setMatchEntryValue(udpDstCaseBuilder.build());
386         entries.add(entryBuilder.build());
387         entryBuilder = new MatchEntryBuilder();
388         entryBuilder.setOxmClass(OpenflowBasicClass.class);
389         entryBuilder.setOxmMatchField(SctpSrc.class);
390         entryBuilder.setHasMask(false);
391         SctpSrcCaseBuilder sctpSrcCaseBuilder = new SctpSrcCaseBuilder();
392         SctpSrcBuilder sctpSrcBuilder = new SctpSrcBuilder();
393         sctpSrcBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params
394                 .xml.ns.yang.ietf.inet.types.rev130715.PortNumber(6657));
395         sctpSrcCaseBuilder.setSctpSrc(sctpSrcBuilder.build());
396         entryBuilder.setMatchEntryValue(sctpSrcCaseBuilder.build());
397         entries.add(entryBuilder.build());
398         entryBuilder = new MatchEntryBuilder();
399         entryBuilder.setOxmClass(OpenflowBasicClass.class);
400         entryBuilder.setOxmMatchField(SctpDst.class);
401         entryBuilder.setHasMask(false);
402         SctpDstCaseBuilder sctpDstCaseBuilder = new SctpDstCaseBuilder();
403         SctpDstBuilder sctpDstBuilder = new SctpDstBuilder();
404         sctpDstBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params
405                 .xml.ns.yang.ietf.inet.types.rev130715.PortNumber(6658));
406         sctpDstCaseBuilder.setSctpDst(sctpDstBuilder.build());
407         entryBuilder.setMatchEntryValue(sctpDstCaseBuilder.build());
408         entries.add(entryBuilder.build());
409         entryBuilder = new MatchEntryBuilder();
410         entryBuilder.setOxmClass(OpenflowBasicClass.class);
411         entryBuilder.setOxmMatchField(Icmpv4Type.class);
412         entryBuilder.setHasMask(false);
413         Icmpv4TypeCaseBuilder icmpv4TypeCaseBuilder = new Icmpv4TypeCaseBuilder();
414         Icmpv4TypeBuilder icmpv4TypeBuilder = new Icmpv4TypeBuilder();
415         icmpv4TypeBuilder.setIcmpv4Type((short) 51);
416         icmpv4TypeCaseBuilder.setIcmpv4Type(icmpv4TypeBuilder.build());
417         entryBuilder.setMatchEntryValue(icmpv4TypeCaseBuilder.build());
418         entries.add(entryBuilder.build());
419         entryBuilder = new MatchEntryBuilder();
420         entryBuilder.setOxmClass(OpenflowBasicClass.class);
421         entryBuilder.setOxmMatchField(Icmpv4Code.class);
422         entryBuilder.setHasMask(false);
423         Icmpv4CodeCaseBuilder icmpv4CodeCaseBuilder = new Icmpv4CodeCaseBuilder();
424         Icmpv4CodeBuilder icmpv4CodeBuilder = new Icmpv4CodeBuilder();
425         icmpv4CodeBuilder.setIcmpv4Code((short) 52);
426         icmpv4CodeCaseBuilder.setIcmpv4Code(icmpv4CodeBuilder.build());
427         entryBuilder.setMatchEntryValue(icmpv4CodeCaseBuilder.build());
428         entries.add(entryBuilder.build());
429         entryBuilder = new MatchEntryBuilder();
430         entryBuilder.setOxmClass(OpenflowBasicClass.class);
431         entryBuilder.setOxmMatchField(ArpOp.class);
432         entryBuilder.setHasMask(false);
433         ArpOpCaseBuilder arpOpCaseBuilder = new ArpOpCaseBuilder();
434         ArpOpBuilder arpOpBuilder = new ArpOpBuilder();
435         arpOpBuilder.setOpCode(53);
436         arpOpCaseBuilder.setArpOp(arpOpBuilder.build());
437         entryBuilder.setMatchEntryValue(arpOpCaseBuilder.build());
438         entries.add(entryBuilder.build());
439         entryBuilder = new MatchEntryBuilder();
440         entryBuilder.setOxmClass(OpenflowBasicClass.class);
441         entryBuilder.setOxmMatchField(ArpSpa.class);
442         entryBuilder.setHasMask(true);
443         ArpSpaCaseBuilder arpSpaCaseBuilder = new ArpSpaCaseBuilder();
444         ArpSpaBuilder arpSpaBuilder = new ArpSpaBuilder();
445         arpSpaBuilder.setIpv4Address(new Ipv4Address("10.0.0.4"));
446         arpSpaBuilder.setMask(new byte[]{0,0,0,16});
447         arpSpaCaseBuilder.setArpSpa(arpSpaBuilder.build());
448         entryBuilder.setMatchEntryValue(arpSpaCaseBuilder.build());
449         entries.add(entryBuilder.build());
450         entryBuilder = new MatchEntryBuilder();
451         entryBuilder.setOxmClass(OpenflowBasicClass.class);
452         entryBuilder.setOxmMatchField(ArpTpa.class);
453         entryBuilder.setHasMask(true);
454         ArpTpaCaseBuilder arpTpaCaseBuilder = new ArpTpaCaseBuilder();
455         ArpTpaBuilder arpTpaBuilder = new ArpTpaBuilder();
456         arpTpaBuilder.setIpv4Address(new Ipv4Address("10.0.0.5"));
457         arpTpaBuilder.setMask(new byte[]{0,0,0,17});
458         arpTpaCaseBuilder.setArpTpa(arpTpaBuilder.build());
459         entryBuilder.setMatchEntryValue(arpTpaCaseBuilder.build());
460         entries.add(entryBuilder.build());
461         entryBuilder = new MatchEntryBuilder();
462         entryBuilder.setOxmClass(OpenflowBasicClass.class);
463         entryBuilder.setOxmMatchField(ArpSha.class);
464         entryBuilder.setHasMask(true);
465         ArpShaCaseBuilder arpShaCaseBuilder = new ArpShaCaseBuilder();
466         ArpShaBuilder arpShaBuilder = new ArpShaBuilder();
467         arpShaBuilder.setMacAddress(new MacAddress("00:01:02:03:04:05"));
468         arpShaBuilder.setMask(new byte[]{0,0,4,0,0,6});
469         arpShaCaseBuilder.setArpSha(arpShaBuilder.build());
470         entryBuilder.setMatchEntryValue(arpShaCaseBuilder.build());
471         entries.add(entryBuilder.build());
472         entryBuilder = new MatchEntryBuilder();
473         entryBuilder.setOxmClass(OpenflowBasicClass.class);
474         entryBuilder.setOxmMatchField(ArpTha.class);
475         entryBuilder.setHasMask(true);
476         ArpThaCaseBuilder arpThaCaseBuilder = new ArpThaCaseBuilder();
477         ArpThaBuilder arpThaBuilder = new ArpThaBuilder();
478         arpThaBuilder.setMacAddress(new MacAddress("00:00:00:00:00:03"));
479         arpThaBuilder.setMask(new byte[]{0,0,6,0,0,4});
480         arpThaCaseBuilder.setArpTha(arpThaBuilder.build());
481         entryBuilder.setMatchEntryValue(arpThaCaseBuilder.build());
482         entries.add(entryBuilder.build());
483         entryBuilder = new MatchEntryBuilder();
484         entryBuilder.setOxmClass(OpenflowBasicClass.class);
485         entryBuilder.setOxmMatchField(Ipv6Src.class);
486         entryBuilder.setHasMask(true);
487         Ipv6SrcCaseBuilder ipv6SrcCaseBuilder = new Ipv6SrcCaseBuilder();
488         Ipv6SrcBuilder ipv6SrcBuilder = new Ipv6SrcBuilder();
489         ipv6SrcBuilder.setIpv6Address(new Ipv6Address("0:0:0:0:0:0:0:1"));
490         ipv6SrcBuilder.setMask(new byte[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1});
491         ipv6SrcCaseBuilder.setIpv6Src(ipv6SrcBuilder.build());
492         entryBuilder.setMatchEntryValue(ipv6SrcCaseBuilder.build());
493         entries.add(entryBuilder.build());
494         entryBuilder = new MatchEntryBuilder();
495         entryBuilder.setOxmClass(OpenflowBasicClass.class);
496         entryBuilder.setOxmMatchField(Ipv6Dst.class);
497         entryBuilder.setHasMask(true);
498         Ipv6DstCaseBuilder ipv6DstCaseBuilder = new Ipv6DstCaseBuilder();
499         Ipv6DstBuilder ipv6DstBuilder = new Ipv6DstBuilder();
500         ipv6DstBuilder.setIpv6Address(new Ipv6Address("0:0:1:0:1:0:0:1"));
501         ipv6DstBuilder.setMask(new byte[]{0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1});
502         ipv6DstCaseBuilder.setIpv6Dst(ipv6DstBuilder.build());
503         entryBuilder.setMatchEntryValue(ipv6DstCaseBuilder.build());
504         entries.add(entryBuilder.build());
505         entryBuilder = new MatchEntryBuilder();
506         entryBuilder.setOxmClass(OpenflowBasicClass.class);
507         entryBuilder.setOxmMatchField(Ipv6Flabel.class);
508         entryBuilder.setHasMask(false);
509         Ipv6FlabelCaseBuilder ipv6FlabelCaseBuilder = new Ipv6FlabelCaseBuilder();
510         Ipv6FlabelBuilder ipv6FlabelBuilder = new Ipv6FlabelBuilder();
511         ipv6FlabelBuilder.setIpv6Flabel(new Ipv6FlowLabel(58L));
512         ipv6FlabelCaseBuilder.setIpv6Flabel(ipv6FlabelBuilder.build());
513         entryBuilder.setMatchEntryValue(ipv6FlabelCaseBuilder.build());
514         entries.add(entryBuilder.build());
515         entryBuilder = new MatchEntryBuilder();
516         entryBuilder.setOxmClass(OpenflowBasicClass.class);
517         entryBuilder.setOxmMatchField(Icmpv6Type.class);
518         entryBuilder.setHasMask(false);
519         Icmpv6TypeCaseBuilder icmpv6TypeCaseBuilder = new Icmpv6TypeCaseBuilder();
520         Icmpv6TypeBuilder icmpv6TypeBuilder = new Icmpv6TypeBuilder();
521         icmpv6TypeBuilder.setIcmpv6Type((short) 59);
522         icmpv6TypeCaseBuilder.setIcmpv6Type(icmpv6TypeBuilder.build());
523         entryBuilder.setMatchEntryValue(icmpv6TypeCaseBuilder.build());
524         entries.add(entryBuilder.build());
525         entryBuilder = new MatchEntryBuilder();
526         entryBuilder.setOxmClass(OpenflowBasicClass.class);
527         entryBuilder.setOxmMatchField(Icmpv6Code.class);
528         entryBuilder.setHasMask(false);
529         Icmpv6CodeCaseBuilder icmpv6CodeCaseBuilder = new Icmpv6CodeCaseBuilder();
530         Icmpv6CodeBuilder icmpv6CodeBuilder = new Icmpv6CodeBuilder();
531         icmpv6CodeBuilder.setIcmpv6Code((short) 60);
532         icmpv6CodeCaseBuilder.setIcmpv6Code(icmpv6CodeBuilder.build());
533         entryBuilder.setMatchEntryValue(icmpv6CodeCaseBuilder.build());
534         entries.add(entryBuilder.build());
535         entryBuilder.setOxmClass(OpenflowBasicClass.class);
536         entryBuilder.setOxmMatchField(Ipv6NdTarget.class);
537         entryBuilder.setHasMask(false);
538         Ipv6NdTargetCaseBuilder ipv6NdTargetCaseBuilder = new Ipv6NdTargetCaseBuilder();
539         Ipv6NdTargetBuilder ipv6NdTargetBuilder = new Ipv6NdTargetBuilder();
540         ipv6NdTargetBuilder.setIpv6Address(new Ipv6Address("F:0:0::0:0:0:1"));
541         ipv6NdTargetCaseBuilder.setIpv6NdTarget(ipv6NdTargetBuilder.build());
542         entryBuilder.setMatchEntryValue(ipv6NdTargetCaseBuilder.build());
543         entries.add(entryBuilder.build());
544         entryBuilder = new MatchEntryBuilder();
545         entryBuilder.setOxmClass(OpenflowBasicClass.class);
546         entryBuilder.setOxmMatchField(Ipv6NdSll.class);
547         entryBuilder.setHasMask(false);
548         Ipv6NdSllCaseBuilder ipv6NdSllCaseBuilder = new Ipv6NdSllCaseBuilder();
549         Ipv6NdSllBuilder ipv6NdSllBuilder = new Ipv6NdSllBuilder();
550         ipv6NdSllBuilder.setMacAddress(new MacAddress("01:00:03:00:00:06"));
551         ipv6NdSllCaseBuilder.setIpv6NdSll(ipv6NdSllBuilder.build());
552         entryBuilder.setMatchEntryValue(ipv6NdSllCaseBuilder.build());
553         entries.add(entryBuilder.build());
554         entryBuilder = new MatchEntryBuilder();
555         entryBuilder.setOxmClass(OpenflowBasicClass.class);
556         entryBuilder.setOxmMatchField(Ipv6NdTll.class);
557         entryBuilder.setHasMask(false);
558         Ipv6NdTllCaseBuilder ipv6NdTllCaseBuilder = new Ipv6NdTllCaseBuilder();
559         Ipv6NdTllBuilder ipv6NdTllBuilder = new Ipv6NdTllBuilder();
560         ipv6NdTllBuilder.setMacAddress(new MacAddress("04:00:02:00:00:08"));
561         ipv6NdTllCaseBuilder.setIpv6NdTll(ipv6NdTllBuilder.build());
562         entryBuilder.setMatchEntryValue(ipv6NdTllCaseBuilder.build());
563         entries.add(entryBuilder.build());
564         entryBuilder = new MatchEntryBuilder();
565         entryBuilder.setOxmClass(OpenflowBasicClass.class);
566         entryBuilder.setOxmMatchField(MplsLabel.class);
567         entryBuilder.setHasMask(false);
568         MplsLabelCaseBuilder mplsLabelCaseBuilder = new MplsLabelCaseBuilder();
569         MplsLabelBuilder mplsLabelBuilder = new MplsLabelBuilder();
570         mplsLabelBuilder.setMplsLabel(61L);
571         mplsLabelCaseBuilder.setMplsLabel(mplsLabelBuilder.build());
572         entryBuilder.setMatchEntryValue(mplsLabelCaseBuilder.build());
573         entries.add(entryBuilder.build());
574         entryBuilder = new MatchEntryBuilder();
575         entryBuilder.setOxmClass(OpenflowBasicClass.class);
576         entryBuilder.setOxmMatchField(MplsTc.class);
577         entryBuilder.setHasMask(false);
578         MplsTcCaseBuilder mplsTcCaseBuilder = new MplsTcCaseBuilder();
579         MplsTcBuilder mplsTcBuilder = new MplsTcBuilder();
580         mplsTcBuilder.setTc((short) 62);
581         mplsTcCaseBuilder.setMplsTc(mplsTcBuilder.build());
582         entryBuilder.setMatchEntryValue(mplsTcCaseBuilder.build());
583         entries.add(entryBuilder.build());
584         entryBuilder = new MatchEntryBuilder();
585         entryBuilder.setOxmClass(OpenflowBasicClass.class);
586         entryBuilder.setOxmMatchField(MplsBos.class);
587         entryBuilder.setHasMask(false);
588         MplsBosCaseBuilder mplsBosCaseBuilder = new MplsBosCaseBuilder();
589         MplsBosBuilder mplsBosBuilder = new MplsBosBuilder();
590         mplsBosBuilder.setBos(true);
591         mplsBosCaseBuilder.setMplsBos(mplsBosBuilder.build());
592         entryBuilder.setMatchEntryValue(mplsBosCaseBuilder.build());
593         entries.add(entryBuilder.build());
594         entryBuilder = new MatchEntryBuilder();
595         entryBuilder.setOxmClass(OpenflowBasicClass.class);
596         entryBuilder.setOxmMatchField(PbbIsid.class);
597         entryBuilder.setHasMask(true);
598         PbbIsidCaseBuilder pbbIsidCaseBuilder = new PbbIsidCaseBuilder();
599         PbbIsidBuilder pbbIsidBuilder = new PbbIsidBuilder();
600         pbbIsidBuilder.setIsid(64L);
601         pbbIsidBuilder.setMask(new byte[]{0,1,2});
602         pbbIsidCaseBuilder.setPbbIsid(pbbIsidBuilder.build());
603         entryBuilder.setMatchEntryValue(pbbIsidCaseBuilder.build());
604         entries.add(entryBuilder.build());
605         entryBuilder = new MatchEntryBuilder();
606         entryBuilder.setOxmClass(OpenflowBasicClass.class);
607         entryBuilder.setOxmMatchField(TunnelId.class);
608         entryBuilder.setHasMask(true);
609         TunnelIdCaseBuilder tunnelIdCaseBuilder = new TunnelIdCaseBuilder();
610         TunnelIdBuilder tunnelIdBuilder = new TunnelIdBuilder();
611         tunnelIdBuilder.setTunnelId(new byte[]{0,0,0,0,0,0,0,1});
612         tunnelIdBuilder.setMask(new byte[]{0,0,0,0,0,0,0,2});
613         tunnelIdCaseBuilder.setTunnelId(tunnelIdBuilder.build());
614         entryBuilder.setMatchEntryValue(tunnelIdCaseBuilder.build());
615         entries.add(entryBuilder.build());
616         entryBuilder = new MatchEntryBuilder();
617         entryBuilder.setOxmClass(OpenflowBasicClass.class);
618         entryBuilder.setOxmMatchField(Ipv6Exthdr.class);
619         entryBuilder.setHasMask(true);
620         Ipv6ExthdrCaseBuilder ipv6ExthdrCaseBuilder = new Ipv6ExthdrCaseBuilder();
621         Ipv6ExthdrBuilder ipv6ExthdrBuilder = new Ipv6ExthdrBuilder();
622         ipv6ExthdrBuilder.setPseudoField(new Ipv6ExthdrFlags(true, false, true,
623                 false, true, false, true, false, true));
624         ipv6ExthdrBuilder.setMask(new byte[]{0,2});
625         ipv6ExthdrCaseBuilder.setIpv6Exthdr(ipv6ExthdrBuilder.build());
626         entryBuilder.setMatchEntryValue(ipv6ExthdrCaseBuilder.build());
627         entries.add(entryBuilder.build());
628         entryBuilder = new MatchEntryBuilder();
629         entryBuilder.setOxmClass(OpenflowBasicClass.class);
630         entryBuilder.setOxmMatchField(PacketType.class);
631         entryBuilder.setHasMask(false);
632         PacketTypeCaseBuilder packetTypeCaseBuilder = new PacketTypeCaseBuilder();
633         PacketTypeBuilder packetTypeBuilder = new PacketTypeBuilder();
634         packetTypeBuilder.setPacketType(0x1894fL);
635         packetTypeCaseBuilder.setPacketType(packetTypeBuilder.build());
636         entryBuilder.setMatchEntryValue(packetTypeCaseBuilder.build());
637         entries.add(entryBuilder.build());
638
639
640         builder.setMatchEntry(entries);
641         Match match = builder.build();
642
643         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
644         matchSerializer.serialize(match, out);
645
646         Assert.assertEquals("Wrong match type", 1, out.readUnsignedShort());
647         Assert.assertEquals("Wrong match length", 432, out.readUnsignedShort());
648         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
649         Assert.assertEquals("Wrong match entry field & hasMask", 0, out.readUnsignedByte());
650         Assert.assertEquals("Wrong match entry length", 4, out.readUnsignedByte());
651         Assert.assertEquals("Wrong match entry value", 42, out.readUnsignedInt());
652         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
653         Assert.assertEquals("Wrong match entry field & hasMask", 2, out.readUnsignedByte());
654         Assert.assertEquals("Wrong match entry length", 4, out.readUnsignedByte());
655         Assert.assertEquals("Wrong match entry value", 43, out.readUnsignedInt());
656         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
657         Assert.assertEquals("Wrong match entry field & hasMask", 5, out.readUnsignedByte());
658         Assert.assertEquals("Wrong match entry length", 16, out.readUnsignedByte());
659         Assert.assertEquals("Wrong match entry value", 1L, out.readLong());
660         Assert.assertEquals("Wrong match entry mask", 2L, out.readLong());
661         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
662         Assert.assertEquals("Wrong match entry field & hasMask", 7, out.readUnsignedByte());
663         Assert.assertEquals("Wrong match entry length", 12, out.readUnsignedByte());
664         byte[] array = new byte[6];
665         out.readBytes(array);
666         Assert.assertArrayEquals("Wrong match entry value", new byte[]{1,0,3,0,0,6}, array);
667         array = new byte[6];
668         out.readBytes(array);
669         Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,0,0,0,5}, array);
670         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
671         Assert.assertEquals("Wrong match entry field & hasMask", 9, out.readUnsignedByte());
672         Assert.assertEquals("Wrong match entry length", 12, out.readUnsignedByte());
673         array = new byte[6];
674         out.readBytes(array);
675         Assert.assertArrayEquals("Wrong match entry value", new byte[]{4,0,2,0,0,8}, array);
676         array = new byte[6];
677         out.readBytes(array);
678         Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,0,0,0,2}, array);
679         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
680         Assert.assertEquals("Wrong match entry field & hasMask", 10, out.readUnsignedByte());
681         Assert.assertEquals("Wrong match entry length", 2, out.readUnsignedByte());
682         Assert.assertEquals("Wrong match entry value", 46, out.readUnsignedShort());
683         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
684         Assert.assertEquals("Wrong match entry field & hasMask", 13, out.readUnsignedByte());
685         Assert.assertEquals("Wrong match entry length", 4, out.readUnsignedByte());
686         Assert.assertEquals("Wrong match entry value", 4141, out.readUnsignedShort());
687         array = new byte[2];
688         out.readBytes(array);
689         Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,9}, array);
690         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
691         Assert.assertEquals("Wrong match entry field & hasMask", 14, out.readUnsignedByte());
692         Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());
693         Assert.assertEquals("Wrong match entry value", 14, out.readUnsignedByte());
694         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
695         Assert.assertEquals("Wrong match entry field & hasMask", 16, out.readUnsignedByte());
696         Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());
697         Assert.assertEquals("Wrong match entry value", 48, out.readUnsignedByte());
698         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
699         Assert.assertEquals("Wrong match entry field & hasMask", 18, out.readUnsignedByte());
700         Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());
701         Assert.assertEquals("Wrong match entry value", 49, out.readUnsignedByte());
702         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
703         Assert.assertEquals("Wrong match entry field & hasMask", 20, out.readUnsignedByte());
704         Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());
705         Assert.assertEquals("Wrong match entry value", 50, out.readUnsignedByte());
706         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
707         Assert.assertEquals("Wrong match entry field & hasMask", 23, out.readUnsignedByte());
708         Assert.assertEquals("Wrong match entry length", 8, out.readUnsignedByte());
709         array = new byte[4];
710         out.readBytes(array);
711         Assert.assertArrayEquals("Wrong match entry value", new byte[]{10,0,0,1}, array);
712         array = new byte[4];
713         out.readBytes(array);
714         Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,0,14}, array);
715         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
716         Assert.assertEquals("Wrong match entry field & hasMask", 25, out.readUnsignedByte());
717         Assert.assertEquals("Wrong match entry length", 8, out.readUnsignedByte());
718         array = new byte[4];
719         out.readBytes(array);
720         Assert.assertArrayEquals("Wrong match entry value", new byte[]{10,0,0,2}, array);
721         array = new byte[4];
722         out.readBytes(array);
723         Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,0,15}, array);
724         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
725         Assert.assertEquals("Wrong match entry field & hasMask", 26, out.readUnsignedByte());
726         Assert.assertEquals("Wrong match entry length", 2, out.readUnsignedByte());
727         Assert.assertEquals("Wrong match entry value", 6653, out.readUnsignedShort());
728         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
729         Assert.assertEquals("Wrong match entry field & hasMask", 28, out.readUnsignedByte());
730         Assert.assertEquals("Wrong match entry length", 2, out.readUnsignedByte());
731         Assert.assertEquals("Wrong match entry value", 6654, out.readUnsignedShort());
732         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
733         Assert.assertEquals("Wrong match entry field & hasMask", 30, out.readUnsignedByte());
734         Assert.assertEquals("Wrong match entry length", 2, out.readUnsignedByte());
735         Assert.assertEquals("Wrong match entry value", 6655, out.readUnsignedShort());
736         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
737         Assert.assertEquals("Wrong match entry field & hasMask", 32, out.readUnsignedByte());
738         Assert.assertEquals("Wrong match entry length", 2, out.readUnsignedByte());
739         Assert.assertEquals("Wrong match entry value", 6656, out.readUnsignedShort());
740         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
741         Assert.assertEquals("Wrong match entry field & hasMask", 34, out.readUnsignedByte());
742         Assert.assertEquals("Wrong match entry length", 2, out.readUnsignedByte());
743         Assert.assertEquals("Wrong match entry value", 6657, out.readUnsignedShort());
744         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
745         Assert.assertEquals("Wrong match entry field & hasMask", 36, out.readUnsignedByte());
746         Assert.assertEquals("Wrong match entry length", 2, out.readUnsignedByte());
747         Assert.assertEquals("Wrong match entry value", 6658, out.readUnsignedShort());
748         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
749         Assert.assertEquals("Wrong match entry field & hasMask", 38, out.readUnsignedByte());
750         Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());
751         Assert.assertEquals("Wrong match entry value", 51, out.readUnsignedByte());
752         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
753         Assert.assertEquals("Wrong match entry field & hasMask", 40, out.readUnsignedByte());
754         Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());
755         Assert.assertEquals("Wrong match entry value", 52, out.readUnsignedByte());
756         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
757         Assert.assertEquals("Wrong match entry field & hasMask", 42, out.readUnsignedByte());
758         Assert.assertEquals("Wrong match entry length", 2, out.readUnsignedByte());
759         Assert.assertEquals("Wrong match entry value", 53, out.readUnsignedShort());
760         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
761         Assert.assertEquals("Wrong match entry field & hasMask", 45, out.readUnsignedByte());
762         Assert.assertEquals("Wrong match entry length", 8, out.readUnsignedByte());
763         array = new byte[4];
764         out.readBytes(array);
765         Assert.assertArrayEquals("Wrong match entry value", new byte[]{10,0,0,4}, array);
766         array = new byte[4];
767         out.readBytes(array);
768         Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,0,16}, array);
769         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
770         Assert.assertEquals("Wrong match entry field & hasMask", 47, out.readUnsignedByte());
771         Assert.assertEquals("Wrong match entry length", 8, out.readUnsignedByte());
772         array = new byte[4];
773         out.readBytes(array);
774         Assert.assertArrayEquals("Wrong match entry value", new byte[]{10,0,0,5}, array);
775         array = new byte[4];
776         out.readBytes(array);
777         Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,0,17}, array);
778         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
779         Assert.assertEquals("Wrong match entry field & hasMask", 49, out.readUnsignedByte());
780         Assert.assertEquals("Wrong match entry length", 12, out.readUnsignedByte());
781         array = new byte[6];
782         out.readBytes(array);
783         Assert.assertArrayEquals("Wrong match entry value", new byte[]{0,1,2,3,4,5}, array);
784         array = new byte[6];
785         out.readBytes(array);
786         Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,4,0,0,6}, array);
787         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
788         Assert.assertEquals("Wrong match entry field & hasMask", 51, out.readUnsignedByte());
789         Assert.assertEquals("Wrong match entry length", 12, out.readUnsignedByte());
790         array = new byte[6];
791         out.readBytes(array);
792         Assert.assertArrayEquals("Wrong match entry value", new byte[]{0,0,0,0,0,3}, array);
793         array = new byte[6];
794         out.readBytes(array);
795         Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,0,6,0,0,4}, array);
796         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
797         Assert.assertEquals("Wrong match entry field & hasMask", 53, out.readUnsignedByte());
798         Assert.assertEquals("Wrong match entry length", 32, out.readUnsignedByte());
799         array = new byte[16];
800         out.readBytes(array);
801         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);
802         array = new byte[16];
803         out.readBytes(array);
804         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);
805         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
806         Assert.assertEquals("Wrong match entry field & hasMask", 55, out.readUnsignedByte());
807         Assert.assertEquals("Wrong match entry length", 32, out.readUnsignedByte());
808         array = new byte[16];
809         out.readBytes(array);
810         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);
811         array = new byte[16];
812         out.readBytes(array);
813         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);
814         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
815         Assert.assertEquals("Wrong match entry field & hasMask", 56, out.readUnsignedByte());
816         Assert.assertEquals("Wrong match entry length", 4, out.readUnsignedByte()); //8, out.readUnsignedByte());
817         Assert.assertEquals("Wrong match entry value", 58, out.readUnsignedInt());
818         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
819         Assert.assertEquals("Wrong match entry field & hasMask", 58, out.readUnsignedByte());
820         Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());
821         Assert.assertEquals("Wrong match entry value", 59, out.readUnsignedByte());
822         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
823         Assert.assertEquals("Wrong match entry field & hasMask", 60, out.readUnsignedByte());
824         Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());
825         Assert.assertEquals("Wrong match entry value", 60, out.readUnsignedByte());
826         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
827         Assert.assertEquals("Wrong match entry field & hasMask", 62, out.readUnsignedByte());
828         Assert.assertEquals("Wrong match entry length", 16, out.readUnsignedByte());
829         array = new byte[16];
830         out.readBytes(array);
831         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);
832         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
833         Assert.assertEquals("Wrong match entry field & hasMask", 64, out.readUnsignedByte());
834         Assert.assertEquals("Wrong match entry length", 6, out.readUnsignedByte());
835         array = new byte[6];
836         out.readBytes(array);
837         Assert.assertArrayEquals("Wrong match entry value", new byte[]{1,0,3,0,0,6}, array);
838         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
839         Assert.assertEquals("Wrong match entry field & hasMask", 66, out.readUnsignedByte());
840         Assert.assertEquals("Wrong match entry length", 6, out.readUnsignedByte());
841         array = new byte[6];
842         out.readBytes(array);
843         Assert.assertArrayEquals("Wrong match entry value", new byte[]{4,0,2,0,0,8}, array);
844         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
845         Assert.assertEquals("Wrong match entry field & hasMask", 68, out.readUnsignedByte());
846         Assert.assertEquals("Wrong match entry length", 4, out.readUnsignedByte());
847         Assert.assertEquals("Wrong match entry value", 61, out.readUnsignedInt());
848         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
849         Assert.assertEquals("Wrong match entry field & hasMask", 70, out.readUnsignedByte());
850         Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());
851         Assert.assertEquals("Wrong match entry value", 62, out.readUnsignedByte());
852         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
853         Assert.assertEquals("Wrong match entry field & hasMask", 72, out.readUnsignedByte());
854         Assert.assertEquals("Wrong match entry length", 1, out.readUnsignedByte());
855         Assert.assertEquals("Wrong match entry value", 1, out.readUnsignedByte());
856         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
857         Assert.assertEquals("Wrong match entry field & hasMask", 75, out.readUnsignedByte());
858         Assert.assertEquals("Wrong match entry length", 6, out.readUnsignedByte());
859         Assert.assertEquals("Wrong match entry value", 64, out.readUnsignedMedium());
860         array = new byte[3];
861         out.readBytes(array);
862         Assert.assertArrayEquals("Wrong match entry mask", new byte[]{0,1,2}, array);
863         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
864         Assert.assertEquals("Wrong match entry field & hasMask", 77, out.readUnsignedByte());
865         Assert.assertEquals("Wrong match entry length", 16, out.readUnsignedByte());
866         Assert.assertEquals("Wrong match entry value", 1L, out.readLong());
867         Assert.assertEquals("Wrong match entry mask", 2L, out.readLong());
868         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
869         Assert.assertEquals("Wrong match entry field & hasMask", 79, out.readUnsignedByte());
870         Assert.assertEquals("Wrong match entry length", 4, out.readUnsignedByte());
871         Assert.assertEquals("Wrong match entry value", 358, out.readUnsignedShort());
872         array = new byte[2];
873         out.readBytes(array);
874         Assert.assertArrayEquals("Wrong match entry value", new byte[]{0,2}, array);
875         Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
876         Assert.assertEquals("Wrong match entry field & hasMask", 0x58, out.readUnsignedByte());
877         Assert.assertEquals("Wrong match entry length", 4, out.readUnsignedByte());
878         Assert.assertEquals("Wrong match entry value", 1, out.readUnsignedShort());
879         Assert.assertEquals("Wrong match entry mask", 0x894f, out.readUnsignedShort());
880         Assert.assertTrue("Wrong padding", out.readableBytes() == 0);
881     }
882
883 }