Move ip-sgt-distribution-service into sxp-integration
[groupbasedpolicy.git] / sxp-integration / ip-sgt-distribution-service / src / test / java / org / opendaylight / groupbasedpolicy / ip / sgt / distribution / service / impl / SxpCapableNodeListenerTest.java
diff --git a/sxp-integration/ip-sgt-distribution-service/src/test/java/org/opendaylight/groupbasedpolicy/ip/sgt/distribution/service/impl/SxpCapableNodeListenerTest.java b/sxp-integration/ip-sgt-distribution-service/src/test/java/org/opendaylight/groupbasedpolicy/ip/sgt/distribution/service/impl/SxpCapableNodeListenerTest.java
new file mode 100644 (file)
index 0000000..cf745db
--- /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.groupbasedpolicy.ip.sgt.distribution.service.impl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.isA;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableList;
+import com.google.common.util.concurrent.CheckedFuture;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+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.DataTreeIdentifier;
+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.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.groupbasedpolicy.test.CustomDataBrokerTest;
+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.controller.config.ip.sgt.distribution.rev160715.SxpConnectionAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.SxpConnectionAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.sxp.connection.fields.SxpConnection;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.ip.sgt.distribution.rev160715.sxp.connection.fields.SxpConnectionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.SxpNodeIdentity;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.SxpNodeIdentityBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.SxpDomains;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.SxpDomainsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.sxp.domains.SxpDomain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.sxp.domains.SxpDomainBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.network.topology.topology.node.sxp.domains.SxpDomainKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.sxp.connections.fields.Connections;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.sxp.connections.fields.connections.Connection;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.protocol.rev141002.ConnectionMode;
+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.NodeId;
+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.NodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+public class SxpCapableNodeListenerTest extends CustomDataBrokerTest {
+
+    private final String SXP_NODE_ID = "sxp_node";
+    private final String NODE_ID = "node1";
+    private final IpAddress IP_ADDR = new IpAddress(new Ipv4Address("10.0.0.1"));
+    private final String PASSWD = "cisco123";
+    private final String TOPOLOGY_ID = "topology";
+    private final String DOMAIN_ID = TOPOLOGY_ID + "/" + NODE_ID;
+    private final PortNumber SXP_PORT = new PortNumber(64999);
+    private static final String SXP_DOMAIN_NAME = "JUNIT_SXP_DOMAIN_NAME";
+    private DataBroker dataBroker;
+    private SxpCapableNodeListener nodeListener;
+
+    @Override
+    public Collection<Class<?>> getClassesFromModules() {
+        return ImmutableList.of(Topology.class, SxpDomain.class, SxpConnectionAugmentation.class);
+    }
+
+    @Before
+    public void init() throws Exception {
+        dataBroker = getDataBroker();
+        nodeListener = new SxpCapableNodeListener(dataBroker, SXP_NODE_ID);
+    }
+
+    @Test
+    public void testInit() throws Exception {
+        dataBroker = mock(DataBroker.class);
+        nodeListener = new SxpCapableNodeListener(dataBroker, SXP_NODE_ID);
+        DataTreeIdentifier<SxpConnection> iid = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION,
+                InstanceIdentifier.builder(NetworkTopology.class)
+                        .child(Topology.class)
+                        .child(Node.class)
+                        .augmentation(SxpConnectionAugmentation.class)
+                        .child(SxpConnection.class)
+                        .build());
+        verify(dataBroker).registerDataTreeChangeListener(iid, nodeListener);
+    }
+
+    @Test
+    public void testClose() {
+        dataBroker = mock(DataBroker.class);
+        ListenerRegistration<SxpCapableNodeListener> registration = mock(ListenerRegistration.class);
+        when(dataBroker.registerDataTreeChangeListener(any(), isA(SxpCapableNodeListener.class)))
+                .thenReturn(registration);
+        nodeListener = new SxpCapableNodeListener(dataBroker, SXP_NODE_ID);
+        nodeListener.close();
+        verify(registration).close();
+    }
+
+    @Test
+    public void testOnDataTreeChange_createAndDeleteNode() throws Exception {
+        Node sxpNode =
+                new NodeBuilder().setNodeId(new NodeId(SXP_NODE_ID))
+                        .addAugmentation(SxpNodeIdentity.class,
+                                new SxpNodeIdentityBuilder().setSxpDomains(new SxpDomainsBuilder()
+                                        .setSxpDomain(Collections.singletonList(
+                                                new SxpDomainBuilder()
+                                                        .setDomainName(SXP_DOMAIN_NAME)
+                                                        .build()))
+                                        .build()).build())
+                        .build();
+        InstanceIdentifier<Node> sxpNodeIid =
+                InstanceIdentifier.builder(NetworkTopology.class)
+                        .child(Topology.class,
+                                new TopologyKey(new TopologyId(IpSgtDistributionServiceImpl.SXP_TOPOLOGY_ID)))
+                        .child(Node.class, new NodeKey(new NodeId(SXP_NODE_ID)))
+                        .build();
+        WriteTransaction wtx = dataBroker.newWriteOnlyTransaction();
+        wtx.put(LogicalDatastoreType.CONFIGURATION, sxpNodeIid, sxpNode, true);
+        Node node = new NodeBuilder().setNodeId(new NodeId(NODE_ID))
+                .addAugmentation(SxpConnectionAugmentation.class, new SxpConnectionAugmentationBuilder()
+                        .setSxpConnection(new SxpConnectionBuilder().setIpAddress(IP_ADDR).setPassword(PASSWD).build()).build())
+                .build();
+        InstanceIdentifier<Node> nodeIid = InstanceIdentifier.builder(NetworkTopology.class)
+                .child(Topology.class, new TopologyKey(new TopologyId(TOPOLOGY_ID)))
+                .child(Node.class, new NodeKey(new NodeId(NODE_ID)))
+                .build();
+        wtx.put(LogicalDatastoreType.CONFIGURATION, nodeIid, node, true);
+        wtx.submit().get();
+        assertEquals(DOMAIN_ID, nodeListener.getDomainIdForPeer(nodeIid));
+        InstanceIdentifier<SxpDomain> domainIid =
+                InstanceIdentifier.builder(NetworkTopology.class)
+                        .child(Topology.class,
+                                new TopologyKey(new TopologyId(IpSgtDistributionServiceImpl.SXP_TOPOLOGY_ID)))
+                        .child(Node.class, new NodeKey(new NodeId(SXP_NODE_ID)))
+                        .augmentation(SxpNodeIdentity.class)
+                        .child(SxpDomains.class)
+                        .child(SxpDomain.class, new SxpDomainKey(DOMAIN_ID))
+                        .build();
+        ReadOnlyTransaction rtx = dataBroker.newReadOnlyTransaction();
+        CheckedFuture<Optional<SxpDomain>, ReadFailedException> read =
+                rtx.read(LogicalDatastoreType.CONFIGURATION, domainIid);
+        Optional<SxpDomain> optionalDomain = read.get();
+        assertTrue(optionalDomain.isPresent());
+        SxpDomain sxpDomain = optionalDomain.get();
+        Connections connections = sxpDomain.getConnections();
+        assertNotNull(connections);
+        List<Connection> connectionList = connections.getConnection();
+        assertNotNull(connectionList);
+        assertEquals(1, connectionList.size());
+        Connection connection = connectionList.get(0);
+        assertEquals(IP_ADDR, connection.getPeerAddress());
+        assertEquals(PASSWD, connection.getPassword());
+        assertEquals(SXP_PORT, connection.getTcpPort());
+        assertEquals(ConnectionMode.Speaker, connection.getMode());
+
+        wtx = dataBroker.newWriteOnlyTransaction();
+        wtx.delete(LogicalDatastoreType.CONFIGURATION, nodeIid);
+        wtx.submit().get();
+        assertNull(nodeListener.getDomainIdForPeer(nodeIid));
+        rtx = dataBroker.newReadOnlyTransaction();
+        read = rtx.read(LogicalDatastoreType.CONFIGURATION, domainIid);
+        assertFalse(read.get().isPresent());
+    }
+}