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