From e7511c47636bd684a65caf6ceca784cbd00c49bb Mon Sep 17 00:00:00 2001 From: Suraj Ranjan Date: Wed, 23 Dec 2015 17:14:25 +0530 Subject: [PATCH] UnitTests for StateInterface Helpers Change-Id: Ib5fd5f14436c905038a328f967b90ea3c78c6140 Signed-off-by: Suraj Ranjan --- .../test/InterfaceManagerTestUtil.java | 26 +++ .../interfacemgr/test/StateInterfaceTest.java | 161 ++++++++++++++++++ .../TunnelInterfaceConfigurationTest.java | 22 ++- 3 files changed, 208 insertions(+), 1 deletion(-) create mode 100644 interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/StateInterfaceTest.java diff --git a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/InterfaceManagerTestUtil.java b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/InterfaceManagerTestUtil.java index e8e7e6f4..e0071296 100644 --- a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/InterfaceManagerTestUtil.java +++ b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/InterfaceManagerTestUtil.java @@ -28,6 +28,9 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces. import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteMetadataCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.metadata._case.WriteMetadata; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction; @@ -47,6 +50,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.re import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdPools; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.id.pools.IdPool; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.id.pools.IdPoolKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._if.indexes._interface.map.IfIndexInterface; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._if.indexes._interface.map.IfIndexInterfaceBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._if.indexes._interface.map.IfIndexInterfaceKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.BridgeEntry; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.BridgeEntryBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.BridgeEntryKey; @@ -96,6 +102,13 @@ public class InterfaceManagerTestUtil { .build(); } + public static InstanceIdentifier getFlowCapableNodeConnectorIdentifier(String nodeKey, NodeConnectorId ncId) { + return InstanceIdentifier.builder(Nodes.class) + .child(Node.class, new NodeKey(new NodeId(nodeKey))) + .child(NodeConnector.class, new NodeConnectorKey(ncId)).augmentation(FlowCapableNodeConnector.class) + .build(); + } + public static Interface buildInterface(String ifName, String desc, boolean enabled, Object ifType, BigInteger dpn) { InterfaceBuilder builder = new InterfaceBuilder().setKey(new InterfaceKey(ifName)).setName(ifName) @@ -127,6 +140,10 @@ public class InterfaceManagerTestUtil { builder.addAugmentation(IfTunnel.class, tunnel); return builder.build(); } + public static IfIndexInterface buildIfIndexInterface(int ifindex, String interfaceName) { + IfIndexInterfaceBuilder builder = new IfIndexInterfaceBuilder().setKey(new IfIndexInterfaceKey(ifindex)).setIfIndex(ifindex).setInterfaceName(interfaceName); + return builder.build(); + } public static NodeConnector buildNodeConnector(NodeConnectorId ncId) { NodeConnectorBuilder ncBuilder = new NodeConnectorBuilder() @@ -135,6 +152,15 @@ public class InterfaceManagerTestUtil { return ncBuilder.build(); } + public static NodeConnector buildFlowCapableNodeConnector(NodeConnectorId ncId) { + NodeConnectorBuilder ncBuilder = new NodeConnectorBuilder() + .setId(ncId) + .setKey(new NodeConnectorKey(ncId)); + FlowCapableNodeConnectorBuilder flowCapableNodeConnectorBuilder = new FlowCapableNodeConnectorBuilder().setHardwareAddress(MacAddress.getDefaultInstance("AA:AA:AA:AA:AA:AA")); + ncBuilder.addAugmentation(FlowCapableNodeConnector.class,flowCapableNodeConnectorBuilder.build()); + return ncBuilder.build(); + } + public static NodeConnectorId buildNodeConnectorId(BigInteger dpn, long portNo) { return new NodeConnectorId(buildNodeConnectorString(dpn, portNo)); } diff --git a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/StateInterfaceTest.java b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/StateInterfaceTest.java new file mode 100644 index 00000000..ad68fc05 --- /dev/null +++ b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/StateInterfaceTest.java @@ -0,0 +1,161 @@ +/* + * 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.interfacemgr.test; + +import com.google.common.base.Optional; +import com.google.common.util.concurrent.Futures; +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.vpnservice.interfacemgr.IfmConstants; +import org.opendaylight.vpnservice.interfacemgr.IfmUtil; +import org.opendaylight.vpnservice.interfacemgr.commons.InterfaceManagerCommonUtils; +import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.statehelpers.OvsInterfaceStateAddHelper; +import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.statehelpers.OvsInterfaceStateRemoveHelper; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.*; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.IfIndexesInterfaceMap; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._if.indexes._interface.map.IfIndexInterface; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._if.indexes._interface.map.IfIndexInterfaceKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.BridgeEntry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.TunnelTypeGre; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.common.RpcResultBuilder; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Future; + +import static org.mockito.Mockito.*; + + + +@RunWith(MockitoJUnitRunner.class) +public class StateInterfaceTest { + BigInteger dpId = BigInteger.valueOf(1); + NodeConnectorId nodeConnectorId = null; + NodeConnector nodeConnector = null; + FlowCapableNodeConnector fcNodeConnectorNew = null; + Interface interfaceEnabled = null; + Interface interfaceDisabled = null; + IfIndexInterface IfindexInterface = null; + InstanceIdentifier bridgeEntryIid = null; + InstanceIdentifier interfaceInstanceIdentifier = null; + InstanceIdentifier fcNodeConnectorId = null; + InstanceIdentifier ifIndexId =null; + InstanceIdentifier interfaceStateIdentifier = null; + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface stateInterface; + + @Mock DataBroker dataBroker; + @Mock IdManagerService idManager; + @Mock ListenerRegistration dataChangeListenerRegistration; + @Mock ReadOnlyTransaction mockReadTx; + @Mock WriteTransaction mockWriteTx; + + OvsInterfaceStateAddHelper addHelper; + OvsInterfaceStateRemoveHelper removeHelper; + + @Before + public void setUp() throws Exception { + when(dataBroker.registerDataChangeListener( + any(LogicalDatastoreType.class), + any(InstanceIdentifier.class), + any(DataChangeListener.class), + any(DataChangeScope.class))) + .thenReturn(dataChangeListenerRegistration); + setupMocks(); + } + + private void setupMocks() { + nodeConnectorId = InterfaceManagerTestUtil.buildNodeConnectorId(BigInteger.valueOf(1), 2); + nodeConnector = InterfaceManagerTestUtil.buildFlowCapableNodeConnector(nodeConnectorId); + fcNodeConnectorNew = nodeConnector.getAugmentation(FlowCapableNodeConnector.class); + fcNodeConnectorId = InterfaceManagerTestUtil.getFlowCapableNodeConnectorIdentifier("openflow:1", nodeConnectorId); + IfindexInterface = InterfaceManagerTestUtil.buildIfIndexInterface(100,InterfaceManagerTestUtil.interfaceName); + ifIndexId = InstanceIdentifier.builder(IfIndexesInterfaceMap.class).child(IfIndexInterface.class, new IfIndexInterfaceKey(100)).build(); + interfaceInstanceIdentifier = InterfaceManagerCommonUtils.getInterfaceIdentifier(new InterfaceKey(InterfaceManagerTestUtil.interfaceName)); + interfaceStateIdentifier = IfmUtil.buildStateInterfaceId(InterfaceManagerTestUtil.interfaceName); + interfaceEnabled = InterfaceManagerTestUtil.buildTunnelInterface(dpId, InterfaceManagerTestUtil.interfaceName, "Test Interface1", true, TunnelTypeGre.class + , "192.168.56.101", "192.168.56.102"); + interfaceDisabled = InterfaceManagerTestUtil.buildTunnelInterface(dpId, InterfaceManagerTestUtil.interfaceName, "Test Interface1", false, TunnelTypeGre.class + , "192.168.56.101", "192.168.56.102"); + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder ifaceBuilder = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder(); + List lowerLayerIfList = new ArrayList<>(); + lowerLayerIfList.add(nodeConnectorId.getValue()); + ifaceBuilder.setOperStatus(OperStatus.Up).setAdminStatus(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.AdminStatus.Up) + .setPhysAddress(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress.getDefaultInstance("AA:AA:AA:AA:AA:AA")) + .setIfIndex(100) + .setLowerLayerIf(lowerLayerIfList); + ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(InterfaceManagerTestUtil.interfaceName)); + stateInterface = ifaceBuilder.build(); + when(dataBroker.newReadOnlyTransaction()).thenReturn(mockReadTx); + when(dataBroker.newWriteOnlyTransaction()).thenReturn(mockWriteTx); + } + + @Test + public void testAddStateInterface() { + Optional expectedInterface = Optional.of(interfaceEnabled); + AllocateIdOutput expectedId = new AllocateIdOutputBuilder().setIdValue(Long.valueOf("100")).build(); + + Future> idOutputOptional = RpcResultBuilder.success(expectedId).buildFuture(); + + doReturn(Futures.immediateCheckedFuture(expectedInterface)).when(mockReadTx).read( + LogicalDatastoreType.CONFIGURATION, interfaceInstanceIdentifier); + AllocateIdInput getIdInput = new AllocateIdInputBuilder() + .setPoolName(IfmConstants.IFM_IDPOOL_NAME) + .setIdKey(InterfaceManagerTestUtil.interfaceName).build(); + doReturn(idOutputOptional).when(idManager).allocateId(getIdInput); + + addHelper.addState(dataBroker, idManager, nodeConnectorId, InterfaceManagerTestUtil.interfaceName, fcNodeConnectorNew); + + //Add some verifications + verify(mockWriteTx).put(LogicalDatastoreType.OPERATIONAL, interfaceStateIdentifier, + stateInterface,true); + } + @Test + public void testDeleteStateInterface() { + Optional + expectedStateInterface = Optional.of(stateInterface); + Optional expectedIfindexInterface = Optional.of(IfindexInterface); + doReturn(Futures.immediateCheckedFuture(expectedIfindexInterface)).when(mockReadTx).read( + LogicalDatastoreType.OPERATIONAL, ifIndexId); + doReturn(Futures.immediateCheckedFuture(expectedStateInterface)).when(mockReadTx).read( + LogicalDatastoreType.OPERATIONAL, interfaceStateIdentifier); + doReturn(Futures.immediateCheckedFuture(Optional.absent())).when(mockReadTx).read( + LogicalDatastoreType.CONFIGURATION, interfaceInstanceIdentifier); + + ReleaseIdInput getIdInput = new ReleaseIdInputBuilder() + .setPoolName(IfmConstants.IFM_IDPOOL_NAME) + .setIdKey(InterfaceManagerTestUtil.interfaceName).build(); + + doReturn(Futures.immediateFuture(RpcResultBuilder.success().build())).when(idManager).releaseId(getIdInput); + + removeHelper.removeState(idManager, fcNodeConnectorId, dataBroker, InterfaceManagerTestUtil.interfaceName, fcNodeConnectorNew); + + verify(mockWriteTx).delete(LogicalDatastoreType.OPERATIONAL, interfaceStateIdentifier); + verify(mockWriteTx).delete(LogicalDatastoreType.OPERATIONAL, ifIndexId); + + } +} \ No newline at end of file diff --git a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/TunnelInterfaceConfigurationTest.java b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/TunnelInterfaceConfigurationTest.java index 9ffd0e56..fc57cdd7 100644 --- a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/TunnelInterfaceConfigurationTest.java +++ b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/TunnelInterfaceConfigurationTest.java @@ -21,7 +21,6 @@ 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.interfacemgr.IfmUtil; import org.opendaylight.vpnservice.interfacemgr.commons.InterfaceMetaUtils; import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.confighelpers.OvsInterfaceConfigAddHelper; @@ -221,6 +220,27 @@ public class TunnelInterfaceConfigurationTest { ifaceBuilder.setOperStatus(OperStatus.Down); ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(stateInterface.getName())); + verify(mockWriteTx).merge(LogicalDatastoreType.OPERATIONAL, interfaceStateIdentifier, + ifaceBuilder.build()); + } + @Test + public void testEnableAdminStateForGreInterface() { + Optional + expectedStateInterface = Optional.of(stateInterface); + OptionalexpectedNodeConnector = Optional.of(nodeConnector); + + doReturn(Futures.immediateCheckedFuture(expectedNodeConnector)).when(mockReadTx).read( + LogicalDatastoreType.OPERATIONAL, nodeConnectorInstanceIdentifier); + doReturn(Futures.immediateCheckedFuture(expectedStateInterface)).when(mockReadTx).read( + LogicalDatastoreType.OPERATIONAL, interfaceStateIdentifier); + + updateHelper.updateConfiguration(dataBroker,idManager,tunnelInterfaceEnabled,tunnelInterfaceDisabled); + + //verify whether operational data store is updated with the new oper state. + InterfaceBuilder ifaceBuilder = new InterfaceBuilder(); + ifaceBuilder.setOperStatus(OperStatus.Down); + ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(stateInterface.getName())); + verify(mockWriteTx).merge(LogicalDatastoreType.OPERATIONAL, interfaceStateIdentifier, ifaceBuilder.build()); } -- 2.36.6