/* * 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.sxp.controller.util.io; import com.google.common.util.concurrent.AbstractCheckedFuture; import java.util.ArrayList; import java.util.List; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.opendaylight.controller.config.yang.sxp.controller.conf.ConnectionTimers; import org.opendaylight.controller.config.yang.sxp.controller.conf.Security; import org.opendaylight.controller.config.yang.sxp.controller.conf.SxpController; import org.opendaylight.controller.config.yang.sxp.controller.conf.SxpNode; import org.opendaylight.controller.config.yang.sxp.controller.conf.Timers; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.sxp.controller.core.DatastoreAccess; import org.opendaylight.sxp.core.Configuration; 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.IpPrefix; 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.Ipv4Prefix; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix; 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.sxp.database.rev160308.Sgt; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.configuration.MasterDatabaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.configuration.fields.Binding; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.master.database.configuration.fields.BindingBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.SxpNodeIdentity; 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.ConnectionsBuilder; 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.node.rev160308.sxp.connections.fields.connections.ConnectionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.node.rev160308.sxp.databases.fields.MasterDatabase; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.protocol.rev141002.ConnectionMode; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.protocol.rev141002.NodeId; import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.protocol.rev141002.Version; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.RETURNS_MOCKS; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @RunWith(PowerMockRunner.class) @PrepareForTest({DatastoreAccess.class, org.opendaylight.sxp.core.SxpNode.class, org.opendaylight.sxp.util.inet.Search.class, Configuration.class}) public class ConfigLoaderTest { @Rule public ExpectedException exception = ExpectedException.none(); private static DatastoreAccess access; private ConfigLoader configLoader; @Before public void init() throws Exception { access = PowerMockito.mock(DatastoreAccess.class); PowerMockito.when( access.put(any(InstanceIdentifier.class), any(SxpNodeIdentity.class), any(LogicalDatastoreType.class))) .thenReturn(mock(AbstractCheckedFuture.class)); PowerMockito.when(access.checkAndPut(any(InstanceIdentifier.class), any(SxpNodeIdentity.class), any(LogicalDatastoreType.class), anyBoolean())).thenReturn(true); PowerMockito.mockStatic(org.opendaylight.sxp.core.SxpNode.class, RETURNS_MOCKS); PowerMockito.mockStatic(org.opendaylight.sxp.util.inet.Search.class); configLoader = new ConfigLoader(access); } @Test public void testInitTopologyNode() throws Exception { assertTrue(ConfigLoader.initTopologyNode("0.0.0.0", LogicalDatastoreType.OPERATIONAL, access)); assertTrue(ConfigLoader.initTopologyNode("0.0.0.0", LogicalDatastoreType.CONFIGURATION, access)); } private org.opendaylight.controller.config.yang.sxp.controller.conf.Connection getConnection(Version version, ConnectionMode mode) { org.opendaylight.controller.config.yang.sxp.controller.conf.Connection connection = new org.opendaylight.controller.config.yang.sxp.controller.conf.Connection(); connection.setVersion(version); connection.setMode(mode); connection.setPeerAddress(new IpAddress("1.1.1.1".toCharArray())); connection.setTcpPort(PortNumber.getDefaultInstance("60000")); connection.setConnectionTimers(new ConnectionTimers()); return connection; } private org.opendaylight.controller.config.yang.sxp.controller.conf.Binding getBinding(Integer sgt, String... strings) { org.opendaylight.controller.config.yang.sxp.controller.conf.Binding binding = new org.opendaylight.controller.config.yang.sxp.controller.conf.Binding(); if (sgt != null) { binding.setSgt(new Sgt(sgt)); } if (strings != null) { List<IpPrefix> ipPrefixes = new ArrayList<>(); for (String s : strings) { if (s.contains(":")) { ipPrefixes.add(new IpPrefix(Ipv6Prefix.getDefaultInstance(s))); } else { ipPrefixes.add(new IpPrefix(Ipv4Prefix.getDefaultInstance(s))); } } binding.setIpPrefix(ipPrefixes); } return binding; } private SxpNode getNode(String nodeId) { SxpNode node = new SxpNode(); node.setNodeId(nodeId == null ? null : new NodeId(nodeId)); node.setSecurity(new Security()); node.getSecurity().setPassword("pass"); node.setEnabled(true); node.setDescription("Desc"); node.setTcpPort(new PortNumber(64999)); node.setSourceIp(new IpAddress(new Ipv4Address("127.0.0.1"))); node.setConnections(new org.opendaylight.controller.config.yang.sxp.controller.conf.Connections()); node.getConnections().setConnection(new ArrayList<>()); node.getConnections().getConnection().add(getConnection(Version.Version4, ConnectionMode.Speaker)); node.getConnections().getConnection().add(getConnection(Version.Version4, ConnectionMode.Listener)); node.setMasterDatabase(new org.opendaylight.controller.config.yang.sxp.controller.conf.MasterDatabase()); node.getMasterDatabase().setBinding(new ArrayList<>()); node.getMasterDatabase().getBinding().add(getBinding(150, "1.1.1.1/32", "2.2.2.2/32")); node.getMasterDatabase().getBinding().add(getBinding(1500, "10.10.10.10/32", "20.20.20.20/32")); node.setTimers(new Timers()); return node; } @Test public void testLoad() throws Exception { configLoader.load(null); verify(access, never()).checkAndPut(any(InstanceIdentifier.class), any(DataObject.class), eq(LogicalDatastoreType.CONFIGURATION), anyBoolean()); SxpController controller = new SxpController(); configLoader.load(controller); verify(access, never()).checkAndPut(any(InstanceIdentifier.class), any(DataObject.class), eq(LogicalDatastoreType.CONFIGURATION), anyBoolean()); controller.setSxpNode(new ArrayList<>()); configLoader.load(controller); verify(access, never()).checkAndPut(any(InstanceIdentifier.class), any(DataObject.class), eq(LogicalDatastoreType.CONFIGURATION), anyBoolean()); controller.getSxpNode().add(getNode(null)); controller.getSxpNode().add(getNode("0.0.0.0")); controller.getSxpNode().add(getNode("1.1.1.1")); configLoader.load(controller); verify(access, times(6)).checkAndPut(any(InstanceIdentifier.class), any(DataObject.class), eq(LogicalDatastoreType.CONFIGURATION), anyBoolean()); } @Test public void testParseMasterDatabase() throws Exception { MasterDatabase masterDatabase = ConfigLoader.parseMasterDatabase(null); assertNotNull(masterDatabase); assertNotNull(masterDatabase.getMasterDatabaseBinding()); assertTrue(masterDatabase.getMasterDatabaseBinding().isEmpty()); masterDatabase = ConfigLoader.parseMasterDatabase(new MasterDatabaseBuilder().build()); assertNotNull(masterDatabase); assertNotNull(masterDatabase.getMasterDatabaseBinding()); assertTrue(masterDatabase.getMasterDatabaseBinding().isEmpty()); List<Binding> bindings = new ArrayList<>(); List<IpPrefix> prefixList = new ArrayList<>(); prefixList.add(new IpPrefix("5.5.5.5/32".toCharArray())); prefixList.add(new IpPrefix("50.50.50.50/32".toCharArray())); bindings.add(new BindingBuilder().setSgt(new Sgt(25)).setIpPrefix(prefixList).build()); masterDatabase = ConfigLoader.parseMasterDatabase(new MasterDatabaseBuilder().setBinding(bindings).build()); assertNotNull(masterDatabase); assertNotNull(masterDatabase.getMasterDatabaseBinding()); assertEquals(2, masterDatabase.getMasterDatabaseBinding().size()); } @Test public void testParseConnections() throws Exception { Connections connections = ConfigLoader.parseConnections(null); assertNotNull(connections); assertNotNull(connections.getConnection()); assertTrue(connections.getConnection().isEmpty()); connections = ConfigLoader.parseConnections(new ConnectionsBuilder().build()); assertNotNull(connections); assertNotNull(connections.getConnection()); assertTrue(connections.getConnection().isEmpty()); List<Connection> connectionList = new ArrayList<>(); connectionList.add(new ConnectionBuilder().build()); connectionList.add(new ConnectionBuilder().build()); connections = ConfigLoader.parseConnections(new ConnectionsBuilder().setConnection(connectionList).build()); assertNotNull(connections); assertNotNull(connections.getConnection()); assertEquals(2, connections.getConnection().size()); } }