--- /dev/null
+package org.opendaylight.vpnservice.test;
+
+import java.util.Collection;
+
+import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+import com.google.common.base.Preconditions;
+
+public abstract class AbstractMockFibManager<D extends DataObject> implements DataTreeChangeListener<D> {
+
+ public AbstractMockFibManager() {
+ // Do Nothing
+ }
+
+
+ public void onDataTreeChanged(Collection<DataTreeModification<D>> changes) {
+ // TODO Auto-generated method stub
+ }
+
+}
--- /dev/null
+package org.opendaylight.vpnservice.test;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Collections;
+import java.util.concurrent.ExecutionException;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+
+import org.mockito.runners.MockitoJUnitRunner;
+import org.opendaylight.bgpmanager.FibDSWriter;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.binding.test.AbstractDataBrokerTest;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+import static org.junit.Assert.assertEquals;
+
+@RunWith(MockitoJUnitRunner.class)
+
+public class BgpManagerTest extends AbstractDataBrokerTest {
+ DataBroker dataBroker;
+ FibDSWriter bgpFibWriter = null ;
+ MockFibManager fibManager = null ;
+
+ @Before
+ public void setUp() throws Exception {
+ dataBroker = getDataBroker() ;
+ bgpFibWriter = new FibDSWriter(dataBroker);
+ fibManager = new MockFibManager(dataBroker);
+ }
+
+ @Test
+ public void testAddSinglePrefix() {
+ String rd = "101";
+ String prefix = "10.10.10.10/32";
+ String nexthop = "100.100.100.100";
+ int label = 1234;
+
+ bgpFibWriter.addFibEntryToDS(rd, prefix, nexthop, label);
+ assertEquals(1, fibManager.getDataChgCount());
+ }
+
+ @Test
+ public void testAddPrefixesInRd() {
+ String rd = "101";
+ String prefix = "10.10.10.10/32";
+ String nexthop = "100.100.100.100";
+ int label = 1234;
+
+ bgpFibWriter.addFibEntryToDS(rd, prefix, nexthop, label);
+ assertEquals(1, fibManager.getDataChgCount());
+
+ prefix = "10.10.10.11/32";
+ label = 3456;
+ bgpFibWriter.addFibEntryToDS(rd, prefix, nexthop, label);
+ assertEquals(2, fibManager.getDataChgCount());
+
+
+ }
+
+ @Test
+ public void testAddPrefixesAcrossRd() {
+ String rd = "101";
+ String prefix = "10.10.10.10/32";
+ String nexthop = "100.100.100.100";
+ int label = 1234;
+
+ bgpFibWriter.addFibEntryToDS(rd, prefix, nexthop, label);
+ assertEquals(1, fibManager.getDataChgCount());
+
+ rd = "102";
+ prefix = "10.10.10.11/32";
+ nexthop = "200.200.200.200";
+ label = 3456;
+ bgpFibWriter.addFibEntryToDS(rd, prefix, nexthop, label);
+ assertEquals(2, fibManager.getDataChgCount());
+
+ }
+
+
+ @Test
+ public void testRemovePrefix() {
+ String rd = "101";
+ String prefix = "10.10.10.10/32";
+ String nexthop = "100.100.100.100";
+ int label = 1234;
+
+ //add and then remove prefix
+ bgpFibWriter.addFibEntryToDS(rd, prefix, nexthop, label);
+ assertEquals(1, fibManager.getDataChgCount());
+ bgpFibWriter.removeFibEntryFromDS(rd, prefix);
+ assertEquals(0, fibManager.getDataChgCount());
+
+ }
+
+}
--- /dev/null
+package org.opendaylight.vpnservice.test;
+
+import java.util.Collection;
+
+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.common.api.data.LogicalDatastoreType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.FibEntries;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.fibentries.VrfTables;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.vrfentries.VrfEntry;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+public class MockFibManager extends AbstractMockFibManager<VrfEntry> {
+
+ private int nFibEntries = 0;
+
+ private ListenerRegistration<MockFibManager> listenerRegistration;
+
+ public MockFibManager( final DataBroker db) {
+ super() ;
+ registerListener(db) ;
+ }
+
+ private void registerListener(final DataBroker db) {
+ final DataTreeIdentifier<VrfEntry> treeId = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, getWildCardPath());
+ try {
+ listenerRegistration = db.registerDataTreeChangeListener(treeId, MockFibManager.this);
+ } catch (final Exception e) {
+ throw new IllegalStateException("FibManager registration Listener fail! System needs restart.", e);
+ }
+ }
+
+ private InstanceIdentifier<VrfEntry> getWildCardPath() {
+ return InstanceIdentifier.create(FibEntries.class).child(VrfTables.class).child(VrfEntry.class);
+ }
+
+ @Override
+ public void onDataTreeChanged(Collection<DataTreeModification<VrfEntry>> changes) {
+ for (DataTreeModification<VrfEntry> change : changes) {
+ final InstanceIdentifier<VrfEntry> key = change.getRootPath().getRootIdentifier();
+ final DataObjectModification<VrfEntry> mod = change.getRootNode();
+
+ switch (mod.getModificationType()) {
+ case DELETE:
+ nFibEntries -= 1;
+ break;
+ case WRITE:
+ if (mod.getDataBefore() == null) {
+ nFibEntries += 1;
+ } else {
+ // UPDATE COUNT UNCHANGED
+ }
+ break;
+ default:
+ throw new IllegalArgumentException("Unhandled modification type " + mod.getModificationType());
+ }
+ }
+ }
+
+ public int getDataChgCount() {
+ return nFibEntries;
+ }
+}