Bump odlparent/yangtools/mdsal/controller
[bgpcep.git] / pcep / ietf-stateful / src / test / java / org / opendaylight / protocol / pcep / ietf / PCEPTlvParserTest.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. 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.protocol.pcep.ietf;
9
10 import static org.junit.Assert.assertArrayEquals;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.fail;
13
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;
61
62 public class PCEPTlvParserTest {
63
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
69     };
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
74     };
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
81     };
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
84     };
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
89     };
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
93     };
94
95     @Test
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));
103     }
104
105     @Test
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)
114                     .build())
115             .build();
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));
120     }
121
122     @Test
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));
132     }
133
134     @Test
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));
142     }
143
144     @Test
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));
161     }
162
163     @Test
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(
168             new byte[] {
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
172             })));
173         afi.setIpv6ExtendedTunnelId(new Ipv6ExtendedTunnelId(Ipv6Util.addressForByteBuf(Unpooled.wrappedBuffer(
174             new byte[] {
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
178             }))));
179         afi.setIpv6TunnelEndpointAddress(Ipv6Util.addressForByteBuf(Unpooled.wrappedBuffer(
180             new byte[] {
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
184             })));
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));
192     }
193
194     @Test
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
201                     .Flags(false, true))
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));
210     }
211
212     @Test
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
220                 }))))
221                 .setFlags(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.ErrorSpec
222                     .Flags(false, true))
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));
231     }
232
233     @Test
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));
247     }
248
249     @Test
250     public void testPathBindingTlvMplsLabel() {
251         final byte[] pathBindingBytes = {
252             0x00, 0x1f, 0x00, 0x06, 0x00, 0x00, (byte) 0xA8, 0x0F, (byte) 0x60, 0x00, 0x00, 0x00
253         };
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));
260
261         try {
262             final byte[] wrong = {0, 0x1f, 0, 4, 1, 1, 2, 3};
263             parser.parseTlv(Unpooled.wrappedBuffer(ByteArray.cutBytes(wrong, 4)));
264             fail();
265         } catch (final PCEPDeserializerException e) {
266             assertEquals("Unsupported Path Binding Type: 257", e.getMessage());
267         }
268     }
269
270     @Test
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
274         };
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));
286     }
287 }