2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.protocol.pcep.impl;
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNull;
13 import java.io.IOException;
14 import java.util.ArrayList;
15 import java.util.List;
17 import org.junit.Before;
18 import org.junit.Test;
19 import org.opendaylight.protocol.concepts.IPv4Address;
20 import org.opendaylight.protocol.concepts.TEMetric;
21 import org.opendaylight.protocol.pcep.PCEPErrors;
22 import org.opendaylight.protocol.pcep.PCEPObject;
23 import org.opendaylight.protocol.pcep.PCEPTlv;
24 import org.opendaylight.protocol.pcep.object.CompositeErrorObject;
25 import org.opendaylight.protocol.pcep.object.CompositeNotifyObject;
26 import org.opendaylight.protocol.pcep.object.CompositePathObject;
27 import org.opendaylight.protocol.pcep.object.CompositeRequestObject;
28 import org.opendaylight.protocol.pcep.object.CompositeResponseObject;
29 import org.opendaylight.protocol.pcep.object.CompositeRptPathObject;
30 import org.opendaylight.protocol.pcep.object.CompositeStateReportObject;
31 import org.opendaylight.protocol.pcep.object.CompositeUpdPathObject;
32 import org.opendaylight.protocol.pcep.object.CompositeUpdateRequestObject;
33 import org.opendaylight.protocol.pcep.object.PCEPClassTypeObject;
34 import org.opendaylight.protocol.pcep.object.PCEPEndPointsObject;
35 import org.opendaylight.protocol.pcep.object.PCEPErrorObject;
36 import org.opendaylight.protocol.pcep.object.PCEPExistingPathBandwidthObject;
37 import org.opendaylight.protocol.pcep.object.PCEPExplicitRouteObject;
38 import org.opendaylight.protocol.pcep.object.PCEPIncludeRouteObject;
39 import org.opendaylight.protocol.pcep.object.PCEPLoadBalancingObject;
40 import org.opendaylight.protocol.pcep.object.PCEPLspObject;
41 import org.opendaylight.protocol.pcep.object.PCEPLspaObject;
42 import org.opendaylight.protocol.pcep.object.PCEPMetricObject;
43 import org.opendaylight.protocol.pcep.object.PCEPNoPathObject;
44 import org.opendaylight.protocol.pcep.object.PCEPNotificationObject;
45 import org.opendaylight.protocol.pcep.object.PCEPOpenObject;
46 import org.opendaylight.protocol.pcep.object.PCEPReportedRouteObject;
47 import org.opendaylight.protocol.pcep.object.PCEPRequestParameterObject;
48 import org.opendaylight.protocol.pcep.object.PCEPRequestedPathBandwidthObject;
49 import org.opendaylight.protocol.pcep.subobject.EROAsNumberSubobject;
50 import org.opendaylight.protocol.pcep.subobject.ExplicitRouteSubobject;
51 import org.opendaylight.protocol.pcep.subobject.RROAsNumberSubobject;
52 import org.opendaylight.protocol.pcep.subobject.ReportedRouteSubobject;
53 import org.opendaylight.protocol.pcep.tlv.LSPCleanupTlv;
54 import org.opendaylight.protocol.pcep.tlv.PCEStatefulCapabilityTlv;
55 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.nps.concepts.rev130930.Bandwidth;
58 public class CompositeTest {
60 public PCEPExplicitRouteObject ero;
61 public PCEPClassTypeObject ct;
62 public PCEPLspaObject lspa;
63 public List<PCEPMetricObject> metrics = new ArrayList<PCEPMetricObject>();
64 public PCEPIncludeRouteObject iro = new PCEPIncludeRouteObject(new ArrayList<ExplicitRouteSubobject>() {
65 private static final long serialVersionUID = 1L;
68 this.add(new EROAsNumberSubobject(new AsNumber(0L), true));
71 public PCEPRequestParameterObject requestParameter;
72 public PCEPNoPathObject noPath;
73 public PCEPRequestedPathBandwidthObject bandwidth;
75 public List<PCEPRequestParameterObject> requestParameters = new ArrayList<PCEPRequestParameterObject>();
76 public PCEPErrorObject error;
77 public List<PCEPErrorObject> errors = new ArrayList<PCEPErrorObject>();
79 public PCEPNotificationObject notification;
80 public List<PCEPNotificationObject> notifications = new ArrayList<PCEPNotificationObject>();
82 private PCEPReportedRouteObject reportedRoute;
83 private PCEPExistingPathBandwidthObject rroBandwidth;
84 private PCEPIncludeRouteObject includeRoute;
85 private PCEPLoadBalancingObject loadBalancing;
86 private PCEPEndPointsObject<?> endPoints;
88 private PCEPLspObject lsp;
89 private final List<CompositePathObject> compositePaths = new ArrayList<CompositePathObject>();
90 private final List<CompositeRptPathObject> compositeRptPaths = new ArrayList<CompositeRptPathObject>();
91 private final List<CompositeUpdPathObject> compositeUpdPaths = new ArrayList<CompositeUpdPathObject>();
92 public PCEPReportedRouteObject rro = new PCEPReportedRouteObject(new ArrayList<ReportedRouteSubobject>() {
93 private static final long serialVersionUID = 1L;
96 this.add(new RROAsNumberSubobject(new AsNumber(0L)));
101 public void setUp() {
102 this.ero = new PCEPExplicitRouteObject(new ArrayList<ExplicitRouteSubobject>() {
103 private static final long serialVersionUID = 1L;
106 this.add(new EROAsNumberSubobject(new AsNumber(0L), true));
109 this.ct = new PCEPClassTypeObject((short) 5);
110 this.lspa = new PCEPLspaObject(0, 0, 0, (short) 0, (short) 0, false, false, false, false);
111 this.metrics.add(new PCEPMetricObject(false, false, new TEMetric(1000), false, false));
112 this.metrics.add(new PCEPMetricObject(false, false, new TEMetric(1000), false, false));
114 this.requestParameter = new PCEPRequestParameterObject(false, false, false, false, false, false, false, false, (short) 0, 0, false, false);
115 this.noPath = new PCEPNoPathObject((short) 2, false, false);
116 this.bandwidth = new PCEPRequestedPathBandwidthObject(new Bandwidth(new byte[] { 0 }), false, false);
118 this.requestParameters.add(this.requestParameter);
119 this.requestParameters.add(this.requestParameter);
121 this.error = new PCEPErrorObject(PCEPErrors.BANDWIDTH_MISSING);
123 this.errors.add(this.error);
124 this.errors.add(this.error);
125 this.errors.add(this.error);
127 this.notification = new PCEPNotificationObject((short) 1, (short) 1);
129 this.notifications.add(this.notification);
130 this.notifications.add(this.notification);
132 final List<ExplicitRouteSubobject> eroSubobjects = new ArrayList<ExplicitRouteSubobject>();
133 eroSubobjects.add(new EROAsNumberSubobject(new AsNumber(0x0L), false));
134 eroSubobjects.add(new EROAsNumberSubobject(new AsNumber(0x0L), false));
135 eroSubobjects.add(new EROAsNumberSubobject(new AsNumber(0x0L), false));
137 final List<ReportedRouteSubobject> rroSubobjects = new ArrayList<ReportedRouteSubobject>();
138 rroSubobjects.add(new RROAsNumberSubobject(new AsNumber(0x0L)));
139 rroSubobjects.add(new RROAsNumberSubobject(new AsNumber(0x0L)));
140 rroSubobjects.add(new RROAsNumberSubobject(new AsNumber(0x0L)));
142 this.reportedRoute = new PCEPReportedRouteObject(rroSubobjects, true);
143 this.rroBandwidth = new PCEPExistingPathBandwidthObject(new Bandwidth(new byte[] { (byte) 0xFF }), true, false);
144 this.includeRoute = new PCEPIncludeRouteObject(eroSubobjects, true, false);
145 this.loadBalancing = new PCEPLoadBalancingObject(0x0, new Bandwidth(new byte[] { 0 }), false);
146 final byte[] ipbytes = { (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF };
147 this.endPoints = new PCEPEndPointsObject<IPv4Address>(new IPv4Address(ipbytes), new IPv4Address(ipbytes));
149 this.lsp = new PCEPLspObject(0, false, false, true, true, null);
150 this.compositePaths.add(new CompositePathObject(new PCEPExplicitRouteObject(eroSubobjects, true), this.lspa, this.bandwidth, this.metrics, this.includeRoute));
151 this.compositePaths.add(new CompositePathObject(new PCEPExplicitRouteObject(eroSubobjects, true)));
153 this.compositeUpdPaths.add(new CompositeUpdPathObject(new PCEPExplicitRouteObject(eroSubobjects, true), this.lspa, this.bandwidth, this.metrics));
154 this.compositeUpdPaths.add(new CompositeUpdPathObject(new PCEPExplicitRouteObject(eroSubobjects, true)));
159 public void testCompositePathObject() {
160 final List<PCEPObject> objects = new ArrayList<PCEPObject>();
161 objects.add(this.ero);
162 objects.add(this.lspa);
163 objects.add(this.metrics.get(0));
164 objects.add(this.metrics.get(1));
165 objects.add(this.iro);
166 objects.add(new PCEPMetricObject(false, false, new TEMetric(1000), false, false));
167 final CompositePathObject path = CompositePathObject.getCompositeFromList(objects);
168 assertEquals(path.getExcludedRoute(), this.ero);
169 assertEquals(path.getLspa(), this.lspa);
170 assertNull(path.getBandwidth());
171 assertEquals(path.getMetrics().get(0), this.metrics.get(0));
172 assertEquals(path.getMetrics().get(1), this.metrics.get(1));
173 assertEquals(path.getIncludeRoute(), this.iro);
177 public void testCompositeRptPathObject() {
178 final List<PCEPObject> objects = new ArrayList<PCEPObject>();
179 objects.add(this.ero);
180 objects.add(this.lspa);
181 objects.add(this.rro);
182 objects.add(this.metrics.get(0));
183 objects.add(this.metrics.get(1));
184 objects.add(new PCEPMetricObject(false, false, new TEMetric(1000), false, false));
185 final CompositeRptPathObject path = CompositeRptPathObject.getCompositeFromList(objects);
186 assertEquals(path.getExcludedRoute(), this.ero);
187 assertEquals(path.getLspa(), this.lspa);
188 assertNull(path.getBandwidth());
189 assertEquals(path.getMetrics().get(0), this.metrics.get(0));
190 assertEquals(path.getMetrics().get(1), this.metrics.get(1));
191 assertEquals(path.getReportedRoute(), this.rro);
195 public void testCompositeResponseObject() {
196 final List<PCEPObject> objects = new ArrayList<PCEPObject>();
197 objects.add(this.requestParameter);
198 objects.add(this.noPath);
199 objects.add(this.bandwidth);
200 objects.add(this.metrics.get(0));
201 objects.add(this.metrics.get(1));
202 objects.add(this.iro);
204 objects.add(this.ero);
205 objects.add(this.lspa);
206 objects.add(this.metrics.get(0));
207 objects.add(this.metrics.get(1));
208 objects.add(this.iro);
210 objects.add(this.ero);
211 objects.add(this.lspa);
212 objects.add(this.metrics.get(0));
213 objects.add(new PCEPMetricObject(false, false, new TEMetric(1000), false, false));
214 objects.add(this.iro);
216 objects.add(this.requestParameter);
217 final List<CompositeResponseObject> list = new ArrayList<CompositeResponseObject>();
218 while (!objects.isEmpty()) {
219 list.add(CompositeResponseObject.getCompositeFromList(objects));
221 assertEquals(2, list.size());
222 final CompositeResponseObject response = list.get(0);
224 assertEquals(response.getRequestParameter(), this.requestParameter);
225 assertEquals(response.getNoPath(), this.noPath);
226 assertNull(response.getLspa());
227 assertEquals(response.getBandwidth(), this.bandwidth);
228 assertEquals(response.getMetrics().get(0), this.metrics.get(0));
229 assertEquals(response.getMetrics().get(1), this.metrics.get(1));
230 assertEquals(response.getIncludeRoute(), this.iro);
232 CompositePathObject path = response.getPaths().get(0);
233 assertEquals(path.getExcludedRoute(), this.ero);
234 assertEquals(path.getLspa(), this.lspa);
235 assertNull(path.getBandwidth());
236 assertEquals(path.getMetrics().get(0), this.metrics.get(0));
237 assertEquals(path.getMetrics().get(1), this.metrics.get(1));
238 assertEquals(path.getIncludeRoute(), this.iro);
240 path = response.getPaths().get(1);
241 assertEquals(path.getExcludedRoute(), this.ero);
242 assertEquals(path.getLspa(), this.lspa);
243 assertNull(path.getBandwidth());
244 assertEquals(path.getMetrics().get(0), this.metrics.get(0));
245 assertEquals(path.getMetrics().get(1), new PCEPMetricObject(false, false, new TEMetric(1000), false, false));
246 assertEquals(path.getIncludeRoute(), this.iro);
250 public void testCompositeErrorObject() {
251 final List<PCEPObject> objects = new ArrayList<PCEPObject>();
252 CompositeErrorObject compositeErrors;
254 objects.addAll(this.requestParameters);
255 objects.addAll(this.errors);
256 compositeErrors = new CompositeErrorObject(this.requestParameters.subList(0, this.requestParameters.size()), this.errors.subList(0,
257 this.errors.size()));
258 assertEquals(compositeErrors, CompositeErrorObject.getCompositeFromList(objects));
261 objects.addAll(this.errors);
262 compositeErrors = new CompositeErrorObject(null, this.errors.subList(0, this.errors.size()));
263 assertEquals(compositeErrors, CompositeErrorObject.getCompositeFromList(objects));
268 public void testCompositeNotifyObject() {
269 final List<PCEPObject> objects = new ArrayList<PCEPObject>();
270 CompositeNotifyObject compositeNotifications;
272 objects.addAll(this.requestParameters);
273 objects.addAll(this.notifications);
274 compositeNotifications = new CompositeNotifyObject(this.requestParameters.subList(0, this.requestParameters.size()), this.notifications.subList(
275 0, this.notifications.size()));
276 assertEquals(compositeNotifications, CompositeNotifyObject.getCompositeFromList(objects));
280 objects.addAll(this.requestParameters);
281 objects.addAll(this.notifications);
283 objects.addAll(this.requestParameters);
284 objects.addAll(this.notifications);
285 while (!objects.isEmpty()) {
286 assertEquals(compositeNotifications, CompositeNotifyObject.getCompositeFromList(objects));
290 objects.addAll(this.notifications);
291 compositeNotifications = new CompositeNotifyObject(null, this.notifications.subList(0, this.notifications.size()));
292 assertEquals(compositeNotifications, CompositeNotifyObject.getCompositeFromList(objects));
297 public void testCompositeRequestObject() {
298 final List<PCEPObject> objects = new ArrayList<PCEPObject>();
299 CompositeRequestObject compositeRequest;
301 objects.add(this.requestParameter);
302 objects.add(this.endPoints);
303 objects.add(this.ct);
304 objects.add(this.lsp);
305 objects.add(this.lspa);
306 objects.add(this.bandwidth);
307 objects.addAll(this.metrics);
308 objects.add(this.reportedRoute);
309 objects.add(this.rroBandwidth);
310 objects.add(this.includeRoute);
311 objects.add(this.loadBalancing);
313 compositeRequest = new CompositeRequestObject(this.requestParameter, this.endPoints, this.ct, this.lsp, this.lspa, this.bandwidth, this.metrics.subList(
314 0, this.metrics.size()), this.reportedRoute, this.rroBandwidth, this.includeRoute, this.loadBalancing);
315 assertEquals(compositeRequest, CompositeRequestObject.getCompositeFromList(objects));
319 objects.add(this.requestParameter);
320 objects.add(this.endPoints);
321 objects.add(this.ct);
322 objects.add(this.lsp);
323 objects.add(this.lspa);
324 objects.add(this.bandwidth);
325 objects.addAll(this.metrics);
326 objects.add(this.reportedRoute);
327 objects.add(this.rroBandwidth);
328 objects.add(this.includeRoute);
329 objects.add(this.loadBalancing);
331 objects.add(this.requestParameter);
332 objects.add(this.endPoints);
333 objects.add(this.ct);
334 objects.add(this.lsp);
335 objects.add(this.lspa);
336 objects.add(this.bandwidth);
337 objects.addAll(this.metrics);
338 objects.add(this.reportedRoute);
339 objects.add(this.rroBandwidth);
340 objects.add(this.includeRoute);
341 objects.add(this.loadBalancing);
342 while (!objects.isEmpty()) {
343 assertEquals(compositeRequest, CompositeRequestObject.getCompositeFromList(objects));
347 objects.add(this.requestParameter);
348 objects.add(this.endPoints);
349 compositeRequest = new CompositeRequestObject(this.requestParameter, this.endPoints);
350 assertEquals(compositeRequest, CompositeRequestObject.getCompositeFromList(objects));
355 public void testCompositeStateReportObject() {
356 final List<PCEPObject> objects = new ArrayList<PCEPObject>();
357 CompositeStateReportObject compositeStateReport;
359 objects.add(this.lsp);
360 for (final CompositeRptPathObject compositeRptPath : this.compositeRptPaths) {
361 objects.addAll(compositeRptPath.getCompositeAsList());
364 compositeStateReport = new CompositeStateReportObject(this.lsp, this.compositeRptPaths);
365 assertEquals(compositeStateReport, CompositeStateReportObject.getCompositeFromList(objects));
369 objects.add(this.lsp);
370 for (final CompositeRptPathObject compositeRptPath : this.compositeRptPaths) {
371 objects.addAll(compositeRptPath.getCompositeAsList());
374 objects.add(this.lsp);
375 for (final CompositeRptPathObject compositeRptPath : this.compositeRptPaths) {
376 objects.addAll(compositeRptPath.getCompositeAsList());
378 while (!objects.isEmpty()) {
379 assertEquals(compositeStateReport, CompositeStateReportObject.getCompositeFromList(objects));
383 objects.add(this.lsp);
384 for (final CompositeRptPathObject compositeRptPath : this.compositeRptPaths) {
385 objects.addAll(compositeRptPath.getCompositeAsList());
387 compositeStateReport = new CompositeStateReportObject(this.lsp, this.compositeRptPaths);
388 assertEquals(compositeStateReport, CompositeStateReportObject.getCompositeFromList(objects));
393 public void testCompositeUpdateRequestObject() {
394 final List<PCEPObject> objects = new ArrayList<PCEPObject>();
395 CompositeUpdateRequestObject compositeStateReport;
397 objects.add(this.lsp);
398 for (final CompositeUpdPathObject compositePath : this.compositeUpdPaths) {
399 objects.addAll(compositePath.getCompositeAsList());
402 compositeStateReport = new CompositeUpdateRequestObject(this.lsp, this.compositeUpdPaths);
403 assertEquals(compositeStateReport, CompositeUpdateRequestObject.getCompositeFromList(objects));
407 objects.add(this.lsp);
408 for (final CompositeUpdPathObject compositePath : this.compositeUpdPaths) {
409 objects.addAll(compositePath.getCompositeAsList());
412 objects.add(this.lsp);
413 for (final CompositeUpdPathObject compositePath : this.compositeUpdPaths) {
414 objects.addAll(compositePath.getCompositeAsList());
416 while (!objects.isEmpty()) {
417 assertEquals(compositeStateReport, CompositeUpdateRequestObject.getCompositeFromList(objects));
421 objects.add(this.lsp);
422 for (final CompositeUpdPathObject compositePath : this.compositeUpdPaths) {
423 objects.addAll(compositePath.getCompositeAsList());
425 compositeStateReport = new CompositeUpdateRequestObject(this.lsp, this.compositeUpdPaths);
426 assertEquals(compositeStateReport, CompositeUpdateRequestObject.getCompositeFromList(objects));
431 public void testSessionProposalFactory() throws IOException {
432 final PCEPSessionProposalFactoryImpl spf = new PCEPSessionProposalFactoryImpl(10, 2, true, false, true, true, 5);
433 final List<PCEPTlv> tlvs = new ArrayList<PCEPTlv>();
434 tlvs.add(new PCEStatefulCapabilityTlv(true, false, true));
435 tlvs.add(new LSPCleanupTlv(5));
436 assertEquals(new PCEPOpenObject(2, 10, 0, tlvs), spf.getSessionProposal(null, 0));