2 * Copyright (c) 2018 AT&T Intellectual Property. 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.bgp.parser.impl;
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;
42 public class LlGracefulCapabilityHandlerTest {
43 private static final Uint24 TEN = new Uint24(Uint32.TEN);
45 private LlGracefulCapabilityHandler handler;
48 private AddressFamilyRegistry afir;
50 private SubsequentAddressFamilyRegistry safir;
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);
62 final BGPExtensionProviderContext ctx = ServiceLoaderBGPExtensionProviderContext.getSingletonInstance();
63 this.handler = new LlGracefulCapabilityHandler(
64 ctx.getAddressFamilyRegistry(), ctx.getSubsequentAddressFamilyRegistry());
68 public void testLongLivedGracefulCapabilityHandler() throws BGPParsingException, BGPDocumentedException {
70 final byte[] capaBytes = {
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
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)
89 .setAfi(Ipv6AddressFamily.class)
90 .setSafi(UnicastSubsequentAddressFamily.class)
91 .setAfiFlags(new Tables.AfiFlags(Boolean.TRUE))
92 .setLongLivedStaleTime(new Uint24(Uint32.valueOf(160)))
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);
101 Assert.assertArrayEquals(capaBytes, buffer.array());
102 Assert.assertEquals(cParameters, this.handler.parseCapability(Unpooled.wrappedBuffer(capaBytes)
103 .slice(2, capaBytes.length - 2)));
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)
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);
123 public void testRecvdUnsupportedAfi() {
124 final byte[] capaBytes = {
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
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)
145 .setAfi(Ipv6AddressFamily.class)
146 .setSafi(UnicastSubsequentAddressFamily.class)
147 .setAfiFlags(new Tables.AfiFlags(Boolean.FALSE))
148 .setLongLivedStaleTime(new Uint24(Uint32.valueOf(160)))
151 final CParameters cParameters = new CParametersBuilder().addAugmentation(CParameters1.class,
152 new CParameters1Builder().setLlGracefulRestartCapability(capability).build()).build();
153 LlGracefulCapabilityHandler handler1 = new LlGracefulCapabilityHandler(
155 Assert.assertEquals(cParameters, handler1.parseCapability(Unpooled.wrappedBuffer(capaBytes)
156 .slice(2, capaBytes.length - 2)));
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)
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);
176 public void testRecvdUnsupportedSafi() {
177 final byte[] capaBytes = {
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
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)
199 .setAfi(Ipv6AddressFamily.class)
200 .setSafi(UnicastSubsequentAddressFamily.class)
201 .setAfiFlags(new Tables.AfiFlags(Boolean.TRUE))
202 .setLongLivedStaleTime(new Uint24(Uint32.valueOf(160)))
205 final CParameters cParameters = new CParametersBuilder().addAugmentation(CParameters1.class,
206 new CParameters1Builder().setLlGracefulRestartCapability(capability).build()).build();
207 LlGracefulCapabilityHandler handler1 = new LlGracefulCapabilityHandler(
209 Assert.assertEquals(cParameters, handler1.parseCapability(Unpooled.wrappedBuffer(capaBytes)
210 .slice(2, capaBytes.length - 2)));