Bump upstreams to 2022.09
[bgpcep.git] / bgp / rib-impl / src / test / java / org / opendaylight / protocol / bgp / rib / impl / config / OpenConfigMappingUtilTest.java
1 /*
2  * Copyright (c) 2016 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.bgp.rib.impl.config;
9
10 import static junit.framework.TestCase.assertFalse;
11 import static org.junit.Assert.assertArrayEquals;
12 import static org.junit.Assert.assertEquals;
13 import static org.junit.Assert.assertNull;
14 import static org.junit.Assert.assertTrue;
15 import static org.mockito.Mockito.doReturn;
16 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.AFI_SAFI;
17 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.MD5_PASSWORD;
18 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.NEIGHBOR_ADDRESS;
19 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.PORT;
20 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.SHORT;
21 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createAfiSafi;
22 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createNeighborExpected;
23 import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUtil.HOLDTIMER;
24 import static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil.INSTANCE;
25
26 import com.google.common.collect.ImmutableMap;
27 import java.math.BigDecimal;
28 import java.nio.charset.StandardCharsets;
29 import java.util.ArrayList;
30 import java.util.HashMap;
31 import java.util.List;
32 import java.util.Map;
33 import org.junit.Assert;
34 import org.junit.Before;
35 import org.junit.Test;
36 import org.junit.runner.RunWith;
37 import org.mockito.Mock;
38 import org.mockito.junit.MockitoJUnitRunner;
39 import org.opendaylight.protocol.bgp.mode.api.PathSelectionMode;
40 import org.opendaylight.protocol.bgp.mode.impl.add.all.paths.AllPathSelection;
41 import org.opendaylight.protocol.bgp.mode.impl.add.n.paths.AddPathBestNPathSelection;
42 import org.opendaylight.protocol.bgp.openconfig.spi.BGPTableTypeRegistryConsumer;
43 import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl;
44 import org.opendaylight.protocol.bgp.parser.spi.pojo.RevisedErrorHandlingSupportImpl;
45 import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
46 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
47 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder;
48 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiKey;
49 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.BgpNeighborTransportConfig;
50 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.graceful.restart.GracefulRestartBuilder;
51 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafis;
52 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafisBuilder;
53 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ConfigBuilder;
54 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ErrorHandlingBuilder;
55 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.RouteReflectorBuilder;
56 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TimersBuilder;
57 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Transport;
58 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TransportBuilder;
59 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport.Config;
60 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
61 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborBuilder;
62 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborKey;
63 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.peer.group.PeerGroup;
64 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.peer.group.PeerGroupBuilder;
65 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
66 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Neighbors;
67 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST;
68 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV6LABELLEDUNICAST;
69 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV6UNICAST;
70 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.PeerType;
71 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.RrClusterIdType;
72 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.OpenconfigNetworkInstanceData;
73 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.NetworkInstances;
74 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstance;
75 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstanceKey;
76 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.Protocols;
77 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol;
78 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolKey;
79 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.BGP;
80 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
81 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
82 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressNoZone;
83 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
84 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone;
85 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.BgpTableType;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.SendReceive;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.add.path.capability.AddressFamilies;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev180329.mp.capabilities.add.path.capability.AddressFamiliesBuilder;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.NetworkInstanceProtocol;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.GlobalAddPathsConfigBuilder;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.GlobalConfigAugmentationBuilder;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborAddPathsConfigBuilder;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborPeerGroupConfigBuilder;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.NeighborTransportConfigBuilder;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev180329.network.instance.protocol.PeerGroupTransportConfigBuilder;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev180329.PeerRole;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.Ipv4AddressFamily;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.Ipv6AddressFamily;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.MplsLabeledVpnSubsequentAddressFamily;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev200120.UnicastSubsequentAddressFamily;
102 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
103 import org.opendaylight.yangtools.yang.binding.util.BindingMap;
104 import org.opendaylight.yangtools.yang.common.Decimal64;
105 import org.opendaylight.yangtools.yang.common.Uint16;
106 import org.opendaylight.yangtools.yang.common.Uint32;
107 import org.opendaylight.yangtools.yang.common.Uint8;
108
109 @RunWith(MockitoJUnitRunner.class)
110 public class OpenConfigMappingUtilTest {
111     private static final Neighbor NEIGHBOR = createNeighborExpected(NEIGHBOR_ADDRESS);
112     private static final Neighbor EMPTY_NEIGHBOR = new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS).build();
113
114     private static final PeerGroup EMPTY_PEERGROUP = new PeerGroupBuilder().setPeerGroupName("foo").build();
115
116     private static final String KEY = "bgp";
117     private static final InstanceIdentifier<Bgp> BGP_II =
118         InstanceIdentifier.builderOfInherited(OpenconfigNetworkInstanceData.class, NetworkInstances.class).build()
119         .child(NetworkInstance.class, new NetworkInstanceKey("identifier-test"))
120         .child(Protocols.class)
121         .child(Protocol.class, new ProtocolKey(BGP.VALUE, KEY))
122         .augmentation(NetworkInstanceProtocol.class)
123         .child(Bgp.class);
124     private static final NeighborKey NEIGHBOR_KEY = new NeighborKey(NEIGHBOR_ADDRESS);
125     private static final Ipv4Address ROUTER_ID = new Ipv4Address("1.2.3.4");
126     private static final Ipv4Address CLUSTER_ID = new Ipv4Address("4.3.2.1");
127     private static final Ipv4AddressNoZone LOCAL_HOST = new Ipv4AddressNoZone("127.0.0.1");
128
129     private static final Uint8 ALL_PATHS = Uint8.ZERO;
130     private static final Uint8 N_PATHS = Uint8.TWO;
131     private static final PathSelectionMode ADD_PATH_BEST_N_PATH_SELECTION =
132             new AddPathBestNPathSelection(N_PATHS.toJava());
133     private static final PathSelectionMode ADD_PATH_BEST_ALL_PATH_SELECTION = new AllPathSelection();
134     private static final BgpTableType BGP_TABLE_TYPE_IPV4 = new BgpTableTypeImpl(Ipv4AddressFamily.VALUE,
135             UnicastSubsequentAddressFamily.VALUE);
136     private static final BgpTableType BGP_TABLE_TYPE_IPV6
137             = new BgpTableTypeImpl(Ipv6AddressFamily.VALUE, UnicastSubsequentAddressFamily.VALUE);
138
139     private static final AsNumber AS = new AsNumber(Uint32.valueOf(72));
140     private static final AsNumber GLOBAL_AS = new AsNumber(Uint32.valueOf(73));
141     private static final List<AddressFamilies> FAMILIES = List.of(
142         new AddressFamiliesBuilder()
143             .setAfi(Ipv4AddressFamily.VALUE).setSafi(UnicastSubsequentAddressFamily.VALUE)
144             .setSendReceive(SendReceive.Both).build(),
145         new AddressFamiliesBuilder()
146             .setAfi(Ipv6AddressFamily.VALUE).setSafi(UnicastSubsequentAddressFamily.VALUE)
147             .setSendReceive(SendReceive.Send).build(),
148         new AddressFamiliesBuilder()
149             .setAfi(Ipv6AddressFamily.VALUE).setSafi(MplsLabeledVpnSubsequentAddressFamily.VALUE)
150             .setSendReceive(SendReceive.Receive).build());
151     private static final BigDecimal DEFAULT_TIMERS = BigDecimal.valueOf(30);
152
153     @Mock
154     private BGPTableTypeRegistryConsumer tableTypeRegistry;
155
156     @Mock
157     private RIB rib;
158
159     @Before
160     public void setUp() {
161         doReturn(BGP_TABLE_TYPE_IPV4).when(tableTypeRegistry).getTableType(IPV4UNICAST.VALUE);
162         doReturn(BGP_TABLE_TYPE_IPV6).when(tableTypeRegistry).getTableType(IPV6UNICAST.VALUE);
163         doReturn(new BgpTableTypeImpl(Ipv6AddressFamily.VALUE, MplsLabeledVpnSubsequentAddressFamily.VALUE))
164             .when(tableTypeRegistry).getTableType(IPV6LABELLEDUNICAST.VALUE);
165         doReturn(AS).when(rib).getLocalAs();
166     }
167
168     @Test
169     public void testGetRibInstanceName() {
170         assertEquals(KEY, OpenConfigMappingUtil.getRibInstanceName(BGP_II));
171     }
172
173     @Test
174     public void testGetHoldTimer() {
175         assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(), OpenConfigMappingUtil.getHoldTimer(NEIGHBOR, null));
176         assertEquals(HOLDTIMER, OpenConfigMappingUtil.getHoldTimer(EMPTY_NEIGHBOR, null));
177
178         assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(),
179                 OpenConfigMappingUtil.getHoldTimer(NEIGHBOR, EMPTY_PEERGROUP));
180         TimersBuilder builder = new TimersBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net
181                 .yang.bgp.rev151009.bgp.neighbor.group.timers.ConfigBuilder().setHoldTime(Decimal64.valueOf(2, 10))
182                 .build());
183         assertEquals(BigDecimal.TEN.intValue(), OpenConfigMappingUtil.getHoldTimer(NEIGHBOR, new PeerGroupBuilder()
184                 .setPeerGroupName("foo").setTimers(builder.build()).build()));
185     }
186
187     @Test
188     public void testGetRemotePeerAs() {
189         final ConfigBuilder configBuilder = new ConfigBuilder();
190         assertEquals(AS, OpenConfigMappingUtil.getRemotePeerAs(NEIGHBOR.getConfig(), null, null));
191         assertEquals(AS, OpenConfigMappingUtil.getRemotePeerAs(configBuilder.build(), null, rib.getLocalAs()));
192
193         assertEquals(AS, OpenConfigMappingUtil.getRemotePeerAs(NEIGHBOR.getConfig(), EMPTY_PEERGROUP, null));
194         assertEquals(AS, OpenConfigMappingUtil.getRemotePeerAs(configBuilder.build(), EMPTY_PEERGROUP,
195                 rib.getLocalAs()));
196
197         assertEquals(AS, OpenConfigMappingUtil.getRemotePeerAs(null, new PeerGroupBuilder().setPeerGroupName("foo")
198                         .setConfig(new ConfigBuilder().setPeerAs(AS).build()).build(), null));
199     }
200
201     @Test
202     public void testGetLocalPeerAs() {
203         final ConfigBuilder configBuilder = new ConfigBuilder();
204         assertEquals(GLOBAL_AS,OpenConfigMappingUtil.getLocalPeerAs(null, GLOBAL_AS));
205         assertEquals(AS, OpenConfigMappingUtil.getLocalPeerAs(configBuilder.setLocalAs(AS).build(), GLOBAL_AS));
206     }
207
208     @Test
209     public void testIsActive() {
210         final TransportBuilder builder = new TransportBuilder();
211         assertTrue(OpenConfigMappingUtil.isActive(EMPTY_NEIGHBOR, null));
212         assertTrue(OpenConfigMappingUtil.isActive(new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
213                 .setTransport(builder.build()).build(), null));
214
215         final Transport activeFalse = builder.setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp
216                 .rev151009.bgp.neighbor.group.transport.ConfigBuilder().setPassiveMode(true).build()).build();
217         assertFalse(OpenConfigMappingUtil.isActive(new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
218                 .setTransport(activeFalse).build(), null));
219
220         assertTrue(OpenConfigMappingUtil.isActive(EMPTY_NEIGHBOR, EMPTY_PEERGROUP));
221         assertFalse(OpenConfigMappingUtil.isActive(EMPTY_NEIGHBOR, new PeerGroupBuilder().setPeerGroupName("foo")
222             .setTransport(activeFalse).build()));
223     }
224
225     @Test
226     public void testGetRetryTimer() {
227         assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(), OpenConfigMappingUtil.getRetryTimer(NEIGHBOR, null));
228         assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(),
229                 OpenConfigMappingUtil.getRetryTimer(EMPTY_NEIGHBOR, null));
230         TimersBuilder builder = new TimersBuilder()
231             .setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.timers
232                 .ConfigBuilder().setConnectRetry(Decimal64.valueOf(2, 10)).build());
233         assertEquals(BigDecimal.TEN.intValue(), OpenConfigMappingUtil.getRetryTimer(new NeighborBuilder()
234                 .setNeighborAddress(NEIGHBOR_ADDRESS).setTimers(builder.build()).build(), null));
235
236         assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(),
237                 OpenConfigMappingUtil.getRetryTimer(NEIGHBOR, EMPTY_PEERGROUP));
238         assertEquals(BigDecimal.TEN.intValue(), OpenConfigMappingUtil.getRetryTimer(NEIGHBOR,
239                 new PeerGroupBuilder().setPeerGroupName("foo").setTimers(builder.build()).build()));
240     }
241
242     @Test
243     public void testGetNeighborKey() {
244         assertArrayEquals(MD5_PASSWORD.getBytes(StandardCharsets.US_ASCII),
245             OpenConfigMappingUtil.getNeighborKey(NEIGHBOR).asMap().get(INSTANCE.inetAddressFor(NEIGHBOR_ADDRESS)));
246         assertNull(OpenConfigMappingUtil.getNeighborKey(EMPTY_NEIGHBOR));
247         assertNull(OpenConfigMappingUtil.getNeighborKey(new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
248                 .setConfig(new ConfigBuilder().build()).build()));
249     }
250
251     @Test
252     public void testGetNeighborInstanceIdentifier() {
253         assertEquals(BGP_II.child(Neighbors.class).child(Neighbor.class, NEIGHBOR_KEY),
254             OpenConfigMappingUtil.getNeighborInstanceIdentifier(BGP_II, NEIGHBOR_KEY));
255
256     }
257
258     @Test
259     public void testGetNeighborInstanceName() {
260         assertEquals(NEIGHBOR_ADDRESS.getIpv4Address().getValue(), OpenConfigMappingUtil.getNeighborInstanceName(
261             BGP_II.child(Neighbors.class).child(Neighbor.class, NEIGHBOR_KEY)));
262     }
263
264     @Test
265     public void testGetPort() {
266         final TransportBuilder transport = new TransportBuilder();
267         assertEquals(PORT, OpenConfigMappingUtil.getPort(NEIGHBOR, null));
268         assertEquals(PORT, OpenConfigMappingUtil.getPort(new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
269                 .setTransport(transport.build()).build(), null));
270         assertEquals(PORT, OpenConfigMappingUtil.getPort(new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
271                 .setTransport(transport.setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp
272                         .rev151009.bgp.neighbor.group.transport.ConfigBuilder().build()).build()).build(), null));
273         final PortNumber newPort = new PortNumber(Uint16.valueOf(111));
274         final Config portConfig = new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor
275                 .group.transport.ConfigBuilder()
276                     .addAugmentation(new NeighborTransportConfigBuilder().setRemotePort(newPort).build()).build();
277         assertEquals(newPort, OpenConfigMappingUtil.getPort(new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
278                 .setTransport(transport.setConfig(portConfig).build()).build(), null));
279
280         assertEquals(newPort, OpenConfigMappingUtil.getPort(new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
281                 .setTransport(transport.setConfig(portConfig).build()).build(), EMPTY_PEERGROUP));
282
283         final Config portConfigGroup = new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp
284                 .neighbor.group.transport.ConfigBuilder()
285                     .addAugmentation(new PeerGroupTransportConfigBuilder().setRemotePort(newPort).build()).build();
286         assertEquals(newPort, OpenConfigMappingUtil.getPort(EMPTY_NEIGHBOR, new PeerGroupBuilder()
287                 .setPeerGroupName("foo").setTransport(transport.setConfig(portConfigGroup).build()).build()));
288     }
289
290     @Test
291     public void testGetLocalAddress() {
292         assertNull(OpenConfigMappingUtil.getLocalAddress(null));
293         final TransportBuilder transport = new TransportBuilder();
294         assertNull(OpenConfigMappingUtil.getLocalAddress(transport.build()));
295         assertNull(OpenConfigMappingUtil.getLocalAddress(transport.setConfig(
296                 new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport
297                         .ConfigBuilder().build()).build()));
298         assertEquals(new IpAddressNoZone(LOCAL_HOST), OpenConfigMappingUtil.getLocalAddress(transport.setConfig(
299                 new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport
300                         .ConfigBuilder().setLocalAddress(new BgpNeighborTransportConfig
301                         .LocalAddress(new IpAddress(new Ipv4Address(LOCAL_HOST.getValue())))).build()).build()));
302     }
303
304     @Test
305     public void testGetAfiSafiWithDefault() {
306         final AfiSafi v4afi = new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.VALUE).build();
307         final ImmutableMap<AfiSafiKey, AfiSafi> defaultValue = ImmutableMap.of(v4afi.key(), v4afi);
308         assertEquals(defaultValue, OpenConfigMappingUtil.getAfiSafiWithDefault(null, true));
309         final AfiSafis afiSafi = new AfiSafisBuilder().build();
310         assertEquals(defaultValue, OpenConfigMappingUtil.getAfiSafiWithDefault(afiSafi, true));
311
312         final AfiSafi afiSafiIpv6 = new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.VALUE)
313                 .addAugmentation(new NeighborAddPathsConfigBuilder().setReceive(true).setSendMax(SHORT).build())
314                 .build();
315         final Map<AfiSafiKey, AfiSafi> afiSafiIpv6List = BindingMap.of(afiSafiIpv6);
316
317         final Map<AfiSafiKey, AfiSafi> v6 = OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder()
318             .setAfiSafi(afiSafiIpv6List).build(), true);
319         assertEquals(2, v6.size());
320         assertTrue(v6.containsValue(afiSafiIpv6));
321         assertTrue(v6.containsValue(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.VALUE).build()));
322         assertEquals(AFI_SAFI, OpenConfigMappingUtil.getAfiSafiWithDefault(createAfiSafi(), true));
323
324         assertTrue(OpenConfigMappingUtil.getAfiSafiWithDefault(null, false).isEmpty());
325         assertTrue(OpenConfigMappingUtil.getAfiSafiWithDefault(afiSafi, false).isEmpty());
326         assertEquals(afiSafiIpv6, OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder()
327                 .setAfiSafi(afiSafiIpv6List).build(), false).values().iterator().next());
328         assertEquals(AFI_SAFI, OpenConfigMappingUtil.getAfiSafiWithDefault(createAfiSafi(), false));
329     }
330
331     @Test
332     public void testGetGlobalClusterIdentifier() {
333         final org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base
334                 .ConfigBuilder configBuilder = new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009
335                 .bgp.global.base.ConfigBuilder();
336         configBuilder.setRouterId(ROUTER_ID);
337         assertEquals(ROUTER_ID.getValue(),
338                 OpenConfigMappingUtil.getGlobalClusterIdentifier(configBuilder.build()).getValue());
339
340         configBuilder.addAugmentation(new GlobalConfigAugmentationBuilder()
341                 .setRouteReflectorClusterId(new RrClusterIdType(CLUSTER_ID)).build()).build();
342         assertEquals(CLUSTER_ID.getValue(),
343                 OpenConfigMappingUtil.getGlobalClusterIdentifier(configBuilder.build()).getValue());
344     }
345
346     @Test
347     public void testGetNeighborClusterIdentifier() {
348
349         assertNull(OpenConfigMappingUtil.getNeighborClusterIdentifier(null, null));
350
351         final PeerGroupBuilder peerGroup = new PeerGroupBuilder().setPeerGroupName("foo");
352         assertNull(OpenConfigMappingUtil.getNeighborClusterIdentifier(null, peerGroup.build()));
353
354         final RouteReflectorBuilder configBuilder = new RouteReflectorBuilder();
355         assertNull(OpenConfigMappingUtil.getNeighborClusterIdentifier(configBuilder.build(), peerGroup.build()));
356
357         configBuilder.setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor
358                 .group.route.reflector.ConfigBuilder()
359                 .setRouteReflectorClusterId(new RrClusterIdType(CLUSTER_ID)).build()).build();
360         assertEquals(CLUSTER_ID.getValue(), OpenConfigMappingUtil.getNeighborClusterIdentifier(configBuilder.build(),
361                 peerGroup.build()).getValue());
362
363         assertEquals(CLUSTER_ID.getValue(), OpenConfigMappingUtil.getNeighborClusterIdentifier(null,
364                 peerGroup.setRouteReflector(configBuilder.build()).build()).getValue());
365     }
366
367     @Test
368     public void isAppNeighbor() {
369         assertFalse(OpenConfigMappingUtil.isApplicationPeer(new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
370                 .setConfig(new ConfigBuilder().build()).build()));
371         final Neighbor neighbor = new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
372                 .setConfig(new ConfigBuilder()
373                     .addAugmentation(new NeighborPeerGroupConfigBuilder()
374                         .setPeerGroup(OpenConfigMappingUtil.APPLICATION_PEER_GROUP_NAME).build()).build()).build();
375         assertTrue(OpenConfigMappingUtil.isApplicationPeer(neighbor));
376     }
377
378     @Test
379     public void toPathSelectionMode() {
380         final List<AfiSafi> families = new ArrayList<>();
381         families.add(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.VALUE)
382             .addAugmentation(new GlobalAddPathsConfigBuilder().setSendMax(N_PATHS).build()).build());
383         families.add(new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.VALUE)
384             .addAugmentation(new GlobalAddPathsConfigBuilder().setSendMax(ALL_PATHS).build()).build());
385         final Map<BgpTableType, PathSelectionMode> result = OpenConfigMappingUtil
386                 .toPathSelectionMode(families, tableTypeRegistry);
387         final Map<BgpTableType, PathSelectionMode> expected = new HashMap<>();
388         expected.put(new BgpTableTypeImpl(Ipv4AddressFamily.VALUE, UnicastSubsequentAddressFamily.VALUE),
389                 ADD_PATH_BEST_N_PATH_SELECTION);
390         expected.put(new BgpTableTypeImpl(Ipv6AddressFamily.VALUE, UnicastSubsequentAddressFamily.VALUE),
391                 ADD_PATH_BEST_ALL_PATH_SELECTION);
392         // FIXME: these assertions are wrong, as they perform lookup on non-existing keys
393         assertEquals(expected.get(0), result.get(0));
394         assertEquals(expected.get(1), result.get(1));
395     }
396
397     @Test
398     public void toPeerRole() {
399         Neighbor neighbor = new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS).setConfig(new ConfigBuilder()
400                 .setPeerType(PeerType.EXTERNAL).build()).build();
401         PeerRole peerRoleResult = OpenConfigMappingUtil.toPeerRole(neighbor);
402         Assert.assertEquals(PeerRole.Ebgp, peerRoleResult);
403
404         neighbor = new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
405             .setConfig(new ConfigBuilder().setPeerType(PeerType.INTERNAL).build())
406             .build();
407         peerRoleResult = OpenConfigMappingUtil.toPeerRole(neighbor);
408         Assert.assertEquals(PeerRole.Ibgp, peerRoleResult);
409
410         neighbor = new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
411             .setRouteReflector(new RouteReflectorBuilder().setConfig(
412                     new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp
413                 .neighbor.group.route.reflector.ConfigBuilder().setRouteReflectorClient(true).build()).build()).build();
414         peerRoleResult = OpenConfigMappingUtil.toPeerRole(neighbor);
415         Assert.assertEquals(PeerRole.RrClient, peerRoleResult);
416     }
417
418     @Test
419     public void toAddPathCapability() {
420         final List<AfiSafi> families = new ArrayList<>();
421         families.add(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.VALUE)
422             .addAugmentation(new NeighborAddPathsConfigBuilder()
423                 .setReceive(Boolean.TRUE).setSendMax(ALL_PATHS).build()).build());
424         families.add(new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.VALUE)
425             .addAugmentation(new NeighborAddPathsConfigBuilder()
426                 .setReceive(Boolean.FALSE).setSendMax(N_PATHS).build()).build());
427         families.add(new AfiSafiBuilder().setAfiSafiName(IPV6LABELLEDUNICAST.VALUE)
428             .addAugmentation(new NeighborAddPathsConfigBuilder().setReceive(Boolean.FALSE).build()).build());
429         final List<AddressFamilies> result = OpenConfigMappingUtil .toAddPathCapability(families, tableTypeRegistry);
430         assertEquals(FAMILIES, result);
431     }
432
433     @Test
434     public void getGracefulRestartTimerTest() {
435         final int neighborTimer = 5;
436         final int peerGroupTimer = 10;
437         Neighbor neighbor = new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS)
438                 .setGracefulRestart(new GracefulRestartBuilder()
439                         .setConfig(createGracefulConfig(Uint16.valueOf(neighborTimer)))
440                         .build()).build();
441         PeerGroup peerGroup = new PeerGroupBuilder().setPeerGroupName("foo")
442                 .setGracefulRestart(new GracefulRestartBuilder()
443                         .setConfig(createGracefulConfig(Uint16.valueOf(peerGroupTimer)))
444                         .build()).build();
445         // both timers present, pick peer group one
446         int timer = OpenConfigMappingUtil.getGracefulRestartTimer(neighbor, peerGroup, HOLDTIMER);
447         assertEquals(peerGroupTimer, timer);
448
449         // peer group missing graceful restart, use neighbor timer
450         timer = OpenConfigMappingUtil.getGracefulRestartTimer(neighbor, EMPTY_PEERGROUP, HOLDTIMER);
451         assertEquals(neighborTimer, timer);
452
453         // graceful restart enabled but timer not set, use hold time
454         peerGroup = new PeerGroupBuilder().setPeerGroupName("bar")
455                 .setGracefulRestart(new GracefulRestartBuilder()
456                         .setConfig(createGracefulConfig(null))
457                         .build()).build();
458         timer = OpenConfigMappingUtil.getGracefulRestartTimer(EMPTY_NEIGHBOR, peerGroup, HOLDTIMER);
459         assertEquals(HOLDTIMER, timer);
460     }
461
462     private static org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.graceful.restart.graceful
463             .restart.Config createGracefulConfig(final Uint16 restartTimer) {
464         return new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.graceful.restart.graceful
465                 .restart.ConfigBuilder().setRestartTime(restartTimer).build();
466     }
467
468     @Test
469     public void getRevisedErrorHandlingTest() {
470         final NeighborBuilder neighbor = new NeighborBuilder().setNeighborAddress(NEIGHBOR_ADDRESS);
471         final PeerGroupBuilder peerGroup = new PeerGroupBuilder().setPeerGroupName("foo");
472         final org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.error.handling
473                 .ConfigBuilder errorHandlingConfig = new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp
474                         .rev151009.bgp.neighbor.group.error.handling.ConfigBuilder();
475         // error handling not set -> null
476         assertNull(OpenConfigMappingUtil.getRevisedErrorHandling(PeerRole.Ibgp, peerGroup.build(),
477                 neighbor.build()));
478         // error handling for peer group disabled, neighbor not set -> null
479         peerGroup.setErrorHandling(new ErrorHandlingBuilder()
480                 .setConfig(errorHandlingConfig.setTreatAsWithdraw(false).build())
481                 .build());
482         assertNull(OpenConfigMappingUtil.getRevisedErrorHandling(PeerRole.Ibgp, peerGroup.build(),
483                 neighbor.build()));
484         // error handling for peer group enabled, neighbor not set, Igp -> error handling for internal peer
485         peerGroup.setErrorHandling(new ErrorHandlingBuilder()
486                 .setConfig(errorHandlingConfig.setTreatAsWithdraw(true).build())
487                 .build());
488         assertEquals(RevisedErrorHandlingSupportImpl.forInternalPeer(),
489                 OpenConfigMappingUtil.getRevisedErrorHandling(PeerRole.Ibgp, peerGroup.build(), neighbor.build()));
490         // error handling for peer group enabled, neighbor disabled -> null
491         neighbor.setErrorHandling(new ErrorHandlingBuilder()
492                 .setConfig(errorHandlingConfig.setTreatAsWithdraw(false).build())
493                 .build());
494         assertNull(OpenConfigMappingUtil.getRevisedErrorHandling(PeerRole.Ibgp, peerGroup.build(),
495                 neighbor.build()));
496         // error handling for peer group enabled, neighbor enabled, Igb -> error handling for internal peer
497         neighbor.setErrorHandling(new ErrorHandlingBuilder()
498                 .setConfig(errorHandlingConfig.setTreatAsWithdraw(true).build())
499                 .build());
500         assertEquals(RevisedErrorHandlingSupportImpl.forInternalPeer(),
501                 OpenConfigMappingUtil.getRevisedErrorHandling(PeerRole.Ibgp, peerGroup.build(), neighbor.build()));
502         // error handling for peer group enabled, neighbor enabled, Egb -> error handling for external peer
503         neighbor.setErrorHandling(new ErrorHandlingBuilder()
504                 .setConfig(errorHandlingConfig.setTreatAsWithdraw(true).build())
505                 .build());
506         assertEquals(RevisedErrorHandlingSupportImpl.forExternalPeer(),
507                 OpenConfigMappingUtil.getRevisedErrorHandling(PeerRole.Ebgp, peerGroup.build(), neighbor.build()));
508     }
509 }