BUG-6647 Increase code coverage and clean up IV 86/45786/4
authorClaudio D. Gasparini <cgaspari@cisco.com>
Sun, 18 Sep 2016 14:00:34 +0000 (16:00 +0200)
committerClaudio D. Gasparini <cgaspari@cisco.com>
Tue, 20 Sep 2016 06:55:45 +0000 (08:55 +0200)
-Implemet Rib-impl test

Change-Id: Idc952503dddae027e5a48d7b866ed8e94771287f
Signed-off-by: Claudio D. Gasparini <cgaspari@cisco.com>
22 files changed:
bgp/path-selection-mode/src/main/java/org/opendaylight/protocol/bgp/mode/impl/add/AddPathAbstractRouteEntry.java
bgp/rib-impl/pom.xml
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/ApplicationPeer.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/RIBImpl.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeer.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerImpl.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeer.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtil.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/BGPRenderStatsImpl.java
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/RouteUpdateKeyTest.java [new file with mode: 0644]
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AbstractConfig.java [new file with mode: 0644]
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeerTest.java [new file with mode: 0644]
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerImplTest.java [new file with mode: 0644]
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeerTest.java [new file with mode: 0644]
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtilTest.java [new file with mode: 0644]
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImplTest.java [new file with mode: 0644]
bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/BGPRenderStatsImplTest.java [new file with mode: 0644]
bgp/rib-spi/src/main/java/org/opendaylight/protocol/bgp/rib/spi/PeerRoleUtil.java
bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/CommunitiesBuilder.java
bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/PrefixesBuilder.java
bgp/testtool/src/main/java/org/opendaylight/protocol/bgp/testtool/TestingListener.java
rsvp/spi/src/main/java/org/opendaylight/protocol/rsvp/parser/spi/pojo/SimpleRSVPExtensionProviderContext.java

index 33fabba7194ba161c5c3814c6d582837ce991290..cc664dc64740c350796ee3d9c0a37679f5fcc55d 100644 (file)
@@ -24,7 +24,6 @@ import org.opendaylight.protocol.bgp.rib.spi.PeerExportGroup;
 import org.opendaylight.protocol.bgp.rib.spi.PeerExportGroup.PeerExporTuple;
 import org.opendaylight.protocol.bgp.rib.spi.RIBSupport;
 import org.opendaylight.protocol.bgp.rib.spi.RouterIds;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
@@ -186,17 +185,6 @@ public abstract class AddPathAbstractRouteEntry extends AbstractRouteEntry {
             ribSup, discPeers, tx);
     }
 
-    private void removePathFromDataStore(final BestPath path, final boolean isFirstBestPath, final PathArgument routeIdPA,
-        final YangInstanceIdentifier locRibTarget, final RIBSupport ribSup, final ExportPolicyPeerTracker peerPT, final TablesKey localTK,
-        final CacheDisconnectedPeers discPeers, final DOMDataWriteTransaction tx) {
-        LOG.trace("Best Path removed {}", path);
-        final PathArgument routeIdAddPath = ribSup.getRouteIdAddPath(path.getPathId(), routeIdPA);
-        final YangInstanceIdentifier pathAddPathTarget = ribSup.routePath(locRibTarget.node(ROUTES_IDENTIFIER), routeIdAddPath);
-
-        fillLocRib(pathAddPathTarget, null, tx);
-        fillAdjRibsOut(isFirstBestPath, null, null, null, routeIdPA, routeIdAddPath, path.getPeerId(), peerPT, localTK, ribSup, discPeers, tx);
-    }
-
     private void fillAdjRibsOut(final boolean isFirstBestPath, final ContainerNode attributes, final NormalizedNode<?, ?> value, final MapEntryNode addPathValue,
         final PathArgument routeId, final PathArgument routeIdAddPath, final PeerId routePeerId, final ExportPolicyPeerTracker peerPT, final TablesKey
         localTK, final RIBSupport ribSup, final CacheDisconnectedPeers discPeers, final DOMDataWriteTransaction tx) {
index cd6b0f1a3afff366bad8a6fe4b0a7bf460ef0db0..06fc456ed76f3249f92c4cd91a654256c28a1679 100644 (file)
@@ -30,6 +30,9 @@
     <prerequisites>
         <maven>3.0.4</maven>
     </prerequisites>
+    <properties>
+        <powermock.version>1.6.4</powermock.version>
+    </properties>
 
     <dependencies>
         <dependency>
             <groupId>ch.qos.logback</groupId>
             <artifactId>logback-classic</artifactId>
         </dependency>
-
-
+        <dependency>
+            <groupId>org.powermock</groupId>
+            <artifactId>powermock</artifactId>
+            <version>${powermock.version}</version>
+            <type>pom</type>
+        </dependency>
+        <dependency>
+            <groupId>org.powermock</groupId>
+            <artifactId>powermock-module-junit4</artifactId>
+            <version>${powermock.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.powermock</groupId>
+            <artifactId>powermock-api-mockito</artifactId>
+            <version>${powermock.version}</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
index 73fdf42504a408e385c673a9a3429fcc86df7ef8..7ed275f93f3d227b3654db04be7e063101e7b342 100644 (file)
@@ -185,10 +185,18 @@ public class ApplicationPeer implements AutoCloseable, org.opendaylight.protocol
 
     @Override
     public void close() {
-        this.effectiveRibInWriter.close();
-        this.writer.removePeer();
-        this.chain.close();
-        this.writerChain.close();
+        if(this.effectiveRibInWriter != null) {
+            this.effectiveRibInWriter.close();
+        }
+        if(this.writer != null) {
+            this.writer.removePeer();
+        }
+        if(this.chain != null) {
+            this.chain.close();
+        }
+        if(this.writerChain != null) {
+            this.writerChain.close();
+        }
     }
 
     @Override
index 7b30f0b3b2ec84d0b1b97d61e05795b3a5f3f575..842e92c4b49d35d5da5bba8de41fab34839d1514 100755 (executable)
@@ -192,11 +192,13 @@ public final class RIBImpl extends DefaultRibReference implements ClusterSinglet
 
     @Override
     public synchronized void close() throws Exception {
-        this.domChain.close();
         if (this.registration != null) {
             this.registration.close();
             this.registration = null;
         }
+        if(this.domChain != null) {
+            this.domChain.close();
+        }
     }
 
     @Override
@@ -209,6 +211,7 @@ public final class RIBImpl extends DefaultRibReference implements ClusterSinglet
         return this.bgpIdentifier;
     }
 
+    @Nonnull
     @Override
     public Set<? extends BgpTableType> getLocalTables() {
         return this.localTables;
index edcc322755e76a2d8bb9915c6ace0e54b90fc29b..61e5ce2252d1433c5ea3fe56a5bc7546c60bc5df 100644 (file)
@@ -35,7 +35,7 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class AppPeer implements PeerBean {
+public final class AppPeer implements PeerBean {
     private static final Logger LOG = LoggerFactory.getLogger(AppPeer.class);
     private static final QName APP_ID_QNAME = QName.create(ApplicationRib.QNAME, "id").intern();
     private Neighbor currentConfiguration;
@@ -123,7 +123,9 @@ public class AppPeer implements PeerBean {
         @Override
         public ListenableFuture<Void> closeServiceInstance() {
             LOG.info("Application Peer Singleton Service {} instance closed", getIdentifier());
-            this.registration.close();
+            if(this.registration != null) {
+                this.registration.close();
+            }
             this.applicationPeer.close();
             return Futures.immediateFuture(null);
         }
index 02fdcaa3bedc4d0e72c51a7eae1d5432714b11dd..bc863d64c487457973524e7498a85da2d0348788 100644 (file)
@@ -165,10 +165,7 @@ public final class BgpDeployerImpl implements BgpDeployer, ClusteredDataTreeChan
         if(ribImpl == null ) {
             onGlobalCreated(rootIdentifier, global, configurationWriter);
         } else if (!ribImpl.isGlobalEqual(global)) {
-            final List<PeerBean> closedPeers = closeAllBindedPeers(rootIdentifier);
-            ribImpl.close();
-            initiateRibInstance(rootIdentifier, global, ribImpl, configurationWriter);
-            closedPeers.forEach(peer -> peer.restart(ribImpl, this.mappingService));
+            onGlobalUpdated(rootIdentifier, global, ribImpl, configurationWriter);
         }
     }
 
@@ -191,6 +188,14 @@ public final class BgpDeployerImpl implements BgpDeployer, ClusteredDataTreeChan
         LOG.debug("RIB instance created {}", ribImpl);
     }
 
+    private void onGlobalUpdated(final InstanceIdentifier<Bgp> rootIdentifier, final Global global, final RibImpl ribImpl,
+        final WriteConfiguration configurationWriter) {
+        final List<PeerBean> closedPeers = closeAllBindedPeers(rootIdentifier);
+        ribImpl.close();
+        initiateRibInstance(rootIdentifier, global, ribImpl, configurationWriter);
+        closedPeers.forEach(peer -> peer.restart(ribImpl, this.mappingService));
+    }
+
     @Override
     public synchronized void onGlobalRemoved(final InstanceIdentifier<Bgp> rootIdentifier) {
         LOG.debug("Removing RIB instance: {}", rootIdentifier);
index 6f5c4f57de131aa15db609d6f1b0a4cf18940c11..6f22fd90ccdc24fe1a27b3ff0de57f38eddc5a15 100644 (file)
@@ -60,7 +60,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 
-public class BgpPeer implements PeerBean, BGPPeerRuntimeMXBean {
+public final class BgpPeer implements PeerBean, BGPPeerRuntimeMXBean {
 
     private static final Logger LOG = LoggerFactory.getLogger(BgpPeer.class);
 
@@ -86,22 +86,27 @@ public class BgpPeer implements PeerBean, BGPPeerRuntimeMXBean {
     @Override
     public void restart(final RIB rib, final BGPOpenConfigMappingService mappingService) {
         Preconditions.checkState(this.currentConfiguration != null);
+        closeSingletonService();
         start(rib, this.currentConfiguration, mappingService, null);
     }
 
     @Override
     public void close() {
+        closeSingletonService();
+        this.currentConfiguration = null;
+        if (this.serviceRegistration != null) {
+            this.serviceRegistration.unregister();
+            this.serviceRegistration = null;
+        }
+    }
+
+    private void closeSingletonService() {
         try {
             this.bgpPeerSingletonService.close();
             this.bgpPeerSingletonService = null;
         } catch (final Exception e) {
             LOG.warn("Failed to close peer instance", e);
         }
-        this.currentConfiguration = null;
-        if (this.serviceRegistration != null) {
-            this.serviceRegistration.unregister();
-            this.serviceRegistration = null;
-        }
     }
 
     @Override
@@ -209,14 +214,14 @@ public class BgpPeer implements PeerBean, BGPPeerRuntimeMXBean {
             this.neighborAddress = neighbor.getNeighborAddress();
             this.bgpPeer = new BGPPeer(Ipv4Util.toStringIP(this.neighborAddress), rib, mappingService.toPeerRole(neighbor), BgpPeer.this.rpcRegistry);
             final List<BgpParameters> bgpParameters = getBgpParameters(neighbor, rib, mappingService);
-            final KeyMapping key = OpenConfigMappingUtil.getNeighborKey(neighbor);
+            final KeyMapping keyMapping = OpenConfigMappingUtil.getNeighborKey(neighbor);
             this.prefs = new BGPSessionPreferences(rib.getLocalAs(), getHoldTimer(neighbor), rib.getBgpIdentifier(), getPeerAs(neighbor, rib),
-                bgpParameters, getPassword(key));
+                bgpParameters, getPassword(keyMapping));
             this.activeConnection = OpenConfigMappingUtil.isActive(neighbor);
             this.dispatcher = rib.getDispatcher();
             this.inetAddress = Ipv4Util.toInetSocketAddress(this.neighborAddress, OpenConfigMappingUtil.getPort(neighbor));
             this.retryTimer = OpenConfigMappingUtil.getRetryTimer(neighbor);
-            this.key = Optional.fromNullable(key);
+            this.key = Optional.fromNullable(keyMapping);
             this.configurationWriter = configurationWriter;
             this.serviceGroupIdentifier = rib.getRibIServiceGroupIdentifier();
             LOG.info("Peer Singleton Service {} registered", this.serviceGroupIdentifier);
index cc0564c8117ff06d01510c1a44bf1f768754e342..61c29030a10012ed96daeaf13c080d191c205c67 100644 (file)
@@ -10,8 +10,6 @@ package org.opendaylight.protocol.bgp.rib.impl.config;
 
 import static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil.INSTANCE;
 
-import com.google.common.base.Predicate;
-import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableList;
 import java.util.Collections;
 import java.util.List;
@@ -127,12 +125,7 @@ final class OpenConfigMappingUtil {
         }
         final List<AfiSafi> afiSafi = afiSAfis.getAfiSafi();
         if (setDeafultIPv4) {
-            final boolean anyMatch = FluentIterable.from(afiSafi).anyMatch(new Predicate<AfiSafi>() {
-                @Override
-                public boolean apply(final AfiSafi input) {
-                    return input.getAfiSafiName().getName().equals(IPV4UNICAST.class);
-                }
-            });
+            final boolean anyMatch = afiSafi.stream().anyMatch(input -> input.getAfiSafiName().equals(IPV4UNICAST.class));
             if (!anyMatch) {
                 afiSafi.add(IPV4_AFISAFI);
             }
index 9d6b409685d4aabdc301672db296af26c7075b62..c5495ccb9e003117465571ec7a354a136cc9d725 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.protocol.bgp.rib.impl.stats.rib.impl;
 import com.google.common.base.Preconditions;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import org.opendaylight.controller.config.api.IdentityAttributeRef;
@@ -19,14 +20,12 @@ import org.opendaylight.protocol.bgp.rib.impl.stats.UnsignedInt32Counter;
 import org.opendaylight.protocol.bgp.rib.impl.stats.peer.route.PerTableTypeRouteCounter;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.ClusterIdentifier;
 import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
 import org.opendaylight.yangtools.yang.common.QName;
 
-/**
- * @author Kevin Wang
- */
 public class BGPRenderStatsImpl implements BGPRenderStats {
     private final PerTableTypeRouteCounter locRibRouteCounter = new PerTableTypeRouteCounter("loc-rib route");
     private final BgpId bgpId;
@@ -41,8 +40,8 @@ public class BGPRenderStatsImpl implements BGPRenderStats {
         this.ribId = Preconditions.checkNotNull(ribId);
         this.localAs = localAs;
         this.clusterId = clusterId;
-        this.configuredPeerCounter = new UnsignedInt32Counter("Configured Peer of BGP-RIB "+ this.ribId.getValue());
-        this.connectedPeerCounter = new UnsignedInt32Counter("Connected Peer of BGP-RIB "+ this.ribId.getValue());
+        this.configuredPeerCounter = new UnsignedInt32Counter("Configured Peer of BGP-RIB " + this.ribId.getValue());
+        this.connectedPeerCounter = new UnsignedInt32Counter("Connected Peer of BGP-RIB " + this.ribId.getValue());
     }
 
     @Override
@@ -57,25 +56,25 @@ public class BGPRenderStatsImpl implements BGPRenderStats {
         // fill in the the statistic part
         final UnsignedInt32Counter totalRouteCount = new UnsignedInt32Counter("Total Loc-Rib Route Count");
         final List<LocRibRouteTable> locRibRouteTableList = new ArrayList<>();
-        this.locRibRouteCounter.getCounters()
-            .entrySet()
-            .stream()
-            .forEach(e -> {
-                final LocRibRouteTable table = new LocRibRouteTable();
-                final QName afi = BindingReflections.getQName(e.getKey().getAfi()).intern();
-                final QName safi = BindingReflections.getQName(e.getKey().getSafi()).intern();
-                table.setAfi(new IdentityAttributeRef(afi.toString()));
-                table.setSafi(new IdentityAttributeRef(safi.toString()));
-                table.setRoutesCount(e.getValue().getCountAsZeroBasedCounter32());
-
-                locRibRouteTableList.add(table);
-                totalRouteCount.increaseCount(e.getValue().getCount());
-            });
+        this.locRibRouteCounter.getCounters().entrySet().stream().forEach(e -> generateCounters(e, locRibRouteTableList, totalRouteCount));
         renderState.setLocRibRouteTable(locRibRouteTableList);
         renderState.setLocRibRoutesCount(totalRouteCount.getCountAsZeroBasedCounter32());
         return renderState;
     }
 
+    private void generateCounters(final Map.Entry<TablesKey, UnsignedInt32Counter> e, final List<LocRibRouteTable> locRibRouteTableList,
+        final UnsignedInt32Counter totalRouteCount) {
+        final LocRibRouteTable table = new LocRibRouteTable();
+        final QName afi = BindingReflections.getQName(e.getKey().getAfi()).intern();
+        final QName safi = BindingReflections.getQName(e.getKey().getSafi()).intern();
+        table.setAfi(new IdentityAttributeRef(afi.toString()));
+        table.setSafi(new IdentityAttributeRef(safi.toString()));
+        table.setRoutesCount(e.getValue().getCountAsZeroBasedCounter32());
+        locRibRouteTableList.add(table);
+        totalRouteCount.increaseCount(e.getValue().getCount());
+
+    }
+
     @Override
     public PerTableTypeRouteCounter getLocRibRouteCounter() {
         return this.locRibRouteCounter;
diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/RouteUpdateKeyTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/RouteUpdateKeyTest.java
new file mode 100644 (file)
index 0000000..53cfc58
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.rib.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.opendaylight.protocol.bgp.rib.impl.AdjRibInWriter.PEER_ID_QNAME;
+
+import com.google.common.collect.ImmutableMap;
+import org.junit.Test;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.rib.Peer;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
+
+public class RouteUpdateKeyTest {
+    private static final PeerId PEER_ID = new PeerId("127.0.0.1");
+    private static final PeerId PEER_ID_2 = new PeerId("127.0.0.2");
+    private static final NodeIdentifierWithPredicates NIWP_PEER = new NodeIdentifierWithPredicates(Peer.QNAME,
+        ImmutableMap.of(PEER_ID_QNAME, PEER_ID.getValue()));
+
+    @Test
+    public void testRouteUpdateKey() {
+        final RouteUpdateKey rk = new RouteUpdateKey(PEER_ID, NIWP_PEER);
+        assertEquals(PEER_ID, rk.getPeerId());
+        assertEquals(NIWP_PEER, rk.getRouteId());
+        assertTrue(rk.equals(new RouteUpdateKey(PEER_ID, NIWP_PEER)));
+        assertTrue(rk.equals(rk));
+        assertFalse(rk.equals(null));
+        assertFalse(rk.equals(new RouteUpdateKey(PEER_ID_2, NIWP_PEER)));
+        assertFalse(rk.equals(new RouteUpdateKey(PEER_ID, new NodeIdentifierWithPredicates(Peer.QNAME,
+            ImmutableMap.of(PEER_ID_QNAME, PEER_ID_2.getValue())))));
+    }
+
+}
\ No newline at end of file
diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AbstractConfig.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AbstractConfig.java
new file mode 100644 (file)
index 0000000..4afe252
--- /dev/null
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.rib.impl.config;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.CheckedFuture;
+import io.netty.util.concurrent.Future;
+import java.net.InetSocketAddress;
+import java.util.Collections;
+import org.junit.Before;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
+import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
+import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
+import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigMappingService;
+import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl;
+import org.opendaylight.protocol.bgp.rib.impl.spi.AbstractImportPolicy;
+import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
+import org.opendaylight.protocol.bgp.rib.impl.spi.BGPPeerRegistry;
+import org.opendaylight.protocol.bgp.rib.impl.spi.BGPSessionPreferences;
+import org.opendaylight.protocol.bgp.rib.impl.spi.BgpDeployer;
+import org.opendaylight.protocol.bgp.rib.impl.spi.ImportPolicyPeerTracker;
+import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
+import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContextRegistry;
+import org.opendaylight.protocol.bgp.rib.impl.stats.UnsignedInt32Counter;
+import org.opendaylight.protocol.bgp.rib.impl.stats.rib.impl.BGPRenderStats;
+import org.opendaylight.protocol.bgp.rib.spi.BGPSessionListener;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.SendReceive;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.add.path.capability.AddressFamiliesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.Rib;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.osgi.framework.ServiceRegistration;
+
+class AbstractConfig {
+    protected static final AsNumber AS = new AsNumber(123456L);
+    @Mock
+    protected RIB rib;
+    @Mock
+    protected ClusterSingletonServiceRegistration singletonServiceRegistration;
+    @Mock
+    protected BGPOpenConfigMappingService mappingService;
+    @Mock
+    protected BgpDeployer.WriteConfiguration configurationWriter;
+    @Mock
+    protected DOMTransactionChain domTx;
+    @Mock
+    protected BGPRenderStats render;
+    @Mock
+    protected BGPDispatcher dispatcher;
+    @Mock
+    protected ServiceRegistration serviceRegistration;
+    @Mock
+    protected BGPPeerRegistry bgpPeerRegistry;
+    @Mock
+    protected ListenerRegistration listener;
+    @Mock
+    protected Future future;
+    protected ClusterSingletonService singletonService;
+    @Mock
+    protected DOMDataWriteTransaction domDW;
+    @Mock
+    private ImportPolicyPeerTracker importPolicyPeerTracker;
+    @Mock
+    private DOMDataTreeChangeService dataTreeChangeService;
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        Mockito.doAnswer(new Answer<ClusterSingletonServiceRegistration>() {
+            @Override
+            public ClusterSingletonServiceRegistration answer(final InvocationOnMock invocationOnMock) throws Throwable {
+                singletonService = (ClusterSingletonService) invocationOnMock.getArguments()[0];
+                return singletonServiceRegistration;
+            }
+        }).when(this.rib).registerClusterSingletonService(any(ClusterSingletonService.class));
+
+        Mockito.doReturn(new UnsignedInt32Counter("counter")).when(this.render).getConfiguredPeerCounter();
+        Mockito.doReturn(this.render).when(this.rib).getRenderStats();
+        Mockito.doReturn(this.domTx).when(this.rib).createPeerChain(any(TransactionChainListener.class));
+        Mockito.doReturn(AS).when(this.rib).getLocalAs();
+        Mockito.doReturn(this.importPolicyPeerTracker).when(this.rib).getImportPolicyPeerTracker();
+        Mockito.doNothing().when(this.importPolicyPeerTracker).peerRoleChanged(any(YangInstanceIdentifier.class), any(PeerRole.class));
+        Mockito.doReturn(mock(AbstractImportPolicy.class)).when(this.importPolicyPeerTracker).policyFor(any(PeerId.class));
+        Mockito.doReturn(mock(RIBSupportContextRegistry.class)).when(this.rib).getRibSupportContext();
+        Mockito.doReturn(Collections.emptySet()).when(this.rib).getLocalTablesKeys();
+        Mockito.doNothing().when(this.domTx).close();
+        Mockito.doReturn(this.domDW).when(this.domTx).newWriteOnlyTransaction();
+        Mockito.doNothing().when(this.domDW).put(eq(LogicalDatastoreType.OPERATIONAL), any(YangInstanceIdentifier.class), any(MapEntryNode.class));
+        Mockito.doNothing().when(this.domDW).delete(eq(LogicalDatastoreType.OPERATIONAL), any(YangInstanceIdentifier.class));
+        Mockito.doNothing().when(this.domDW).merge(eq(LogicalDatastoreType.OPERATIONAL), any(YangInstanceIdentifier.class), any(NormalizedNode.class));
+        final CheckedFuture checkedFuture = mock(CheckedFuture.class);
+        Mockito.doReturn(checkedFuture).when(this.domDW).submit();
+        Mockito.doReturn(null).when(checkedFuture).checkedGet();
+
+        Mockito.doNothing().when(this.singletonServiceRegistration).close();
+        Mockito.doReturn(YangInstanceIdentifier.of(Rib.QNAME)).when(this.rib).getYangRibId();
+        Mockito.doReturn(this.dataTreeChangeService).when(this.rib).getService();
+        Mockito.doReturn(this.listener).when(this.dataTreeChangeService).registerDataTreeChangeListener(any(), any());
+        Mockito.doReturn(mock(ServiceGroupIdentifier.class)).when(this.rib).getRibIServiceGroupIdentifier();
+        Mockito.doReturn(new BgpId("127.0.0.1")).when(this.rib).getBgpIdentifier();
+        Mockito.doReturn(true).when(future).cancel(true);
+        Mockito.doReturn(future).when(this.dispatcher)
+            .createReconnectingClient(any(InetSocketAddress.class), any(BGPPeerRegistry.class), anyInt(), any(Optional.class));
+        Mockito.doReturn(this.dispatcher).when(this.rib).getDispatcher();
+
+        Mockito.doReturn(PeerRole.Ibgp).when(this.mappingService).toPeerRole(any());
+        Mockito.doReturn(Collections.singletonList(new AddressFamiliesBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class)
+            .setSendReceive(SendReceive.Both).build())).when(this.mappingService).toAddPathCapability(any());
+        Mockito.doReturn(Collections.singletonList(new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)))
+            .when(this.mappingService).toTableTypes(any());
+        Mockito.doReturn(Collections.singleton(new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)))
+            .when(this.rib).getLocalTables();
+        Mockito.doNothing().when(this.configurationWriter).apply();
+
+        Mockito.doNothing().when(this.bgpPeerRegistry).addPeer(any(IpAddress.class), any(BGPSessionListener.class), any(BGPSessionPreferences.class));
+        Mockito.doNothing().when(this.bgpPeerRegistry).removePeer(any(IpAddress.class));
+        Mockito.doReturn("registry").when(this.bgpPeerRegistry).toString();
+        Mockito.doNothing().when(this.listener).close();
+    }
+}
diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeerTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/AppPeerTest.java
new file mode 100644 (file)
index 0000000..91325e1
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.rib.impl.config;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.internal.verification.VerificationModeFactory.times;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
+
+public class AppPeerTest extends AbstractConfig {
+    private static final AppPeer APP_PEER = new AppPeer();
+
+
+    @Before
+    public void setUp() throws Exception {
+        super.setUp();
+        Mockito.doReturn(true).when(this.mappingService).isApplicationPeer(any(Neighbor.class));
+    }
+
+    @Test
+    public void testAppPeer() throws Exception {
+        final Neighbor neighbor = new NeighborBuilder().setNeighborAddress(new IpAddress(new Ipv4Address("127.0.0.1"))).build();
+        APP_PEER.start(this.rib, neighbor, this.mappingService, this.configurationWriter);
+        Mockito.verify(this.rib).getYangRibId();
+        Mockito.verify(this.rib).getService();
+        Mockito.verify(this.rib).getRibIServiceGroupIdentifier();
+        Mockito.verify(this.rib).registerClusterSingletonService(any(ClusterSingletonService.class));
+
+        this.singletonService.instantiateServiceInstance();
+        Mockito.verify(this.configurationWriter).apply();
+        Mockito.verify(this.rib, times(2)).getRibSupportContext();
+        Mockito.verify(this.rib).getLocalTablesKeys();
+        Mockito.verify(this.domTx).newWriteOnlyTransaction();
+
+        APP_PEER.restart(this.rib, this.mappingService);
+        this.singletonService.instantiateServiceInstance();
+        Mockito.verify(this.rib, times(4)).getYangRibId();
+        Mockito.verify(this.rib, times(4)).getService();
+        Mockito.verify(this.rib, times(2)).getRibIServiceGroupIdentifier();
+        Mockito.verify(this.rib, times(2)).registerClusterSingletonService(any(ClusterSingletonService.class));
+
+        this.singletonService.closeServiceInstance();
+        Mockito.verify(this.listener, times(2)).close();
+
+        assertTrue(APP_PEER.containsEqualConfiguration(new NeighborBuilder().setNeighborAddress(new IpAddress(new Ipv4Address("127.0.0.1"))).build()));
+        assertFalse(APP_PEER.containsEqualConfiguration(new NeighborBuilder().setNeighborAddress(new IpAddress(new Ipv4Address("127.0.0.2"))).build()));
+        APP_PEER.close();
+        Mockito.verify(this.singletonServiceRegistration).close();
+    }
+}
\ No newline at end of file
diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerImplTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpDeployerImplTest.java
new file mode 100644 (file)
index 0000000..64a8e79
--- /dev/null
@@ -0,0 +1,440 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.rib.impl.config;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType.DELETE;
+import static org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType.WRITE;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createAddPath;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createConfig;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createRR;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createTimers;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createTransport;
+import static org.powermock.api.mockito.PowerMockito.spy;
+import static org.powermock.api.mockito.PowerMockito.verifyPrivate;
+
+import com.google.common.primitives.Shorts;
+import com.google.common.util.concurrent.CheckedFuture;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Dictionary;
+import java.util.List;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBrokerExtension;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
+import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
+import org.opendaylight.controller.sal.core.api.model.SchemaService;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
+import org.opendaylight.protocol.bgp.mode.impl.add.all.paths.AllPathSelection;
+import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigMappingService;
+import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl;
+import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
+import org.opendaylight.protocol.bgp.rib.impl.spi.BGPPeerRegistry;
+import org.opendaylight.protocol.bgp.rib.impl.spi.BgpDeployer;
+import org.opendaylight.protocol.bgp.rib.impl.spi.InstanceType;
+import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base.AfiSafis;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base.AfiSafisBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base.Config;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base.ConfigBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AddPaths;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AddPathsBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.RouteReflector;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.RouteReflectorBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Timers;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TimersBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Transport;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TransportBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Global;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.GlobalBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Neighbors;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.CommunityType;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV6UNICAST;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.PeerType;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.RrClusterIdTypeBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.NetworkInstances;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstance;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstanceBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstanceKey;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.Protocols;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.ProtocolsBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolKey;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.BGP;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.SendReceive;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.mp.capabilities.add.path.capability.AddressFamiliesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config1Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Protocol1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.blueprint.container.BlueprintContainer;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({BgpDeployerImpl.class})
+public class BgpDeployerImplTest {
+    private static final String NETWORK_INSTANCE_NAME = "network-test";
+    private static final AsNumber AS = new AsNumber(72L);
+    private static final IpAddress IPADDRESS = new IpAddress(new Ipv4Address("127.0.0.1"));
+    private static final BgpId BGP_ID = new BgpId(IPADDRESS.getIpv4Address());
+    private static final BgpTableType TABLE_TYPE = new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
+    private static final short SHORT = 0;
+
+    @Mock
+    DataObjectModification dObject;
+    @Mock
+    private BlueprintContainer blueprintContainer;
+    @Mock
+    private BundleContext bundleContext;
+    @Mock
+    private DataBroker dataBroker;
+    @Mock
+    private BGPOpenConfigMappingService mappingService;
+    @Mock
+    private WriteTransaction wTx;
+    @Mock
+    private DataTreeModification<Bgp> modification;
+    @Mock
+    private ListenerRegistration dataTreeRegistration;
+    @Mock
+    private ServiceRegistration registration;
+
+    private Collection<DataTreeModification<Bgp>> collection = Collections.singleton(modification);
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+        final DOMDataBroker domDataBroker = mock(DOMDataBroker.class);
+
+        Mockito.doReturn(this.wTx).when(this.dataBroker).newWriteOnlyTransaction();
+        Mockito.doReturn("mapping").when(this.mappingService).toString();
+        Mockito.doReturn(false).when(this.mappingService).isApplicationPeer(any(Neighbor.class));
+        Mockito.doReturn(PeerRole.RrClient).when(this.mappingService).toPeerRole(any(Neighbor.class));
+        Mockito.doReturn(Collections.singletonList(new AddressFamiliesBuilder().setAfi(Ipv4AddressFamily.class).setSafi(UnicastSubsequentAddressFamily.class)
+            .setSendReceive(SendReceive.Both).build())).when(this.mappingService).toAddPathCapability(any(List.class));
+
+        Mockito.doReturn(null).when(domDataBroker).createTransactionChain(any());
+        Mockito.doReturn(Collections.singletonMap(DOMDataTreeChangeService.class, mock(DOMDataBrokerExtension.class)))
+            .when(domDataBroker).getSupportedExtensions();
+
+        Mockito.doReturn(Collections.singletonList(TABLE_TYPE)).when(this.mappingService).toTableTypes(any());
+        Mockito.doReturn(Collections.singletonMap(TABLE_TYPE, new AllPathSelection()))
+            .when(this.mappingService).toPathSelectionMode(any());
+        Mockito.doNothing().when(this.registration).unregister();
+        Mockito.doReturn(this.registration).when(this.bundleContext).registerService(eq(InstanceType.RIB.getServices()), any()
+            , any(Dictionary.class));
+        Mockito.doReturn(this.registration).when(this.bundleContext).registerService(eq(InstanceType.PEER.getServices()), any()
+            , any(Dictionary.class));
+
+
+        Mockito.doNothing().when(this.wTx).merge(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), any(NetworkInstance.class));
+        final CheckedFuture future = mock(CheckedFuture.class);
+        Mockito.doReturn(future).when(this.wTx).submit();
+        Mockito.doNothing().when(future).addListener(any(), any());
+        Mockito.doReturn(this.dataTreeRegistration).when(this.dataBroker).registerDataTreeChangeListener(any(), any());
+        Mockito.doNothing().when(this.dataTreeRegistration).close();
+
+        final InstanceIdentifier<Bgp> bgpIID = InstanceIdentifier.create(NetworkInstances.class)
+            .child(NetworkInstance.class, new NetworkInstanceKey(NETWORK_INSTANCE_NAME)).child(Protocols.class)
+            .child(Protocol.class, new ProtocolKey(BGP.class, "bgp")).augmentation(Protocol1.class).child(Bgp.class);
+
+        Mockito.doReturn(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, bgpIID)).when(this.modification).getRootPath();
+        Mockito.doReturn(this.dObject).when(this.modification).getRootNode();
+        Mockito.doReturn("bgpPeer").when(this.modification).toString();
+
+        Mockito.doReturn(Collections.singleton(this.dObject)).when(this.dObject).getModifiedChildren();
+        Mockito.doReturn("dObject").when(this.dObject).toString();
+
+        final RIBExtensionConsumerContext extension = mock(RIBExtensionConsumerContext.class);
+        Mockito.doReturn(mock(GeneratedClassLoadingStrategy.class)).when(extension).getClassLoadingStrategy();
+
+        final ClusterSingletonServiceProvider singletonServiceProvider = mock(ClusterSingletonServiceProvider.class);
+        final ClusterSingletonServiceRegistration serviceRegistration = mock(ClusterSingletonServiceRegistration.class);
+        Mockito.doReturn(serviceRegistration).when(singletonServiceProvider).registerClusterSingletonService(any());
+        Mockito.doNothing().when(serviceRegistration).close();
+
+        final SchemaService schemaService = mock(SchemaService.class);
+        Mockito.doNothing().when(this.dataTreeRegistration).close();
+
+        Mockito.doReturn(this.dataTreeRegistration).when(schemaService).registerSchemaContextListener(any());
+
+        final RibImpl ribImpl = new RibImpl(singletonServiceProvider, extension,
+            mock(BGPDispatcher.class), mock(BindingCodecTreeFactory.class), domDataBroker, schemaService);
+        Mockito.doReturn(ribImpl).when(this.blueprintContainer).getComponentInstance(eq("ribImpl"));
+
+        final BgpPeer bgpPeer = new BgpPeer(mock(RpcProviderRegistry.class), mock(BGPPeerRegistry.class));
+        Mockito.doReturn(bgpPeer).when(this.blueprintContainer).getComponentInstance(eq("bgpPeer"));
+        this.collection = Collections.singleton(modification);
+    }
+
+    @Test
+    public void testDeployerRib() throws Exception {
+        Mockito.doReturn(Global.class).when(this.dObject).getDataType();
+        final BgpDeployerImpl deployer = new BgpDeployerImpl(NETWORK_INSTANCE_NAME, this.blueprintContainer, this.bundleContext, this.dataBroker, this.mappingService);
+        final BgpDeployerImpl spyDeployer = spy(deployer);
+        configureGlobal(IPV4UNICAST.class);
+        Mockito.doReturn(WRITE).when(this.dObject).getModificationType();
+
+        final KeyedInstanceIdentifier<NetworkInstance, NetworkInstanceKey> networkInstanceIId = InstanceIdentifier.create(NetworkInstances.class)
+            .child(NetworkInstance.class, new NetworkInstanceKey(NETWORK_INSTANCE_NAME));
+        final NetworkInstance netII = new NetworkInstanceBuilder().setName(networkInstanceIId.firstKeyOf(NetworkInstance.class).getName())
+            .setProtocols(new ProtocolsBuilder().build()).build();
+        verify(this.wTx).merge(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), Mockito.eq(netII));
+        verify(this.dataBroker).registerDataTreeChangeListener(Mockito.any(DataTreeIdentifier.class), Mockito.any(BgpDeployerImpl.class));
+
+        assertEquals(networkInstanceIId, spyDeployer.getInstanceIdentifier());
+        assertEquals(this.mappingService, spyDeployer.getMappingService());
+
+        spyDeployer.onDataTreeChanged(this.collection);
+        verifyPrivate(spyDeployer).invoke("onGlobalChanged", any(DataObjectModification.class), any(InstanceIdentifier.class));
+        verify(this.blueprintContainer).getComponentInstance(eq("ribImpl"));
+        verify(this.bundleContext).registerService(eq(InstanceType.RIB.getServices()), any(), any(Dictionary.class));
+        verify(spyDeployer).onDataTreeChanged(any(Collection.class));
+        verify(spyDeployer).onGlobalModified(any(InstanceIdentifier.class), any(), any());
+        verifyPrivate(spyDeployer).invoke("onGlobalCreated", any(InstanceIdentifier.class), any(Global.class), any(BgpDeployer.WriteConfiguration.class));
+        verifyPrivate(spyDeployer).invoke("initiateRibInstance", any(InstanceIdentifier.class), any(Global.class), any(RibImpl.class), any(BgpDeployer
+            .WriteConfiguration.class));
+        verifyPrivate(spyDeployer).invoke("registerRibInstance", any(RibImpl.class), anyString());
+        verify(spyDeployer).onDataTreeChanged(any(Collection.class));
+
+        //change with same rib already existing
+        spyDeployer.onDataTreeChanged(this.collection);
+        verifyPrivate(spyDeployer, times(2)).invoke("onGlobalChanged", any(DataObjectModification.class), any(InstanceIdentifier.class));
+        verify(this.blueprintContainer).getComponentInstance(eq("ribImpl"));
+        verify(this.bundleContext).registerService(eq(InstanceType.RIB.getServices()), any(), any(Dictionary.class));
+        verify(spyDeployer, times(2)).onDataTreeChanged(any(Collection.class));
+        verify(spyDeployer, times(2)).onGlobalModified(any(InstanceIdentifier.class), any(), any());
+        verifyPrivate(spyDeployer).invoke("onGlobalCreated", any(InstanceIdentifier.class), any(Global.class), any(BgpDeployer
+            .WriteConfiguration.class));
+        verifyPrivate(spyDeployer).invoke("initiateRibInstance", any(InstanceIdentifier.class), any(Global.class), any(RibImpl.class), any(BgpDeployer
+            .WriteConfiguration.class));
+        verifyPrivate(spyDeployer).invoke("registerRibInstance", any(RibImpl.class), anyString());
+        verify(spyDeployer, times(2)).onDataTreeChanged(any(Collection.class));
+
+        //Update for existing rib
+        configureGlobal(IPV6UNICAST.class);
+        spyDeployer.onDataTreeChanged(this.collection);
+        verifyPrivate(spyDeployer, times(3)).invoke("onGlobalChanged", any(DataObjectModification.class), any(InstanceIdentifier.class));
+        verify(this.blueprintContainer).getComponentInstance(eq("ribImpl"));
+        verify(this.bundleContext, times(2)).registerService(eq(InstanceType.RIB.getServices()), any(), any(Dictionary.class));
+        verify(spyDeployer, times(3)).onDataTreeChanged(any(Collection.class));
+        verify(spyDeployer, times(3)).onGlobalModified(any(InstanceIdentifier.class), any(), any());
+        verifyPrivate(spyDeployer).invoke("onGlobalCreated", any(InstanceIdentifier.class), any(Global.class),
+            any(BgpDeployer.WriteConfiguration.class));
+        verifyPrivate(spyDeployer).invoke("onGlobalUpdated", any(InstanceIdentifier.class), any(Global.class), any(RibImpl.class), any(BgpDeployer.WriteConfiguration.class));
+        verify(this.dataTreeRegistration).close();
+        verify(this.registration).unregister();
+        verifyPrivate(spyDeployer).invoke("closeAllBindedPeers", any(InstanceIdentifier.class));
+        verifyPrivate(spyDeployer, times(2)).invoke("initiateRibInstance", any(InstanceIdentifier.class), any(Global.class), any(RibImpl.class), any
+            (BgpDeployer.WriteConfiguration.class));
+        verifyPrivate(spyDeployer, times(2)).invoke("registerRibInstance", any(RibImpl.class), anyString());
+        verify(spyDeployer, times(3)).onDataTreeChanged(any(Collection.class));
+
+        //Delete for existing rib
+        Mockito.doReturn(DELETE).when(this.dObject).getModificationType();
+
+        spyDeployer.onDataTreeChanged(this.collection);
+        verifyPrivate(spyDeployer, times(4)).invoke("onGlobalChanged", any(DataObjectModification.class), any(InstanceIdentifier.class));
+        verify(this.blueprintContainer).getComponentInstance(eq("ribImpl"));
+        verify(this.bundleContext, times(2)).registerService(eq(InstanceType.RIB.getServices()), any(), any(Dictionary.class));
+        verify(spyDeployer, times(4)).onDataTreeChanged(any(Collection.class));
+        verify(spyDeployer, times(3)).onGlobalModified(any(InstanceIdentifier.class), any(), any());
+        verify(spyDeployer).onGlobalRemoved(any(InstanceIdentifier.class));
+        verify(this.dataTreeRegistration, times(2)).close();
+        verify(this.registration, times(2)).unregister();
+        verifyPrivate(spyDeployer).invoke("onGlobalCreated", any(InstanceIdentifier.class), any(Global.class),
+            any(BgpDeployer.WriteConfiguration.class));
+        verifyPrivate(spyDeployer).invoke("onGlobalUpdated", any(InstanceIdentifier.class), any(Global.class), any(RibImpl.class), any(BgpDeployer.WriteConfiguration.class));
+        verifyPrivate(spyDeployer).invoke("closeAllBindedPeers", any(InstanceIdentifier.class));
+        verifyPrivate(spyDeployer, times(2)).invoke("initiateRibInstance", any(InstanceIdentifier.class), any(Global.class), any(RibImpl.class), any
+            (BgpDeployer.WriteConfiguration.class));
+        verifyPrivate(spyDeployer, times(2)).invoke("registerRibInstance", any(RibImpl.class), anyString());
+        verify(spyDeployer, times(4)).onDataTreeChanged(any(Collection.class));
+
+        deployer.close();
+    }
+
+    private void configureGlobal(final Class<? extends AfiSafiType> afi) {
+        final Config config = new ConfigBuilder().setAs(AS).setRouterId(BGP_ID).build();
+        final ArrayList<AfiSafi> afiSafiList = new ArrayList<>();
+        afiSafiList.add(new AfiSafiBuilder().setAfiSafiName(afi).addAugmentation(AfiSafi2.class, new AfiSafi2Builder().setReceive(true)
+            .setSendMax(Shorts.checkedCast(0L)).build()).build());
+        final AfiSafis afiSafi = new AfiSafisBuilder().setAfiSafi(afiSafiList).build();
+        Mockito.doReturn(new GlobalBuilder().setConfig(config).setAfiSafis(afiSafi).build()).when(this.dObject).getDataAfter();
+    }
+
+    /**
+     * Test create Rib
+     */
+    @Test
+    public void testDeployerCreateNeighbor() throws Exception {
+
+        final BgpDeployerImpl deployer = new BgpDeployerImpl(NETWORK_INSTANCE_NAME, this.blueprintContainer, this.bundleContext, this.dataBroker, this.mappingService);
+        final BgpDeployerImpl spyDeployer = spy(deployer);
+
+        //First create Rib
+        Mockito.doReturn(Global.class).when(this.dObject).getDataType();
+        Mockito.doReturn(WRITE).when(this.dObject).getModificationType();
+        configureGlobal(IPV4UNICAST.class);
+
+        spyDeployer.onDataTreeChanged(this.collection);
+        verifyPrivate(spyDeployer).invoke("onGlobalChanged", any(DataObjectModification.class), any(InstanceIdentifier.class));
+        verify(this.blueprintContainer).getComponentInstance(eq("ribImpl"));
+        verify(this.bundleContext).registerService(eq(InstanceType.RIB.getServices()), any(), any(Dictionary.class));
+        verify(spyDeployer).onDataTreeChanged(any(Collection.class));
+        verify(spyDeployer).onGlobalModified(any(InstanceIdentifier.class), any(), any());
+        verifyPrivate(spyDeployer).invoke("onGlobalCreated", any(InstanceIdentifier.class), any(Global.class), any(BgpDeployer.WriteConfiguration.class));
+        verifyPrivate(spyDeployer).invoke("initiateRibInstance", any(InstanceIdentifier.class), any(Global.class), any(RibImpl.class), any(BgpDeployer
+            .WriteConfiguration.class));
+        verifyPrivate(spyDeployer).invoke("registerRibInstance", any(RibImpl.class), anyString());
+        verify(spyDeployer).onDataTreeChanged(any(Collection.class));
+
+
+        Mockito.doReturn(Neighbors.class).when(this.dObject).getDataType();
+        Mockito.doReturn(WRITE).when(this.dObject).getModificationType();
+        configureNeighbor(IPV4UNICAST.class);
+
+
+        final KeyedInstanceIdentifier<NetworkInstance, NetworkInstanceKey> networkInstanceIId = InstanceIdentifier.create(NetworkInstances.class)
+            .child(NetworkInstance.class, new NetworkInstanceKey(NETWORK_INSTANCE_NAME));
+        final NetworkInstance netII = new NetworkInstanceBuilder().setName(networkInstanceIId.firstKeyOf(NetworkInstance.class).getName())
+            .setProtocols(new ProtocolsBuilder().build()).build();
+        verify(this.wTx).merge(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), Mockito.eq(netII));
+        verify(this.dataBroker).registerDataTreeChangeListener(Mockito.any(DataTreeIdentifier.class), Mockito.any(BgpDeployerImpl.class));
+
+        assertEquals(networkInstanceIId, spyDeployer.getInstanceIdentifier());
+        assertEquals(this.mappingService, spyDeployer.getMappingService());
+
+        spyDeployer.onDataTreeChanged(this.collection);
+        verify(spyDeployer, times(2)).onDataTreeChanged(any(Collection.class));
+        verifyPrivate(spyDeployer).invoke("onNeighborsChanged", any(DataObjectModification.class), any(InstanceIdentifier.class));
+        verify(spyDeployer).onNeighborModified(any(InstanceIdentifier.class), any(Neighbor.class), any());
+        verifyPrivate(spyDeployer).invoke("onNeighborCreated", any(InstanceIdentifier.class), any(Neighbor.class), any(BgpDeployer.WriteConfiguration.class));
+        verify(this.blueprintContainer).getComponentInstance(eq("bgpPeer"));
+        verifyPrivate(spyDeployer).invoke("initiatePeerInstance", any(InstanceIdentifier.class), any(InstanceIdentifier.class), any(Neighbor.class),
+            any(PeerBean.class), any(BgpDeployer.WriteConfiguration.class));
+        verifyPrivate(spyDeployer).invoke("registerPeerInstance", any(Neighbor.class), anyString());
+        verify(this.bundleContext).registerService(eq(InstanceType.PEER.getServices()), any(BgpPeer.class), any(Dictionary.class));
+
+        //change with same peer already existing
+        spyDeployer.onDataTreeChanged(this.collection);
+        verify(spyDeployer, times(3)).onDataTreeChanged(any(Collection.class));
+        verifyPrivate(spyDeployer, times(2)).invoke("onNeighborsChanged", any(DataObjectModification.class), any(InstanceIdentifier.class));
+        verify(spyDeployer, times(2)).onNeighborModified(any(InstanceIdentifier.class), any(Neighbor.class), any());
+        verifyPrivate(spyDeployer).invoke("onNeighborCreated", any(InstanceIdentifier.class), any(Neighbor.class), any(BgpDeployer.WriteConfiguration.class));
+        verify(this.blueprintContainer).getComponentInstance(eq("bgpPeer"));
+        verifyPrivate(spyDeployer).invoke("initiatePeerInstance", any(InstanceIdentifier.class), any(InstanceIdentifier.class), any(Neighbor.class),
+            any(PeerBean.class), any(BgpDeployer.WriteConfiguration.class));
+        verifyPrivate(spyDeployer).invoke("registerPeerInstance", any(Neighbor.class), anyString());
+        verify(this.bundleContext).registerService(eq(InstanceType.PEER.getServices()), any(BgpPeer.class), any(Dictionary.class));
+
+        //Update for existing rib
+        configureNeighbor(IPV6UNICAST.class);
+        spyDeployer.onDataTreeChanged(this.collection);
+        verify(spyDeployer, times(4)).onDataTreeChanged(any(Collection.class));
+        verifyPrivate(spyDeployer, times(3)).invoke("onNeighborsChanged", any(DataObjectModification.class), any(InstanceIdentifier.class));
+        verify(spyDeployer, times(3)).onNeighborModified(any(InstanceIdentifier.class), any(Neighbor.class), any());
+        verifyPrivate(spyDeployer).invoke("onNeighborCreated", any(InstanceIdentifier.class), any(Neighbor.class), any(BgpDeployer.WriteConfiguration.class));
+        verify(this.blueprintContainer).getComponentInstance(eq("bgpPeer"));
+        verifyPrivate(spyDeployer, times(2)).invoke("initiatePeerInstance", any(InstanceIdentifier.class), any(InstanceIdentifier.class), any(Neighbor.class),
+            any(PeerBean.class), any(BgpDeployer.WriteConfiguration.class));
+        verifyPrivate(spyDeployer, times(2)).invoke("registerPeerInstance", any(Neighbor.class), anyString());
+        verify(this.bundleContext, times(2)).registerService(eq(InstanceType.PEER.getServices()), any(BgpPeer.class), any(Dictionary.class));
+
+       //Delete existing Peer
+        Mockito.doReturn(DELETE).when(this.dObject).getModificationType();
+
+        spyDeployer.onDataTreeChanged(this.collection);
+        verify(spyDeployer, times(5)).onDataTreeChanged(any(Collection.class));
+        verify( this.dObject).getDataBefore();
+        verifyPrivate(spyDeployer, times(4)).invoke("onNeighborsChanged", any(DataObjectModification.class), any(InstanceIdentifier.class));
+        verify(spyDeployer, times(3)).onNeighborModified(any(InstanceIdentifier.class), any(Neighbor.class), any());
+        verify(spyDeployer, times(1)).onNeighborRemoved(any(InstanceIdentifier.class), any(Neighbor.class));
+        verifyPrivate(spyDeployer).invoke("onNeighborCreated", any(InstanceIdentifier.class), any(Neighbor.class), any(BgpDeployer.WriteConfiguration.class));
+        verify(this.blueprintContainer).getComponentInstance(eq("bgpPeer"));
+        verifyPrivate(spyDeployer, times(2)).invoke("initiatePeerInstance", any(InstanceIdentifier.class), any(InstanceIdentifier.class), any(Neighbor.class),
+            any(PeerBean.class), any(BgpDeployer.WriteConfiguration.class));
+        verifyPrivate(spyDeployer, times(2)).invoke("registerPeerInstance", any(Neighbor.class), anyString());
+        verify(this.bundleContext, times(2)).registerService(eq(InstanceType.PEER.getServices()), any(BgpPeer.class), any(Dictionary.class));
+
+        deployer.close();
+    }
+
+    private void configureNeighbor(final Class<? extends AfiSafiType> afi) {
+        Mockito.doReturn(createNeighborExpected(afi)).when(this.dObject).getDataAfter();
+        Mockito.doReturn(createNeighborExpected(afi)).when(this.dObject).getDataBefore();
+    }
+
+
+   private Neighbor createNeighborExpected(final Class<? extends AfiSafiType> afi) {
+        return new NeighborBuilder()
+            .setAfiSafis(createAfiSafi(afi))
+            .setConfig(createConfig())
+            .setNeighborAddress(IPADDRESS)
+            .setRouteReflector(createRR())
+            .setTimers(createTimers())
+            .setTransport(createTransport())
+            .setAddPaths(createAddPath())
+            .build();
+    }
+
+    private static org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafis createAfiSafi(final Class<? extends AfiSafiType> afi) {
+        return new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafisBuilder()
+            .setAfiSafi(Collections.singletonList(new AfiSafiBuilder().setAfiSafiName(afi)
+            .addAugmentation(AfiSafi1.class, new AfiSafi1Builder().setReceive(true).setSendMax(SHORT).build()).build())).build();
+    }
+}
\ No newline at end of file
diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeerTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/BgpPeerTest.java
new file mode 100644 (file)
index 0000000..0b0ddef
--- /dev/null
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.rib.impl.config;
+
+import static junit.framework.TestCase.fail;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyList;
+import static org.mockito.Mockito.times;
+
+import com.google.common.base.Optional;
+import java.math.BigDecimal;
+import java.net.InetSocketAddress;
+import java.util.Collections;
+import java.util.List;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
+import org.opendaylight.protocol.bgp.rib.impl.spi.BGPPeerRegistry;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AddPaths;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AddPathsBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafis;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafisBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Config;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.RouteReflector;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.RouteReflectorBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Timers;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TimersBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.Transport;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TransportBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.add.paths.ConfigBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.CommunityType;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.PeerType;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.RrClusterIdTypeBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config1Builder;
+
+public class BgpPeerTest extends AbstractConfig {
+    static final short SHORT = 0;
+    static final IpAddress NEIGHBOR_ADDRESS = new IpAddress(new Ipv4Address("127.0.0.1"));
+    static final BigDecimal DEFAULT_TIMERS = BigDecimal.valueOf(30);
+    static final String MD5_PASSWORD = "123";
+    static final PortNumber PORT = new PortNumber(179);
+    static final AfiSafi AFI_SAFI_IPV4 = new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class)
+    .addAugmentation(AfiSafi1.class, new AfiSafi1Builder().setReceive(true).setSendMax(SHORT).build()).build();
+    static final List<AfiSafi> AFI_SAFI = Collections.singletonList(AFI_SAFI_IPV4);
+    private BgpPeer bgpPeer;
+
+    @Before
+    public void setUp() throws Exception {
+        super.setUp();
+        this.bgpPeer = new BgpPeer(Mockito.mock(RpcProviderRegistry.class), this.bgpPeerRegistry);
+        Mockito.doNothing().when(this.serviceRegistration).unregister();
+    }
+
+    @Test
+    public void testBgpPeer() throws Exception {
+        final Neighbor neighbor = new NeighborBuilder().setAfiSafis(createAfiSafi()).setConfig(createConfig()).setNeighborAddress(NEIGHBOR_ADDRESS)
+            .setRouteReflector(createRR()).setTimers(createTimers()).setTransport(createTransport()).setAddPaths(createAddPath()).build();
+
+        this.bgpPeer.start(this.rib, neighbor, this.mappingService, this.configurationWriter);
+        Mockito.verify(this.mappingService).toPeerRole(any());
+        Mockito.verify(this.render).getConfiguredPeerCounter();
+        Mockito.verify(this.rib).createPeerChain(any());
+        Mockito.verify(this.rib, times(2)).getLocalAs();
+        Mockito.verify(this.rib).getLocalTables();
+        Mockito.verify(this.mappingService).toAddPathCapability(anyList());
+        Mockito.verify(this.mappingService).toTableTypes(anyList());
+        Mockito.verify(this.rib).getRibIServiceGroupIdentifier();
+        Mockito.verify(this.rib).registerClusterSingletonService(any(ClusterSingletonService.class));
+
+        this.singletonService.instantiateServiceInstance();
+        Mockito.verify(this.configurationWriter).apply();
+        Mockito.verify(this.bgpPeerRegistry).addPeer(any(), any(), any());
+        Mockito.verify(this.dispatcher).createReconnectingClient(any(InetSocketAddress.class), any(BGPPeerRegistry.class), anyInt(), any(Optional.class));
+
+        try {
+            this.bgpPeer.start(this.rib, neighbor, this.mappingService, this.configurationWriter);
+            fail("Expected Exception");
+        } catch (final IllegalStateException expected) {
+            assertEquals("Previous peer instance {} was not closed.", expected.getMessage());
+        }
+        this.bgpPeer.setServiceRegistration(serviceRegistration);
+        this.bgpPeer.restart(this.rib, this.mappingService);
+        Mockito.verify(this.mappingService, times(2)).toPeerRole(any());
+        Mockito.verify(this.render, times(2)).getConfiguredPeerCounter();
+        Mockito.verify(this.rib, times(2)).createPeerChain(any());
+        Mockito.verify(this.rib, times(4)).getLocalAs();
+        Mockito.verify(this.rib, times(2)).getLocalTables();
+        Mockito.verify(this.mappingService, times(2)).toAddPathCapability(anyList());
+        Mockito.verify(this.mappingService, times(2)).toTableTypes(anyList());
+        Mockito.verify(this.rib, times(2)).getRibIServiceGroupIdentifier();
+        Mockito.verify(this.rib, times(2)).registerClusterSingletonService(any(ClusterSingletonService.class));
+        this.singletonService.instantiateServiceInstance();
+
+        assertNotNull(this.bgpPeer.getBgpPeerState());
+        assertNotNull(this.bgpPeer.getBgpSessionState());
+        this.bgpPeer.resetStats();
+        this.bgpPeer.resetSession();
+
+        final Neighbor neighborExpected = createNeighborExpected(NEIGHBOR_ADDRESS);
+        assertTrue(this.bgpPeer.containsEqualConfiguration(neighborExpected));
+        assertFalse(this.bgpPeer.containsEqualConfiguration(createNeighborExpected(new IpAddress(new Ipv4Address("127.0.0.2")))));
+
+        this.singletonService.closeServiceInstance();
+        Mockito.verify(this.bgpPeerRegistry).removePeer(any(IpAddress.class));
+
+        this.bgpPeer.close();
+        Mockito.verify(this.singletonServiceRegistration, times(2)).close();
+        Mockito.verify(serviceRegistration).unregister();
+        Mockito.verify(this.future).cancel(true);
+    }
+
+    static Neighbor createNeighborExpected(final IpAddress neighborAddress) {
+        return new NeighborBuilder()
+            .setAfiSafis(createAfiSafi())
+            .setConfig(createConfig())
+            .setNeighborAddress(neighborAddress)
+            .setRouteReflector(createRR())
+            .setTimers(createTimers())
+            .setTransport(createTransport())
+            .setAddPaths(createAddPath())
+            .build();
+    }
+
+    static Transport createTransport() {
+        return new TransportBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor
+            .group.transport.ConfigBuilder().setMtuDiscovery(false).setPassiveMode(false).addAugmentation(Config1.class, new Config1Builder()
+            .setRemotePort(PORT).build()).build()).build();
+    }
+
+    static Timers createTimers() {
+        return new TimersBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group
+            .timers.ConfigBuilder().setHoldTime(DEFAULT_TIMERS).setMinimumAdvertisementInterval(DEFAULT_TIMERS)
+            .setKeepaliveInterval(DEFAULT_TIMERS).setConnectRetry(DEFAULT_TIMERS).build()).build();
+    }
+
+    static RouteReflector createRR() {
+        return new RouteReflectorBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp
+            .neighbor.group.route.reflector.ConfigBuilder().setRouteReflectorClusterId(RrClusterIdTypeBuilder.getDefaultInstance("127.0.0.1"))
+            .setRouteReflectorClient(false).build()).build();
+    }
+
+    static Config createConfig() {
+        return new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ConfigBuilder().setPeerAs(AS)
+            .setPeerType(PeerType.INTERNAL).setAuthPassword(MD5_PASSWORD).setRouteFlapDamping(false).setSendCommunity(CommunityType.NONE).build();
+    }
+
+    static AfiSafis createAfiSafi() {
+        return new AfiSafisBuilder().setAfiSafi(AFI_SAFI).build();
+    }
+
+    static AddPaths createAddPath() {
+        return new AddPathsBuilder().setConfig(new ConfigBuilder().setReceive(true).setSendMax(SHORT).build()).build();
+    }
+}
\ No newline at end of file
diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtilTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/OpenConfigMappingUtilTest.java
new file mode 100644 (file)
index 0000000..18bcf6a
--- /dev/null
@@ -0,0 +1,276 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.rib.impl.config;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.opendaylight.protocol.bgp.rib.impl.config.AbstractConfig.AS;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.AFI_SAFI;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.AFI_SAFI_IPV4;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.DEFAULT_TIMERS;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.MD5_PASSWORD;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.NEIGHBOR_ADDRESS;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.PORT;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.SHORT;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createAfiSafi;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createNeighborExpected;
+import static org.opendaylight.protocol.bgp.rib.impl.config.BgpPeerTest.createTransport;
+import static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil.INSTANCE;
+
+import com.google.common.collect.ImmutableList;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import javax.annotation.Nonnull;
+import org.junit.Test;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
+import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
+import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
+import org.opendaylight.protocol.bgp.rib.impl.spi.BGPDispatcher;
+import org.opendaylight.protocol.bgp.rib.impl.spi.CodecsRegistry;
+import org.opendaylight.protocol.bgp.rib.impl.spi.ImportPolicyPeerTracker;
+import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
+import org.opendaylight.protocol.bgp.rib.impl.spi.RIBSupportContextRegistry;
+import org.opendaylight.protocol.bgp.rib.impl.stats.rib.impl.BGPRenderStats;
+import org.opendaylight.protocol.bgp.rib.spi.CacheDisconnectedPeers;
+import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafis;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafisBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ConfigBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TransportBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborKey;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Neighbors;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV6UNICAST;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.NetworkInstances;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstance;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstanceKey;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.Protocols;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolKey;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.BGP;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi1Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Config1Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Protocol1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.Rib;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.RibKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+
+public class OpenConfigMappingUtilTest {
+    private static final Neighbor NEIGHBOR = createNeighborExpected(NEIGHBOR_ADDRESS);
+    private static final String KEY = "bgp";
+    private static final InstanceIdentifier<Bgp> BGP_II = InstanceIdentifier.create(NetworkInstances.class)
+        .child(NetworkInstance.class, new NetworkInstanceKey("identifier-test")).child(Protocols.class)
+        .child(Protocol.class, new ProtocolKey(BGP.class, KEY)).augmentation(Protocol1.class).child(Bgp.class);
+    private static final NeighborKey NEIGHBOR_KEY = new NeighborKey(NEIGHBOR_ADDRESS);
+
+    private static class RibMock implements RIB {
+
+        @Override
+        public AsNumber getLocalAs() {
+            return AS;
+        }
+
+        @Override
+        public BgpId getBgpIdentifier() {
+            return null;
+        }
+
+        @Nonnull
+        @Override
+        public Set<? extends BgpTableType> getLocalTables() {
+            return null;
+        }
+
+        @Override
+        public BGPDispatcher getDispatcher() {
+            return null;
+        }
+
+        @Override
+        public DOMTransactionChain createPeerChain(final TransactionChainListener listener) {
+            return null;
+        }
+
+        @Override
+        public RIBExtensionConsumerContext getRibExtensions() {
+            return null;
+        }
+
+        @Override
+        public RIBSupportContextRegistry getRibSupportContext() {
+            return null;
+        }
+
+        @Override
+        public YangInstanceIdentifier getYangRibId() {
+            return null;
+        }
+
+        @Override
+        public CodecsRegistry getCodecsRegistry() {
+            return null;
+        }
+
+        @Override
+        public CacheDisconnectedPeers getCacheDisconnectedPeers() {
+            return null;
+        }
+
+        @Override
+        public DOMDataTreeChangeService getService() {
+            return null;
+        }
+
+        @Override
+        public BGPRenderStats getRenderStats() {
+            return null;
+        }
+
+        @Override
+        public ImportPolicyPeerTracker getImportPolicyPeerTracker() {
+            return null;
+        }
+
+        @Override
+        public Set<TablesKey> getLocalTablesKeys() {
+            return null;
+        }
+
+        @Override
+        public ServiceGroupIdentifier getRibIServiceGroupIdentifier() {
+            return null;
+        }
+
+        @Override
+        public ClusterSingletonServiceRegistration registerClusterSingletonService(final ClusterSingletonService clusterSingletonService) {
+            return null;
+        }
+
+        @Override
+        public void close() throws Exception {
+
+        }
+
+        @Override
+        public KeyedInstanceIdentifier<Rib, RibKey> getInstanceIdentifier() {
+            return null;
+        }
+    }
+
+    @Test
+    public void testGetRibInstanceName() throws Exception {
+        assertEquals(KEY, OpenConfigMappingUtil.getRibInstanceName(BGP_II));
+    }
+
+    @Test
+    public void testGetHoldTimer() throws Exception {
+        assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(), OpenConfigMappingUtil.getHoldTimer(NEIGHBOR));
+    }
+
+    @Test
+    public void testGetPeerAs() throws Exception {
+        assertEquals(AS, OpenConfigMappingUtil.getPeerAs(NEIGHBOR, null));
+        assertEquals(AS, OpenConfigMappingUtil.getPeerAs(new NeighborBuilder().build(), new RibMock()));
+    }
+
+    @Test
+    public void testIsActive() throws Exception {
+        assertTrue(OpenConfigMappingUtil.isActive(new NeighborBuilder().build()));
+        assertTrue(OpenConfigMappingUtil.isActive(new NeighborBuilder().setTransport(new TransportBuilder().build()).build()));
+        assertTrue(OpenConfigMappingUtil.isActive(new NeighborBuilder().setTransport(createTransport()).build()));
+    }
+
+    @Test
+    public void testGetRetryTimer() throws Exception {
+        assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(), OpenConfigMappingUtil.getRetryTimer(NEIGHBOR));
+        assertEquals(DEFAULT_TIMERS.toBigInteger().intValue(), OpenConfigMappingUtil.getRetryTimer(new NeighborBuilder().build()));
+    }
+
+    @Test
+    public void testGetNeighborKey() throws Exception {
+        assertArrayEquals(MD5_PASSWORD.getBytes(StandardCharsets.US_ASCII),
+            OpenConfigMappingUtil.getNeighborKey(NEIGHBOR).get(INSTANCE.inetAddressFor(NEIGHBOR_ADDRESS)));
+        assertNull(OpenConfigMappingUtil.getNeighborKey(new NeighborBuilder().build()));
+        assertNull(OpenConfigMappingUtil.getNeighborKey(new NeighborBuilder().setConfig(new ConfigBuilder().build()).build()));
+    }
+
+    @Test
+    public void testGetNeighborInstanceIdentifier() throws Exception {
+        assertEquals(BGP_II.child(Neighbors.class).child(Neighbor.class, NEIGHBOR_KEY),
+            OpenConfigMappingUtil.getNeighborInstanceIdentifier(BGP_II, NEIGHBOR_KEY));
+
+    }
+
+    @Test
+    public void testGetNeighborInstanceName() throws Exception {
+        assertEquals(NEIGHBOR_ADDRESS.getIpv4Address().getValue(),
+            OpenConfigMappingUtil.getNeighborInstanceName(BGP_II.child(Neighbors.class).child(Neighbor.class, NEIGHBOR_KEY)));
+    }
+
+    @Test
+    public void testGetPort() throws Exception {
+        assertEquals(PORT, OpenConfigMappingUtil.getPort(NEIGHBOR));
+        assertEquals(PORT, OpenConfigMappingUtil.getPort(new NeighborBuilder().setTransport(new TransportBuilder().build()).build()));
+        assertEquals(PORT, OpenConfigMappingUtil.getPort(new NeighborBuilder().setTransport(
+            new TransportBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport.
+                ConfigBuilder().build()).build()).build()));
+        assertEquals(PORT, OpenConfigMappingUtil.getPort(new NeighborBuilder().setTransport(
+            new TransportBuilder().setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport.
+                ConfigBuilder().addAugmentation(Config1.class, new Config1Builder().build()).build()).build()).build()));
+    }
+
+    @Test
+    public void testGetAfiSafiWithDefault() throws Exception {
+        final ImmutableList<AfiSafi> defaultValue = ImmutableList.of(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build());
+        assertEquals(defaultValue, OpenConfigMappingUtil.getAfiSafiWithDefault(null, true));
+        final AfiSafis afiSafi = new AfiSafisBuilder().build();
+        assertEquals(defaultValue, OpenConfigMappingUtil.getAfiSafiWithDefault(afiSafi, true));
+
+        final AfiSafi afiSafiIpv6 = new AfiSafiBuilder().setAfiSafiName(IPV6UNICAST.class).addAugmentation(AfiSafi1.class,
+            new AfiSafi1Builder().setReceive(true).setSendMax(SHORT).build()).build();
+        final List<AfiSafi> afiSafiIpv6List = new ArrayList<>();
+        afiSafiIpv6List.add(afiSafiIpv6);
+
+        final List<AfiSafi> expected = new ArrayList<>(afiSafiIpv6List);
+        expected.add(AFI_SAFI_IPV4);
+        assertEquals(afiSafiIpv6, OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder().setAfiSafi(afiSafiIpv6List).build(), true).get(0));
+        assertEquals(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build(),
+            OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder().setAfiSafi(afiSafiIpv6List).build(), true).get(1));
+        assertEquals(AFI_SAFI, OpenConfigMappingUtil.getAfiSafiWithDefault(createAfiSafi(), true));
+
+        assertTrue(OpenConfigMappingUtil.getAfiSafiWithDefault(null, false).isEmpty());
+        assertTrue(OpenConfigMappingUtil.getAfiSafiWithDefault(afiSafi, false).isEmpty());
+        assertEquals(afiSafiIpv6, OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder().setAfiSafi(afiSafiIpv6List).build(), false).get(0));
+        assertEquals(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class).build(),
+            OpenConfigMappingUtil.getAfiSafiWithDefault(new AfiSafisBuilder().setAfiSafi(afiSafiIpv6List).build(), false).get(1));
+        assertEquals(AFI_SAFI, OpenConfigMappingUtil.getAfiSafiWithDefault(createAfiSafi(), false));
+    }
+}
\ No newline at end of file
diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImplTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/config/RibImplTest.java
new file mode 100644 (file)
index 0000000..7b3b4a2
--- /dev/null
@@ -0,0 +1,179 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.rib.impl.config;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyList;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.primitives.Shorts;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBrokerExtension;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataTreeChangeService;
+import org.opendaylight.controller.sal.core.api.model.SchemaService;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration;
+import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
+import org.opendaylight.protocol.bgp.mode.impl.add.all.paths.AllPathSelection;
+import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenConfigMappingService;
+import org.opendaylight.protocol.bgp.parser.BgpTableTypeImpl;
+import org.opendaylight.protocol.bgp.rib.DefaultRibReference;
+import org.opendaylight.protocol.bgp.rib.RibReference;
+import org.opendaylight.protocol.bgp.rib.impl.RIBImpl;
+import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
+import org.opendaylight.protocol.bgp.rib.spi.RIBSupport;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafi;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.multiprotocol.rev151009.bgp.common.afi.safi.list.AfiSafiBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base.AfiSafisBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Global;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.GlobalBuilder;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.IPV4UNICAST;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.AfiSafi2Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.BgpRib;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.Rib;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.bgp.rib.RibKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode;
+import org.osgi.framework.ServiceRegistration;
+
+public class RibImplTest extends AbstractConfig {
+    private static final List<AfiSafi> AFISAFIS = new ArrayList<>();
+    private static final Long ALL_PATHS = 0L;
+    private static final BgpTableType TABLE_TYPE = new BgpTableTypeImpl(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class);
+    private static final Ipv4Address BGP_ID = new BgpId(new Ipv4Address("127.0.0.1"));
+
+    static {
+        AFISAFIS.add(new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class)
+            .addAugmentation(AfiSafi2.class, new AfiSafi2Builder().setReceive(true).setSendMax(Shorts.checkedCast(ALL_PATHS)).build()).build());
+    }
+
+    @Mock
+    private RIBExtensionConsumerContext extension;
+    @Mock
+    private BindingCodecTreeFactory bindingCodecTreeFactory;
+    @Mock
+    private DOMDataBroker domDataBroker;
+    @Mock
+    private SchemaService schemaService;
+    @Mock
+    private ClusterSingletonServiceProvider clusterSingletonServiceProvider;
+    @Mock
+    private BGPOpenConfigMappingService mappingService;
+    @Mock
+    private ListenerRegistration dataTreeRegistration;
+    @Mock
+    private RIBSupport ribSupport;
+    @Mock
+    private ServiceRegistration serviceRegistration;
+
+    @Before
+    public void setUp() throws Exception {
+        super.setUp();
+        Mockito.doAnswer(new Answer<ClusterSingletonServiceRegistration>() {
+            @Override
+            public ClusterSingletonServiceRegistration answer(final InvocationOnMock invocationOnMock) throws Throwable {
+                singletonService = (ClusterSingletonService) invocationOnMock.getArguments()[0];
+                return singletonServiceRegistration;
+            }
+        }).when(this.clusterSingletonServiceProvider).registerClusterSingletonService(any(ClusterSingletonService.class));
+
+        Mockito.doReturn(Collections.singletonMap(TABLE_TYPE, new AllPathSelection()))
+            .when(this.mappingService).toPathSelectionMode(any());
+        Mockito.doReturn(Collections.singletonList(TABLE_TYPE)).when(this.mappingService).toTableTypes(any());
+        Mockito.doReturn(mock(GeneratedClassLoadingStrategy.class)).when(this.extension).getClassLoadingStrategy();
+        Mockito.doReturn(this.ribSupport).when(this.extension).getRIBSupport(any(TablesKey.class));
+        final NodeIdentifier nii = new NodeIdentifier(QName.create("test").intern());
+        Mockito.doReturn(nii).when(this.ribSupport).routeAttributesIdentifier();
+        Mockito.doReturn(ImmutableSet.of()).when(this.ribSupport).cacheableAttributeObjects();
+        final ChoiceNode choiceNode = mock(ChoiceNode.class);
+        Mockito.doReturn(choiceNode).when(this.ribSupport).emptyRoutes();
+        Mockito.doReturn(nii).when(choiceNode).getIdentifier();
+        Mockito.doReturn(QName.create("test").intern()).when(choiceNode).getNodeType();
+        Mockito.doReturn(this.domTx).when(this.domDataBroker).createTransactionChain(any());
+        final DOMDataTreeChangeService dOMDataTreeChangeService = mock(DOMDataTreeChangeService.class);
+        Mockito.doReturn(Collections.singletonMap(DOMDataTreeChangeService.class, dOMDataTreeChangeService))
+            .when(this.domDataBroker).getSupportedExtensions();
+        Mockito.doReturn(this.dataTreeRegistration).when(this.schemaService).registerSchemaContextListener(any());
+        Mockito.doNothing().when(this.dataTreeRegistration).close();
+        Mockito.doReturn(mock(ListenerRegistration.class)).when(dOMDataTreeChangeService).registerDataTreeChangeListener(any(), any());
+        Mockito.doNothing().when(this.serviceRegistration).unregister();
+    }
+
+    @Test
+    public void testRibImpl() throws Exception {
+        final RibImpl ribImpl = new RibImpl(this.clusterSingletonServiceProvider, this.extension, this.dispatcher,
+            this.bindingCodecTreeFactory, this.domDataBroker, this.schemaService);
+        ribImpl.setServiceRegistration(this.serviceRegistration);
+        ribImpl.start(createGlobal(), "rib-test", this.mappingService, this.configurationWriter);
+        verify(this.mappingService).toPathSelectionMode(anyList());
+        verify(this.mappingService).toTableTypes(anyList());
+        verify(this.extension).getClassLoadingStrategy();
+        verify(this.domDataBroker).createTransactionChain(any(RIBImpl.class));
+        verify(this.domDataBroker).getSupportedExtensions();
+        verify(this.clusterSingletonServiceProvider).registerClusterSingletonService(any());
+        verify(this.schemaService).registerSchemaContextListener(any(RIBImpl.class));
+        this.singletonService.instantiateServiceInstance();
+        Mockito.verify(this.configurationWriter).apply();
+        assertEquals("RIBImpl{}", ribImpl.toString());
+        assertEquals(ServiceGroupIdentifier.create(new RibId("rib-test") + "-service-group"), ribImpl.getRibIServiceGroupIdentifier());
+        assertEquals(Collections.singleton(new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)), ribImpl.getLocalTablesKeys());
+        assertNotNull(ribImpl.getImportPolicyPeerTracker());
+        assertNotNull(ribImpl.getService());
+        assertNotNull(ribImpl.getCacheDisconnectedPeers());
+        assertNotNull(ribImpl.getInstanceIdentifier());
+        assertEquals(AS, ribImpl.getLocalAs());
+        assertEquals(BGP_ID, ribImpl.getBgpIdentifier());
+        assertEquals(Collections.singleton(TABLE_TYPE), ribImpl.getLocalTables());
+        assertEquals(this.dispatcher, ribImpl.getDispatcher());
+        assertEquals(this.extension, ribImpl.getRibExtensions());
+        assertNotNull(ribImpl.getRibSupportContext());
+        assertNotNull(ribImpl.getCodecsRegistry());
+
+        ribImpl.close();
+        verify(this.dataTreeRegistration).close();
+        verify(this.dataTreeRegistration).close();
+        verify(this.serviceRegistration).unregister();
+    }
+
+    private Global createGlobal() {
+        return new GlobalBuilder()
+            .setAfiSafis(new AfiSafisBuilder().setAfiSafi(AFISAFIS).build())
+            .setConfig(new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.global.base
+                .ConfigBuilder().setAs(AS).setRouterId(BGP_ID).build()).build();
+    }
+}
\ No newline at end of file
diff --git a/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/BGPRenderStatsImplTest.java b/bgp/rib-impl/src/test/java/org/opendaylight/protocol/bgp/rib/impl/stats/rib/impl/BGPRenderStatsImplTest.java
new file mode 100644 (file)
index 0000000..ee50556
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.protocol.bgp.rib.impl.stats.rib.impl;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Test;
+import org.opendaylight.controller.config.yang.bgp.rib.impl.BgpRenderState;
+import org.opendaylight.controller.config.yang.bgp.rib.impl.LocRibRouteTable;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.ZeroBasedCounter32;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.RibId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.BgpId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.ClusterIdentifier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.Ipv4AddressFamily;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.UnicastSubsequentAddressFamily;
+
+public class BGPRenderStatsImplTest {
+    private final static BgpId BGP_ID = new BgpId("127.0.0.1");
+    private static final RibId RIB_ID = new RibId("test-rib");
+    private static final ClusterIdentifier CLUSTER_ID = new ClusterIdentifier("192.168.1.2");
+    private static final AsNumber AS = new AsNumber(0x10L);
+    private static final ZeroBasedCounter32 COUTER = new ZeroBasedCounter32(0L);
+
+    @Test
+    public void getBgpRenderState() throws Exception {
+        final BGPRenderStatsImpl render = new BGPRenderStatsImpl(BGP_ID, RIB_ID, AS, CLUSTER_ID);
+
+        final BgpRenderState renderStateExpected = new BgpRenderState();
+        renderStateExpected.setRibId(RIB_ID);
+        renderStateExpected.setBgpRibId(BGP_ID);
+        renderStateExpected.setClusterId(CLUSTER_ID);
+        renderStateExpected.setLocalAs(AS);
+        renderStateExpected.setConfiguredPeerCount(COUTER);
+        renderStateExpected.setConnectedPeerCount(COUTER);
+        final List<LocRibRouteTable> locRibRouteTableList = new ArrayList<>();
+        renderStateExpected.setLocRibRouteTable(locRibRouteTableList);
+        renderStateExpected.setLocRibRoutesCount(COUTER);
+
+        assertEquals(renderStateExpected, render.getBgpRenderState());
+        assertEquals(1L, render.getLocRibRouteCounter().init(new TablesKey(Ipv4AddressFamily.class, UnicastSubsequentAddressFamily.class)).increaseCount());
+        assertEquals(1L, render.getConfiguredPeerCounter().increaseCount());
+        assertEquals(1L, render.getConnectedPeerCounter().increaseCount());
+    }
+}
\ No newline at end of file
index ef714486e1b311cdcd5f12293158eb2eb76f170d..8b0f301206f7f3fc65b8f965798f2f39d87949b6 100644 (file)
@@ -17,7 +17,7 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 
-final public class PeerRoleUtil {
+public final class PeerRoleUtil {
     public static final NodeIdentifier PEER_ROLE_NID = new NodeIdentifier(QName.create(Peer.QNAME, "peer-role").intern());
 
     private PeerRoleUtil() {
index 66928b6d195095de5ef76b1dc84a08dc4b11aabe..d8b41fcb9398669929e59fc6bb26f342ef5f5497 100644 (file)
@@ -47,11 +47,11 @@ import org.slf4j.LoggerFactory;
 
 final class CommunitiesBuilder {
     private static final Logger LOG = LoggerFactory.getLogger(CommunitiesBuilder.class);
-    private final static As4SpecificCommon AS_4_COMMON = new As4SpecificCommonBuilder().setAsNumber(new AsNumber(20L)).setLocalAdministrator(100).build();
-    private final static Ipv4Address IPV4 = new Ipv4Address("192.168.1.0");
-    private final static byte[] BYTE = new byte[]{(byte) 0x4f, (byte) 0x70, (byte) 0x00, (byte) 0x00};
-    private final static int LA = 4660;
-    private final static ShortAsNumber SHORT_AS = new ShortAsNumber(20L);
+    private static final As4SpecificCommon AS_4_COMMON = new As4SpecificCommonBuilder().setAsNumber(new AsNumber(20L)).setLocalAdministrator(100).build();
+    private static final Ipv4Address IPV4 = new Ipv4Address("192.168.1.0");
+    private static final byte[] BYTE = new byte[]{(byte) 0x4f, (byte) 0x70, (byte) 0x00, (byte) 0x00};
+    private static final int LA = 4660;
+    private static final ShortAsNumber SHORT_AS = new ShortAsNumber(20L);
 
     private CommunitiesBuilder() {
         throw new UnsupportedOperationException();
index 286e0efda2f393543bb6049823cae98d4aea2bf4..0fb984c768bf7edfc3af97421bca1ee34ebbc96f 100644 (file)
@@ -41,7 +41,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.type
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHopBuilder;
 
 final class PrefixesBuilder {
-    private final static Ipv4NextHopCase NEXT_HOP;
+    private static final Ipv4NextHopCase NEXT_HOP;
 
     static {
         NEXT_HOP = new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder().setGlobal(new Ipv4Address("127.1.1.1")).build()).build();
@@ -51,7 +51,7 @@ final class PrefixesBuilder {
         throw new UnsupportedOperationException();
     }
 
-    static void AdvertiseIpv4Prefixes(final ChannelOutputLimiter session, final int nPrefixes, final List<String> extCom, final boolean multipartSupport) {
+    static void advertiseIpv4Prefixes(final ChannelOutputLimiter session, final int nPrefixes, final List<String> extCom, final boolean multipartSupport) {
         Ipv4Prefix addressPrefix = new Ipv4Prefix("1.1.1.1/31");
         for (int i = 0; i < nPrefixes; i++) {
             buildAndSend(session, addressPrefix, extCom, multipartSupport);
index 2297de7525351d7af0e4f86ee5232e5179239199..c022aad54975be854cf1449996f8d4a8f8f44efc 100644 (file)
@@ -43,7 +43,7 @@ final class TestingListener implements BGPSessionListener {
     public void onSessionUp(final BGPSession session) {
         LOG.info("Client Listener: Session Up.");
         if (this.nPrefixes > 0) {
-            PrefixesBuilder.AdvertiseIpv4Prefixes(((BGPSessionImpl) session).getLimiter(), this.nPrefixes, this.extCom, this.multiPathSupport);
+            PrefixesBuilder.advertiseIpv4Prefixes(((BGPSessionImpl) session).getLimiter(), this.nPrefixes, this.extCom, this.multiPathSupport);
         }
     }
 
index 6a2eb86b49fd07067b56dbbfd992bad4b1b19eb1..c8767df248569e840de597a56467f8ee9ecac761 100644 (file)
@@ -29,7 +29,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev
 
 public class SimpleRSVPExtensionProviderContext extends SimpleRSVPExtensionConsumerContext implements RSVPExtensionProviderContext {
 
-    public static final int DEFAULT_MAXIMUM_CACHED_OBJECTS = 100000;
+    private static final int DEFAULT_MAXIMUM_CACHED_OBJECTS = 100000;
 
     private final AtomicReference<Cache<Object, Object>> cacheRef;
     private final ReferenceCache referenceCache = new ReferenceCache() {
@@ -47,15 +47,12 @@ public class SimpleRSVPExtensionProviderContext extends SimpleRSVPExtensionConsu
             return ret;
         }
     };
-    private final int maximumCachedObjects;
 
     public SimpleRSVPExtensionProviderContext() {
         this(DEFAULT_MAXIMUM_CACHED_OBJECTS);
     }
 
     public SimpleRSVPExtensionProviderContext(final int maximumCachedObjects) {
-        this.maximumCachedObjects = maximumCachedObjects;
-
         final Cache<Object, Object> cache = CacheBuilder.newBuilder().maximumSize(maximumCachedObjects).build();
         this.cacheRef = new AtomicReference<Cache<Object,Object>>(cache);
     }