BUG-6747: Race condition on peer connection
[bgpcep.git] / bgp / rib-impl / src / test / java / org / opendaylight / protocol / bgp / rib / impl / ExportPolicyPeerTrackerImplTest.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;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertFalse;
13 import static org.junit.Assert.assertNull;
14 import static org.junit.Assert.assertTrue;
15 import static org.opendaylight.controller.md.sal.binding.impl.BindingDOMMountPointServiceAdapter.LOG;
16 import static org.opendaylight.protocol.bgp.rib.impl.AdjRibInWriter.PEER_ID_QNAME;
17
18 import java.util.ArrayList;
19 import java.util.HashSet;
20 import java.util.List;
21 import java.util.Optional;
22 import java.util.Set;
23 import org.junit.Test;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.SendReceive;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.BgpRib;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerId;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.SimpleRoutingPolicy;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.rib.Peer;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.ClusterIdentifier;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
35 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
36
37 public class ExportPolicyPeerTrackerImplTest {
38     private static final TablesKey TABLE_KEY = new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
39     private static final Ipv4Address BGP_ID = new Ipv4Address("127.0.0.1");
40     private static final PolicyDatabase PD = new PolicyDatabase(72L, BGP_ID, new ClusterIdentifier(BGP_ID));
41     private static final PeerId PEER_ID1 = new PeerId("bgp://42.42.42.42");
42     private static final YangInstanceIdentifier YII_PEER1 = YangInstanceIdentifier.builder().node(BgpRib.QNAME).node(Peer.QNAME)
43         .nodeWithKey(Peer.QNAME, PEER_ID_QNAME, PEER_ID1.getValue()).build();
44     private static final PeerId PEER_ID2 = new PeerId("bgp://42.42.42.43");
45     private static final YangInstanceIdentifier YII_PEER2 = YangInstanceIdentifier.builder().node(BgpRib.QNAME).node(Peer.QNAME)
46         .nodeWithKey(Peer.QNAME, PEER_ID_QNAME, PEER_ID2.getValue()).build();
47     private static final PeerId PEER_ID3 = new PeerId("bgp://42.42.42.44");
48     private static final YangInstanceIdentifier YII_PEER3 = YangInstanceIdentifier.builder().node(BgpRib.QNAME).node(Peer.QNAME)
49         .nodeWithKey(Peer.QNAME, PEER_ID_QNAME, PEER_ID3.getValue()).build();
50     private static final PeerId PEER_ID4 = new PeerId("bgp://42.42.42.45");
51     private static final YangInstanceIdentifier YII_PEER4 = YangInstanceIdentifier.builder().node(BgpRib.QNAME).node(Peer.QNAME)
52         .nodeWithKey(Peer.QNAME, PEER_ID_QNAME, PEER_ID4.getValue()).build();
53     private static final PeerId PEER_ID5 = new PeerId("bgp://42.42.42.46");
54     private final static List<AutoCloseable> TABLE_REGISTRATION = new ArrayList<>();
55
56     @Test
57     public void testExportPolicyPeerTrackerImpl() throws Exception {
58         final ExportPolicyPeerTrackerImpl exportPpt = new ExportPolicyPeerTrackerImpl(PD, TABLE_KEY);
59
60         TABLE_REGISTRATION.add(exportPpt.registerPeer(PEER_ID1, SendReceive.Both, YII_PEER1, PeerRole.RrClient, Optional.empty()));
61         TABLE_REGISTRATION.add(exportPpt.registerPeer(PEER_ID2, SendReceive.Receive, YII_PEER2, PeerRole.Ibgp, Optional.of(SimpleRoutingPolicy.AnnounceNone)));
62         TABLE_REGISTRATION.add(exportPpt.registerPeer(PEER_ID3, SendReceive.Send, YII_PEER3, PeerRole.Ebgp, Optional.of(SimpleRoutingPolicy.LearnNone)));
63         TABLE_REGISTRATION.add(exportPpt.registerPeer(PEER_ID4, null, YII_PEER4, PeerRole.Ibgp, Optional.empty()));
64
65         assertEquals(PeerRole.RrClient, exportPpt.getRole(YII_PEER1));
66         assertEquals(PeerRole.Ibgp, exportPpt.getRole(YII_PEER2));
67         assertEquals(PeerRole.Ebgp, exportPpt.getRole(YII_PEER3));
68         assertEquals(PeerRole.Ibgp, exportPpt.getRole(YII_PEER4));
69
70         assertTrue(exportPpt.getPeerGroup(PeerRole.RrClient).containsPeer(PEER_ID1));
71         assertTrue(exportPpt.getPeerGroup(PeerRole.Ibgp).containsPeer(PEER_ID2));
72         assertTrue(exportPpt.getPeerGroup(PeerRole.Ebgp).containsPeer(PEER_ID3));
73         assertTrue(exportPpt.getPeerGroup(PeerRole.Ibgp).containsPeer(PEER_ID4));
74
75         assertTrue(exportPpt.isTableSupported(PEER_ID1));
76         assertFalse(exportPpt.isTableSupported(PEER_ID2));
77         assertTrue(exportPpt.isTableSupported(PEER_ID3));
78         assertTrue(exportPpt.isTableSupported(PEER_ID4));
79         assertFalse(exportPpt.isTableSupported(PEER_ID5));
80
81         assertTrue(exportPpt.isAddPathSupportedByPeer(PEER_ID1));
82         assertTrue(exportPpt.isAddPathSupportedByPeer(PEER_ID2));
83         assertFalse(exportPpt.isAddPathSupportedByPeer(PEER_ID3));
84         assertFalse(exportPpt.isAddPathSupportedByPeer(PEER_ID4));
85         assertFalse(exportPpt.isAddPathSupportedByPeer(PEER_ID5));
86
87         TABLE_REGISTRATION.remove(0).close();
88         assertNull(exportPpt.getRole(YII_PEER1));
89         assertNull(exportPpt.getPeerGroup(PeerRole.RrClient));
90         assertFalse(exportPpt.isTableSupported(PEER_ID1));
91         assertFalse(exportPpt.isAddPathSupportedByPeer(PEER_ID1));
92
93
94         TABLE_REGISTRATION.get(0).close();
95         assertNull(exportPpt.getRole(YII_PEER2));
96         assertFalse(exportPpt.getPeerGroup(PeerRole.Ibgp).containsPeer(PEER_ID2));
97         assertFalse(exportPpt.isTableSupported(PEER_ID2));
98         assertFalse(exportPpt.isAddPathSupportedByPeer(PEER_ID2));
99
100         for (final AutoCloseable tableCloseable : TABLE_REGISTRATION) {
101             try {
102                 tableCloseable.close();
103             } catch (final Exception e) {
104                 LOG.warn("Failed to close registration", e);
105             }
106         }
107         TABLE_REGISTRATION.clear();
108     }
109
110 }