Bug 3117 - Capability Parameter Parse Issue
[bgpcep.git] / bgp / parser-impl / src / test / java / org / opendaylight / protocol / bgp / parser / impl / GracefulCapabilityHandlerTest.java
1 /*
2  * Copyright (c) 2014 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
9 package org.opendaylight.protocol.bgp.parser.impl;
10
11 import com.google.common.collect.Lists;
12 import io.netty.buffer.ByteBuf;
13 import io.netty.buffer.Unpooled;
14 import java.util.Collections;
15 import org.junit.Assert;
16 import org.junit.Before;
17 import org.junit.Test;
18 import org.opendaylight.protocol.bgp.parser.BGPDocumentedException;
19 import org.opendaylight.protocol.bgp.parser.BGPParsingException;
20 import org.opendaylight.protocol.bgp.parser.impl.message.open.GracefulCapabilityHandler;
21 import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
22 import org.opendaylight.protocol.bgp.parser.spi.pojo.ServiceLoaderBGPExtensionProviderContext;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.bgp.parameters.optional.capabilities.CParametersBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.CParameters1;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.CParameters1Builder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.GracefulRestartCapability.RestartFlags;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.GracefulRestartCapabilityBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.graceful.restart.capability.Tables;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.graceful.restart.capability.Tables.AfiFlags;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.open.bgp.parameters.optional.capabilities.c.parameters.graceful.restart.capability.TablesBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.AddressFamily;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.SubsequentAddressFamily;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
35
36 public class GracefulCapabilityHandlerTest {
37
38     private BGPExtensionProviderContext ctx;
39
40     @Before
41     public void setUp() {
42         this.ctx = ServiceLoaderBGPExtensionProviderContext.getSingletonInstance();
43     }
44
45     @Test
46     public void testGracefulCapabilityHandler() throws BGPDocumentedException, BGPParsingException {
47         final GracefulCapabilityHandler handler = new GracefulCapabilityHandler(
48             this.ctx.getAddressFamilyRegistry(),this.ctx.getSubsequentAddressFamilyRegistry());
49
50         final byte[] capaBytes = {
51             (byte) 0x40, (byte) 0x06, (byte) 0x80, (byte) 0x32,
52             (byte) 0x00, (byte) 0x01, (byte) 0x01, (byte) 0x80
53         };
54
55         final GracefulRestartCapabilityBuilder capaBuilder = new GracefulRestartCapabilityBuilder();
56         capaBuilder.setRestartFlags(new RestartFlags(true));
57         capaBuilder.setRestartTime(50);
58         final TablesBuilder tablesBuilder = new TablesBuilder();
59         tablesBuilder.setAfiFlags(new AfiFlags(true));
60         tablesBuilder.setAfi(Ipv4AddressFamily.class);
61         tablesBuilder.setSafi(UnicastSubsequentAddressFamily.class);
62         capaBuilder.setTables(Lists.newArrayList(tablesBuilder.build()));
63
64         final ByteBuf buffer = Unpooled.buffer(capaBytes.length);
65         handler.serializeCapability( new CParametersBuilder().addAugmentation(CParameters1.class,
66             new CParameters1Builder().setGracefulRestartCapability(capaBuilder.build()).build()).build(), buffer);
67         Assert.assertArrayEquals(capaBytes, buffer.array());
68
69         Assert.assertEquals( new CParametersBuilder().addAugmentation(CParameters1.class,
70             new CParameters1Builder().setGracefulRestartCapability(capaBuilder.build()).build()).build(),
71             handler.parseCapability(Unpooled.wrappedBuffer(capaBytes).slice(2, capaBytes.length - 2)));
72
73         final byte[] capaBytes2 = {
74             (byte) 0x40, (byte) 0x06, (byte) 0x00, (byte) 0x00,
75             (byte) 0x00, (byte) 0x01, (byte) 0x01, (byte) 0x00
76         };
77         capaBuilder.setRestartFlags(new RestartFlags(false));
78         capaBuilder.setRestartTime(0);
79         tablesBuilder.setAfiFlags(new AfiFlags(false));
80         capaBuilder.setTables(Lists.newArrayList(tablesBuilder.build()));
81         buffer.clear();
82         handler.serializeCapability( new CParametersBuilder().addAugmentation(CParameters1.class,
83             new CParameters1Builder().setGracefulRestartCapability(capaBuilder.build()).build()).build(), buffer);
84         Assert.assertArrayEquals(capaBytes2, buffer.array());
85         Assert.assertEquals( new CParametersBuilder().addAugmentation(CParameters1.class,
86             new CParameters1Builder().setGracefulRestartCapability(capaBuilder.build()).build()).build(),
87             handler.parseCapability(Unpooled.wrappedBuffer(capaBytes2).slice(2, capaBytes2.length - 2)));
88
89         capaBuilder.setRestartFlags(null);
90         tablesBuilder.setAfiFlags(null);
91         capaBuilder.setRestartTime(null);
92         capaBuilder.setTables(Lists.newArrayList(tablesBuilder.build()));
93         buffer.clear();
94         handler.serializeCapability( new CParametersBuilder().addAugmentation(CParameters1.class,
95             new CParameters1Builder().setGracefulRestartCapability(capaBuilder.build()).build()).build(), buffer);
96         Assert.assertArrayEquals(capaBytes2, buffer.array());
97
98         final byte[] capaBytes3 = {
99             (byte) 0x40, (byte) 0x06, (byte) 0x00, (byte) 0x00,
100             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00
101         };
102         capaBuilder.setRestartFlags(new RestartFlags(false));
103         capaBuilder.setRestartTime(0);
104         capaBuilder.setTables(Collections.<Tables>emptyList());
105         Assert.assertEquals( new CParametersBuilder().addAugmentation(CParameters1.class,
106             new CParameters1Builder().setGracefulRestartCapability(capaBuilder.build()).build()).build(),
107             handler.parseCapability(Unpooled.wrappedBuffer(capaBytes3).slice(2, capaBytes3.length - 2)));
108
109         final byte[] capaBytes4 = {
110             (byte) 0x40, (byte) 0x06, (byte) 0x00, (byte) 0x00,
111             (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x00
112         };
113         Assert.assertEquals( new CParametersBuilder().addAugmentation(CParameters1.class,
114             new CParameters1Builder().setGracefulRestartCapability(capaBuilder.build()).build()).build(),
115             handler.parseCapability(Unpooled.wrappedBuffer(capaBytes4).slice(2, capaBytes4.length - 2)));
116         final byte[] capaBytes5 = {
117             (byte) 0x40, (byte) 0x02, (byte) 0x00, (byte) 0x00
118         };
119         final ByteBuf b = Unpooled.buffer(capaBytes5.length);
120
121         handler.serializeCapability( new CParametersBuilder().addAugmentation(CParameters1.class,
122             new CParameters1Builder().setGracefulRestartCapability(new GracefulRestartCapabilityBuilder().build()).build()).build(), b);
123         Assert.assertArrayEquals(capaBytes5, b.array());
124         Assert.assertEquals(new CParametersBuilder().addAugmentation(CParameters1.class, new CParameters1Builder()
125             .setGracefulRestartCapability(new GracefulRestartCapabilityBuilder().setRestartFlags(new RestartFlags(Boolean.FALSE))
126                 .setRestartTime(0).setTables(Collections.<Tables>emptyList()).build()).build()).build(),
127             handler.parseCapability(Unpooled.wrappedBuffer(capaBytes5).slice(2, capaBytes5.length - 2)));
128     }
129
130     @Test(expected=IllegalArgumentException.class)
131     public void testUnhandledAfi() {
132         final GracefulCapabilityHandler handler = new GracefulCapabilityHandler(this.ctx.getAddressFamilyRegistry(),
133             this.ctx.getSubsequentAddressFamilyRegistry());
134
135         final GracefulRestartCapabilityBuilder capaBuilder = new GracefulRestartCapabilityBuilder();
136         capaBuilder.setRestartFlags(new RestartFlags(true));
137         capaBuilder.setRestartTime(50);
138         final TablesBuilder tablesBuilder = new TablesBuilder();
139         tablesBuilder.setAfiFlags(new AfiFlags(true));
140
141         tablesBuilder.setAfi(AddressFamily.class);
142         tablesBuilder.setSafi(UnicastSubsequentAddressFamily.class);
143         capaBuilder.setTables(Lists.newArrayList(tablesBuilder.build()));
144
145         final ByteBuf buffer = Unpooled.buffer();
146         handler.serializeCapability( new CParametersBuilder().addAugmentation(CParameters1.class,
147             new CParameters1Builder().setGracefulRestartCapability(capaBuilder.build()).build()).build(), buffer);
148     }
149
150     @Test(expected=IllegalArgumentException.class)
151     public void testUnhandledSafi() {
152         final GracefulCapabilityHandler handler = new GracefulCapabilityHandler(this.ctx.getAddressFamilyRegistry(),
153             this.ctx.getSubsequentAddressFamilyRegistry());
154
155         final GracefulRestartCapabilityBuilder capaBuilder = new GracefulRestartCapabilityBuilder();
156         capaBuilder.setRestartFlags(new RestartFlags(true));
157         capaBuilder.setRestartTime(50);
158         final TablesBuilder tablesBuilder = new TablesBuilder();
159         tablesBuilder.setAfiFlags(new AfiFlags(true));
160         tablesBuilder.setAfi(Ipv4AddressFamily.class);
161         tablesBuilder.setSafi(SubsequentAddressFamily.class);
162         capaBuilder.setTables(Lists.newArrayList(tablesBuilder.build()));
163
164         final ByteBuf buffer = Unpooled.buffer();
165         handler.serializeCapability( new CParametersBuilder().addAugmentation(CParameters1.class,
166             new CParameters1Builder().setGracefulRestartCapability(capaBuilder.build()).build()).build(), buffer);
167     }
168
169     @Test(expected=IllegalArgumentException.class)
170     public void testRestartTimeMinValue() {
171         final GracefulCapabilityHandler handler = new GracefulCapabilityHandler(this.ctx.getAddressFamilyRegistry(),
172             this.ctx.getSubsequentAddressFamilyRegistry());
173
174         final GracefulRestartCapabilityBuilder capaBuilder = new GracefulRestartCapabilityBuilder();
175         capaBuilder.setRestartFlags(new RestartFlags(true));
176         capaBuilder.setRestartTime(-1);
177         final TablesBuilder tablesBuilder = new TablesBuilder();
178         tablesBuilder.setAfiFlags(new AfiFlags(true));
179         tablesBuilder.setAfi(Ipv4AddressFamily.class);
180         tablesBuilder.setSafi(UnicastSubsequentAddressFamily.class);
181         capaBuilder.setTables(Lists.newArrayList(tablesBuilder.build()));
182
183         final ByteBuf buffer = Unpooled.buffer();
184         handler.serializeCapability( new CParametersBuilder().addAugmentation(CParameters1.class,
185             new CParameters1Builder().setGracefulRestartCapability(capaBuilder.build()).build()).build(), buffer);
186     }
187
188     @Test(expected=IllegalArgumentException.class)
189     public void testRestartTimeMaxValue() {
190         final GracefulCapabilityHandler handler = new GracefulCapabilityHandler(this.ctx.getAddressFamilyRegistry(),
191             this.ctx.getSubsequentAddressFamilyRegistry());
192
193         final GracefulRestartCapabilityBuilder capaBuilder = new GracefulRestartCapabilityBuilder();
194         capaBuilder.setRestartFlags(new RestartFlags(true));
195         capaBuilder.setRestartTime(50 * 1000);
196         final TablesBuilder tablesBuilder = new TablesBuilder();
197         tablesBuilder.setAfiFlags(new AfiFlags(true));
198         tablesBuilder.setAfi(Ipv4AddressFamily.class);
199         tablesBuilder.setSafi(UnicastSubsequentAddressFamily.class);
200         capaBuilder.setTables(Lists.newArrayList(tablesBuilder.build()));
201
202         final ByteBuf buffer = Unpooled.buffer();
203         handler.serializeCapability( new CParametersBuilder().addAugmentation(CParameters1.class,
204             new CParameters1Builder().setGracefulRestartCapability(capaBuilder.build()).build()).build(), buffer);
205     }
206
207 }