BUG-6747: Race condition on peer connection
[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
9 package org.opendaylight.protocol.bgp.rib.impl.config;
10
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.opendaylight.protocol.bgp.rib.impl.config.AbstractConfig.AS;
16 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.AFI_SAFI;
17 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.AFI_SAFI_IPV4;
18 import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.DEFAULT_TIMERS;
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.BgpPeerTest.createTransport;
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.nio.charset.StandardCharsets;
30 import java.util.ArrayList;
31 import java.util.List;
32 import java.util.Set;
33 import javax.annotation.Nonnull;
34 import org.junit.Test;
35 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
36 import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
37 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
38 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
39 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
40 import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
41 import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
42 import org.opendaylight.protocol.bgp.rib.impl.spi.CodecsRegistry;
43 import org.opendaylight.protocol.bgp.rib.impl.spi.ImportPolicyPeerTracker;
44 import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
45 import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContextRegistry;
46 import org.opendaylight.protocol.bgp.rib.impl.stats.rib.impl.BGPRenderStats;
47 import org.opendaylight.protocol.bgp.rib.spi.ExportPolicyPeerTracker;
48 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
49 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
50 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder;
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.TransportBuilder;
55 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
56 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborBuilder;
57 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborKey;
58 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
59 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Neighbors;
60 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST;
61 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV6UNICAST;
62 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.NetworkInstances;
63 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstance;
64 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstanceKey;
65 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.Protocols;
66 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol;
67 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolKey;
68 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.BGP;
69 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
70 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1Builder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config1;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config1Builder;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Protocol1;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.Rib;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.RibKey;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId;
81 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
82 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
83 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
84
85 public class OpenConfigMappingUtilTest {
86     private static final Neighbor NEIGHBOR = createNeighborExpected(NEIGHBOR_ADDRESS);
87     private static final String KEY = "bgp";
88     private static final InstanceIdentifier<Bgp> BGP_II = InstanceIdentifier.create(NetworkInstances.class)
89         .child(NetworkInstance.class, new NetworkInstanceKey("identifier-test")).child(Protocols.class)
90         .child(Protocol.class, new ProtocolKey(BGP.class, KEY)).augmentation(Protocol1.class).child(Bgp.class);
91     private static final NeighborKey NEIGHBOR_KEY = new NeighborKey(NEIGHBOR_ADDRESS);
92
93     private static class RibMock implements RIB {
94
95         @Override
96         public AsNumber getLocalAs() {
97             return AS;
98         }
99
100         @Override
101         public BgpId getBgpIdentifier() {
102             return null;
103         }
104
105         @Nonnull
106         @Override
107         public Set<? extends BgpTableType> getLocalTables() {
108             return null;
109         }
110
111         @Override
112         public BGPDispatcher getDispatcher() {
113             return null;
114         }
115
116         @Override
117         public DOMTransactionChain createPeerChain(final TransactionChainListener listener) {
118             return null;
119         }
120
121         @Override
122         public RIBExtensionConsumerContext getRibExtensions() {
123             return null;
124         }
125
126         @Override
127         public RIBSupportContextRegistry getRibSupportContext() {
128             return null;
129         }
130
131         @Override
132         public YangInstanceIdentifier getYangRibId() {
133             return null;
134         }
135
136         @Override
137         public CodecsRegistry getCodecsRegistry() {
138             return null;
139         }
140
141         @Override
142         public DOMDataTreeChangeService getService() {
143             return null;
144         }
145
146         @Override
147         public BGPRenderStats getRenderStats() {
148             return null;
149         }
150
151         @Override
152         public ImportPolicyPeerTracker getImportPolicyPeerTracker() {
153             return null;
154         }
155
156         @Override
157         public ExportPolicyPeerTracker getExportPolicyPeerTracker(final TablesKey tablesKey) {
158             return null;
159         }
160
161         @Override
162         public Set<TablesKey> getLocalTablesKeys() {
163             return null;
164         }
165
166         @Override
167         public ServiceGroupIdentifier getRibIServiceGroupIdentifier() {
168             return null;
169         }
170
171         @Override
172         public ClusterSingletonServiceRegistration registerClusterSingletonService(final ClusterSingletonService clusterSingletonService) {
173             return null;
174         }
175
176         @Override
177         public void close() throws Exception {
178
179         }
180
181         @Override
182         public KeyedInstanceIdentifier<Rib, RibKey> getInstanceIdentifier() {
183             return null;
184         }
185     }
186
187     @Test
188     public void testGetRibInstanceName() throws Exception {
189         assertEquals(KEY, OpenConfigMappingUtil.getRibInstanceName(BGP_II));
190     }
191
192     @Test
193     public void testGetHoldTimer() throws Exception {
194         assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(), OpenConfigMappingUtil.getHoldTimer(NEIGHBOR));
195     }
196
197     @Test
198     public void testGetPeerAs() throws Exception {
199         assertEquals(AS, OpenConfigMappingUtil.getPeerAs(NEIGHBOR, null));
200         assertEquals(AS, OpenConfigMappingUtil.getPeerAs(new NeighborBuilder().build(), new RibMock()));
201     }
202
203     @Test
204     public void testIsActive() throws Exception {
205         assertTrue(OpenConfigMappingUtil.isActive(new NeighborBuilder().build()));
206         assertTrue(OpenConfigMappingUtil.isActive(new NeighborBuilder().setTransport(new TransportBuilder().build()).build()));
207         assertTrue(OpenConfigMappingUtil.isActive(new NeighborBuilder().setTransport(createTransport()).build()));
208     }
209
210     @Test
211     public void testGetRetryTimer() throws Exception {
212         assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(), OpenConfigMappingUtil.getRetryTimer(NEIGHBOR));
213         assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(), OpenConfigMappingUtil.getRetryTimer(new NeighborBuilder().build()));
214     }
215
216     @Test
217     public void testGetNeighborKey() throws Exception {
218         assertArrayEquals(MD5_PASSWORD.getBytes(StandardCharsets.US_ASCII),
219             OpenConfigMappingUtil.getNeighborKey(NEIGHBOR).get(INSTANCE.inetAddressFor(NEIGHBOR_ADDRESS)));
220         assertNull(OpenConfigMappingUtil.getNeighborKey(new NeighborBuilder().build()));
221         assertNull(OpenConfigMappingUtil.getNeighborKey(new NeighborBuilder().setConfig(new ConfigBuilder().build()).build()));
222     }
223
224     @Test
225     public void testGetNeighborInstanceIdentifier() throws Exception {
226         assertEquals(BGP_II.child(Neighbors.class).child(Neighbor.class, NEIGHBOR_KEY),
227             OpenConfigMappingUtil.getNeighborInstanceIdentifier(BGP_II, NEIGHBOR_KEY));
228
229     }
230
231     @Test
232     public void testGetNeighborInstanceName() throws Exception {
233         assertEquals(NEIGHBOR_ADDRESS.getIpv4Address().getValue(),
234             OpenConfigMappingUtil.getNeighborInstanceName(BGP_II.child(Neighbors.class).child(Neighbor.class, NEIGHBOR_KEY)));
235     }
236
237     @Test
238     public void testGetPort() throws Exception {
239         assertEquals(PORT, OpenConfigMappingUtil.getPort(NEIGHBOR));
240         assertEquals(PORT, OpenConfigMappingUtil.getPort(new NeighborBuilder().setTransport(new TransportBuilder().build()).build()));
241         assertEquals(PORT, OpenConfigMappingUtil.getPort(new NeighborBuilder().setTransport(
242             new TransportBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport.
243                 ConfigBuilder().build()).build()).build()));
244         assertEquals(PORT, OpenConfigMappingUtil.getPort(new NeighborBuilder().setTransport(
245             new TransportBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport.
246                 ConfigBuilder().addAugmentation(Config1.class, new Config1Builder().build()).build()).build()).build()));
247     }
248
249     @Test
250     public void testGetAfiSafiWithDefault() throws Exception {
251         final ImmutableList<AfiSafi> defaultValue = ImmutableList.of(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build());
252         assertEquals(defaultValue, OpenConfigMappingUtil.getAfiSafiWithDefault(null, true));
253         final AfiSafis afiSafi = new AfiSafisBuilder().build();
254         assertEquals(defaultValue, OpenConfigMappingUtil.getAfiSafiWithDefault(afiSafi, true));
255
256         final AfiSafi afiSafiIpv6 = new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class).addAugmentation(AfiSafi1.class,
257             new AfiSafi1Builder().setReceive(true).setSendMax(SHORT).build()).build();
258         final List<AfiSafi> afiSafiIpv6List = new ArrayList<>();
259         afiSafiIpv6List.add(afiSafiIpv6);
260
261         final List<AfiSafi> expected = new ArrayList<>(afiSafiIpv6List);
262         expected.add(AFI_SAFI_IPV4);
263         assertEquals(afiSafiIpv6, OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder().setAfiSafi(afiSafiIpv6List).build(), true).get(0));
264         assertEquals(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build(),
265             OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder().setAfiSafi(afiSafiIpv6List).build(), true).get(1));
266         assertEquals(AFI_SAFI, OpenConfigMappingUtil.getAfiSafiWithDefault(createAfiSafi(), true));
267
268         assertTrue(OpenConfigMappingUtil.getAfiSafiWithDefault(null, false).isEmpty());
269         assertTrue(OpenConfigMappingUtil.getAfiSafiWithDefault(afiSafi, false).isEmpty());
270         assertEquals(afiSafiIpv6, OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder().setAfiSafi(afiSafiIpv6List).build(), false).get(0));
271         assertEquals(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build(),
272             OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder().setAfiSafi(afiSafiIpv6List).build(), false).get(1));
273         assertEquals(AFI_SAFI, OpenConfigMappingUtil.getAfiSafiWithDefault(createAfiSafi(), false));
274     }
275 }