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