Promote MessageRegistry to pcep-api
[bgpcep.git] / pcep / ietf-stateful / src / test / java / org / opendaylight / protocol / pcep / ietf / PCEPValidatorTest.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.assertFalse;
13
14 import com.google.common.collect.Lists;
15 import io.netty.buffer.ByteBuf;
16 import io.netty.buffer.Unpooled;
17 import java.io.IOException;
18 import java.util.ArrayList;
19 import java.util.Collections;
20 import java.util.List;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.opendaylight.protocol.pcep.PCEPDeserializerException;
24 import org.opendaylight.protocol.pcep.ietf.initiated.InitiatedActivator;
25 import org.opendaylight.protocol.pcep.ietf.initiated.InitiatedPCInitiateMessageParser;
26 import org.opendaylight.protocol.pcep.ietf.stateful.StatefulActivator;
27 import org.opendaylight.protocol.pcep.ietf.stateful.StatefulErrorMessageParser;
28 import org.opendaylight.protocol.pcep.ietf.stateful.StatefulPCReportMessageParser;
29 import org.opendaylight.protocol.pcep.ietf.stateful.StatefulPCRequestMessageParser;
30 import org.opendaylight.protocol.pcep.ietf.stateful.StatefulPCUpdateRequestMessageParser;
31 import org.opendaylight.protocol.pcep.parser.BaseParserExtensionActivator;
32 import org.opendaylight.protocol.pcep.parser.message.PCEPOpenMessageParser;
33 import org.opendaylight.protocol.pcep.spi.pojo.SimplePCEPExtensionProviderContext;
34 import org.opendaylight.protocol.pcep.sync.optimizations.SyncOptimizationsActivator;
35 import org.opendaylight.protocol.util.ByteArray;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ieee754.rev130819.Float32;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.network.concepts.rev131125.Bandwidth;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.Lsp1Builder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.PcinitiateBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.Srp1Builder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.pcinitiate.message.PcinitiateMessageBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.pcinitiate.message.pcinitiate.message.RequestsBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.OperationalStatus;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.P2p1Builder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.PcrptBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.PcupdBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.PlspId;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.SrpIdNumber;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.Tlvs1Builder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.identifiers.tlv.LspIdentifiersBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.identifiers.tlv.lsp.identifiers.address.family.Ipv4CaseBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.object.Lsp;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.object.LspBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.lsp.object.lsp.TlvsBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.pcerr.pcerr.message.error.type.StatefulCaseBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.pcerr.pcerr.message.error.type.stateful._case.stateful.Srps;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.pcerr.pcerr.message.error.type.stateful._case.stateful.SrpsBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.pcrpt.message.PcrptMessageBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.pcrpt.message.pcrpt.message.Reports;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.pcrpt.message.pcrpt.message.ReportsBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.pcupd.message.PcupdMessageBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.pcupd.message.pcupd.message.UpdatesBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.pcupd.message.pcupd.message.updates.PathBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.srp.object.Srp;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.srp.object.SrpBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.stateful.capability.tlv.StatefulBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev181109.OpenBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev181109.PcerrBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev181109.Pcreq;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev181109.PcreqBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.Message;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.ProtocolVersion;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.RequestId;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.endpoints.address.family.ipv4._case.Ipv4Builder;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.explicit.route.object.Ero;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.explicit.route.object.EroBuilder;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.include.route.object.Iro;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.include.route.object.IroBuilder;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.include.route.object.iro.Subobject;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.include.route.object.iro.SubobjectBuilder;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.lsp.attributes.Metrics;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.lsp.attributes.MetricsBuilder;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.lspa.object.Lspa;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.lspa.object.LspaBuilder;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.metric.object.MetricBuilder;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.message.OpenMessageBuilder;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcep.error.object.ErrorObject;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcep.error.object.ErrorObjectBuilder;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcerr.message.PcerrMessageBuilder;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcerr.message.pcerr.message.Errors;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcerr.message.pcerr.message.ErrorsBuilder;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcerr.message.pcerr.message.error.type.RequestCaseBuilder;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcerr.message.pcerr.message.error.type.SessionCaseBuilder;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcerr.message.pcerr.message.error.type.request._case.RequestBuilder;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcerr.message.pcerr.message.error.type.session._case.SessionBuilder;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcreq.message.PcreqMessageBuilder;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcreq.message.pcreq.message.requests.SegmentComputationBuilder;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcreq.message.pcreq.message.requests.segment.computation.P2pBuilder;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.reported.route.object.Rro;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.reported.route.object.RroBuilder;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.rp.object.Rp;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.rp.object.RpBuilder;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.AttributeFilter;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.Ipv4ExtendedTunnelId;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.LspId;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.TunnelId;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820._record.route.subobjects.subobject.type.UnnumberedCase;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820._record.route.subobjects.subobject.type.UnnumberedCaseBuilder;
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820._record.route.subobjects.subobject.type.unnumbered._case.UnnumberedBuilder;
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.basic.explicit.route.subobjects.subobject.type.AsNumberCase;
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.basic.explicit.route.subobjects.subobject.type.AsNumberCaseBuilder;
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.basic.explicit.route.subobjects.subobject.type.as.number._case.AsNumberBuilder;
114 import org.opendaylight.yangtools.yang.common.Uint16;
115 import org.opendaylight.yangtools.yang.common.Uint32;
116 import org.opendaylight.yangtools.yang.common.Uint8;
117
118 public class PCEPValidatorTest {
119
120     private Lspa lspa;
121     private Metrics metrics;
122     private Iro iro;
123     private Ero ero;
124     private Rro rro;
125     private Srp srp;
126     private Lsp lsp;
127     private Lsp lspSrp;
128     private org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.bandwidth.object
129         .Bandwidth bandwidth;
130     private org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.reoptimization
131         .bandwidth.object.ReoptimizationBandwidth reoptimizationBandwidth;
132
133     private AsNumberCase eroASSubobject;
134     private UnnumberedCase rroUnnumberedSub;
135
136     private SimplePCEPExtensionProviderContext ctx;
137     private BaseParserExtensionActivator act;
138
139     private static final byte[] PCRT1 = {
140         (byte) 0x20, (byte) 0x0A, (byte) 0x00, (byte) 0x20,
141
142         (byte) 0x20, (byte) 0x10, (byte) 0x00, (byte) 0x1C,
143         (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, //Skip
144         (byte) 0x00, (byte) 0x12, (byte) 0x00, (byte) 0x10, //TLV Type + TLV Length
145         (byte) 0x7F, (byte) 0x00, (byte) 0x01, (byte) 0x01, //TLV 127.0.1.1
146         (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x01, //TLV LSP Id + Tunnel id
147         (byte) 0x7F, (byte) 0x00, (byte) 0x01, (byte) 0x02, //TLV Ipv4ExtendedTunnelId 127.0.1.2
148         (byte) 0x7F, (byte) 0x00, (byte) 0x01, (byte) 0x03, //TLV TunnelEndpointAddress 127.0.1.3
149     };
150
151     private static final byte[] PCRT2 = {
152         (byte) 0x20, (byte) 0x0A, (byte) 0x00, (byte) 0x3C,
153
154         (byte) 0x20, (byte) 0x10, (byte) 0x00, (byte) 0x1C, //(byte) 0x39,
155         (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, //Skip
156         (byte) 0x00, (byte) 0x12, (byte) 0x00, (byte) 0x10, //TLV Type + TLV Length
157         (byte) 0x7F, (byte) 0x00, (byte) 0x01, (byte) 0x01, //TLV 127.0.1.1
158         (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x01, //TLV LSP Id + Tunnel id
159         (byte) 0x7F, (byte) 0x00, (byte) 0x01, (byte) 0x02, //TLV Ipv4ExtendedTunnelId 127.0.1.2
160         (byte) 0x7F, (byte) 0x00, (byte) 0x01, (byte) 0x03, //TLV TunnelEndpointAddress 127.0.1.3
161
162         (byte) 0x07, (byte) 0x10, (byte) 0x00, (byte) 0x08,
163         (byte) 0x20, (byte) 0x04, (byte) 0xFF, (byte) 0xFF,
164         (byte) 0x09, (byte) 0x10, (byte) 0x00, (byte) 0x14,
165         (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
166         (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
167         (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
168         (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00
169     };
170
171     private static final byte[] PCRT3 = {
172         (byte) 0x20, (byte) 0x0A, (byte) 0x00, (byte) 0x4C,
173
174         (byte) 0x20, (byte) 0x10, (byte) 0x00, (byte) 0x1C, //(byte) 0x39,
175         (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, //Skip
176         (byte) 0x00, (byte) 0x12, (byte) 0x00, (byte) 0x10, //TLV Type + TLV Length
177         (byte) 0x7F, (byte) 0x00, (byte) 0x01, (byte) 0x01, //TLV 127.0.1.1
178         (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x01, //TLV LSP Id + Tunnel id
179         (byte) 0x7F, (byte) 0x00, (byte) 0x01, (byte) 0x02, //TLV Ipv4ExtendedTunnelId 127.0.1.2
180         (byte) 0x7F, (byte) 0x00, (byte) 0x01, (byte) 0x03, //TLV TunnelEndpointAddress 127.0.1.3
181
182         (byte) 0x07, (byte) 0x10, (byte) 0x00, (byte) 0x08,
183         (byte) 0x20, (byte) 0x04, (byte) 0xFF, (byte) 0xFF,
184         (byte) 0x09, (byte) 0x10, (byte) 0x00, (byte) 0x14,
185         (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
186         (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
187         (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
188         (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
189
190         (byte) 0x05, (byte) 0x10, (byte) 0x00, (byte) 0x08,
191         (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
192         (byte) 0x05, (byte) 0x20, (byte) 0x00, (byte) 0x08,
193         (byte) 0x47, (byte) 0x74, (byte) 0x24, (byte) 0x00
194     };
195
196     @Before
197     public void setUp() {
198         ctx = new SimplePCEPExtensionProviderContext();
199         act = new BaseParserExtensionActivator();
200         act.start(ctx);
201
202         lspa = new LspaBuilder()
203                 .setProcessingRule(false)
204                 .setIgnore(false)
205                 .setLocalProtectionDesired(false)
206                 .setHoldPriority(Uint8.ZERO)
207                 .setSetupPriority(Uint8.ZERO)
208                 .setExcludeAny(new AttributeFilter(Uint32.ZERO))
209                 .setIncludeAll(new AttributeFilter(Uint32.ZERO))
210                 .setIncludeAny(new AttributeFilter(Uint32.ZERO))
211                 .setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109
212                     .lspa.object.lspa.TlvsBuilder().build())
213                 .build();
214
215         metrics = new MetricsBuilder()
216                 .setMetric(new MetricBuilder()
217                     .setIgnore(false)
218                     .setProcessingRule(false)
219                     .setComputed(false)
220                     .setBound(false)
221                     .setMetricType(Uint8.ONE)
222                     .setValue(new Float32(new byte[4])).build())
223                 .build();
224
225         eroASSubobject = new AsNumberCaseBuilder().setAsNumber(new AsNumberBuilder().setAsNumber(
226             new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber(
227                 Uint32.valueOf(0xFFFF)))
228             .build()).build();
229
230         rroUnnumberedSub = new UnnumberedCaseBuilder()
231                 .setUnnumbered(new UnnumberedBuilder()
232                     .setRouterId(Uint32.valueOf(0x00112233L))
233                     .setInterfaceId(Uint32.valueOf(0x00ff00ffL))
234                     .build())
235                 .build();
236
237         final IroBuilder iroBuilder = new IroBuilder()
238                 .setIgnore(false)
239                 .setProcessingRule(false);
240         final List<Subobject> iroSubs = new ArrayList<>();
241         iroSubs.add(new SubobjectBuilder().setSubobjectType(eroASSubobject).setLoose(false).build());
242         iroBuilder.setSubobject(iroSubs);
243         iro = iroBuilder.build();
244
245         final EroBuilder eroBuilder = new EroBuilder();
246         eroBuilder.setIgnore(false);
247         eroBuilder.setProcessingRule(false);
248         final List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.explicit.route
249             .object.ero.Subobject> eroSubs = new ArrayList<>();
250         eroSubs.add(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.explicit
251             .route.object.ero.SubobjectBuilder().setSubobjectType(eroASSubobject).setLoose(false).build());
252         eroBuilder.setSubobject(eroSubs);
253         ero = eroBuilder.build();
254
255         final RroBuilder rroBuilder = new RroBuilder();
256         rroBuilder.setIgnore(false);
257         rroBuilder.setProcessingRule(false);
258         final List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.reported.route
259             .object.rro.Subobject> rroSubs = new ArrayList<>();
260         rroSubs.add(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.reported
261             .route.object.rro.SubobjectBuilder().setSubobjectType(rroUnnumberedSub).setProtectionAvailable(false)
262             .setProtectionInUse(false).build());
263         rroBuilder.setSubobject(rroSubs);
264         rro = rroBuilder.build();
265
266         srp = new SrpBuilder()
267                 .setIgnore(false)
268                 .setProcessingRule(false)
269                 .setOperationId(new SrpIdNumber(Uint32.ONE))
270                 .addAugmentation(new Srp1Builder().setRemove(false).build())
271                 .setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful
272                     .rev200720.srp.object.srp.TlvsBuilder().build())
273                 .build();
274
275         final LspBuilder lspBuilder = new LspBuilder()
276                 .setIgnore(false)
277                 .setProcessingRule(false)
278                 .setAdministrative(false)
279                 .setDelegate(false)
280                 .setPlspId(new PlspId(Uint32.ZERO))
281                 .setOperational(OperationalStatus.Down)
282                 .setSync(false)
283                 .setRemove(false)
284                 .setTlvs(new TlvsBuilder().build())
285                 .addAugmentation(new Lsp1Builder().setCreate(false).build());
286
287         lspSrp = lspBuilder.build();
288         lsp = lspBuilder.setTlvs(new TlvsBuilder()
289             .setLspIdentifiers(new LspIdentifiersBuilder()
290                 .setAddressFamily(new Ipv4CaseBuilder()
291                     .setIpv4(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful
292                         .rev200720.lsp.identifiers.tlv.lsp.identifiers.address.family.ipv4._case.Ipv4Builder()
293                             .setIpv4TunnelSenderAddress(new Ipv4AddressNoZone("127.0.1.1"))
294                             .setIpv4ExtendedTunnelId(new Ipv4ExtendedTunnelId(new Ipv4AddressNoZone("127.0.1.2")))
295                             .setIpv4TunnelEndpointAddress(new Ipv4AddressNoZone("127.0.1.3"))
296                             .build())
297                     .build())
298                 .setLspId(new LspId(Uint32.ONE))
299                 .setTunnelId(new TunnelId(Uint16.ONE))
300                 .build())
301             .build())
302             .build();
303
304         final Ipv4Builder afi = new Ipv4Builder()
305             .setSourceIpv4Address(new Ipv4AddressNoZone("255.255.255.255"))
306             .setDestinationIpv4Address(new Ipv4AddressNoZone("255.255.255.255"));
307
308         bandwidth = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109
309             .bandwidth.object.BandwidthBuilder()
310                 .setIgnore(false)
311                 .setProcessingRule(false)
312                 .setBandwidth(new Bandwidth(new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00 }))
313                 .build();
314
315         reoptimizationBandwidth = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types
316             .rev181109.reoptimization.bandwidth.object.ReoptimizationBandwidthBuilder()
317                 .setIgnore(false)
318                 .setProcessingRule(false)
319                 .setBandwidth(new Bandwidth(new byte[] { (byte) 0x47, (byte) 0x74, (byte) 0x24, (byte) 0x00 }))
320                 .build();
321     }
322
323     @Test
324     public void testOpenMsg() throws IOException, PCEPDeserializerException {
325         new StatefulActivator().start(ctx);
326
327         final ByteBuf result = Unpooled.wrappedBuffer(
328             ByteArray.fileToBytes("src/test/resources/PCEPOpenMessage1.bin"));
329         final PCEPOpenMessageParser parser = new PCEPOpenMessageParser(ctx.getObjectHandlerRegistry());
330         final OpenMessageBuilder builder = new OpenMessageBuilder()
331             .setOpen(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open
332                 .object.OpenBuilder()
333                 .setProcessingRule(false)
334             .setIgnore(false)
335             .setVersion(new ProtocolVersion(Uint8.ONE))
336             .setKeepalive(Uint8.valueOf(30))
337             .setDeadTimer(Uint8.valueOf(120))
338             .setSessionId(Uint8.ONE)
339             .setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109
340                 .open.object.open.TlvsBuilder()
341                     .addAugmentation(new Tlvs1Builder()
342                         .setStateful(new StatefulBuilder().setLspUpdateCapability(Boolean.TRUE).build())
343                         .build())
344                     .build())
345             .build());
346
347         assertEquals(new OpenBuilder().setOpenMessage(builder.build()).build(), parser.parseMessage(result.slice(4,
348             result.readableBytes() - 4), List.of()));
349         final ByteBuf buf = Unpooled.buffer(result.readableBytes());
350         parser.serializeMessage(new OpenBuilder().setOpenMessage(builder.build()).build(), buf);
351         assertArrayEquals(result.array(), buf.array());
352     }
353
354     @Test
355     public void testSyncOptActivator() {
356         new SyncOptimizationsActivator().start(ctx);
357     }
358
359     @Test
360     public void testReqMesgWithLSP() throws IOException, PCEPDeserializerException {
361         // Test PcRequest message with an LSP Object as per RFC8231
362         new StatefulActivator().start(ctx);
363
364         final Rp rp = new RpBuilder()
365                 .setProcessingRule(true)
366                 .setIgnore(false)
367                 .setReoptimization(false)
368                 .setBiDirectional(false)
369                 .setLoose(true)
370                 .setMakeBeforeBreak(false)
371                 .setOrder(false)
372                 .setPathKey(false)
373                 .setSupplyOf(false)
374                 .setFragmentation(false)
375                 .setP2mp(false)
376                 .setEroCompression(false)
377                 .setPriority(Uint8.ONE)
378                 .setRequestId(new RequestId(Uint32.TEN))
379                 .setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109
380                     .rp.object.rp.TlvsBuilder().build())
381                 .build();
382
383         final Lsp lspReq = new LspBuilder()
384                 .setIgnore(false)
385                 .setProcessingRule(false)
386                 .setAdministrative(false)
387                 .setDelegate(false)
388                 .setPlspId(new PlspId(Uint32.ZERO))
389                 .setOperational(OperationalStatus.Down)
390                 .setSync(false)
391                 .setRemove(false)
392                 .setTlvs(new TlvsBuilder().build())
393                 .build();
394
395         final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109
396             .endpoints.object.EndpointsObjBuilder epBuilder =
397                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109
398                     .endpoints.object.EndpointsObjBuilder()
399                 .setIgnore(false)
400                 .setProcessingRule(true)
401                 .setAddressFamily(
402                     new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109
403                             .endpoints.address.family.Ipv4CaseBuilder()
404                         .setIpv4(
405                             new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109
406                                     .endpoints.address.family.ipv4._case.Ipv4Builder()
407                                 .setSourceIpv4Address(new Ipv4AddressNoZone("255.255.255.255"))
408                                 .setDestinationIpv4Address(new Ipv4AddressNoZone("255.255.255.255"))
409                                 .build())
410                         .build());
411
412         final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109
413             .pcreq.message.pcreq.message.RequestsBuilder rBuilder =
414                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109
415                     .pcreq.message.pcreq.message.RequestsBuilder()
416                 .setRp(rp)
417                 .setSegmentComputation(new SegmentComputationBuilder().setP2p(new P2pBuilder()
418                 .setEndpointsObj(epBuilder.build()).addAugmentation(new P2p1Builder().setLsp(lspReq).build())
419                 .build()).build());
420
421         final List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109
422             .pcreq.message.pcreq.message.Requests> reqs = new ArrayList<>();
423         reqs.add(rBuilder.build());
424
425         final Pcreq pcReq = new PcreqBuilder()
426             .setPcreqMessage(new PcreqMessageBuilder().setRequests(reqs).build())
427             .build();
428
429         final StatefulPCRequestMessageParser parser = new StatefulPCRequestMessageParser(
430                 ctx.getObjectHandlerRegistry());
431         ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCReq.1.bin"));
432         assertEquals(pcReq, parser.parseMessage(result.slice(4, result.readableBytes() - 4), Collections.emptyList()));
433
434         ByteBuf buf = Unpooled.buffer(result.readableBytes());
435         parser.serializeMessage(pcReq, buf);
436         assertArrayEquals(result.array(), buf.array());
437     }
438
439     @Test
440     public void testUpdMsg() throws IOException, PCEPDeserializerException {
441         new InitiatedActivator().start(ctx);
442         final StatefulPCUpdateRequestMessageParser parser = new StatefulPCUpdateRequestMessageParser(
443             ctx.getObjectHandlerRegistry());
444
445         final PathBuilder pBuilder = new PathBuilder()
446             .setEro(ero)
447             .setLspa(lspa);
448         final PcupdMessageBuilder builder = new PcupdMessageBuilder()
449             .setUpdates(List.of(
450                 new UpdatesBuilder().setSrp(srp).setLsp(lspSrp).setPath(pBuilder.build()).build()));
451
452         ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCUpd.2.bin"));
453         assertEquals(new PcupdBuilder().setPcupdMessage(builder.build()).build(),
454             parser.parseMessage(result.slice(4, result.readableBytes() - 4), List.of()));
455         ByteBuf buf = Unpooled.buffer(result.readableBytes());
456         parser.serializeMessage(new PcupdBuilder().setPcupdMessage(builder.build()).build(), buf);
457         assertArrayEquals(result.array(), buf.array());
458
459         builder.setUpdates(List.of(
460             new UpdatesBuilder().setSrp(srp).setLsp(lspSrp).setPath(pBuilder.build()).build(),
461             new UpdatesBuilder().setSrp(srp).setLsp(lspSrp).setPath(new PathBuilder()
462                 .setEro(ero)
463                 .setLspa(lspa)
464                 .build())
465             .build()));
466
467         result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCUpd.5.bin"));
468         assertEquals(new PcupdBuilder().setPcupdMessage(builder.build()).build(),
469             parser.parseMessage(result.slice(4, result.readableBytes() - 4), List.of()));
470         buf = Unpooled.buffer(result.readableBytes());
471         parser.serializeMessage(new PcupdBuilder().setPcupdMessage(builder.build()).build(), buf);
472         assertArrayEquals(result.array(), buf.array());
473     }
474
475     @Test
476     public void testRptMsg() throws IOException, PCEPDeserializerException {
477         new InitiatedActivator().start(ctx);
478         new StatefulActivator().start(ctx);
479         ByteBuf result = Unpooled.wrappedBuffer(PCRT1);
480
481         final StatefulPCReportMessageParser parser = new StatefulPCReportMessageParser(
482             ctx.getObjectHandlerRegistry());
483
484         final PcrptMessageBuilder builder = new PcrptMessageBuilder();
485
486         final List<Reports> reports = new ArrayList<>();
487         reports.add(new ReportsBuilder().setLsp(lsp).build());
488         builder.setReports(reports);
489         final Message parseResult = parser.parseMessage(result.slice(4, result.readableBytes() - 4),
490             List.of());
491         assertEquals(new PcrptBuilder().setPcrptMessage(builder.build()).build(), parseResult);
492         ByteBuf buf = Unpooled.buffer(result.readableBytes());
493         parser.serializeMessage(new PcrptBuilder().setPcrptMessage(builder.build()).build(), buf);
494         assertArrayEquals(result.array(), buf.array());
495
496         result = Unpooled.wrappedBuffer(PCRT2);
497
498         builder.setReports(List.of(new ReportsBuilder()
499             .setLsp(lsp)
500             .setPath(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720
501                 .pcrpt.message.pcrpt.message.reports.PathBuilder()
502                     .setEro(ero)
503                     .setLspa(lspa)
504                     .build())
505             .build()));
506
507         final ByteBuf input = result.slice(4, result.readableBytes() - 4);
508         assertEquals(new PcrptBuilder().setPcrptMessage(builder.build()).build(),
509             parser.parseMessage(input, List.of()));
510         buf = Unpooled.buffer(result.readableBytes());
511         parser.serializeMessage(new PcrptBuilder().setPcrptMessage(builder.build()).build(), buf);
512         assertArrayEquals(result.array(), buf.array());
513
514         result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCRpt.3.bin"));
515
516         final List<Reports> reports2 = new ArrayList<>();
517         final var pBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful
518             .rev200720.pcrpt.message.pcrpt.message.reports.PathBuilder();
519         pBuilder.setEro(ero);
520         pBuilder.setLspa(lspa);
521         pBuilder.setMetrics(Lists.newArrayList(metrics, metrics));
522         pBuilder.setRro(rro);
523         reports2.add(new ReportsBuilder().setSrp(srp).setLsp(lspSrp).setPath(pBuilder.build()).build());
524         builder.setReports(reports2);
525
526         assertEquals(new PcrptBuilder().setPcrptMessage(builder.build()).build(),
527             parser.parseMessage(result.slice(4, result.readableBytes() - 4), List.of()));
528         buf = Unpooled.buffer(result.readableBytes());
529         parser.serializeMessage(new PcrptBuilder().setPcrptMessage(builder.build()).build(), buf);
530         assertArrayEquals(result.array(), buf.array());
531
532         result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCRpt.4.bin"));
533
534         assertEquals(new PcrptBuilder().setPcrptMessage(builder.build()).build(),
535                 parser.parseMessage(result.slice(4, result.readableBytes() - 4), List.of()));
536
537         result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCRpt.5.bin"));
538
539         final List<Reports> reports3 = new ArrayList<>();
540         final var pBuilder1 = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful
541             .rev200720.pcrpt.message.pcrpt.message.reports.PathBuilder();
542         pBuilder1.setEro(ero);
543         pBuilder1.setLspa(lspa);
544         pBuilder1.setMetrics(Lists.newArrayList(metrics, metrics));
545         pBuilder1.setRro(rro);
546         reports3.add(new ReportsBuilder().setSrp(srp).setLsp(lspSrp).setPath(pBuilder.build()).build());
547         reports3.add(new ReportsBuilder().setSrp(srp).setLsp(lspSrp).setPath(pBuilder1.build()).build());
548         builder.setReports(reports3);
549
550         assertEquals(new PcrptBuilder().setPcrptMessage(builder.build()).build(),
551             parser.parseMessage(result.slice(4, result.readableBytes() - 4), List.of()));
552         buf = Unpooled.buffer(result.readableBytes());
553         parser.serializeMessage(new PcrptBuilder().setPcrptMessage(builder.build()).build(), buf);
554         assertArrayEquals(result.array(), buf.array());
555
556         result = Unpooled.wrappedBuffer(PCRT3);
557
558         final List<Reports> reports4 = new ArrayList<>();
559         reports4.add(new ReportsBuilder().setLsp(lsp).setPath(new org.opendaylight.yang.gen.v1.urn.opendaylight
560             .params.xml.ns.yang.pcep.ietf.stateful.rev200720.pcrpt.message.pcrpt.message.reports.PathBuilder()
561             .setEro(ero).setLspa(lspa).setBandwidth(bandwidth)
562             .setReoptimizationBandwidth(reoptimizationBandwidth).build()).build());
563         builder.setReports(reports4);
564
565         final ByteBuf input2 = result.slice(4, result.readableBytes() - 4);
566         assertEquals(new PcrptBuilder().setPcrptMessage(builder.build()).build(),
567             parser.parseMessage(input2, List.of()));
568         buf = Unpooled.buffer(result.readableBytes());
569         parser.serializeMessage(new PcrptBuilder().setPcrptMessage(builder.build()).build(), buf);
570         assertArrayEquals(result.array(), buf.array());
571     }
572
573     @Test
574     public void testPcinitMsg() throws IOException, PCEPDeserializerException {
575         new InitiatedActivator().start(ctx);
576
577         final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/Pcinit.bin"));
578
579         final InitiatedPCInitiateMessageParser parser = new InitiatedPCInitiateMessageParser(
580             ctx.getObjectHandlerRegistry());
581
582         final PcinitiateMessageBuilder builder = new PcinitiateMessageBuilder()
583             .setRequests(List.of(new RequestsBuilder()
584             .setSrp(srp)
585             .setLsp(lspSrp)
586             .setEro(ero)
587             .setLspa(lspa)
588             .setMetrics(List.of(metrics))
589             .setIro(iro)
590             .build()));
591
592         assertEquals(new PcinitiateBuilder().setPcinitiateMessage(builder.build()).build(),
593             parser.parseMessage(result.slice(4,result.readableBytes() - 4), List.of()));
594         final ByteBuf buf = Unpooled.buffer(result.readableBytes());
595         parser.serializeMessage(new PcinitiateBuilder().setPcinitiateMessage(builder.build()).build(), buf);
596         assertArrayEquals(result.array(), buf.array());
597     }
598
599     @Test
600     public void testErrorMsg() throws IOException, PCEPDeserializerException {
601         new StatefulActivator().start(ctx);
602
603         final StatefulErrorMessageParser parser = new StatefulErrorMessageParser(
604             ctx.getObjectHandlerRegistry());
605
606         ErrorObject error1 = new ErrorObjectBuilder().setIgnore(false).setProcessingRule(false)
607             .setType(Uint8.valueOf(19)).setValue(Uint8.ONE).build();
608
609         List<Errors> innerErr = new ArrayList<>();
610         innerErr.add(new ErrorsBuilder().setErrorObject(error1).build());
611
612         PcerrMessageBuilder builder = new PcerrMessageBuilder();
613         builder.setErrors(innerErr);
614         final List<Srps> srps = new ArrayList<>();
615         srps.add(new SrpsBuilder()
616             .setSrp(new SrpBuilder()
617                 .setOperationId(new SrpIdNumber(Uint32.valueOf(3)))
618                 .setIgnore(false)
619                 .setProcessingRule(false)
620                 .setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful
621                     .rev200720.srp.object.srp.TlvsBuilder().build())
622                 .build())
623             .build());
624         builder.setErrorType(new StatefulCaseBuilder().setStateful(new org.opendaylight.yang.gen.v1.urn.opendaylight
625             .params.xml.ns.yang.pcep.ietf.stateful.rev200720.pcerr.pcerr.message.error.type.stateful._case
626             .StatefulBuilder().setSrps(srps).build()).build());
627
628         ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCErr.1.bin"));
629         assertEquals(new PcerrBuilder().setPcerrMessage(builder.build()).build(),
630             parser.parseMessage(result.slice(4, result.readableBytes() - 4), List.of()));
631         ByteBuf buf = Unpooled.buffer(result.readableBytes());
632         parser.serializeMessage(new PcerrBuilder().setPcerrMessage(builder.build()).build(), buf);
633         assertArrayEquals(result.array(), buf.array());
634
635         error1 = new ErrorObjectBuilder().setIgnore(false).setProcessingRule(false).setType(Uint8.valueOf(3))
636             .setValue(Uint8.ONE).build();
637
638         innerErr = new ArrayList<>();
639         builder = new PcerrMessageBuilder();
640
641         final RpBuilder rpBuilder = new RpBuilder()
642             .setProcessingRule(true)
643             .setIgnore(false)
644             .setReoptimization(false)
645             .setBiDirectional(false)
646             .setLoose(true)
647             .setMakeBeforeBreak(false)
648             .setOrder(false)
649             .setPathKey(false)
650             .setSupplyOf(false)
651             .setFragmentation(false)
652             .setP2mp(false)
653             .setEroCompression(false)
654             .setPriority(Uint8.ONE)
655             .setRequestId(new RequestId(Uint32.TEN))
656             .setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109
657                 .rp.object.rp.TlvsBuilder().build())
658             .setProcessingRule(false);
659         final List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcerr.message
660             .pcerr.message.error.type.request._case.request.Rps> rps = new ArrayList<>();
661         rps.add(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.pcerr.message
662             .pcerr.message.error.type.request._case.request.RpsBuilder().setRp(rpBuilder.build()).build());
663
664         innerErr.add(new ErrorsBuilder().setErrorObject(error1).build());
665
666         builder.setErrors(innerErr);
667         builder.setErrorType(new RequestCaseBuilder().setRequest(new RequestBuilder().setRps(rps).build()).build());
668
669         result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCErr.5.bin"));
670         assertEquals(new PcerrBuilder().setPcerrMessage(builder.build()).build(),
671             parser.parseMessage(result.slice(4, result.readableBytes() - 4), List.of()));
672         buf = Unpooled.buffer(result.readableBytes());
673         parser.serializeMessage(new PcerrBuilder().setPcerrMessage(builder.build()).build(), buf);
674         assertArrayEquals(result.array(), buf.array());
675
676         builder = new PcerrMessageBuilder();
677         error1 = new ErrorObjectBuilder().setIgnore(false).setProcessingRule(false).setType(Uint8.valueOf(3))
678             .setValue(Uint8.ONE).build();
679
680         innerErr = new ArrayList<>();
681         innerErr.add(new ErrorsBuilder().setErrorObject(error1).build());
682
683         builder.setErrors(innerErr);
684         builder.setErrorType(new SessionCaseBuilder().setSession(new SessionBuilder()
685             .setOpen(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open
686                 .object.OpenBuilder()
687                 .setDeadTimer(Uint8.ONE)
688                 .setKeepalive(Uint8.ONE)
689                 .setVersion(new ProtocolVersion(Uint8.ONE))
690                 .setSessionId(Uint8.ZERO)
691                 .setIgnore(false)
692                 .setProcessingRule(false)
693                 .setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types
694                     .rev181109.open.object.open.TlvsBuilder().build())
695                 .build()).build()).build());
696
697         result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCErr.3.bin"));
698         assertEquals(new PcerrBuilder().setPcerrMessage(builder.build()).build(),
699             parser.parseMessage(result.slice(4,result.readableBytes() - 4), List.of()));
700         buf = Unpooled.buffer(result.readableBytes());
701         parser.serializeMessage(new PcerrBuilder().setPcerrMessage(builder.build()).build(), buf);
702         assertArrayEquals(result.array(), buf.array());
703     }
704
705     @Test
706     public void testMissingLspObjectErrorInPcRptMsg() throws PCEPDeserializerException {
707         final byte[] statefulMsg = {
708             (byte) 0x20, (byte) 0x0B, (byte) 0x00, (byte) 0x1C,
709             /* srp-object */
710             (byte) 0x21, (byte) 0x10, (byte) 0x00, (byte) 0x0C,
711             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x001,
712             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01,
713             /* lsp-object is missing*/
714             /* sr-ero-object */
715             (byte) 0x07, (byte) 0x10, (byte) 0x00, (byte) 0x0C,
716             /* ipv4 prefix subobject */
717             (byte) 0x81, (byte) 0x08, (byte) 0xFF, (byte) 0xFF,
718             (byte) 0xFF, (byte) 0xFF, (byte) 0x16, (byte) 0x00
719         };
720
721         new InitiatedActivator().start(ctx);
722         new StatefulActivator().start(ctx);
723
724         final StatefulPCReportMessageParser parser = new StatefulPCReportMessageParser(
725             ctx.getObjectHandlerRegistry());
726
727         final ByteBuf buf = Unpooled.wrappedBuffer(statefulMsg);
728         final List<Message> errors = new ArrayList<>();
729         parser.parseMessage(buf.slice(4, buf.readableBytes() - 4), errors);
730         assertFalse(errors.isEmpty());
731         assertEquals(new PcerrBuilder()
732             .setPcerrMessage(new PcerrMessageBuilder()
733                 .setErrors(List.of(new ErrorsBuilder()
734                     .setErrorObject(new ErrorObjectBuilder()
735                         .setType(Uint8.valueOf(6))
736                         .setValue(Uint8.valueOf(8))
737                         .build())
738                     .build()))
739                 .build())
740             .build(), errors.get(0));
741     }
742
743     @Test
744     public void testUnexpectedRroObjectInPcUpdMsg() throws PCEPDeserializerException {
745         final byte[] badUpdateMsg = {
746             (byte) 0x20, (byte) 0x0b, (byte) 0x00, (byte) 0x50,
747             /* SRP, LSP and ERO objects */
748             (byte) 0x21, (byte) 0x12, (byte) 0x00, (byte) 0x0c,
749             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
750             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01,
751             (byte) 0x20, (byte) 0x10, (byte) 0x00, (byte) 0x08,
752             (byte) 0x00, (byte) 0x00, (byte) 0x10, (byte) 0x09,
753             (byte) 0x07, (byte) 0x10, (byte) 0x00, (byte) 0x14,
754             (byte) 0x01, (byte) 0x08, (byte) 0x05, (byte) 0x05,
755             (byte) 0x05, (byte) 0x03, (byte) 0x18, (byte) 0x00,
756             (byte) 0x01, (byte) 0x08, (byte) 0x08, (byte) 0x08,
757             (byte) 0x08, (byte) 0x04, (byte) 0x18, (byte) 0x00,
758             /* RRO object */
759             (byte) 0x08, (byte) 0x10, (byte) 0x00, (byte) 0x24,
760             (byte) 0x01, (byte) 0x08, (byte) 0x0a, (byte) 0x00,
761             (byte) 0x00, (byte) 0x83, (byte) 0x20, (byte) 0x20,
762             (byte) 0x03, (byte) 0x08, (byte) 0x01, (byte) 0x01,
763             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
764             (byte) 0x01, (byte) 0x08, (byte) 0x0a, (byte) 0x00,
765             (byte) 0x09, (byte) 0xde, (byte) 0x20, (byte) 0x00,
766             (byte) 0x03, (byte) 0x08, (byte) 0x01, (byte) 0x01,
767             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00
768         };
769
770         new InitiatedActivator().start(ctx);
771
772         final StatefulPCUpdateRequestMessageParser parser = new StatefulPCUpdateRequestMessageParser(
773             ctx.getObjectHandlerRegistry());
774
775         final ByteBuf buf = Unpooled.wrappedBuffer(badUpdateMsg);
776         final List<Message> errors = new ArrayList<>();
777         parser.parseMessage(buf.slice(4, buf.readableBytes() - 4), errors);
778         assertFalse(errors.isEmpty());
779         assertEquals(new PcerrBuilder()
780             .setPcerrMessage(new PcerrMessageBuilder()
781                 .setErrors(List.of(new ErrorsBuilder()
782                     .setErrorObject(new ErrorObjectBuilder()
783                         .setType(Uint8.valueOf(6))
784                         .setValue(Uint8.valueOf(10))
785                         .build())
786                     .build()))
787                 .build())
788             .build(), errors.get(0));
789     }
790 }