Promote MessageRegistry to pcep-api
[bgpcep.git] / pcep / ietf-stateful / 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 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;
70
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};
74
75     private final SimplePCEPExtensionProviderContext ctx = new SimplePCEPExtensionProviderContext();
76     private final TlvRegistry tlvRegistry = ctx.getTlvHandlerRegistry();
77     private final VendorInformationTlvRegistry viTlvRegistry = ctx.getVendorInformationTlvRegistry();
78
79     @Before
80     public void setUp() {
81         new BaseParserExtensionActivator().start(ctx);
82     }
83
84     @Test
85     public void testOpenObjectWithTLV() throws PCEPDeserializerException, IOException {
86         new SyncOptimizationsActivator().start(ctx);
87
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"));
92
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)
96                 .setIgnore(false)
97                 .setVersion(new ProtocolVersion(Uint8.ONE))
98                 .setKeepalive(Uint8.valueOf(30))
99                 .setDeadTimer(Uint8.valueOf(120))
100                 .setSessionId(Uint8.ONE);
101
102         final Stateful tlv1 = new StatefulBuilder().setLspUpdateCapability(Boolean.TRUE)
103             .addAugmentation(new Stateful1Builder().build()).build();
104
105         final Tlvs1Builder statBuilder = new Tlvs1Builder();
106         statBuilder.setStateful(tlv1);
107
108         final Tlvs3Builder syncOptBuilder = new Tlvs3Builder()
109             .setLspDbVersion(new LspDbVersionBuilder().setLspDbVersionValue(DB_VERSION).build())
110             .setSpeakerEntityId(new SpeakerEntityIdBuilder().setSpeakerEntityIdValue(SPEAKER_ID).build());
111
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())
116             .build());
117
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));
123     }
124
125     @Test
126     public void testLspObjectWithTLV() throws IOException, PCEPDeserializerException {
127         new StatefulActivator().start(ctx);
128         new SyncOptimizationsActivator().start(ctx);
129
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"));
134
135         final LspBuilder builder = new LspBuilder()
136             .setProcessingRule(true)
137             .setIgnore(true)
138             .setAdministrative(true)
139             .setDelegate(false)
140             .setRemove(true)
141             .setSync(false)
142             .addAugmentation(new Lsp1Builder().setCreate(false).build())
143             .setOperational(OperationalStatus.GoingDown)
144             .setPlspId(new PlspId(Uint32.valueOf(0x12345)));
145
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())
155             .build());
156
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));
162     }
163
164     @Test
165     public void testStatefulLspObjectWithTlv() throws IOException, PCEPDeserializerException {
166         new StatefulActivator().start(ctx);
167
168         final StatefulLspObjectParser parser = new StatefulLspObjectParser(tlvRegistry, viTlvRegistry);
169         final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes(
170             "src/test/resources/PCEPLspObject2WithTLV.bin"));
171
172         final LspBuilder builder = new LspBuilder()
173                 .setProcessingRule(true)
174                 .setIgnore(true)
175                 .setAdministrative(true)
176                 .setDelegate(false)
177                 .setRemove(true)
178                 .setSync(false)
179                 .setOperational(OperationalStatus.GoingDown)
180                 .setPlspId(new PlspId(Uint32.valueOf(0x12345)));
181
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 })))
195                         .build())
196                     .build())
197                 .setLspId(new LspId(Uint32.valueOf(65535))).setTunnelId(new TunnelId(Uint16.valueOf(4660)))
198                 .build();
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))
208                         .build())
209                     .build())
210                 .build();
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));
219     }
220
221     @Test
222     public void testSrpObject() throws PCEPDeserializerException {
223         final InitiatedSrpObjectParser parser = new InitiatedSrpObjectParser(tlvRegistry,
224             viTlvRegistry);
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
227         });
228
229         final SrpBuilder builder = new SrpBuilder()
230                 .setProcessingRule(false)
231                 .setIgnore(false)
232                 .setOperationId(new SrpIdNumber(Uint32.ONE))
233                 .addAugmentation(new Srp1Builder().setRemove(true).build())
234                 .setTlvs(new TlvsBuilder().build());
235
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));
241     }
242
243     @Test
244     public void testSRPObjectWithPSTTlv() throws PCEPDeserializerException {
245         final byte[] srpObjectWithPstTlvBytes = { 0x21, 0x10, 0x00, 0x14, 0x0, 0x0, 0x0, 0x01, 0x0, 0x0,
246             0x0, 0x01,
247             /* pst-tlv */
248             0x0, 0x1C, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0 };
249         final InitiatedSrpObjectParser parser = new InitiatedSrpObjectParser(tlvRegistry,
250             viTlvRegistry);
251         final SrpBuilder builder = new SrpBuilder()
252                 .setProcessingRule(false)
253                 .setIgnore(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());
259
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));
266     }
267 }