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.PCEPDeserializerException;
19 import org.opendaylight.protocol.pcep.ietf.initiated.InitiatedSrpObjectParser;
20 import org.opendaylight.protocol.pcep.ietf.stateful.StatefulActivator;
21 import org.opendaylight.protocol.pcep.ietf.stateful.StatefulLspObjectParser;
22 import org.opendaylight.protocol.pcep.parser.BaseParserExtensionActivator;
23 import org.opendaylight.protocol.pcep.spi.ObjectHeaderImpl;
24 import org.opendaylight.protocol.pcep.spi.TlvRegistry;
25 import org.opendaylight.protocol.pcep.spi.VendorInformationTlvRegistry;
26 import org.opendaylight.protocol.pcep.spi.pojo.SimplePCEPExtensionProviderContext;
27 import org.opendaylight.protocol.pcep.sync.optimizations.SyncOptimizationsActivator;
28 import org.opendaylight.protocol.pcep.sync.optimizations.SyncOptimizationsLspObjectParser;
29 import org.opendaylight.protocol.pcep.sync.optimizations.SyncOptimizationsOpenObjectParser;
30 import org.opendaylight.protocol.util.ByteArray;
31 import org.opendaylight.protocol.util.Ipv4Util;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressNoZone;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev200720.Stateful1Builder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev200720.Tlvs3Builder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev200720.lsp.db.version.tlv.LspDbVersion;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev200720.lsp.db.version.tlv.LspDbVersionBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev200720.speaker.entity.id.tlv.SpeakerEntityIdBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.Lsp1Builder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.Srp1Builder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.OperationalStatus;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.PlspId;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.SrpIdNumber;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.Tlvs1Builder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.error.code.tlv.LspErrorCode;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.error.code.tlv.LspErrorCodeBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.identifiers.tlv.LspIdentifiers;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.identifiers.tlv.LspIdentifiersBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.identifiers.tlv.lsp.identifiers.address.family.Ipv4CaseBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.identifiers.tlv.lsp.identifiers.address.family.ipv4._case.Ipv4Builder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.object.LspBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.rsvp.error.spec.tlv.RsvpErrorSpec;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.rsvp.error.spec.tlv.RsvpErrorSpecBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.rsvp.error.spec.tlv.rsvp.error.spec.error.type.RsvpCaseBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.rsvp.error.spec.tlv.rsvp.error.spec.error.type.rsvp._case.RsvpErrorBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.srp.object.SrpBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.srp.object.srp.TlvsBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.stateful.capability.tlv.Stateful;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.stateful.capability.tlv.StatefulBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.symbolic.path.name.tlv.SymbolicPathName;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.symbolic.path.name.tlv.SymbolicPathNameBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.ProtocolVersion;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.path.setup.type.tlv.PathSetupTypeBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.Ipv4ExtendedTunnelId;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.LspId;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.TunnelId;
66 import org.opendaylight.yangtools.yang.common.Uint16;
67 import org.opendaylight.yangtools.yang.common.Uint32;
68 import org.opendaylight.yangtools.yang.common.Uint64;
69 import org.opendaylight.yangtools.yang.common.Uint8;
71 public class PCEPObjectParserTest {
72 private static final Uint64 DB_VERSION = Uint64.valueOf("0102030405060708", 16);
73 private static final byte[] SPEAKER_ID = {0x01, 0x02, 0x03, 0x04};
75 private final SimplePCEPExtensionProviderContext ctx = new SimplePCEPExtensionProviderContext();
76 private final TlvRegistry tlvRegistry = ctx.getTlvHandlerRegistry();
77 private final VendorInformationTlvRegistry viTlvRegistry = ctx.getVendorInformationTlvRegistry();
81 new BaseParserExtensionActivator().start(ctx);
85 public void testOpenObjectWithTLV() throws PCEPDeserializerException, IOException {
86 new SyncOptimizationsActivator().start(ctx);
88 final SyncOptimizationsOpenObjectParser parser = new SyncOptimizationsOpenObjectParser(
89 ctx.getTlvHandlerRegistry(), ctx.getVendorInformationTlvRegistry());
90 final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes(
91 "src/test/resources/PCEPOpenObject1.bin"));
93 final var builder = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109
94 .open.object.OpenBuilder()
95 .setProcessingRule(false)
97 .setVersion(new ProtocolVersion(Uint8.ONE))
98 .setKeepalive(Uint8.valueOf(30))
99 .setDeadTimer(Uint8.valueOf(120))
100 .setSessionId(Uint8.ONE);
102 final Stateful tlv1 = new StatefulBuilder().setLspUpdateCapability(Boolean.TRUE)
103 .addAugmentation(new Stateful1Builder().build()).build();
105 final Tlvs1Builder statBuilder = new Tlvs1Builder();
106 statBuilder.setStateful(tlv1);
108 final Tlvs3Builder syncOptBuilder = new Tlvs3Builder()
109 .setLspDbVersion(new LspDbVersionBuilder().setLspDbVersionValue(DB_VERSION).build())
110 .setSpeakerEntityId(new SpeakerEntityIdBuilder().setSpeakerEntityIdValue(SPEAKER_ID).build());
112 builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109
113 .open.object.open.TlvsBuilder()
114 .addAugmentation(statBuilder.build())
115 .addAugmentation(syncOptBuilder.build())
118 assertEquals(builder.build(), parser.parseObject(
119 new ObjectHeaderImpl(false, false), result.slice(4, result.readableBytes() - 4)));
120 final ByteBuf buf = Unpooled.buffer();
121 parser.serializeObject(builder.build(), buf);
122 assertArrayEquals(result.array(), ByteArray.getAllBytes(buf));
126 public void testLspObjectWithTLV() throws IOException, PCEPDeserializerException {
127 new StatefulActivator().start(ctx);
128 new SyncOptimizationsActivator().start(ctx);
130 final SyncOptimizationsLspObjectParser parser = new SyncOptimizationsLspObjectParser(
131 ctx.getTlvHandlerRegistry(), ctx.getVendorInformationTlvRegistry());
132 final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes(
133 "src/test/resources/PCEPLspObject1WithTLV.bin"));
135 final LspBuilder builder = new LspBuilder()
136 .setProcessingRule(true)
138 .setAdministrative(true)
142 .addAugmentation(new Lsp1Builder().setCreate(false).build())
143 .setOperational(OperationalStatus.GoingDown)
144 .setPlspId(new PlspId(Uint32.valueOf(0x12345)));
146 final LspErrorCode tlv1 = new LspErrorCodeBuilder().setErrorCode(Uint32.valueOf(627610883)).build();
147 final SymbolicPathName tlv2 = new SymbolicPathNameBuilder().setPathName(
148 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720
149 .SymbolicPathName("Med".getBytes())).build();
150 final LspDbVersion lspDbVersion = new LspDbVersionBuilder().setLspDbVersionValue(DB_VERSION).build();
151 builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful
152 .rev200720.lsp.object.lsp.TlvsBuilder().setLspErrorCode(tlv1).setSymbolicPathName(tlv2)
153 .addAugmentation(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller
154 .pcep.sync.optimizations.rev200720.Tlvs1Builder().setLspDbVersion(lspDbVersion).build())
157 assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true),
158 result.slice(4, result.readableBytes() - 4)));
159 final ByteBuf buf = Unpooled.buffer();
160 parser.serializeObject(builder.build(), buf);
161 assertArrayEquals(result.array(),ByteArray.getAllBytes(buf));
165 public void testStatefulLspObjectWithTlv() throws IOException, PCEPDeserializerException {
166 new StatefulActivator().start(ctx);
168 final StatefulLspObjectParser parser = new StatefulLspObjectParser(tlvRegistry, viTlvRegistry);
169 final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes(
170 "src/test/resources/PCEPLspObject2WithTLV.bin"));
172 final LspBuilder builder = new LspBuilder()
173 .setProcessingRule(true)
175 .setAdministrative(true)
179 .setOperational(OperationalStatus.GoingDown)
180 .setPlspId(new PlspId(Uint32.valueOf(0x12345)));
182 final LspErrorCode tlv1 = new LspErrorCodeBuilder().setErrorCode(Uint32.valueOf(627610883)).build();
183 final SymbolicPathName tlv2 = new SymbolicPathNameBuilder().setPathName(
184 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720
185 .SymbolicPathName("Med".getBytes())).build();
186 final LspIdentifiers tlv3 = new LspIdentifiersBuilder()
187 .setAddressFamily(new Ipv4CaseBuilder()
188 .setIpv4(new Ipv4Builder()
189 .setIpv4TunnelSenderAddress(Ipv4Util.addressForByteBuf(Unpooled.wrappedBuffer(
190 new byte[] { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78 })))
191 .setIpv4ExtendedTunnelId(new Ipv4ExtendedTunnelId(Ipv4Util.addressForByteBuf(
192 Unpooled.wrappedBuffer(new byte[] { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78 }))))
193 .setIpv4TunnelEndpointAddress(Ipv4Util.addressForByteBuf(Unpooled.wrappedBuffer(
194 new byte[] { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78 })))
197 .setLspId(new LspId(Uint32.valueOf(65535))).setTunnelId(new TunnelId(Uint16.valueOf(4660)))
199 final RsvpErrorSpec tlv4 = new RsvpErrorSpecBuilder()
200 .setErrorType(new RsvpCaseBuilder()
201 .setRsvpError(new RsvpErrorBuilder()
202 .setNode(new IpAddressNoZone(Ipv4Util.addressForByteBuf(Unpooled.wrappedBuffer(
203 new byte[] { (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0x78 }))))
204 .setFlags(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820
205 .ErrorSpec.Flags(false, true))
206 .setCode(Uint8.valueOf(146))
207 .setValue(Uint16.valueOf(5634))
211 builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful
212 .rev200720.lsp.object.lsp.TlvsBuilder().setLspErrorCode(tlv1).setSymbolicPathName(tlv2)
213 .setLspIdentifiers(tlv3).setRsvpErrorSpec(tlv4).build());
214 assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true),
215 result.slice(4, result.readableBytes() - 4)));
216 final ByteBuf buf = Unpooled.buffer();
217 parser.serializeObject(builder.build(), buf);
218 assertArrayEquals(result.array(),ByteArray.getAllBytes(buf));
222 public void testSrpObject() throws PCEPDeserializerException {
223 final InitiatedSrpObjectParser parser = new InitiatedSrpObjectParser(tlvRegistry,
225 final ByteBuf result = Unpooled.wrappedBuffer(new byte[] {
226 (byte) 0x21, (byte) 0x10, (byte) 0x00, (byte) 0x0c, 0, 0, 0, (byte) 0x01, 0, 0, 0, (byte) 0x01
229 final SrpBuilder builder = new SrpBuilder()
230 .setProcessingRule(false)
232 .setOperationId(new SrpIdNumber(Uint32.ONE))
233 .addAugmentation(new Srp1Builder().setRemove(true).build())
234 .setTlvs(new TlvsBuilder().build());
236 assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false),
237 result.slice(4, result.readableBytes() - 4)));
238 final ByteBuf buf = Unpooled.buffer();
239 parser.serializeObject(builder.build(), buf);
240 assertArrayEquals(result.array(),ByteArray.getAllBytes(buf));
244 public void testSRPObjectWithPSTTlv() throws PCEPDeserializerException {
245 final byte[] srpObjectWithPstTlvBytes = { 0x21, 0x10, 0x00, 0x14, 0x0, 0x0, 0x0, 0x01, 0x0, 0x0,
248 0x0, 0x1C, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0 };
249 final InitiatedSrpObjectParser parser = new InitiatedSrpObjectParser(tlvRegistry,
251 final SrpBuilder builder = new SrpBuilder()
252 .setProcessingRule(false)
254 .setOperationId(new SrpIdNumber(Uint32.ONE))
255 .addAugmentation(new Srp1Builder().setRemove(true).build())
256 .setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful
257 .rev200720.srp.object.srp.TlvsBuilder()
258 .setPathSetupType(new PathSetupTypeBuilder().setPst(Uint8.ZERO).build()).build());
260 final ByteBuf result = Unpooled.wrappedBuffer(srpObjectWithPstTlvBytes);
261 assertEquals(builder.build(),
262 parser.parseObject(new ObjectHeaderImpl(false, false), result.slice(4, result.readableBytes() - 4)));
263 final ByteBuf buf = Unpooled.buffer();
264 parser.serializeObject(builder.build(), buf);
265 assertArrayEquals(srpObjectWithPstTlvBytes, ByteArray.getAllBytes(buf));