From: Abhinav Gupta Date: Thu, 14 May 2015 19:06:26 +0000 (+0530) Subject: Added unit tests for NextHopManager X-Git-Tag: release/lithium~18 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=vpnservice.git;a=commitdiff_plain;h=b43b27e328b6e99c55ef5a7e7a98aae874e5b72f Added unit tests for NextHopManager Change-Id: Ia4cdd6cf1d938305f120129da0c8460b9681325b Signed-off-by: Abhinav Gupta --- diff --git a/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/NexthopManager.java b/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/NexthopManager.java index 29d5acd9..8ea89397 100644 --- a/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/NexthopManager.java +++ b/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/NexthopManager.java @@ -117,7 +117,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { } - private long getVpnId(String vpnName) { + protected long getVpnId(String vpnName) { InstanceIdentifierBuilder idBuilder = InstanceIdentifier.builder(VpnInstances.class) .child(VpnInstance.class, new VpnInstanceKey(vpnName)); @@ -140,7 +140,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { return dpn; } - private int createNextHopPointer(String nexthopKey) { + protected int createNextHopPointer(String nexthopKey) { GetUniqueIdInput getIdInput = new GetUniqueIdInputBuilder() .setPoolName("nextHopPointerPool").setIdKey(nexthopKey) .build(); @@ -213,7 +213,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { } } - private void addVpnNexthopToDS(long vpnId, String ipPrefix, long egressPointer) { + protected void addVpnNexthopToDS(long vpnId, String ipPrefix, long egressPointer) { InstanceIdentifierBuilder idBuilder = InstanceIdentifier.builder(L3nexthop.class) .child(VpnNexthops.class, new VpnNexthopsKey(vpnId)); @@ -270,7 +270,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { } - private VpnNexthop getVpnNexthop(long vpnId, String ipAddress) { + protected VpnNexthop getVpnNexthop(long vpnId, String ipAddress) { // check if vpn node is there InstanceIdentifierBuilder idBuilder = InstanceIdentifier.builder(L3nexthop.class) diff --git a/nexthopmgr/nexthopmgr-impl/src/test/java/org/opendaylight/vpnservice/nexthopmgr/test/MockDataChangedEvent.java b/nexthopmgr/nexthopmgr-impl/src/test/java/org/opendaylight/vpnservice/nexthopmgr/test/MockDataChangedEvent.java new file mode 100644 index 00000000..40152577 --- /dev/null +++ b/nexthopmgr/nexthopmgr-impl/src/test/java/org/opendaylight/vpnservice/nexthopmgr/test/MockDataChangedEvent.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. 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.vpnservice.nexthopmgr.test; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +class MockDataChangedEvent implements AsyncDataChangeEvent, DataObject> { + Map, DataObject> created = new HashMap<>(); + Map, DataObject> updated = new HashMap<>(); + Map, DataObject> original = new HashMap<>(); + Set> removed = new HashSet<>(); + + @Override + public Map, DataObject> getCreatedData() { + return created; + } + + @Override + public Map, DataObject> getUpdatedData() { + return updated; + } + + @Override + public Set> getRemovedPaths() { + return removed; + } + + @Override + public Map, DataObject> getOriginalData() { + return original; + } + + @Override + public DataObject getOriginalSubtree() { + throw new UnsupportedOperationException("Not implemented by mock"); + } + + @Override + public DataObject getUpdatedSubtree() { + throw new UnsupportedOperationException("Not implemented by mock"); + } +} diff --git a/nexthopmgr/nexthopmgr-impl/src/test/java/org/opendaylight/vpnservice/nexthopmgr/test/NexthopManagerTest.java b/nexthopmgr/nexthopmgr-impl/src/test/java/org/opendaylight/vpnservice/nexthopmgr/test/NexthopManagerTest.java new file mode 100644 index 00000000..48ba2bac --- /dev/null +++ b/nexthopmgr/nexthopmgr-impl/src/test/java/org/opendaylight/vpnservice/nexthopmgr/test/NexthopManagerTest.java @@ -0,0 +1,208 @@ +/* + * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. 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.vpnservice.nexthopmgr.test; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.when; + +import com.google.common.base.Optional; +import com.google.common.util.concurrent.Futures; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +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.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; +import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; +import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.idmanager.IdManager; +import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager; +import org.opendaylight.vpnservice.nexthopmgr.NexthopManager; +import org.opendaylight.vpnservice.nexthopmgr.VpnInterfaceChangeListener; +import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInterfaces; +import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.VpnInstance; +import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface; +import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceBuilder; +import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.Adjacencies; +import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.AdjacenciesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.Adjacency; +import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.AdjacencyKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.l3nexthop.VpnNexthops; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.l3nexthop.vpnnexthops.VpnNexthop; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.l3nexthop.vpnnexthops.VpnNexthopBuilder; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.binding.Augmentation; +import org.opendaylight.yangtools.yang.binding.DataContainer; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.vpnservice.interfacemgr.interfaces.IInterfaceManager; + +@RunWith(MockitoJUnitRunner.class) +public class NexthopManagerTest { + + private final String ifName = "dpn1-if0"; + private final String vpnName = "vpn1"; + private final String ipAddress = "1.1.1.1"; + private final String macAddress = "11:22:33:44:55:66"; + private final int groupId = 5000; + private final long dpId = 1L; + private final long vpnId = 2L; + + Map, DataObject> written = new HashMap<>(); + Map, DataObject> updated = new HashMap<>(); + Set> removed = new HashSet<>(); + + @Mock + DataBroker dataBroker; + @Mock + IdManager idManager; + @Mock + IInterfaceManager interfacemanager; + @Mock + ListenerRegistration dataChangeListenerRegistration; + @Mock + ReadOnlyTransaction mockReadTx; + @Mock + WriteTransaction mockWriteTx; + @Mock + IMdsalApiManager mdsalmanager; + + MockDataChangedEvent dataChangeEvent; + NexthopManager nhmgr; + VpnInterfaceChangeListener vpnchglistener; + VpnInstance vpninstance; + VpnInterface vpninterface; + VpnNexthops vpnnexthops; + VpnNexthop vpnNexthop; + + InstanceIdentifier vpnInterfaceIdent; + InstanceIdentifier adjacencies; + Adjacencies adjacency; + List adjList = new ArrayList(); + + Adjacency adjacencyobject = new Adjacency() { + + @Override + public > E getAugmentation(Class augmentationType) { + return null; + } + + @Override + public Class getImplementedInterface() { + return null; + } + + @Override + public Long getNextHopId() { + return null; + } + + @Override + public String getMacAddress() { + return macAddress; + } + + @Override + public Long getLabel() { + return null; + } + + @Override + public AdjacencyKey getKey() { + return null; + } + + @Override + public String getIpAddress() { + return ipAddress; + } + }; + + @Before + public void setUp() throws Exception { + adjacency = getVpnInterfaceAugmentation(adjList); + adjacencies = + InstanceIdentifier.create(VpnInterfaces.class).child(VpnInterface.class).augmentation(Adjacencies.class); + vpnInterfaceIdent = adjacencies.firstIdentifierOf(VpnInterface.class); + vpninterface = getVpnInterface(ifName, vpnName, adjacency); + adjList.add(adjacencyobject); + + when( + dataBroker.registerDataChangeListener(any(LogicalDatastoreType.class), any(InstanceIdentifier.class), + any(DataChangeListener.class), any(DataChangeScope.class))).thenReturn( + dataChangeListenerRegistration); + + dataChangeEvent = new MockDataChangedEvent(); + vpnNexthop = new VpnNexthopBuilder().setEgressPointer(10L).setIpAddress(ipAddress).build(); + nhmgr = new NexthopManager(dataBroker) { + protected int createNextHopPointer(String nexthopKey) { + return groupId; + } + + protected long getVpnId(String vpnName) { + return vpnId; + } + + protected VpnNexthop getVpnNexthop(long vpnId, String ipAddress) { + return vpnNexthop; + } + + protected void addVpnNexthopToDS(long vpnId, String ipPrefix, long egressPointer) { + return; + } + }; + + nhmgr.setInterfaceManager(interfacemanager); + nhmgr.setMdsalManager(mdsalmanager); + vpnchglistener = new VpnInterfaceChangeListener(dataBroker, nhmgr); + setupMocks(); + } + + private void setupMocks() { + when(dataBroker.newReadOnlyTransaction()).thenReturn(mockReadTx); + when(dataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTx); + } + + @Test + public void testAdd() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { + Optional vpnIf = Optional.of(vpninterface); + + doReturn(Futures.immediateCheckedFuture(vpnIf)).when(mockReadTx).read(LogicalDatastoreType.OPERATIONAL, + vpnInterfaceIdent); + + when(interfacemanager.getDpnForInterface(ifName)).thenReturn(dpId); + dataChangeEvent.created.put(adjacencies, adjacency); + vpnchglistener.onDataChanged(dataChangeEvent); + + // FIXME: Add some verifications + } + + private Adjacencies getVpnInterfaceAugmentation(List nextHops) { + return new AdjacenciesBuilder().setAdjacency(nextHops).build(); + } + + private VpnInterface getVpnInterface(String intfName, String vpnName, Adjacencies aug) { + return new VpnInterfaceBuilder().setKey(new VpnInterfaceKey(intfName)).setVpnInstanceName(vpnName) + .addAugmentation(Adjacencies.class, aug).build(); + } +} \ No newline at end of file