937d6dbc523ad577f600eabfec5246250fb630dc
[bgpcep.git] / pcep / ietf-stateful07 / src / test / java / org / opendaylight / protocol / pcep / ietf / PCEPObjectParserTest.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
13 import io.netty.buffer.ByteBuf;
14 import io.netty.buffer.Unpooled;
15 import java.io.IOException;
16 import java.math.BigInteger;
17 import org.junit.Before;
18 import org.junit.Test;
19 import org.opendaylight.protocol.pcep.ietf.initiated00.CInitiated00SrpObjectParser;
20 import org.opendaylight.protocol.pcep.ietf.stateful07.Stateful07LspObjectParser;
21 import org.opendaylight.protocol.pcep.ietf.stateful07.Stateful07LspaObjectParser;
22 import org.opendaylight.protocol.pcep.ietf.stateful07.StatefulActivator;
23 import org.opendaylight.protocol.pcep.parser.BaseParserExtensionActivator;
24 import org.opendaylight.protocol.pcep.spi.ObjectHeaderImpl;
25 import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException;
26 import org.opendaylight.protocol.pcep.spi.TlvRegistry;
27 import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry;
28 import org.opendaylight.protocol.pcep.spi.pojo.ServiceLoaderPCEPExtensionProviderContext;
29 import org.opendaylight.protocol.pcep.spi.pojo.SimplePCEPExtensionProviderContext;
30 import org.opendaylight.protocol.pcep.sync.optimizations.SyncOptimizationsActivator;
31 import org.opendaylight.protocol.pcep.sync.optimizations.SyncOptimizationsLspObjectParser;
32 import org.opendaylight.protocol.pcep.sync.optimizations.SyncOptimizationsOpenObjectParser;
33 import org.opendaylight.protocol.util.ByteArray;
34 import org.opendaylight.protocol.util.Ipv4Util;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressNoZone;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev181109.Stateful1;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev181109.Stateful1Builder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev181109.Tlvs3;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev181109.Tlvs3Builder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev181109.lsp.db.version.tlv.LspDbVersion;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev181109.lsp.db.version.tlv.LspDbVersionBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev181109.speaker.entity.id.tlv.SpeakerEntityIdBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev181109.Lsp1;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev181109.Lsp1Builder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev181109.Srp1;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev181109.Srp1Builder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.OperationalStatus;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.PlspId;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.SrpIdNumber;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.Tlvs1;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.Tlvs1Builder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.Tlvs2;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.Tlvs2Builder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.lsp.error.code.tlv.LspErrorCode;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.lsp.error.code.tlv.LspErrorCodeBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.lsp.identifiers.tlv.LspIdentifiers;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.lsp.identifiers.tlv.LspIdentifiersBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.lsp.identifiers.tlv.lsp.identifiers.address.family.Ipv4CaseBuilder;
59 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;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.lsp.object.LspBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.rsvp.error.spec.tlv.RsvpErrorSpec;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.rsvp.error.spec.tlv.RsvpErrorSpecBuilder;
63 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;
64 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;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.srp.object.SrpBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.srp.object.srp.TlvsBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.stateful.capability.tlv.Stateful;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.stateful.capability.tlv.StatefulBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.symbolic.path.name.tlv.SymbolicPathName;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.symbolic.path.name.tlv.SymbolicPathNameBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.ProtocolVersion;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.lspa.object.Lspa;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.lspa.object.LspaBuilder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.path.setup.type.tlv.PathSetupTypeBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.AttributeFilter;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.Ipv4ExtendedTunnelId;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.LspId;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.TunnelId;
79
80 public class PCEPObjectParserTest {
81
82     private SimplePCEPExtensionProviderContext ctx;
83     private BaseParserExtensionActivator act;
84
85     private TlvRegistry tlvRegistry;
86     private VendorInformationTlvRegistry viTlvRegistry;
87
88     private static final byte[] DB_VERSION = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
89     private static final byte[] SPEAKER_ID = {0x01, 0x02, 0x03, 0x04};
90
91     @Before
92     public void setUp() {
93         this.ctx = new SimplePCEPExtensionProviderContext();
94         this.act = new BaseParserExtensionActivator();
95         this.act.start(this.ctx);
96         this.tlvRegistry = ServiceLoaderPCEPExtensionProviderContext.create().getTlvHandlerRegistry();
97         this.viTlvRegistry = ServiceLoaderPCEPExtensionProviderContext.getSingletonInstance()
98                 .getVendorInformationTlvRegistry();
99     }
100
101     @Test
102     public void testOpenObjectWithTLV() throws PCEPDeserializerException, IOException {
103         try (SyncOptimizationsActivator a = new SyncOptimizationsActivator()) {
104             a.start(this.ctx);
105
106             final SyncOptimizationsOpenObjectParser parser = new SyncOptimizationsOpenObjectParser(
107                 this.ctx.getTlvHandlerRegistry(), this.ctx.getVendorInformationTlvRegistry());
108             final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes(
109                 "src/test/resources/PCEPOpenObject1.bin"));
110
111             final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.object
112                 .OpenBuilder builder = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types
113                     .rev181109.open.object.OpenBuilder();
114             builder.setProcessingRule(false);
115             builder.setIgnore(false);
116             builder.setVersion(new ProtocolVersion((short) 1));
117             builder.setKeepalive((short) 30);
118             builder.setDeadTimer((short) 120);
119             builder.setSessionId((short) 1);
120
121             final Stateful tlv1 = new StatefulBuilder().setLspUpdateCapability(Boolean.TRUE)
122                     .addAugmentation(Stateful1.class, new Stateful1Builder().build()).build();
123
124             final Tlvs1Builder statBuilder = new Tlvs1Builder();
125             statBuilder.setStateful(tlv1);
126
127             final Tlvs3Builder syncOptBuilder = new Tlvs3Builder();
128             syncOptBuilder.setLspDbVersion(new LspDbVersionBuilder()
129                 .setLspDbVersionValue(new BigInteger(DB_VERSION)).build());
130             syncOptBuilder.setSpeakerEntityId(new SpeakerEntityIdBuilder().setSpeakerEntityIdValue(SPEAKER_ID).build());
131
132             builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109
133                 .open.object.open.TlvsBuilder()
134                 .addAugmentation(Tlvs1.class, statBuilder.build())
135                 .addAugmentation(Tlvs3.class, syncOptBuilder.build())
136                 .build());
137
138             assertEquals(builder.build(), parser.parseObject(
139                 new ObjectHeaderImpl(false, false), result.slice(4, result.readableBytes() - 4)));
140             final ByteBuf buf = Unpooled.buffer();
141             parser.serializeObject(builder.build(), buf);
142             assertArrayEquals(result.array(), ByteArray.getAllBytes(buf));
143         }
144     }
145
146     @Test
147     public void testLspObjectWithTLV() throws IOException, PCEPDeserializerException {
148         try (StatefulActivator a = new StatefulActivator();
149             SyncOptimizationsActivator a2 = new SyncOptimizationsActivator()) {
150             a.start(this.ctx);
151             a2.start(this.ctx);
152
153             final SyncOptimizationsLspObjectParser parser = new SyncOptimizationsLspObjectParser(
154                 this.ctx.getTlvHandlerRegistry(), this.ctx.getVendorInformationTlvRegistry());
155             final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes(
156                 "src/test/resources/PCEPLspObject1WithTLV.bin"));
157
158             final LspBuilder builder = new LspBuilder();
159             builder.setProcessingRule(true);
160             builder.setIgnore(true);
161             builder.setAdministrative(true);
162             builder.setDelegate(false);
163             builder.setRemove(true);
164             builder.setSync(false);
165             builder.addAugmentation(Lsp1.class, new Lsp1Builder().setCreate(false).build());
166             builder.setOperational(OperationalStatus.GoingDown);
167             builder.setPlspId(new PlspId(0x12345L));
168
169             final LspErrorCode tlv1 = new LspErrorCodeBuilder().setErrorCode(627610883L).build();
170             final SymbolicPathName tlv2 = new SymbolicPathNameBuilder().setPathName(
171                     new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109
172                         .SymbolicPathName("Med".getBytes())).build();
173             final LspDbVersion lspDbVersion = new LspDbVersionBuilder().setLspDbVersionValue(new BigInteger(DB_VERSION))
174                     .build();
175             builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful
176                 .rev181109.lsp.object.lsp.TlvsBuilder().setLspErrorCode(tlv1).setSymbolicPathName(tlv2)
177                     .addAugmentation(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep
178                         .sync.optimizations.rev181109.Tlvs1.class, new org.opendaylight.yang.gen.v1.urn.opendaylight
179                             .params.xml.ns.yang.controller.pcep.sync.optimizations.rev181109.Tlvs1Builder()
180                             .setLspDbVersion(lspDbVersion).build())
181                     .build());
182
183             assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true),
184                 result.slice(4, result.readableBytes() - 4)));
185             final ByteBuf buf = Unpooled.buffer();
186             parser.serializeObject(builder.build(), buf);
187             assertArrayEquals(result.array(),ByteArray.getAllBytes(buf));
188         }
189     }
190
191     @Test
192     public void testStateful07LspObjectWithTlv() throws IOException, PCEPDeserializerException {
193         final Stateful07LspObjectParser parser = new Stateful07LspObjectParser(this.tlvRegistry, this.viTlvRegistry);
194         final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes(
195             "src/test/resources/PCEPLspObject2WithTLV.bin"));
196
197         final LspBuilder builder = new LspBuilder();
198         builder.setProcessingRule(true);
199         builder.setIgnore(true);
200         builder.setAdministrative(true);
201         builder.setDelegate(false);
202         builder.setRemove(true);
203         builder.setSync(false);
204         builder.setOperational(OperationalStatus.GoingDown);
205         builder.setPlspId(new PlspId(0x12345L));
206
207         final LspErrorCode tlv1 = new LspErrorCodeBuilder().setErrorCode(627610883L).build();
208         final SymbolicPathName tlv2 = new SymbolicPathNameBuilder().setPathName(
209                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109
210                     .SymbolicPathName("Med".getBytes())).build();
211         final Ipv4Builder afi = new Ipv4Builder();
212         afi.setIpv4TunnelSenderAddress(Ipv4Util.noZoneAddressForByteBuf(Unpooled.wrappedBuffer(
213             new byte[] { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78 })));
214         afi.setIpv4ExtendedTunnelId(new Ipv4ExtendedTunnelId(Ipv4Util.noZoneAddressForByteBuf(Unpooled.wrappedBuffer(
215             new byte[] { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78 }))));
216         afi.setIpv4TunnelEndpointAddress(Ipv4Util.noZoneAddressForByteBuf(Unpooled.wrappedBuffer(
217             new byte[] { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78 })));
218         final LspIdentifiers tlv3 = new LspIdentifiersBuilder()
219                 .setAddressFamily(new Ipv4CaseBuilder().setIpv4(afi.build()).build())
220                 .setLspId(new LspId(65535L)).setTunnelId(new TunnelId(4660)).build();
221         final RsvpErrorBuilder rsvpBuilder = new RsvpErrorBuilder();
222         rsvpBuilder.setNode(new IpAddressNoZone(Ipv4Util.noZoneAddressForByteBuf(Unpooled.wrappedBuffer(
223             new byte[] { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78 }))));
224         rsvpBuilder.setFlags(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820
225             .ErrorSpec.Flags(false, true));
226         rsvpBuilder.setCode((short) 146);
227         rsvpBuilder.setValue(5634);
228         final RsvpErrorSpec tlv4 = new RsvpErrorSpecBuilder()
229                 .setErrorType(new RsvpCaseBuilder().setRsvpError(rsvpBuilder.build()).build()).build();
230         builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful
231             .rev181109.lsp.object.lsp.TlvsBuilder().setLspErrorCode(tlv1).setSymbolicPathName(tlv2)
232             .setLspIdentifiers(tlv3).setRsvpErrorSpec(tlv4).build());
233         assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true),
234             result.slice(4, result.readableBytes() - 4)));
235         final ByteBuf buf = Unpooled.buffer();
236         parser.serializeObject(builder.build(), buf);
237         assertArrayEquals(result.array(),ByteArray.getAllBytes(buf));
238     }
239
240     @Test
241     public void testLspaObject() throws IOException, PCEPDeserializerException {
242         final Stateful07LspaObjectParser parser = new Stateful07LspaObjectParser(this.tlvRegistry, this.viTlvRegistry);
243         final LspaBuilder builder = new LspaBuilder();
244         final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes(
245             "src/test/resources/PCEPLspaObject3RandVals.bin"));
246
247         final SymbolicPathName tlv = new SymbolicPathNameBuilder().setPathName(
248                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109
249                     .SymbolicPathName(new byte[] {
250                         (byte) 0x4d, (byte) 0x65, (byte) 0x64, (byte) 0x20, (byte) 0x74, (byte) 0x65, (byte) 0x73,
251                         (byte) 0x74, (byte) 0x20, (byte) 0x6f, (byte) 0x66, (byte) 0x20, (byte) 0x73, (byte) 0x79,
252                         (byte) 0x6d, (byte) 0x62, (byte) 0x6f, (byte) 0x6c, (byte) 0x69, (byte) 0x63, (byte) 0x20,
253                         (byte) 0x6e, (byte) 0x61, (byte) 0x6d, (byte) 0x65 })).build();
254
255         builder.setIgnore(false);
256         builder.setProcessingRule(false);
257         builder.setExcludeAny(new AttributeFilter(0x20A1FEE3L));
258         builder.setIncludeAny(new AttributeFilter(0x1A025CC7L));
259         builder.setIncludeAll(new AttributeFilter(0x2BB66532L));
260         builder.setHoldPriority((short) 0x02);
261         builder.setSetupPriority((short) 0x03);
262         builder.setLocalProtectionDesired(true);
263         builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.lspa
264             .object.lspa.TlvsBuilder().addAugmentation(Tlvs2.class,
265                 new Tlvs2Builder().setSymbolicPathName(tlv).build()).build());
266
267         // Tlvs container does not contain toString
268         final Object o = parser.parseObject(new ObjectHeaderImpl(true, true),
269             result.slice(4, result.readableBytes() - 4));
270         assertEquals(tlv, ((Lspa) o).getTlvs().augmentation(Tlvs2.class).getSymbolicPathName());
271         // assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), ByteArray.cutBytes(result,
272         // 4)));
273         final ByteBuf buf = Unpooled.buffer();
274         parser.serializeObject(builder.build(), buf);
275         assertArrayEquals(result.array(),ByteArray.getAllBytes(buf));
276     }
277
278     @Test
279     public void testSrpObject() throws PCEPDeserializerException {
280         final CInitiated00SrpObjectParser parser = new CInitiated00SrpObjectParser(this.tlvRegistry,
281             this.viTlvRegistry);
282         final ByteBuf result = Unpooled.wrappedBuffer(new byte[] {
283             (byte) 0x21, (byte) 0x10, (byte) 0x00, (byte) 0x0c, 0, 0, 0, (byte) 0x01, 0, 0, 0, (byte) 0x01
284         });
285
286         final SrpBuilder builder = new SrpBuilder();
287         builder.setProcessingRule(false);
288         builder.setIgnore(false);
289         builder.setOperationId(new SrpIdNumber(1L));
290         builder.addAugmentation(Srp1.class, new Srp1Builder().setRemove(true).build());
291         builder.setTlvs(new TlvsBuilder().build());
292
293         assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false),
294             result.slice(4, result.readableBytes() - 4)));
295         final ByteBuf buf = Unpooled.buffer();
296         parser.serializeObject(builder.build(), buf);
297         assertArrayEquals(result.array(),ByteArray.getAllBytes(buf));
298     }
299
300     @Test
301     public void testSRPObjectWithPSTTlv() throws PCEPDeserializerException {
302         final byte[] srpObjectWithPstTlvBytes = { 0x21, 0x10, 0x00, 0x14, 0x0, 0x0, 0x0, 0x01, 0x0, 0x0,
303             0x0, 0x01,
304             /* pst-tlv */
305             0x0, 0x1C, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0 };
306         final CInitiated00SrpObjectParser parser = new CInitiated00SrpObjectParser(this.tlvRegistry,
307             this.viTlvRegistry);
308         final SrpBuilder builder = new SrpBuilder();
309         builder.setProcessingRule(false);
310         builder.setIgnore(false);
311         builder.setOperationId(new SrpIdNumber(1L));
312         builder.addAugmentation(Srp1.class, new Srp1Builder().setRemove(true).build());
313         builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful
314             .rev181109.srp.object.srp.TlvsBuilder()
315                 .setPathSetupType(new PathSetupTypeBuilder().setPst((short) 0).build()).build());
316
317         final ByteBuf result = Unpooled.wrappedBuffer(srpObjectWithPstTlvBytes);
318         assertEquals(builder.build(),
319                 parser.parseObject(new ObjectHeaderImpl(false, false), result.slice(4, result.readableBytes() - 4)));
320         final ByteBuf buf = Unpooled.buffer();
321         parser.serializeObject(builder.build(), buf);
322         assertArrayEquals(srpObjectWithPstTlvBytes, ByteArray.getAllBytes(buf));
323     }
324 }