2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.protocol.pcep.ietf;
10 import static org.junit.Assert.assertArrayEquals;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.fail;
14 import io.netty.buffer.ByteBuf;
15 import io.netty.buffer.Unpooled;
16 import org.junit.Test;
17 import org.opendaylight.protocol.pcep.ietf.stateful.PathBindingTlvParser;
18 import org.opendaylight.protocol.pcep.ietf.stateful.StatefulLSPIdentifierIpv4TlvParser;
19 import org.opendaylight.protocol.pcep.ietf.stateful.StatefulLSPIdentifierIpv6TlvParser;
20 import org.opendaylight.protocol.pcep.ietf.stateful.StatefulLspSymbolicNameTlvParser;
21 import org.opendaylight.protocol.pcep.ietf.stateful.StatefulLspUpdateErrorTlvParser;
22 import org.opendaylight.protocol.pcep.ietf.stateful.StatefulRSVPErrorSpecTlvParser;
23 import org.opendaylight.protocol.pcep.ietf.stateful.StatefulStatefulCapabilityTlvParser;
24 import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
25 import org.opendaylight.protocol.pcep.sync.optimizations.SyncOptimizationsCapabilityTlvParser;
26 import org.opendaylight.protocol.util.ByteArray;
27 import org.opendaylight.protocol.util.Ipv4Util;
28 import org.opendaylight.protocol.util.Ipv6Util;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressNoZone;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.iana.rev130816.EnterpriseNumber;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.MplsLabel;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.lsp.error.code.tlv.LspErrorCode;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.lsp.error.code.tlv.LspErrorCodeBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.lsp.identifiers.tlv.LspIdentifiers;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.lsp.identifiers.tlv.LspIdentifiersBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.lsp.identifiers.tlv.lsp.identifiers.address.family.Ipv4CaseBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.lsp.identifiers.tlv.lsp.identifiers.address.family.Ipv6CaseBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.lsp.identifiers.tlv.lsp.identifiers.address.family.ipv4._case.Ipv4Builder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.lsp.identifiers.tlv.lsp.identifiers.address.family.ipv6._case.Ipv6Builder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.path.binding.tlv.PathBinding;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.path.binding.tlv.PathBindingBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.path.binding.tlv.path.binding.binding.type.value.MplsLabelBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.path.binding.tlv.path.binding.binding.type.value.MplsLabelEntryBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.rsvp.error.spec.tlv.RsvpErrorSpec;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.rsvp.error.spec.tlv.RsvpErrorSpecBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.rsvp.error.spec.tlv.rsvp.error.spec.error.type.RsvpCaseBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.rsvp.error.spec.tlv.rsvp.error.spec.error.type.UserCaseBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.rsvp.error.spec.tlv.rsvp.error.spec.error.type.rsvp._case.RsvpErrorBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.rsvp.error.spec.tlv.rsvp.error.spec.error.type.user._case.UserErrorBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.stateful.capability.tlv.Stateful;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.stateful.capability.tlv.StatefulBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.symbolic.path.name.tlv.SymbolicPathName;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.symbolic.path.name.tlv.SymbolicPathNameBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.Ipv4ExtendedTunnelId;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.Ipv6ExtendedTunnelId;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.LspId;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.TunnelId;
58 import org.opendaylight.yangtools.yang.common.Uint16;
59 import org.opendaylight.yangtools.yang.common.Uint32;
60 import org.opendaylight.yangtools.yang.common.Uint8;
62 public class PCEPTlvParserTest {
64 private static final byte[] STATEFUL_BYTES = { 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01 };
65 private static final byte[] STATEFUL_SYNC_OPT_BYTES = new byte[]{ 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x33 };
66 private static final byte[] SYMBOLIC_NAME_BYTES = {
67 0x00, 0x11, 0x00, 0x1C, 0x4d, 0x65, 0x64, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20, 0x6f,
68 0x66, 0x20, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x69, 0x63, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x65, 0x65, 0x65
70 private static final byte[] LSP_UPDATE_ERROR_BYTES = { 0x00, 0x14, 0x00, 0x04, 0x25, 0x68, (byte) 0x95, 0x03 };
71 private static final byte[] LSP_IDENTIFIERS4_BYTES = {
72 0x00, 0x12, 0x00, 0x10, 0x12, 0x34, 0x56, 0x78, (byte) 0xFF, (byte) 0xFF, 0x12,
73 0x34, 0x12, 0x34, 0x56, 0x78, 0x12, 0x34, 0x56, 0x78
75 private static final byte[] LSP_IDENTIFIERS6_BYTES = {
76 0x00, 0x13, 0x00, 0x34, 0x12, 0x34, 0x56, 0x78, (byte) 0x9A, (byte) 0xBC,
77 (byte) 0xDE, (byte) 0xF0, 0x12, 0x34, 0x56, 0x78, (byte) 0x9A, (byte) 0xBC, (byte) 0xDE, (byte) 0xF0, 0x12,
78 0x34, (byte) 0xFF, (byte) 0xFF, 0x12, 0x34, 0x56, 0x78, 0x12, 0x34, 0x56, 0x78, 0x01, 0x23, 0x45, 0x67, 0x01,
79 0x23, 0x45, 0x67, 0x12, 0x34, 0x56, 0x78, (byte) 0x9A, (byte) 0xBC, (byte) 0xDE, (byte) 0xF0, 0x12, 0x34, 0x56,
80 0x78, (byte) 0x9A, (byte) 0xBC, (byte) 0xDE, (byte) 0xF0
82 private static final byte[] RSVP_ERROR_BYTES = {
83 0x00, 0x15, 0x00, 0x0c, 0, 0x0c, 0x06, 0x01, 0x12, 0x34, 0x56, 0x78, 0x02, (byte) 0x92, 0x16, 0x02
85 private static final byte[] RSVP_ERROR6_BYTES = {
86 0x00, 0x15, 0x00, 0x18, 0, 0x18, 0x06, 0x02, 0x12, 0x34, 0x56, 0x78, (byte) 0x9a, (byte) 0xbc, (byte) 0xde,
87 (byte) 0xf0, 0x12, 0x34, 0x56, 0x78, (byte) 0x9a, (byte) 0xbc, (byte) 0xde, (byte) 0xf0, 0x02, (byte) 0xd5,
88 (byte) 0xc5, (byte) 0xd9
90 private static final byte[] USER_ERROR_BYTES = {
91 0x00, 0x15, 0x00, 0x18, 0, 0x18, (byte) 0xc2, 0x01, 0x00, 0x00, 0x30, 0x39, 0x05, 0x09, 0x00,
92 0x26, 0x75, 0x73, 0x65, 0x72, 0x20, 0x64, 0x65, 0x73, 0x63, 0, 0, 0
96 public void testStatefulTlv() throws PCEPDeserializerException {
97 final StatefulStatefulCapabilityTlvParser parser = new StatefulStatefulCapabilityTlvParser();
98 final Stateful tlv = new StatefulBuilder().setLspUpdateCapability(Boolean.TRUE).build();
99 assertEquals(tlv, parser.parseTlv(Unpooled.wrappedBuffer(ByteArray.cutBytes(STATEFUL_BYTES, 4))));
100 final ByteBuf buff = Unpooled.buffer();
101 parser.serializeTlv(tlv, buff);
102 assertArrayEquals(STATEFUL_BYTES, ByteArray.getAllBytes(buff));
106 public void testStatefulTlvSyncOptimizationExtension() throws PCEPDeserializerException {
107 final SyncOptimizationsCapabilityTlvParser parser = new SyncOptimizationsCapabilityTlvParser();
108 final Stateful tlv = new StatefulBuilder().setLspUpdateCapability(Boolean.TRUE)
109 .addAugmentation(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync
110 .optimizations.rev181109.Stateful1Builder()
111 .setTriggeredInitialSync(Boolean.TRUE)
112 .setDeltaLspSyncCapability(Boolean.TRUE)
113 .setIncludeDbVersion(Boolean.TRUE)
116 assertEquals(tlv, parser.parseTlv(Unpooled.wrappedBuffer(ByteArray.cutBytes(STATEFUL_SYNC_OPT_BYTES, 4))));
117 final ByteBuf buff = Unpooled.buffer();
118 parser.serializeTlv(tlv, buff);
119 assertArrayEquals(STATEFUL_SYNC_OPT_BYTES, ByteArray.getAllBytes(buff));
123 public void testSymbolicNameTlv() throws PCEPDeserializerException {
124 final StatefulLspSymbolicNameTlvParser parser = new StatefulLspSymbolicNameTlvParser();
125 final SymbolicPathName tlv = new SymbolicPathNameBuilder().setPathName(
126 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109
127 .SymbolicPathName("Med test of symbolic nameeee".getBytes())).build();
128 assertEquals(tlv, parser.parseTlv(Unpooled.wrappedBuffer(ByteArray.cutBytes(SYMBOLIC_NAME_BYTES, 4))));
129 final ByteBuf buff = Unpooled.buffer();
130 parser.serializeTlv(tlv, buff);
131 assertArrayEquals(SYMBOLIC_NAME_BYTES, ByteArray.getAllBytes(buff));
135 public void testLspErrorCodeTlv() throws PCEPDeserializerException {
136 final StatefulLspUpdateErrorTlvParser parser = new StatefulLspUpdateErrorTlvParser();
137 final LspErrorCode tlv = new LspErrorCodeBuilder().setErrorCode(Uint32.valueOf(627610883)).build();
138 assertEquals(tlv, parser.parseTlv(Unpooled.wrappedBuffer(ByteArray.cutBytes(LSP_UPDATE_ERROR_BYTES, 4))));
139 final ByteBuf buff = Unpooled.buffer();
140 parser.serializeTlv(tlv, buff);
141 assertArrayEquals(LSP_UPDATE_ERROR_BYTES, ByteArray.getAllBytes(buff));
145 public void testLspIdentifiers4Tlv() throws PCEPDeserializerException {
146 final StatefulLSPIdentifierIpv4TlvParser parser = new StatefulLSPIdentifierIpv4TlvParser();
147 final Ipv4Builder afi = new Ipv4Builder();
148 afi.setIpv4TunnelSenderAddress(Ipv4Util.addressForByteBuf(Unpooled.wrappedBuffer(
149 new byte[] { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78 })));
150 afi.setIpv4ExtendedTunnelId(new Ipv4ExtendedTunnelId(Ipv4Util.addressForByteBuf(
151 Unpooled.wrappedBuffer(new byte[] { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78 }))));
152 afi.setIpv4TunnelEndpointAddress(Ipv4Util.addressForByteBuf(Unpooled.wrappedBuffer(
153 new byte[] { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78 })));
154 final LspIdentifiers tlv = new LspIdentifiersBuilder().setAddressFamily(
155 new Ipv4CaseBuilder().setIpv4(afi.build()).build()).setLspId(new LspId(Uint32.valueOf(65535)))
156 .setTunnelId(new TunnelId(Uint16.valueOf(4660))).build();
157 assertEquals(tlv, parser.parseTlv(Unpooled.wrappedBuffer(ByteArray.cutBytes(LSP_IDENTIFIERS4_BYTES, 4))));
158 final ByteBuf buff = Unpooled.buffer();
159 parser.serializeTlv(tlv, buff);
160 assertArrayEquals(LSP_IDENTIFIERS4_BYTES, ByteArray.getAllBytes(buff));
164 public void testLspIdentifiers6Tlv() throws PCEPDeserializerException {
165 final StatefulLSPIdentifierIpv6TlvParser parser = new StatefulLSPIdentifierIpv6TlvParser();
166 final Ipv6Builder afi = new Ipv6Builder();
167 afi.setIpv6TunnelSenderAddress(Ipv6Util.addressForByteBuf(Unpooled.wrappedBuffer(
169 (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78,
170 (byte) 0x9A, (byte) 0xBC, (byte) 0xDE, (byte) 0xF0, (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78,
171 (byte) 0x9A, (byte) 0xBC, (byte) 0xDE, (byte) 0xF0
173 afi.setIpv6ExtendedTunnelId(new Ipv6ExtendedTunnelId(Ipv6Util.addressForByteBuf(Unpooled.wrappedBuffer(
175 (byte) 0x12, (byte) 0x34, (byte) 0x56,
176 (byte) 0x78, (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78, (byte) 0x01, (byte) 0x23, (byte) 0x45,
177 (byte) 0x67, (byte) 0x01, (byte) 0x23, (byte) 0x45, (byte) 0x67
179 afi.setIpv6TunnelEndpointAddress(Ipv6Util.addressForByteBuf(Unpooled.wrappedBuffer(
181 (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78,
182 (byte) 0x9A, (byte) 0xBC, (byte) 0xDE, (byte) 0xF0, (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78,
183 (byte) 0x9A, (byte) 0xBC, (byte) 0xDE, (byte) 0xF0
185 final LspIdentifiers tlv = new LspIdentifiersBuilder()
186 .setAddressFamily(new Ipv6CaseBuilder().setIpv6(afi.build()).build())
187 .setLspId(new LspId(Uint32.valueOf(4660))).setTunnelId(new TunnelId(Uint16.MAX_VALUE)).build();
188 assertEquals(tlv, parser.parseTlv(Unpooled.wrappedBuffer(ByteArray.cutBytes(LSP_IDENTIFIERS6_BYTES, 4))));
189 final ByteBuf buff = Unpooled.buffer();
190 parser.serializeTlv(tlv, buff);
191 assertArrayEquals(LSP_IDENTIFIERS6_BYTES, ByteArray.getAllBytes(buff));
195 public void testRSVPError4SpecTlv() throws PCEPDeserializerException {
196 final StatefulRSVPErrorSpecTlvParser parser = new StatefulRSVPErrorSpecTlvParser();
197 final RsvpErrorBuilder builder = new RsvpErrorBuilder()
198 .setNode(new IpAddressNoZone(Ipv4Util.addressForByteBuf(Unpooled.wrappedBuffer(
199 new byte[] { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78 }))))
200 .setFlags(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.ErrorSpec
202 .setCode(Uint8.valueOf(146))
203 .setValue(Uint16.valueOf(5634));
204 final RsvpErrorSpec tlv = new RsvpErrorSpecBuilder()
205 .setErrorType(new RsvpCaseBuilder().setRsvpError(builder.build()).build()).build();
206 assertEquals(tlv, parser.parseTlv(Unpooled.wrappedBuffer(ByteArray.cutBytes(RSVP_ERROR_BYTES, 4))));
207 final ByteBuf buff = Unpooled.buffer();
208 parser.serializeTlv(tlv, buff);
209 assertArrayEquals(RSVP_ERROR_BYTES, ByteArray.getAllBytes(buff));
213 public void testRSVPError6SpecTlv() throws PCEPDeserializerException {
214 final StatefulRSVPErrorSpecTlvParser parser = new StatefulRSVPErrorSpecTlvParser();
215 final RsvpErrorBuilder builder = new RsvpErrorBuilder()
216 .setNode(new IpAddressNoZone(Ipv6Util.addressForByteBuf(Unpooled.wrappedBuffer(new byte[] {
217 (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78,
218 (byte) 0x9a, (byte) 0xbc, (byte) 0xde, (byte) 0xf0, (byte) 0x12, (byte) 0x34, (byte) 0x56,
219 (byte) 0x78, (byte) 0x9a, (byte) 0xbc, (byte) 0xde, (byte) 0xf0
221 .setFlags(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.ErrorSpec
223 .setCode(Uint8.valueOf(213))
224 .setValue(Uint16.valueOf(50649));
225 final RsvpErrorSpec tlv = new RsvpErrorSpecBuilder()
226 .setErrorType(new RsvpCaseBuilder().setRsvpError(builder.build()).build()).build();
227 assertEquals(tlv, parser.parseTlv(Unpooled.wrappedBuffer(ByteArray.cutBytes(RSVP_ERROR6_BYTES, 4))));
228 final ByteBuf buff = Unpooled.buffer();
229 parser.serializeTlv(tlv, buff);
230 assertArrayEquals(RSVP_ERROR6_BYTES, ByteArray.getAllBytes(buff));
234 public void testUserErrorSpecTlv() throws PCEPDeserializerException {
235 final StatefulRSVPErrorSpecTlvParser parser = new StatefulRSVPErrorSpecTlvParser();
236 final UserErrorBuilder builder = new UserErrorBuilder()
237 .setEnterprise(new EnterpriseNumber(Uint32.valueOf(12345)))
238 .setSubOrg(Uint8.valueOf(5))
239 .setValue(Uint16.valueOf(38))
240 .setDescription("user desc");
241 final RsvpErrorSpec tlv = new RsvpErrorSpecBuilder()
242 .setErrorType(new UserCaseBuilder().setUserError(builder.build()).build()).build();
243 assertEquals(tlv, parser.parseTlv(Unpooled.wrappedBuffer(ByteArray.cutBytes(USER_ERROR_BYTES, 4))));
244 final ByteBuf buff = Unpooled.buffer();
245 parser.serializeTlv(tlv, buff);
246 assertArrayEquals(USER_ERROR_BYTES, ByteArray.getAllBytes(buff));
250 public void testPathBindingTlvMplsLabel() {
251 final byte[] pathBindingBytes = {
252 0x00, 0x1f, 0x00, 0x06, 0x00, 0x00, (byte) 0xA8, 0x0F, (byte) 0x60, 0x00, 0x00, 0x00
254 final PathBindingTlvParser parser = new PathBindingTlvParser();
255 final PathBindingBuilder builder = new PathBindingBuilder();
256 builder.setBindingTypeValue(new MplsLabelBuilder().setMplsLabel(new MplsLabel(Uint32.valueOf(688374))).build());
257 final ByteBuf buff = Unpooled.buffer();
258 parser.serializeTlv(builder.build(), buff);
259 assertArrayEquals(pathBindingBytes, ByteArray.readAllBytes(buff));
262 final byte[] wrong = {0, 0x1f, 0, 4, 1, 1, 2, 3};
263 parser.parseTlv(Unpooled.wrappedBuffer(ByteArray.cutBytes(wrong, 4)));
265 } catch (final PCEPDeserializerException e) {
266 assertEquals("Unsupported Path Binding Type: 257", e.getMessage());
271 public void testPathBindingTlvMplsLabelEntry() {
272 final byte[] pathBindingBytes = {
273 0x00, 0x1f, 0x00, 0x06, 0x00, 0x01, (byte) 0xA8, (byte) 0x0F, (byte) 0x6D, (byte)0xAD, 0x00, 0x00
275 final PathBindingTlvParser parser = new PathBindingTlvParser();
276 final PathBindingBuilder builder = new PathBindingBuilder();
277 builder.setBindingTypeValue(new MplsLabelEntryBuilder()
278 .setTrafficClass(Uint8.valueOf(6))
279 .setTimeToLive(Uint8.valueOf(173))
280 .setBottomOfStack(true)
281 .setLabel(new MplsLabel(Uint32.valueOf(688374))).build());
282 final PathBinding tlv = builder.build();
283 final ByteBuf buff = Unpooled.buffer();
284 parser.serializeTlv(tlv, buff);
285 assertArrayEquals(pathBindingBytes, ByteArray.readAllBytes(buff));