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