Fix buffer read for unsupported LLGR Safi
[bgpcep.git] / bgp / parser-impl / src / test / java / org / opendaylight / protocol / bgp / parser / impl / LlGracefulCapabilityHandlerTest.java
1 /*
2  * Copyright (c) 2018 AT&T Intellectual Property. 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.bgp.parser.impl;
9
10 import io.netty.buffer.ByteBuf;
11 import io.netty.buffer.Unpooled;
12 import java.util.Arrays;
13 import org.junit.Assert;
14 import org.junit.Before;
15 import org.junit.Test;
16 import org.mockito.Mock;
17 import org.mockito.Mockito;
18 import org.mockito.MockitoAnnotations;
19 import org.opendaylight.protocol.bgp.parser.BGPDocumentedException;
20 import org.opendaylight.protocol.bgp.parser.BGPParsingException;
21 import org.opendaylight.protocol.bgp.parser.impl.message.open.LlGracefulCapabilityHandler;
22 import org.opendaylight.protocol.bgp.parser.spi.AddressFamilyRegistry;
23 import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
24 import org.opendaylight.protocol.bgp.parser.spi.SubsequentAddressFamilyRegistry;
25 import org.opendaylight.protocol.bgp.parser.spi.pojo.ServiceLoaderBGPExtensionProviderContext;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.open.message.bgp.parameters.optional.capabilities.CParameters;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.open.message.bgp.parameters.optional.capabilities.CParametersBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.CParameters1;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.CParameters1Builder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.LlGracefulRestartCapability;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.LlGracefulRestartCapabilityBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.ll.graceful.restart.capability.Tables;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.ll.graceful.restart.capability.TablesBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.AddressFamily;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.Ipv4AddressFamily;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.Ipv6AddressFamily;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.SubsequentAddressFamily;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.UnicastSubsequentAddressFamily;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.uint24.rev200104.Uint24;
40 import org.opendaylight.yangtools.yang.common.Uint32;
41
42 public class LlGracefulCapabilityHandlerTest {
43     private static final Uint24 TEN = new Uint24(Uint32.TEN);
44
45     private LlGracefulCapabilityHandler handler;
46
47     @Mock
48     private AddressFamilyRegistry afir;
49     @Mock
50     private SubsequentAddressFamilyRegistry safir;
51
52
53     @Before
54     public void setUp() {
55         MockitoAnnotations.initMocks(this);
56         Mockito.doReturn(Ipv4AddressFamily.class).when(this.afir).classForFamily(1);
57         Mockito.doReturn(Ipv6AddressFamily.class).when(this.afir).classForFamily(2);
58         Mockito.doReturn(null).when(this.afir).classForFamily(256);
59         Mockito.doReturn(UnicastSubsequentAddressFamily.class).when(this.safir).classForFamily(1);
60         Mockito.doReturn(null).when(this.safir).classForFamily(-123);
61
62         final BGPExtensionProviderContext ctx = ServiceLoaderBGPExtensionProviderContext.getSingletonInstance();
63         this.handler = new LlGracefulCapabilityHandler(
64                 ctx.getAddressFamilyRegistry(), ctx.getSubsequentAddressFamilyRegistry());
65     }
66
67     @Test
68     public void testLongLivedGracefulCapabilityHandler() throws BGPParsingException, BGPDocumentedException {
69
70         final byte[] capaBytes = {
71             //header
72             (byte) 0x47, (byte) 0x0e,
73             // Ipv4 Unicast, afiFlags = false, timer = 10
74             (byte) 0x00, (byte) 0x01, (byte) 0x01,
75             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x0a,
76             // Ipv6 Unicast, afiFlags = true, timer = 160
77             (byte) 0x00, (byte) 0x02, (byte) 0x01,
78             (byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0xa0
79         };
80
81         final LlGracefulRestartCapability capability = new LlGracefulRestartCapabilityBuilder()
82                 .setTables(Arrays.asList(new TablesBuilder()
83                                 .setAfi(Ipv4AddressFamily.class)
84                                 .setSafi(UnicastSubsequentAddressFamily.class)
85                                 .setAfiFlags(new Tables.AfiFlags(Boolean.FALSE))
86                                 .setLongLivedStaleTime(TEN)
87                                 .build(),
88                         new TablesBuilder()
89                                 .setAfi(Ipv6AddressFamily.class)
90                                 .setSafi(UnicastSubsequentAddressFamily.class)
91                                 .setAfiFlags(new Tables.AfiFlags(Boolean.TRUE))
92                                 .setLongLivedStaleTime(new Uint24(Uint32.valueOf(160)))
93                                 .build())
94                 ).build();
95
96         final CParameters cParameters = new CParametersBuilder().addAugmentation(CParameters1.class,
97                 new CParameters1Builder().setLlGracefulRestartCapability(capability).build()).build();
98         final ByteBuf buffer = Unpooled.buffer(capaBytes.length);
99         this.handler.serializeCapability(cParameters, buffer);
100
101         Assert.assertArrayEquals(capaBytes, buffer.array());
102         Assert.assertEquals(cParameters, this.handler.parseCapability(Unpooled.wrappedBuffer(capaBytes)
103                 .slice(2, capaBytes.length - 2)));
104     }
105
106     @Test(expected = IllegalArgumentException.class)
107     public void testUnsupportedAfi() {
108         final LlGracefulRestartCapability capability = new LlGracefulRestartCapabilityBuilder()
109                 .setTables(Arrays.asList(new TablesBuilder()
110                                 .setAfi(AddressFamily.class)
111                                 .setSafi(UnicastSubsequentAddressFamily.class)
112                                 .setAfiFlags(new Tables.AfiFlags(Boolean.FALSE))
113                                 .setLongLivedStaleTime(TEN)
114                                 .build())).build();
115
116         final CParameters cParameters = new CParametersBuilder().addAugmentation(CParameters1.class,
117                 new CParameters1Builder().setLlGracefulRestartCapability(capability).build()).build();
118         final ByteBuf buffer = Unpooled.buffer();
119         this.handler.serializeCapability(cParameters, buffer);
120     }
121
122     @Test
123     public void testRecvdUnsupportedAfi() {
124         final byte[] capaBytes = {
125             //header
126             (byte) 0x47, (byte) 0x15,
127             // Ipv4 Unicast, afiFlags = false, timer = 10
128             (byte) 0x00, (byte) 0x01, (byte) 0x01,
129             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x0a,
130             // Unsupported afi, afiFlags = true, timer = 160
131             (byte) 0x01, (byte) 0x00, (byte) 0x01,
132             (byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0xa0,
133             //Ipv6  Unicast afiFlags = false, timer = 160
134             (byte) 0x00, (byte) 0x02, (byte) 0x01,
135             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xa0
136         };
137         final LlGracefulRestartCapability capability = new LlGracefulRestartCapabilityBuilder()
138                 .setTables(Arrays.asList(new TablesBuilder()
139                                 .setAfi(Ipv4AddressFamily.class)
140                                 .setSafi(UnicastSubsequentAddressFamily.class)
141                                 .setAfiFlags(new Tables.AfiFlags(Boolean.FALSE))
142                                 .setLongLivedStaleTime(TEN)
143                                 .build(),
144                         new TablesBuilder()
145                                 .setAfi(Ipv6AddressFamily.class)
146                                 .setSafi(UnicastSubsequentAddressFamily.class)
147                                 .setAfiFlags(new Tables.AfiFlags(Boolean.FALSE))
148                                 .setLongLivedStaleTime(new Uint24(Uint32.valueOf(160)))
149                                 .build())).build();
150
151         final CParameters cParameters = new CParametersBuilder().addAugmentation(CParameters1.class,
152                 new CParameters1Builder().setLlGracefulRestartCapability(capability).build()).build();
153         LlGracefulCapabilityHandler handler1 = new LlGracefulCapabilityHandler(
154                 afir, safir);
155         Assert.assertEquals(cParameters, handler1.parseCapability(Unpooled.wrappedBuffer(capaBytes)
156                 .slice(2, capaBytes.length - 2)));
157     }
158
159     @Test(expected = IllegalArgumentException.class)
160     public void testUnsupportedSafi() {
161         final LlGracefulRestartCapability capability = new LlGracefulRestartCapabilityBuilder()
162                 .setTables(Arrays.asList(new TablesBuilder()
163                         .setAfi(Ipv4AddressFamily.class)
164                         .setSafi(SubsequentAddressFamily.class)
165                         .setAfiFlags(new Tables.AfiFlags(Boolean.FALSE))
166                         .setLongLivedStaleTime(TEN)
167                         .build())).build();
168
169         final CParameters cParameters = new CParametersBuilder().addAugmentation(CParameters1.class,
170                 new CParameters1Builder().setLlGracefulRestartCapability(capability).build()).build();
171         final ByteBuf buffer = Unpooled.buffer();
172         this.handler.serializeCapability(cParameters, buffer);
173     }
174
175     @Test
176     public void testRecvdUnsupportedSafi() {
177         final byte[] capaBytes = {
178             //header
179             (byte) 0x47, (byte) 0x15,
180             // Ipv4 Unicast, afiFlags = false, timer = 10
181             (byte) 0x00, (byte) 0x01, (byte) 0x01,
182             (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x0a,
183             // Unsupported safi, afiFlags = true, timer = 160
184             (byte) 0x00, (byte) 0x01, (byte) 0x85,
185             (byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0xa0,
186             //Ipv6  Unicast afiFlags = false, timer = 160
187             (byte) 0x00, (byte) 0x02, (byte) 0x01,
188             (byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0xa0
189         };
190
191         final LlGracefulRestartCapability capability = new LlGracefulRestartCapabilityBuilder()
192                 .setTables(Arrays.asList(new TablesBuilder()
193                                 .setAfi(Ipv4AddressFamily.class)
194                                 .setSafi(UnicastSubsequentAddressFamily.class)
195                                 .setAfiFlags(new Tables.AfiFlags(Boolean.FALSE))
196                                 .setLongLivedStaleTime(TEN)
197                                 .build(),
198                         new TablesBuilder()
199                                 .setAfi(Ipv6AddressFamily.class)
200                                 .setSafi(UnicastSubsequentAddressFamily.class)
201                                 .setAfiFlags(new Tables.AfiFlags(Boolean.TRUE))
202                                 .setLongLivedStaleTime(new Uint24(Uint32.valueOf(160)))
203                                 .build())).build();
204
205         final CParameters cParameters = new CParametersBuilder().addAugmentation(CParameters1.class,
206                 new CParameters1Builder().setLlGracefulRestartCapability(capability).build()).build();
207         LlGracefulCapabilityHandler handler1 = new LlGracefulCapabilityHandler(
208                 afir, safir);
209         Assert.assertEquals(cParameters, handler1.parseCapability(Unpooled.wrappedBuffer(capaBytes)
210                 .slice(2, capaBytes.length - 2)));
211     }
212 }