afe67b4aa5136891e59c7136f615a8c72a876012
[bgpcep.git] / pcep / impl / src / test / java / org / opendaylight / protocol / pcep / impl / CompositeTest.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.impl;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertNull;
12 import static org.junit.Assert.assertTrue;
13
14 import java.io.IOException;
15 import java.util.ArrayList;
16 import java.util.List;
17
18 import org.junit.Before;
19 import org.junit.Test;
20
21 import org.opendaylight.protocol.concepts.ASNumber;
22 import org.opendaylight.protocol.concepts.Bandwidth;
23 import org.opendaylight.protocol.concepts.IPv4Address;
24 import org.opendaylight.protocol.concepts.TEMetric;
25 import org.opendaylight.protocol.pcep.PCEPErrors;
26 import org.opendaylight.protocol.pcep.PCEPObject;
27 import org.opendaylight.protocol.pcep.PCEPSessionPreferences;
28 import org.opendaylight.protocol.pcep.PCEPTlv;
29 import org.opendaylight.protocol.pcep.object.CompositeErrorObject;
30 import org.opendaylight.protocol.pcep.object.CompositeNotifyObject;
31 import org.opendaylight.protocol.pcep.object.CompositePathObject;
32 import org.opendaylight.protocol.pcep.object.CompositeRequestObject;
33 import org.opendaylight.protocol.pcep.object.CompositeResponseObject;
34 import org.opendaylight.protocol.pcep.object.CompositeRptPathObject;
35 import org.opendaylight.protocol.pcep.object.CompositeStateReportObject;
36 import org.opendaylight.protocol.pcep.object.CompositeUpdPathObject;
37 import org.opendaylight.protocol.pcep.object.CompositeUpdateRequestObject;
38 import org.opendaylight.protocol.pcep.object.PCEPClassTypeObject;
39 import org.opendaylight.protocol.pcep.object.PCEPEndPointsObject;
40 import org.opendaylight.protocol.pcep.object.PCEPErrorObject;
41 import org.opendaylight.protocol.pcep.object.PCEPExistingPathBandwidthObject;
42 import org.opendaylight.protocol.pcep.object.PCEPExplicitRouteObject;
43 import org.opendaylight.protocol.pcep.object.PCEPIncludeRouteObject;
44 import org.opendaylight.protocol.pcep.object.PCEPLoadBalancingObject;
45 import org.opendaylight.protocol.pcep.object.PCEPLspObject;
46 import org.opendaylight.protocol.pcep.object.PCEPLspaObject;
47 import org.opendaylight.protocol.pcep.object.PCEPMetricObject;
48 import org.opendaylight.protocol.pcep.object.PCEPNoPathObject;
49 import org.opendaylight.protocol.pcep.object.PCEPNotificationObject;
50 import org.opendaylight.protocol.pcep.object.PCEPOpenObject;
51 import org.opendaylight.protocol.pcep.object.PCEPReportedRouteObject;
52 import org.opendaylight.protocol.pcep.object.PCEPRequestParameterObject;
53 import org.opendaylight.protocol.pcep.object.PCEPRequestedPathBandwidthObject;
54 import org.opendaylight.protocol.pcep.subobject.EROAsNumberSubobject;
55 import org.opendaylight.protocol.pcep.subobject.ExplicitRouteSubobject;
56 import org.opendaylight.protocol.pcep.subobject.RROAsNumberSubobject;
57 import org.opendaylight.protocol.pcep.subobject.ReportedRouteSubobject;
58 import org.opendaylight.protocol.pcep.tlv.LSPCleanupTlv;
59 import org.opendaylight.protocol.pcep.tlv.PCEStatefulCapabilityTlv;
60
61 public class CompositeTest {
62
63     public PCEPExplicitRouteObject ero;
64     public PCEPClassTypeObject ct;
65     public PCEPLspaObject lspa;
66     public List<PCEPMetricObject> metrics = new ArrayList<PCEPMetricObject>();
67     public PCEPIncludeRouteObject iro = new PCEPIncludeRouteObject(new ArrayList<ExplicitRouteSubobject>() {
68         private static final long serialVersionUID = 1L;
69
70         {
71             this.add(new EROAsNumberSubobject(new ASNumber(0L), true));
72         }
73     }, false, false);
74     public PCEPRequestParameterObject requestParameter;
75     public PCEPNoPathObject noPath;
76     public PCEPRequestedPathBandwidthObject bandwidth;
77
78     public List<PCEPRequestParameterObject> requestParameters = new ArrayList<PCEPRequestParameterObject>();
79     public PCEPErrorObject error;
80     public List<PCEPErrorObject> errors = new ArrayList<PCEPErrorObject>();
81
82     public PCEPNotificationObject notification;
83     public List<PCEPNotificationObject> notifications = new ArrayList<PCEPNotificationObject>();
84
85     private PCEPReportedRouteObject reportedRoute;
86     private PCEPExistingPathBandwidthObject rroBandwidth;
87     private PCEPIncludeRouteObject includeRoute;
88     private PCEPLoadBalancingObject loadBalancing;
89     private PCEPEndPointsObject<?> endPoints;
90
91     private PCEPLspObject lsp;
92     private final List<CompositePathObject> compositePaths = new ArrayList<CompositePathObject>();
93     private final List<CompositeRptPathObject> compositeRptPaths = new ArrayList<CompositeRptPathObject>();
94     private final List<CompositeUpdPathObject> compositeUpdPaths = new ArrayList<CompositeUpdPathObject>();
95     public PCEPReportedRouteObject rro = new PCEPReportedRouteObject(new ArrayList<ReportedRouteSubobject>() {
96         private static final long serialVersionUID = 1L;
97
98         {
99             this.add(new RROAsNumberSubobject(new ASNumber(0L)));
100         }
101     }, false);
102
103     @Before
104     public void setUp() {
105         this.ero = new PCEPExplicitRouteObject(new ArrayList<ExplicitRouteSubobject>() {
106             private static final long serialVersionUID = 1L;
107
108             {
109                 this.add(new EROAsNumberSubobject(new ASNumber(0L), true));
110             }
111         }, false);
112         this.ct = new PCEPClassTypeObject((short) 5);
113         this.lspa = new PCEPLspaObject(0, 0, 0, (short) 0, (short) 0, false, false, false, false);
114         this.metrics.add(new PCEPMetricObject(false, false, new TEMetric(1000), false, false));
115         this.metrics.add(new PCEPMetricObject(false, false, new TEMetric(1000), false, false));
116
117         this.requestParameter = new PCEPRequestParameterObject(false, false, false, false, false, false, false, false, (short) 0, 0, false, false);
118         this.noPath = new PCEPNoPathObject((short) 2, false, false);
119         this.bandwidth = new PCEPRequestedPathBandwidthObject(new Bandwidth(0), false, false);
120
121         this.requestParameters.add(this.requestParameter);
122         this.requestParameters.add(this.requestParameter);
123
124         this.error = new PCEPErrorObject(PCEPErrors.BANDWIDTH_MISSING);
125
126         this.errors.add(this.error);
127         this.errors.add(this.error);
128         this.errors.add(this.error);
129
130         this.notification = new PCEPNotificationObject((short) 1, (short) 1);
131
132         this.notifications.add(this.notification);
133         this.notifications.add(this.notification);
134
135         final List<ExplicitRouteSubobject> eroSubobjects = new ArrayList<ExplicitRouteSubobject>();
136         eroSubobjects.add(new EROAsNumberSubobject(new ASNumber(0x0L), false));
137         eroSubobjects.add(new EROAsNumberSubobject(new ASNumber(0x0L), false));
138         eroSubobjects.add(new EROAsNumberSubobject(new ASNumber(0x0L), false));
139
140         final List<ReportedRouteSubobject> rroSubobjects = new ArrayList<ReportedRouteSubobject>();
141         rroSubobjects.add(new RROAsNumberSubobject(new ASNumber(0x0L)));
142         rroSubobjects.add(new RROAsNumberSubobject(new ASNumber(0x0L)));
143         rroSubobjects.add(new RROAsNumberSubobject(new ASNumber(0x0L)));
144
145         this.reportedRoute = new PCEPReportedRouteObject(rroSubobjects, true);
146         this.rroBandwidth = new PCEPExistingPathBandwidthObject(new Bandwidth(Float.intBitsToFloat(0xFF)), true, false);
147         this.includeRoute = new PCEPIncludeRouteObject(eroSubobjects, true, false);
148         this.loadBalancing = new PCEPLoadBalancingObject(0x0, new Bandwidth(Float.intBitsToFloat(0x0)), false);
149         final byte[] ipbytes = { (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF };
150         this.endPoints = new PCEPEndPointsObject<IPv4Address>(new IPv4Address(ipbytes), new IPv4Address(ipbytes));
151
152         this.lsp = new PCEPLspObject(0, false, false, true, true, null);
153         this.compositePaths.add(new CompositePathObject(new PCEPExplicitRouteObject(eroSubobjects, true), this.lspa, this.bandwidth, this.metrics,
154                 this.includeRoute));
155         this.compositePaths.add(new CompositePathObject(new PCEPExplicitRouteObject(eroSubobjects, true)));
156
157         this.compositeUpdPaths.add(new CompositeUpdPathObject(new PCEPExplicitRouteObject(eroSubobjects, true), this.lspa, this.bandwidth, this.metrics));
158         this.compositeUpdPaths.add(new CompositeUpdPathObject(new PCEPExplicitRouteObject(eroSubobjects, true)));
159
160     }
161
162     @Test
163     public void testCompositePathObject() {
164         final List<PCEPObject> objects = new ArrayList<PCEPObject>();
165         objects.add(this.ero);
166         objects.add(this.lspa);
167         objects.add(this.metrics.get(0));
168         objects.add(this.metrics.get(1));
169         objects.add(this.iro);
170         objects.add(new PCEPMetricObject(false, false, new TEMetric(1000), false, false));
171         final CompositePathObject path = CompositePathObject.getCompositeFromList(objects);
172         assertEquals(path.getExcludedRoute(), this.ero);
173         assertEquals(path.getLspa(), this.lspa);
174         assertNull(path.getBandwidth());
175         assertEquals(path.getMetrics().get(0), this.metrics.get(0));
176         assertEquals(path.getMetrics().get(1), this.metrics.get(1));
177         assertEquals(path.getIncludeRoute(), this.iro);
178     }
179
180     @Test
181     public void testCompositeRptPathObject() {
182         final List<PCEPObject> objects = new ArrayList<PCEPObject>();
183         objects.add(this.ero);
184         objects.add(this.lspa);
185         objects.add(this.rro);
186         objects.add(this.metrics.get(0));
187         objects.add(this.metrics.get(1));
188         objects.add(new PCEPMetricObject(false, false, new TEMetric(1000), false, false));
189         final CompositeRptPathObject path = CompositeRptPathObject.getCompositeFromList(objects);
190         assertEquals(path.getExcludedRoute(), this.ero);
191         assertEquals(path.getLspa(), this.lspa);
192         assertNull(path.getBandwidth());
193         assertEquals(path.getMetrics().get(0), this.metrics.get(0));
194         assertEquals(path.getMetrics().get(1), this.metrics.get(1));
195         assertEquals(path.getReportedRoute(), this.rro);
196     }
197
198     @Test
199     public void testCompositeResponseObject() {
200         final List<PCEPObject> objects = new ArrayList<PCEPObject>();
201         objects.add(this.requestParameter);
202         objects.add(this.noPath);
203         objects.add(this.bandwidth);
204         objects.add(this.metrics.get(0));
205         objects.add(this.metrics.get(1));
206         objects.add(this.iro);
207         // add one path
208         objects.add(this.ero);
209         objects.add(this.lspa);
210         objects.add(this.metrics.get(0));
211         objects.add(this.metrics.get(1));
212         objects.add(this.iro);
213         // add another path
214         objects.add(this.ero);
215         objects.add(this.lspa);
216         objects.add(this.metrics.get(0));
217         objects.add(new PCEPMetricObject(false, false, new TEMetric(1000), false, false));
218         objects.add(this.iro);
219         //
220         objects.add(this.requestParameter);
221         final List<CompositeResponseObject> list = new ArrayList<CompositeResponseObject>();
222         while (!objects.isEmpty()) {
223             list.add(CompositeResponseObject.getCompositeFromList(objects));
224         }
225         assertEquals(2, list.size());
226         final CompositeResponseObject response = list.get(0);
227
228         assertEquals(response.getRequestParameter(), this.requestParameter);
229         assertEquals(response.getNoPath(), this.noPath);
230         assertNull(response.getLspa());
231         assertEquals(response.getBandwidth(), this.bandwidth);
232         assertEquals(response.getMetrics().get(0), this.metrics.get(0));
233         assertEquals(response.getMetrics().get(1), this.metrics.get(1));
234         assertEquals(response.getIncludeRoute(), this.iro);
235         // check path
236         CompositePathObject path = response.getPaths().get(0);
237         assertEquals(path.getExcludedRoute(), this.ero);
238         assertEquals(path.getLspa(), this.lspa);
239         assertNull(path.getBandwidth());
240         assertEquals(path.getMetrics().get(0), this.metrics.get(0));
241         assertEquals(path.getMetrics().get(1), this.metrics.get(1));
242         assertEquals(path.getIncludeRoute(), this.iro);
243         // check path
244         path = response.getPaths().get(1);
245         assertEquals(path.getExcludedRoute(), this.ero);
246         assertEquals(path.getLspa(), this.lspa);
247         assertNull(path.getBandwidth());
248         assertEquals(path.getMetrics().get(0), this.metrics.get(0));
249         assertEquals(path.getMetrics().get(1), new PCEPMetricObject(false, false, new TEMetric(1000), false, false));
250         assertEquals(path.getIncludeRoute(), this.iro);
251     }
252
253     @Test
254     public void testCompositeErrorObject() {
255         final List<PCEPObject> objects = new ArrayList<PCEPObject>();
256         CompositeErrorObject compositeErrors;
257
258         objects.addAll(this.requestParameters);
259         objects.addAll(this.errors);
260         compositeErrors = new CompositeErrorObject(this.requestParameters.subList(0, this.requestParameters.size()), this.errors.subList(0, this.errors.size()));
261         assertEquals(compositeErrors, CompositeErrorObject.getCompositeFromList(objects));
262
263         objects.clear();
264         objects.addAll(this.errors);
265         compositeErrors = new CompositeErrorObject(null, this.errors.subList(0, this.errors.size()));
266         assertEquals(compositeErrors, CompositeErrorObject.getCompositeFromList(objects));
267
268     }
269
270     @Test
271     public void testCompositeNotifyObject() {
272         final List<PCEPObject> objects = new ArrayList<PCEPObject>();
273         CompositeNotifyObject compositeNotifications;
274
275         objects.addAll(this.requestParameters);
276         objects.addAll(this.notifications);
277         compositeNotifications = new CompositeNotifyObject(this.requestParameters.subList(0, this.requestParameters.size()), this.notifications.subList(0,
278                 this.notifications.size()));
279         assertEquals(compositeNotifications, CompositeNotifyObject.getCompositeFromList(objects));
280
281         objects.clear();
282         // first
283         objects.addAll(this.requestParameters);
284         objects.addAll(this.notifications);
285         // second
286         objects.addAll(this.requestParameters);
287         objects.addAll(this.notifications);
288         while (!objects.isEmpty()) {
289             assertEquals(compositeNotifications, CompositeNotifyObject.getCompositeFromList(objects));
290         }
291
292         objects.clear();
293         objects.addAll(this.notifications);
294         compositeNotifications = new CompositeNotifyObject(null, this.notifications.subList(0, this.notifications.size()));
295         assertEquals(compositeNotifications, CompositeNotifyObject.getCompositeFromList(objects));
296
297     }
298
299     @Test
300     public void testCompositeRequestObject() {
301         final List<PCEPObject> objects = new ArrayList<PCEPObject>();
302         CompositeRequestObject compositeRequest;
303
304         objects.add(this.requestParameter);
305         objects.add(this.endPoints);
306         objects.add(this.ct);
307         objects.add(this.lsp);
308         objects.add(this.lspa);
309         objects.add(this.bandwidth);
310         objects.addAll(this.metrics);
311         objects.add(this.reportedRoute);
312         objects.add(this.rroBandwidth);
313         objects.add(this.includeRoute);
314         objects.add(this.loadBalancing);
315
316         compositeRequest = new CompositeRequestObject(this.requestParameter, this.endPoints, this.ct, this.lsp, this.lspa, this.bandwidth,
317                 this.metrics.subList(0, this.metrics.size()), this.reportedRoute, this.rroBandwidth, this.includeRoute, this.loadBalancing);
318         assertEquals(compositeRequest, CompositeRequestObject.getCompositeFromList(objects));
319
320         objects.clear();
321         // first
322         objects.add(this.requestParameter);
323         objects.add(this.endPoints);
324         objects.add(this.ct);
325         objects.add(this.lsp);
326         objects.add(this.lspa);
327         objects.add(this.bandwidth);
328         objects.addAll(this.metrics);
329         objects.add(this.reportedRoute);
330         objects.add(this.rroBandwidth);
331         objects.add(this.includeRoute);
332         objects.add(this.loadBalancing);
333         // second
334         objects.add(this.requestParameter);
335         objects.add(this.endPoints);
336         objects.add(this.ct);
337         objects.add(this.lsp);
338         objects.add(this.lspa);
339         objects.add(this.bandwidth);
340         objects.addAll(this.metrics);
341         objects.add(this.reportedRoute);
342         objects.add(this.rroBandwidth);
343         objects.add(this.includeRoute);
344         objects.add(this.loadBalancing);
345         while (!objects.isEmpty()) {
346             assertEquals(compositeRequest, CompositeRequestObject.getCompositeFromList(objects));
347         }
348
349         objects.clear();
350         objects.add(this.requestParameter);
351         objects.add(this.endPoints);
352         compositeRequest = new CompositeRequestObject(this.requestParameter, this.endPoints);
353         assertEquals(compositeRequest, CompositeRequestObject.getCompositeFromList(objects));
354
355     }
356
357     @Test
358     public void testCompositeStateReportObject() {
359         final List<PCEPObject> objects = new ArrayList<PCEPObject>();
360         CompositeStateReportObject compositeStateReport;
361
362         objects.add(this.lsp);
363         for (final CompositeRptPathObject compositeRptPath : this.compositeRptPaths) {
364             objects.addAll(compositeRptPath.getCompositeAsList());
365         }
366
367         compositeStateReport = new CompositeStateReportObject(this.lsp, this.compositeRptPaths);
368         assertEquals(compositeStateReport, CompositeStateReportObject.getCompositeFromList(objects));
369
370         objects.clear();
371         // first
372         objects.add(this.lsp);
373         for (final CompositeRptPathObject compositeRptPath : this.compositeRptPaths) {
374             objects.addAll(compositeRptPath.getCompositeAsList());
375         }
376         // second
377         objects.add(this.lsp);
378         for (final CompositeRptPathObject compositeRptPath : this.compositeRptPaths) {
379             objects.addAll(compositeRptPath.getCompositeAsList());
380         }
381         while (!objects.isEmpty()) {
382             assertEquals(compositeStateReport, CompositeStateReportObject.getCompositeFromList(objects));
383         }
384
385         objects.clear();
386         objects.add(this.lsp);
387         for (final CompositeRptPathObject compositeRptPath : this.compositeRptPaths) {
388             objects.addAll(compositeRptPath.getCompositeAsList());
389         }
390         compositeStateReport = new CompositeStateReportObject(this.lsp, this.compositeRptPaths);
391         assertEquals(compositeStateReport, CompositeStateReportObject.getCompositeFromList(objects));
392
393     }
394
395     @Test
396     public void testCompositeUpdateRequestObject() {
397         final List<PCEPObject> objects = new ArrayList<PCEPObject>();
398         CompositeUpdateRequestObject compositeStateReport;
399
400         objects.add(this.lsp);
401         for (final CompositeUpdPathObject compositePath : this.compositeUpdPaths) {
402             objects.addAll(compositePath.getCompositeAsList());
403         }
404
405         compositeStateReport = new CompositeUpdateRequestObject(this.lsp, this.compositeUpdPaths);
406         assertEquals(compositeStateReport, CompositeUpdateRequestObject.getCompositeFromList(objects));
407
408         objects.clear();
409         // first
410         objects.add(this.lsp);
411         for (final CompositeUpdPathObject compositePath : this.compositeUpdPaths) {
412             objects.addAll(compositePath.getCompositeAsList());
413         }
414         // second
415         objects.add(this.lsp);
416         for (final CompositeUpdPathObject compositePath : this.compositeUpdPaths) {
417             objects.addAll(compositePath.getCompositeAsList());
418         }
419         while (!objects.isEmpty()) {
420             assertEquals(compositeStateReport, CompositeUpdateRequestObject.getCompositeFromList(objects));
421         }
422
423         objects.clear();
424         objects.add(this.lsp);
425         for (final CompositeUpdPathObject compositePath : this.compositeUpdPaths) {
426             objects.addAll(compositePath.getCompositeAsList());
427         }
428         compositeStateReport = new CompositeUpdateRequestObject(this.lsp, this.compositeUpdPaths);
429         assertEquals(compositeStateReport, CompositeUpdateRequestObject.getCompositeFromList(objects));
430
431     }
432
433         @SuppressWarnings("resource")
434         @Test
435         public void testSessionProposalCheckerFactory() {
436                 assertTrue(new PCEPSessionProposalCheckerFactoryImpl().getPreferencesChecker(null).checkSessionCharacteristics(null));
437                 assertEquals(new PCEPSessionPreferences(new PCEPOpenObject(30, 120, 0, null)), new PCEPSessionProposalCheckerFactoryImpl().getPreferencesChecker(null).getNewProposal(null));
438         }
439
440         @Test
441         public void testSessionProposalFactory() throws IOException {
442                 final PCEPSessionProposalFactoryImpl spf = new PCEPSessionProposalFactoryImpl(10, 2, true, false, true, true, 5);
443                 try {
444                         final List<PCEPTlv> tlvs = new ArrayList<PCEPTlv>();
445                         tlvs.add(new PCEStatefulCapabilityTlv(true, false, true));
446                         tlvs.add(new LSPCleanupTlv(5));
447                         assertEquals(new PCEPSessionPreferences(new PCEPOpenObject(2, 10, 0, tlvs)), spf.getSessionProposal(null, 0).getProposal());
448                 } finally {
449                         spf.close();
450                 }
451         }
452 }