BUG-5731: Send Error Message if LSP-IDENTIFIERS TLV is missing
[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.impl.Activator;
30 import org.opendaylight.protocol.pcep.impl.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.rev100924.Ipv4Address;
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.pcep.crabbe.initiated.rev131126.Lsp1;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Lsp1Builder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.PcinitiateBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Srp1;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.Srp1Builder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.pcinitiate.message.PcinitiateMessageBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.pcinitiate.message.pcinitiate.message.Requests;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev131126.pcinitiate.message.pcinitiate.message.RequestsBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.OperationalStatus;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.PcrptBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.PcupdBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.PlspId;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.SrpIdNumber;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Tlvs1;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.Tlvs1Builder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.identifiers.tlv.LspIdentifiers;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.identifiers.tlv.LspIdentifiersBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.identifiers.tlv.lsp.identifiers.AddressFamily;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.identifiers.tlv.lsp.identifiers.address.family.Ipv4CaseBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.Lsp;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.LspBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.lsp.object.lsp.TlvsBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcerr.pcerr.message.error.type.StatefulCaseBuilder;
60 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;
61 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;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcrpt.message.PcrptMessageBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcrpt.message.pcrpt.message.Reports;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcrpt.message.pcrpt.message.ReportsBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcupd.message.PcupdMessageBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcupd.message.pcupd.message.Updates;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcupd.message.pcupd.message.UpdatesBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcupd.message.pcupd.message.updates.PathBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.Srp;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.SrpBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.stateful.capability.tlv.Stateful;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.stateful.capability.tlv.StatefulBuilder;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.OpenBuilder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.PcerrBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.ProtocolVersion;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.RequestId;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.endpoints.address.family.ipv4._case.Ipv4Builder;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.Ero;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.EroBuilder;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.include.route.object.Iro;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.include.route.object.IroBuilder;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.include.route.object.iro.Subobject;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.include.route.object.iro.SubobjectBuilder;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lsp.attributes.Metrics;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lsp.attributes.MetricsBuilder;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lspa.object.Lspa;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lspa.object.LspaBuilder;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.metric.object.MetricBuilder;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.message.OpenMessageBuilder;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcep.error.object.ErrorObject;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcep.error.object.ErrorObjectBuilder;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.PcerrMessageBuilder;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.Errors;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.ErrorsBuilder;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.error.type.RequestCaseBuilder;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.error.type.SessionCaseBuilder;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.error.type.request._case.RequestBuilder;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcerr.message.pcerr.message.error.type.session._case.SessionBuilder;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reported.route.object.Rro;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reported.route.object.RroBuilder;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.RpBuilder;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.AttributeFilter;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.Ipv4ExtendedTunnelId;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.LspId;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.TunnelId;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.basic.explicit.route.subobjects.subobject.type.AsNumberCase;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.basic.explicit.route.subobjects.subobject.type.AsNumberCaseBuilder;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.basic.explicit.route.subobjects.subobject.type.as.number._case.AsNumberBuilder;
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.record.route.subobjects.subobject.type.UnnumberedCase;
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.record.route.subobjects.subobject.type.UnnumberedCaseBuilder;
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev150820.record.route.subobjects.subobject.type.unnumbered._case.UnnumberedBuilder;
113
114 public class PCEPValidatorTest {
115
116     private Lspa lspa;
117     private Metrics metrics;
118     private Iro iro;
119     private Ero ero;
120     private Rro rro;
121     private Srp srp;
122     private Lsp lsp;
123     private Lsp lspSrp;
124
125     private AsNumberCase eroASSubobject;
126     private UnnumberedCase rroUnnumberedSub;
127
128     private SimplePCEPExtensionProviderContext ctx;
129     private Activator act;
130
131     private static final byte[] PCRT1 = {
132         (byte) 0x20, (byte) 0x0A, (byte) 0x00, (byte) 0x20,
133
134         (byte) 0x20, (byte) 0x10, (byte) 0x00, (byte) 0x1C,
135         (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, //Skip
136         (byte) 0x00, (byte) 0x12, (byte) 0x00, (byte) 0x10, //TLV Type + TLV Length
137         (byte) 0x7F, (byte) 0x00, (byte) 0x01, (byte) 0x01, //TLV 127.0.1.1
138         (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x01, //TLV LSP Id + Tunnel id
139         (byte) 0x7F, (byte) 0x00, (byte) 0x01, (byte) 0x02, //TLV Ipv4ExtendedTunnelId 127.0.1.2
140         (byte) 0x7F, (byte) 0x00, (byte) 0x01, (byte) 0x03, //TLV TunnelEndpointAddress 127.0.1.3
141     };
142
143     private static final byte[] PCRT2 = {
144         (byte) 0x20, (byte) 0x0A, (byte) 0x00, (byte) 0x3C,
145
146         (byte) 0x20, (byte) 0x10, (byte) 0x00, (byte) 0x1C, //(byte) 0x39,
147         (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, //Skip
148         (byte) 0x00, (byte) 0x12, (byte) 0x00, (byte) 0x10, //TLV Type + TLV Length
149         (byte) 0x7F, (byte) 0x00, (byte) 0x01, (byte) 0x01, //TLV 127.0.1.1
150         (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x01, //TLV LSP Id + Tunnel id
151         (byte) 0x7F, (byte) 0x00, (byte) 0x01, (byte) 0x02, //TLV Ipv4ExtendedTunnelId 127.0.1.2
152         (byte) 0x7F, (byte) 0x00, (byte) 0x01, (byte) 0x03, //TLV TunnelEndpointAddress 127.0.1.3
153
154         (byte) 0x07, (byte) 0x10, (byte) 0x00, (byte) 0x08,
155         (byte) 0x20, (byte) 0x04, (byte) 0xFF, (byte) 0xFF,
156         (byte) 0x09, (byte) 0x10, (byte) 0x00, (byte) 0x14,
157         (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
158         (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
159         (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
160         (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00
161     };
162
163     @Before
164     public void setUp() throws Exception {
165         this.ctx = new SimplePCEPExtensionProviderContext();
166         this.act = new Activator();
167         this.act.start(this.ctx);
168
169         final LspaBuilder lspaBuilder = new LspaBuilder();
170         lspaBuilder.setProcessingRule(false);
171         lspaBuilder.setIgnore(false);
172         lspaBuilder.setLocalProtectionDesired(false);
173         lspaBuilder.setHoldPriority((short) 0);
174         lspaBuilder.setSetupPriority((short) 0);
175         lspaBuilder.setExcludeAny(new AttributeFilter(0L));
176         lspaBuilder.setIncludeAll(new AttributeFilter(0L));
177         lspaBuilder.setIncludeAny(new AttributeFilter(0L));
178         lspaBuilder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lspa.object.lspa.TlvsBuilder().build());
179         this.lspa = lspaBuilder.build();
180
181         final MetricBuilder mBuilder = new MetricBuilder();
182         mBuilder.setIgnore(false);
183         mBuilder.setProcessingRule(false);
184         mBuilder.setComputed(false);
185         mBuilder.setBound(false);
186         mBuilder.setMetricType((short) 1);
187         mBuilder.setValue(new Float32(new byte[4]));
188         this.metrics = new MetricsBuilder().setMetric(mBuilder.build()).build();
189
190         this.eroASSubobject = new AsNumberCaseBuilder().setAsNumber(
191             new AsNumberBuilder().setAsNumber(
192                 new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber(0xFFFFL)).build()).build();
193
194         this.rroUnnumberedSub = new UnnumberedCaseBuilder().setUnnumbered(
195             new UnnumberedBuilder().setRouterId(0x00112233L).setInterfaceId(0x00ff00ffL).build()).build();
196
197         final IroBuilder iroBuilder = new IroBuilder();
198         iroBuilder.setIgnore(false);
199         iroBuilder.setProcessingRule(false);
200         final List<Subobject> iroSubs = Lists.newArrayList();
201         iroSubs.add(new SubobjectBuilder().setSubobjectType(this.eroASSubobject).setLoose(false).build());
202         iroBuilder.setSubobject(iroSubs);
203         this.iro = iroBuilder.build();
204
205         final EroBuilder eroBuilder = new EroBuilder();
206         eroBuilder.setIgnore(false);
207         eroBuilder.setProcessingRule(false);
208         final List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.Subobject> eroSubs = Lists.newArrayList();
209         eroSubs.add(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.SubobjectBuilder().setSubobjectType(
210             this.eroASSubobject).setLoose(false).build());
211         eroBuilder.setSubobject(eroSubs);
212         this.ero = eroBuilder.build();
213
214         final RroBuilder rroBuilder = new RroBuilder();
215         rroBuilder.setIgnore(false);
216         rroBuilder.setProcessingRule(false);
217         final List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reported.route.object.rro.Subobject> rroSubs = Lists.newArrayList();
218         rroSubs.add(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reported.route.object.rro.SubobjectBuilder().setSubobjectType(
219             this.rroUnnumberedSub).setProtectionAvailable(false).setProtectionInUse(false).build());
220         rroBuilder.setSubobject(rroSubs);
221         this.rro = rroBuilder.build();
222
223         final SrpBuilder srpBuilder = new SrpBuilder();
224         srpBuilder.setIgnore(false);
225         srpBuilder.setProcessingRule(false);
226         srpBuilder.setOperationId(new SrpIdNumber(1L));
227         srpBuilder.addAugmentation(Srp1.class, new Srp1Builder().setRemove(false).build());
228         srpBuilder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.srp.object.srp.TlvsBuilder().build());
229         this.srp = srpBuilder.build();
230
231         final LspBuilder lspBuilder = new LspBuilder();
232         lspBuilder.setIgnore(false);
233         lspBuilder.setProcessingRule(false);
234         lspBuilder.setAdministrative(false);
235         lspBuilder.setDelegate(false);
236         lspBuilder.setPlspId(new PlspId(0L));
237         lspBuilder.setOperational(OperationalStatus.Down);
238         lspBuilder.setSync(false);
239         lspBuilder.setRemove(false);
240         lspBuilder.setTlvs(new TlvsBuilder().build());
241         lspBuilder.addAugmentation(Lsp1.class, new Lsp1Builder().setCreate(false).build());
242
243         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();
244         builder.setIpv4TunnelSenderAddress(new Ipv4Address("127.0.1.1"));
245         final LspId lspId = new LspId(1L);
246         final TunnelId tunnelId = new TunnelId(1);
247         builder.setIpv4ExtendedTunnelId(new Ipv4ExtendedTunnelId(new Ipv4Address("127.0.1.2")));
248         builder.setIpv4TunnelEndpointAddress(new Ipv4Address("127.0.1.3"));
249         final AddressFamily afiLsp = new Ipv4CaseBuilder().setIpv4(builder.build()).build();
250         final LspIdentifiers identifier = new LspIdentifiersBuilder().setAddressFamily(afiLsp).setLspId(lspId).setTunnelId(tunnelId).build();
251         this.lspSrp = lspBuilder.build();
252         this.lsp = lspBuilder.setTlvs(new TlvsBuilder().setLspIdentifiers(identifier).build()).build();
253
254         final Ipv4Builder afi = new Ipv4Builder();
255         afi.setSourceIpv4Address(new Ipv4Address("255.255.255.255"));
256         afi.setDestinationIpv4Address(new Ipv4Address("255.255.255.255"));
257     }
258
259     @Test
260     public void testOpenMsg() throws IOException, PCEPDeserializerException {
261         try (StatefulActivator a = new StatefulActivator()) {
262             a.start(this.ctx);
263             final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPOpenMessage1.bin"));
264             final PCEPOpenMessageParser parser = new PCEPOpenMessageParser(this.ctx.getObjectHandlerRegistry());
265             final OpenMessageBuilder builder = new OpenMessageBuilder();
266
267             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();
268             b.setProcessingRule(false);
269             b.setIgnore(false);
270             b.setVersion(new ProtocolVersion((short) 1));
271             b.setKeepalive((short) 30);
272             b.setDeadTimer((short) 120);
273             b.setSessionId((short) 1);
274             final Stateful tlv1 = new StatefulBuilder().setLspUpdateCapability(Boolean.TRUE).build();
275             b.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.TlvsBuilder().addAugmentation(
276                 Tlvs1.class, new Tlvs1Builder().setStateful(tlv1).build()).build());
277             builder.setOpen(b.build());
278
279             assertEquals(new OpenBuilder().setOpenMessage(builder.build()).build(), parser.parseMessage(result.slice(4,
280                 result.readableBytes() - 4), Collections.emptyList()));
281             final ByteBuf buf = Unpooled.buffer(result.readableBytes());
282             parser.serializeMessage(new OpenBuilder().setOpenMessage(builder.build()).build(), buf);
283             assertArrayEquals(result.array(), buf.array());
284         }
285     }
286
287     @Test
288     public void testSyncOptActivator() {
289         try (SyncOptimizationsActivator a = new SyncOptimizationsActivator()) {
290             a.start(this.ctx);
291             a.close();
292         }
293     }
294
295     @Test
296     public void testUpdMsg() throws IOException, PCEPDeserializerException {
297         try (CrabbeInitiatedActivator a = new CrabbeInitiatedActivator()) {
298             a.start(this.ctx);
299             ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCUpd.2.bin"));
300
301             final Stateful07PCUpdateRequestMessageParser parser = new Stateful07PCUpdateRequestMessageParser(this.ctx.getObjectHandlerRegistry());
302
303             final PcupdMessageBuilder builder = new PcupdMessageBuilder();
304
305             final List<Updates> updates = Lists.newArrayList();
306             final PathBuilder pBuilder = new PathBuilder();
307             pBuilder.setEro(this.ero);
308             pBuilder.setLspa(this.lspa);
309             updates.add(new UpdatesBuilder().setSrp(this.srp).setLsp(this.lspSrp).setPath(pBuilder.build()).build());
310             builder.setUpdates(updates);
311
312             assertEquals(new PcupdBuilder().setPcupdMessage(builder.build()).build(), parser.parseMessage(result.slice(4,
313                 result.readableBytes() - 4), Collections.emptyList()));
314             ByteBuf buf = Unpooled.buffer(result.readableBytes());
315             parser.serializeMessage(new PcupdBuilder().setPcupdMessage(builder.build()).build(), buf);
316             assertArrayEquals(result.array(), buf.array());
317
318             result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCUpd.5.bin"));
319
320             final List<Updates> updates1 = Lists.newArrayList();
321             final PathBuilder pBuilder1 = new PathBuilder();
322             pBuilder1.setEro(this.ero);
323             pBuilder1.setLspa(this.lspa);
324             updates1.add(new UpdatesBuilder().setSrp(this.srp).setLsp(this.lspSrp).setPath(pBuilder.build()).build());
325             updates1.add(new UpdatesBuilder().setSrp(this.srp).setLsp(this.lspSrp).setPath(pBuilder1.build()).build());
326             builder.setUpdates(updates1);
327
328             assertEquals(new PcupdBuilder().setPcupdMessage(builder.build()).build(), parser.parseMessage(result.slice(4,
329                 result.readableBytes() - 4), Collections.emptyList()));
330             buf = Unpooled.buffer(result.readableBytes());
331             parser.serializeMessage(new PcupdBuilder().setPcupdMessage(builder.build()).build(), buf);
332             assertArrayEquals(result.array(), buf.array());
333         }
334     }
335
336     @Test
337     public void testRptMsg() throws IOException, PCEPDeserializerException {
338         try (CrabbeInitiatedActivator a = new CrabbeInitiatedActivator(); StatefulActivator b = new StatefulActivator()) {
339             a.start(this.ctx);
340             b.start(this.ctx);
341             ByteBuf result = Unpooled.wrappedBuffer(PCRT1);
342
343             final Stateful07PCReportMessageParser parser = new Stateful07PCReportMessageParser(this.ctx.getObjectHandlerRegistry());
344
345             final PcrptMessageBuilder builder = new PcrptMessageBuilder();
346
347             final List<Reports> reports = Lists.newArrayList();
348             reports.add(new ReportsBuilder().setLsp(this.lsp).build());
349             builder.setReports(reports);
350             final Message parseResult = parser.parseMessage(result.slice(4, result.readableBytes() - 4), Collections.emptyList());
351             assertEquals(new PcrptBuilder().setPcrptMessage(builder.build()).build(), parseResult);
352             ByteBuf buf = Unpooled.buffer(result.readableBytes());
353             parser.serializeMessage(new PcrptBuilder().setPcrptMessage(builder.build()).build(), buf);
354             assertArrayEquals(result.array(), buf.array());
355
356             result = Unpooled.wrappedBuffer(PCRT2);
357
358             final List<Reports> reports1 = Lists.newArrayList();
359             reports1.add(new ReportsBuilder().setLsp(this.lsp).setPath(
360                 new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev131222.pcrpt.message.pcrpt.message.reports.PathBuilder().setEro(
361                     this.ero).setLspa(this.lspa).build()).build());
362             builder.setReports(reports1);
363
364             final ByteBuf input = result.slice(4, result.readableBytes() - 4);
365             assertEquals(new PcrptBuilder().setPcrptMessage(builder.build()).build(), parser.parseMessage(input, Collections.emptyList()));
366             buf = Unpooled.buffer(result.readableBytes());
367             parser.serializeMessage(new PcrptBuilder().setPcrptMessage(builder.build()).build(), buf);
368             assertArrayEquals(result.array(), buf.array());
369
370             result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCRpt.3.bin"));
371
372             final List<Reports> reports2 = Lists.newArrayList();
373             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();
374             pBuilder.setEro(this.ero);
375             pBuilder.setLspa(this.lspa);
376             pBuilder.setMetrics(Lists.newArrayList(this.metrics, this.metrics));
377             pBuilder.setRro(this.rro);
378             reports2.add(new ReportsBuilder().setSrp(this.srp).setLsp(this.lspSrp).setPath(pBuilder.build()).build());
379             builder.setReports(reports2);
380
381             assertEquals(new PcrptBuilder().setPcrptMessage(builder.build()).build(), parser.parseMessage(result.slice(4,
382                 result.readableBytes() - 4), Collections.emptyList()));
383             buf = Unpooled.buffer(result.readableBytes());
384             parser.serializeMessage(new PcrptBuilder().setPcrptMessage(builder.build()).build(), buf);
385             assertArrayEquals(result.array(), buf.array());
386
387             result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCRpt.5.bin"));
388
389             final List<Reports> reports3 = Lists.newArrayList();
390             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();
391             pBuilder1.setEro(this.ero);
392             pBuilder1.setLspa(this.lspa);
393             pBuilder1.setMetrics(Lists.newArrayList(this.metrics, this.metrics));
394             pBuilder1.setRro(this.rro);
395             reports3.add(new ReportsBuilder().setSrp(this.srp).setLsp(this.lspSrp).setPath(pBuilder.build()).build());
396             reports3.add(new ReportsBuilder().setSrp(this.srp).setLsp(this.lspSrp).setPath(pBuilder1.build()).build());
397             builder.setReports(reports3);
398
399             assertEquals(new PcrptBuilder().setPcrptMessage(builder.build()).build(), parser.parseMessage(result.slice(4,
400                 result.readableBytes() - 4), Collections.emptyList()));
401             buf = Unpooled.buffer(result.readableBytes());
402             parser.serializeMessage(new PcrptBuilder().setPcrptMessage(builder.build()).build(), buf);
403             assertArrayEquals(result.array(), buf.array());
404         }
405     }
406
407     @Test
408     public void testPcinitMsg() throws IOException, PCEPDeserializerException {
409         try (CrabbeInitiatedActivator a = new CrabbeInitiatedActivator()) {
410             a.start(this.ctx);
411             final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/Pcinit.bin"));
412
413             final CInitiated00PCInitiateMessageParser parser = new CInitiated00PCInitiateMessageParser(this.ctx.getObjectHandlerRegistry());
414
415             final PcinitiateMessageBuilder builder = new PcinitiateMessageBuilder();
416             final RequestsBuilder rBuilder = new RequestsBuilder();
417
418             final List<Requests> reqs = Lists.newArrayList();
419             rBuilder.setSrp(this.srp);
420             rBuilder.setLsp(this.lspSrp);
421             rBuilder.setEro(this.ero);
422             rBuilder.setLspa(this.lspa);
423             rBuilder.setMetrics(Lists.newArrayList(this.metrics));
424             rBuilder.setIro(this.iro);
425             reqs.add(rBuilder.build());
426             builder.setRequests(reqs);
427
428             assertEquals(new PcinitiateBuilder().setPcinitiateMessage(builder.build()).build(), parser.parseMessage(result.slice(4,
429                 result.readableBytes() - 4), Collections.emptyList()));
430             final ByteBuf buf = Unpooled.buffer(result.readableBytes());
431             parser.serializeMessage(new PcinitiateBuilder().setPcinitiateMessage(builder.build()).build(), buf);
432             assertArrayEquals(result.array(), buf.array());
433         }
434     }
435
436     @Test
437     public void testErrorMsg() throws IOException, PCEPDeserializerException {
438         try (StatefulActivator a = new StatefulActivator()) {
439             a.start(this.ctx);
440             final Stateful07ErrorMessageParser parser = new Stateful07ErrorMessageParser(this.ctx.getObjectHandlerRegistry());
441
442             ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCErr.1.bin"));
443             ErrorObject error1 = new ErrorObjectBuilder().setIgnore(false).setProcessingRule(false).setType((short) 19).setValue(
444                 (short) 1).build();
445
446             List<Errors> innerErr = new ArrayList<>();
447             innerErr.add(new ErrorsBuilder().setErrorObject(error1).build());
448
449             PcerrMessageBuilder builder = new PcerrMessageBuilder();
450             builder.setErrors(innerErr);
451             final List<Srps> srps = new ArrayList<>();
452             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());
453             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());
454
455             assertEquals(new PcerrBuilder().setPcerrMessage(builder.build()).build(), parser.parseMessage(result.slice(4,
456                 result.readableBytes() - 4), Collections.emptyList()));
457             ByteBuf buf = Unpooled.buffer(result.readableBytes());
458             parser.serializeMessage(new PcerrBuilder().setPcerrMessage(builder.build()).build(), buf);
459             assertArrayEquals(result.array(), buf.array());
460
461             result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCErr.5.bin"));
462             error1 = new ErrorObjectBuilder().setIgnore(false).setProcessingRule(false).setType((short) 3).setValue((short) 1).build();
463
464             innerErr = new ArrayList<>();
465             builder = new PcerrMessageBuilder();
466
467             final RpBuilder rpBuilder = new RpBuilder();
468             rpBuilder.setProcessingRule(true);
469             rpBuilder.setIgnore(false);
470             rpBuilder.setReoptimization(false);
471             rpBuilder.setBiDirectional(false);
472             rpBuilder.setLoose(true);
473             rpBuilder.setMakeBeforeBreak(false);
474             rpBuilder.setOrder(false);
475             rpBuilder.setPathKey(false);
476             rpBuilder.setSupplyOf(false);
477             rpBuilder.setFragmentation(false);
478             rpBuilder.setP2mp(false);
479             rpBuilder.setEroCompression(false);
480             rpBuilder.setPriority((short) 1);
481             rpBuilder.setRequestId(new RequestId(10L));
482             rpBuilder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.rp.TlvsBuilder().build());
483             rpBuilder.setProcessingRule(false);
484             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();
485             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(
486                 rpBuilder.build()).build());
487
488             innerErr.add(new ErrorsBuilder().setErrorObject(error1).build());
489
490             builder.setErrors(innerErr);
491             builder.setErrorType(new RequestCaseBuilder().setRequest(new RequestBuilder().setRps(rps).build()).build());
492
493             assertEquals(new PcerrBuilder().setPcerrMessage(builder.build()).build(), parser.parseMessage(result.slice(4,
494                 result.readableBytes() - 4), Collections.emptyList()));
495             buf = Unpooled.buffer(result.readableBytes());
496             parser.serializeMessage(new PcerrBuilder().setPcerrMessage(builder.build()).build(), buf);
497             assertArrayEquals(result.array(), buf.array());
498
499             result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCErr.3.bin"));
500
501             builder = new PcerrMessageBuilder();
502             error1 = new ErrorObjectBuilder().setIgnore(false).setProcessingRule(false).setType((short) 3).setValue((short) 1).build();
503
504             innerErr = new ArrayList<>();
505             innerErr.add(new ErrorsBuilder().setErrorObject(error1).build());
506
507             builder.setErrors(innerErr);
508             builder.setErrorType(new SessionCaseBuilder().setSession(new SessionBuilder().setOpen(
509                     new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.OpenBuilder()
510                         .setDeadTimer((short) 1)
511                         .setKeepalive((short) 1)
512                         .setVersion(new ProtocolVersion((short) 1))
513                         .setSessionId((short) 0)
514                         .setIgnore(false)
515                         .setProcessingRule(false)
516                         .setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.TlvsBuilder().build())
517                         .build()).build()).build());
518
519             assertEquals(new PcerrBuilder().setPcerrMessage(builder.build()).build(), parser.parseMessage(result.slice(4,
520                 result.readableBytes() - 4), Collections.emptyList()));
521             buf = Unpooled.buffer(result.readableBytes());
522             parser.serializeMessage(new PcerrBuilder().setPcerrMessage(builder.build()).build(), buf);
523             assertArrayEquals(result.array(), buf.array());
524         }
525     }
526
527     @Test
528     public void testMissingLspObjectErrorInPcRptMsg() throws PCEPDeserializerException {
529         final byte[] statefulMsg= {
530             0x20,0x0B,0x00,0x1C,
531             /* srp-object */
532             0x21,0x10,0x00,0x0C,
533             0x00,0x00,0x00,0x001,
534             0x00,0x00,0x00,0x01,
535             /* lsp-object is missing*/
536             /* sr-ero-object */
537             0x07,0x10,0x00,0x0C,
538             /* ipv4 prefix subobject */
539             (byte) 0x81,0x08,(byte) 0xFF,(byte) 0xFF,
540             (byte) 0xFF,(byte) 0xFF,0x16,0x00};
541
542         final Stateful07PCReportMessageParser parser = new Stateful07PCReportMessageParser(this.ctx.getObjectHandlerRegistry());
543
544         final PcerrMessageBuilder errMsgBuilder = new PcerrMessageBuilder();
545         errMsgBuilder.setErrors(Lists.newArrayList(new ErrorsBuilder().setErrorObject(
546             new ErrorObjectBuilder().setType((short) 6).setValue((short) 8).build()).build()));
547         final PcerrBuilder builder = new PcerrBuilder();
548         builder.setPcerrMessage(errMsgBuilder.build());
549
550         final ByteBuf buf = Unpooled.wrappedBuffer(statefulMsg);
551         final List<Message> errors = Lists.newArrayList();
552         parser.parseMessage(buf.slice(4, buf.readableBytes() - 4), errors);
553         assertFalse(errors.isEmpty());
554         assertEquals(builder.build(), errors.get(0));
555     }
556 }