Bug 3696 - UT GBP - 7 - neutron/ovsdb 87/24787/4
authorKinsey Nietzsche <knietzsc@cisco.com>
Fri, 31 Jul 2015 12:04:35 +0000 (14:04 +0200)
committerMartin Sunal <msunal@cisco.com>
Wed, 19 Aug 2015 12:06:05 +0000 (12:06 +0000)
- TerminationPointDataChangeListener(75%)
- NodeDataChangeListener(92.7%)
- NeutronOvsdb(90.3%)

Change-Id: I432830cefad5eae3e116e07fe2b7c7094efdce96
Signed-off-by: Kinsey Nietzsche <knietzsc@cisco.com>
neutron-ovsdb/src/test/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/NeutronOvsdbTest.java [new file with mode: 0644]
neutron-ovsdb/src/test/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/NodeDataChangeListenerTest.java [new file with mode: 0644]
neutron-ovsdb/src/test/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/TerminationPointDataChangeListenerTest.java [new file with mode: 0644]

diff --git a/neutron-ovsdb/src/test/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/NeutronOvsdbTest.java b/neutron-ovsdb/src/test/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/NeutronOvsdbTest.java
new file mode 100644 (file)
index 0000000..2a5581e
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2015 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.groupbasedpolicy.neutron.ovsdb;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.EndpointService;
+import org.osgi.framework.BundleContext;
+
+public class NeutronOvsdbTest {
+
+    private NeutronOvsdb neutronOvsdb;
+
+    private DataBroker dataProvider;
+    private RpcProviderRegistry rpcProvider;
+    private BundleContext context;
+
+    @Before
+    public void initialise() {
+        dataProvider = mock(DataBroker.class);
+        rpcProvider = mock(RpcProviderRegistry.class);
+        context = mock(BundleContext.class);
+
+        EndpointService epService = mock(EndpointService.class);
+        when(rpcProvider.getRpcService(EndpointService.class)).thenReturn(epService);
+
+        neutronOvsdb = new NeutronOvsdb(dataProvider, rpcProvider, context);
+    }
+
+    @Test
+    public void closeTest() throws Exception {
+        neutronOvsdb.close();
+    }
+
+}
diff --git a/neutron-ovsdb/src/test/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/NodeDataChangeListenerTest.java b/neutron-ovsdb/src/test/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/NodeDataChangeListenerTest.java
new file mode 100644 (file)
index 0000000..d3468a2
--- /dev/null
@@ -0,0 +1,172 @@
+/*
+ * Copyright (c) 2015 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.groupbasedpolicy.neutron.ovsdb;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+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.ReadWriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.nodes.node.ExternalInterfaces;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.DatapathId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ManagedNodeEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.OpenvswitchOtherConfigs;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.CheckedFuture;
+
+public class NodeDataChangeListenerTest {
+
+    private NodeDataChangeListener listener;
+
+    private DataBroker dataBroker;
+    private ListenerRegistration<DataChangeListener> registration;
+    private Map<InstanceIdentifier<?>, DataObject> dataMap;
+    private Set<InstanceIdentifier<?>> dataSet;
+    private AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change;
+    private InstanceIdentifier<OvsdbNodeAugmentation> identifier;
+    private OvsdbNodeAugmentation dataObject;
+    private ReadOnlyTransaction readOnlyTransaction;
+    private ReadWriteTransaction readWriteTransaction;
+
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    @Before
+    public void initialise() throws Exception {
+        dataBroker = mock(DataBroker.class);
+        registration = mock(ListenerRegistration.class);
+        when(
+                dataBroker.registerDataChangeListener(any(LogicalDatastoreType.class), any(InstanceIdentifier.class),
+                        any(DataChangeListener.class), any(DataChangeScope.class))).thenReturn(registration);
+
+        TopologyId topologyId = mock(TopologyId.class);
+        identifier = InstanceIdentifier.create(NetworkTopology.class)
+            .child(Topology.class, new TopologyKey(topologyId))
+            .child(Node.class)
+            .augmentation(OvsdbNodeAugmentation.class);
+
+        dataObject = mock(OvsdbNodeAugmentation.class);
+        ManagedNodeEntry managedNode = mock(ManagedNodeEntry.class);
+        when((dataObject).getManagedNodeEntry()).thenReturn(Arrays.asList(managedNode));
+        OvsdbBridgeRef bridgeRef = mock(OvsdbBridgeRef.class);
+        when(managedNode.getBridgeRef()).thenReturn(bridgeRef);
+        when(bridgeRef.getValue()).thenReturn((InstanceIdentifier) identifier);
+
+        dataMap = new HashMap<InstanceIdentifier<?>, DataObject>();
+        dataMap.put(identifier, dataObject);
+        dataSet = new HashSet<InstanceIdentifier<?>>(Arrays.asList(identifier));
+
+        OpenvswitchOtherConfigs config = mock(OpenvswitchOtherConfigs.class);
+        when((dataObject).getOpenvswitchOtherConfigs()).thenReturn(Arrays.asList(config));
+        when(config.getOtherConfigKey()).thenReturn("provider_mappings");
+        when(config.getOtherConfigValue()).thenReturn("otherConfig:Value");
+
+        readOnlyTransaction = mock(ReadOnlyTransaction.class);
+        when(dataBroker.newReadOnlyTransaction()).thenReturn(readOnlyTransaction);
+        CheckedFuture<Optional<?>, ReadFailedException> readOnlyFuture = mock(CheckedFuture.class);
+        when(readOnlyTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
+                readOnlyFuture);
+        Optional<Node> readOnlyOptional = mock(Optional.class);
+        when(readOnlyFuture.checkedGet()).thenReturn((Optional) readOnlyOptional);
+        when(readOnlyOptional.isPresent()).thenReturn(true);
+        Node node = mock(Node.class);
+        when(readOnlyOptional.get()).thenReturn(node);
+
+        OvsdbBridgeAugmentation ovsdbBridge = mock(OvsdbBridgeAugmentation.class);
+        when(node.getAugmentation(OvsdbBridgeAugmentation.class)).thenReturn(ovsdbBridge);
+        TerminationPoint terminationPoint = mock(TerminationPoint.class);
+        when(node.getTerminationPoint()).thenReturn(Arrays.asList(terminationPoint));
+        OvsdbTerminationPointAugmentation tpAug = mock(OvsdbTerminationPointAugmentation.class);
+        when(terminationPoint.getAugmentation(OvsdbTerminationPointAugmentation.class)).thenReturn(tpAug);
+        when(tpAug.getName()).thenReturn("Value");
+        when(tpAug.getOfport()).thenReturn(5L);
+        DatapathId datapathId = mock(DatapathId.class);
+        when(ovsdbBridge.getDatapathId()).thenReturn(datapathId);
+        when(datapathId.getValue()).thenReturn("FF:FF:FF:FF:FF:FF:FF:FF");
+
+        change = mock(AsyncDataChangeEvent.class);
+
+        readWriteTransaction = mock(ReadWriteTransaction.class);
+        when(dataBroker.newReadWriteTransaction()).thenReturn(readWriteTransaction);
+        CheckedFuture<Void, TransactionCommitFailedException> readWriteFuture = mock(CheckedFuture.class);
+        when(readWriteTransaction.submit()).thenReturn(readWriteFuture);
+        // ExternalInterfaces
+        CheckedFuture<Optional<Node>, ReadFailedException> deleteFuture = mock(CheckedFuture.class);
+        when(readWriteTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
+                deleteFuture);
+        Optional<Node> deleteOptional = mock(Optional.class);
+        when(deleteFuture.checkedGet()).thenReturn(deleteOptional);
+        when(deleteOptional.isPresent()).thenReturn(true);
+
+        listener = new NodeDataChangeListener(dataBroker);
+    }
+
+    @Test
+    public void constructorTest() throws Exception {
+        listener.close();
+        verify(registration).close();
+    }
+
+    @Test
+    public void onDataChangeTestCreations() {
+        when(change.getCreatedData()).thenReturn(dataMap);
+        listener.onDataChanged(change);
+        Assert.assertTrue(NodeDataChangeListener.nodeIdByExtInterface.containsKey(identifier));
+    }
+
+    @Test
+    public void onDataChangeTestUpdates() {
+        InstanceIdentifier<ExternalInterfaces> eiIdentifier = InstanceIdentifier.create(ExternalInterfaces.class);;
+        NodeDataChangeListener.nodeIdByExtInterface.put(identifier, eiIdentifier);
+        when(change.getUpdatedData()).thenReturn(dataMap);
+        when((dataObject).getOpenvswitchOtherConfigs()).thenReturn(null);
+        listener.onDataChanged(change);
+        Assert.assertFalse(NodeDataChangeListener.nodeIdByExtInterface.containsKey(identifier));
+    }
+
+    @Test
+    public void onDataChangeTestRemove() {
+        InstanceIdentifier<ExternalInterfaces> eiIdentifier = InstanceIdentifier.create(ExternalInterfaces.class);;
+        NodeDataChangeListener.nodeIdByExtInterface.put(identifier, eiIdentifier);
+        when(change.getRemovedPaths()).thenReturn(dataSet);
+        listener.onDataChanged(change);
+        Assert.assertFalse(NodeDataChangeListener.nodeIdByExtInterface.containsKey(identifier));
+    }
+
+}
diff --git a/neutron-ovsdb/src/test/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/TerminationPointDataChangeListenerTest.java b/neutron-ovsdb/src/test/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/TerminationPointDataChangeListenerTest.java
new file mode 100644 (file)
index 0000000..d33d8af
--- /dev/null
@@ -0,0 +1,240 @@
+/*
+ * Copyright (c) 2015 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.groupbasedpolicy.neutron.ovsdb;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+
+import org.junit.Before;
+import org.junit.Test;
+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.ReadWriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.ovsdb.southbound.SouthboundConstants;
+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.groupbasedpolicy.common.rev140421.L2BridgeDomainId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.EndpointService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.ports.EndpointByPort;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContext;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayNodeConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.DatapathId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeName;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.InterfaceExternalIds;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.CheckedFuture;
+
+public class TerminationPointDataChangeListenerTest {
+
+    private TerminationPointDataChangeListener listener;
+
+    private DataBroker dataBroker;
+    private EndpointService epService;
+    private ListenerRegistration<DataChangeListener> registration;
+    private AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change;
+
+    private Map<InstanceIdentifier<?>, DataObject> dataMap;
+    private Set<InstanceIdentifier<?>> dataSet;
+    private Node node;
+
+    private CheckedFuture<Optional<OvsdbBridgeAugmentation>, ReadFailedException> ovsdbBridgeFuture;
+    private CheckedFuture<Optional<Node>, ReadFailedException> nodeFuture;
+    private CheckedFuture<Optional<EndpointByPort>, ReadFailedException> endpointByPortFuture;
+    private CheckedFuture<Optional<Endpoint>, ReadFailedException> endpointFuture;
+    private CheckedFuture<Optional<OfOverlayNodeConfig>, ReadFailedException> ofOverlayNodeConfigFuture;
+    private ReadOnlyTransaction readTransaction;
+    private ReadWriteTransaction readWriteTransaction;
+
+    private OvsdbTerminationPointAugmentation ovsdbTp;
+
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    @Before
+    public void initialise() throws Exception {
+        dataBroker = mock(DataBroker.class);
+        epService = mock(EndpointService.class);
+        registration = mock(ListenerRegistration.class);
+        when(
+                dataBroker.registerDataChangeListener(any(LogicalDatastoreType.class), any(InstanceIdentifier.class),
+                        any(DataChangeListener.class), any(DataChangeScope.class))).thenReturn(registration);
+        change = mock(AsyncDataChangeEvent.class);
+
+        InstanceIdentifier<OvsdbTerminationPointAugmentation> ovsdbTpIid = InstanceIdentifier.create(
+                NetworkTopology.class)
+            .child(Topology.class, new TopologyKey(SouthboundConstants.OVSDB_TOPOLOGY_ID))
+            .child(Node.class)
+            .child(TerminationPoint.class)
+            .augmentation(OvsdbTerminationPointAugmentation.class);
+        ovsdbTp = mock(OvsdbTerminationPointAugmentation.class);
+        when(ovsdbTp.getInterfaceType()).thenReturn((Class) Object.class);
+        InterfaceExternalIds externalId = mock(InterfaceExternalIds.class);
+        when(ovsdbTp.getInterfaceExternalIds()).thenReturn(Arrays.asList(externalId));
+        when(externalId.getExternalIdKey()).thenReturn("iface-id");
+        when(externalId.getExternalIdValue()).thenReturn(UUID.randomUUID().toString());
+
+        dataMap = new HashMap<InstanceIdentifier<?>, DataObject>();
+        dataMap.put(ovsdbTpIid, ovsdbTp);
+        dataSet = new HashSet<InstanceIdentifier<?>>(Arrays.asList(ovsdbTpIid));
+
+        readTransaction = mock(ReadOnlyTransaction.class);
+        when(dataBroker.newReadOnlyTransaction()).thenReturn(readTransaction);
+        readWriteTransaction = mock(ReadWriteTransaction.class);
+        when(dataBroker.newReadWriteTransaction()).thenReturn(readWriteTransaction);
+        CheckedFuture<Void, TransactionCommitFailedException> submitFuture = mock(CheckedFuture.class);
+        when(readWriteTransaction.submit()).thenReturn(submitFuture);
+
+        // OvsdbBridgeAugmentation
+        ovsdbBridgeFuture = mock(CheckedFuture.class);
+        Optional<OvsdbBridgeAugmentation> ovsdbOptional = mock(Optional.class);
+        when(ovsdbBridgeFuture.checkedGet()).thenReturn(ovsdbOptional);
+        when(ovsdbOptional.isPresent()).thenReturn(true);
+        OvsdbBridgeAugmentation ovsdbBridge = mock(OvsdbBridgeAugmentation.class);
+        when(ovsdbOptional.get()).thenReturn(ovsdbBridge);
+
+        DatapathId dpid = mock(DatapathId.class);
+        when(ovsdbBridge.getDatapathId()).thenReturn(dpid);
+        when(dpid.getValue()).thenReturn("FF:FF:FF:FF:FF:FF:FF:FF");
+
+        OvsdbBridgeName bridgeName = mock(OvsdbBridgeName.class);
+        when(ovsdbBridge.getBridgeName()).thenReturn(bridgeName);
+        when(bridgeName.getValue()).thenReturn("bridgeName");
+
+        // Node
+        nodeFuture = mock(CheckedFuture.class);
+        Optional<Node> nodeOptional = mock(Optional.class);
+        when(nodeFuture.checkedGet()).thenReturn(nodeOptional);
+        when(nodeOptional.isPresent()).thenReturn(true);
+        node = mock(Node.class);
+        when(nodeOptional.get()).thenReturn(node);
+        OvsdbNodeAugmentation ovsdbNode = mock(OvsdbNodeAugmentation.class);
+        when(node.getAugmentation(OvsdbNodeAugmentation.class)).thenReturn(ovsdbNode);
+
+        // EndpointByPort
+        endpointByPortFuture = mock(CheckedFuture.class);
+        Optional<EndpointByPort> endpointByPortOptional = mock(Optional.class);
+        when(endpointByPortFuture.checkedGet()).thenReturn(endpointByPortOptional);
+        when(endpointByPortOptional.isPresent()).thenReturn(true);
+        EndpointByPort endpointByPort = mock(EndpointByPort.class);
+        when(endpointByPortOptional.get()).thenReturn(endpointByPort);
+        L2BridgeDomainId l2BridgeDomainId = mock(L2BridgeDomainId.class);
+        MacAddress macAddress = mock(MacAddress.class);
+        when(endpointByPort.getL2Context()).thenReturn(l2BridgeDomainId);
+        when(endpointByPort.getMacAddress()).thenReturn(macAddress);
+
+        // Endpoint
+        endpointFuture = mock(CheckedFuture.class);
+        Optional<Endpoint> endpointOptional = mock(Optional.class);
+        when(endpointFuture.checkedGet()).thenReturn(endpointOptional);
+        when(endpointOptional.isPresent()).thenReturn(true);
+        Endpoint endpoint = mock(Endpoint.class);
+        when(endpointOptional.get()).thenReturn(endpoint);
+        OfOverlayContext ofc = mock(OfOverlayContext.class);
+        when(endpoint.getAugmentation(OfOverlayContext.class)).thenReturn(ofc);
+
+        // OfOverlayNodeConfig
+        ofOverlayNodeConfigFuture = mock(CheckedFuture.class);
+        Optional<OfOverlayNodeConfig> ofOverlayNodeConfigOptional = mock(Optional.class);
+        when(ofOverlayNodeConfigFuture.checkedGet()).thenReturn(ofOverlayNodeConfigOptional);
+        when(ofOverlayNodeConfigOptional.isPresent()).thenReturn(true);
+        OfOverlayNodeConfig ofOverlayNodeConfig = mock(OfOverlayNodeConfig.class);
+        when(ofOverlayNodeConfigOptional.get()).thenReturn(ofOverlayNodeConfig);
+
+        listener = new TerminationPointDataChangeListener(dataBroker, epService);
+    }
+
+    @Test
+    public void constructorTest() throws Exception {
+        listener.close();
+        verify(registration).close();
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void onDataChangedTestCreation() {
+        when(change.getCreatedData()).thenReturn(dataMap);
+        when(readTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
+                ovsdbBridgeFuture)
+            .thenReturn(endpointFuture)
+            .thenReturn(nodeFuture);
+
+        when(readWriteTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
+                endpointByPortFuture).thenReturn(ofOverlayNodeConfigFuture);
+
+        listener.onDataChanged(change);
+        verify(readWriteTransaction).submit();
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void onDataChangedTestCreationExternalIdNull() {
+        when(change.getCreatedData()).thenReturn(dataMap);
+        when(readTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
+                ovsdbBridgeFuture).thenReturn(nodeFuture);
+        when(ovsdbTp.getInterfaceExternalIds()).thenReturn(null);
+
+        listener.onDataChanged(change);
+        verify(readWriteTransaction, never()).submit();
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void onDataChangedTestUpdate() {
+        when(change.getUpdatedData()).thenReturn(dataMap);
+        when(readTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
+                ovsdbBridgeFuture)
+            .thenReturn(endpointFuture)
+            .thenReturn(nodeFuture);
+        when(readWriteTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
+                endpointByPortFuture).thenReturn(ofOverlayNodeConfigFuture);
+
+        listener.onDataChanged(change);
+        verify(readWriteTransaction).submit();
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void onDataChangedTestRemoval() {
+        when(change.getRemovedPaths()).thenReturn(dataSet);
+        when(change.getOriginalData()).thenReturn(dataMap);
+        when(readWriteTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
+                endpointByPortFuture);
+        when(readTransaction.read(any(LogicalDatastoreType.class), any(InstanceIdentifier.class))).thenReturn(
+                endpointFuture);
+
+        listener.onDataChanged(change);
+        verify(readWriteTransaction).submit();
+    }
+}