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