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