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