/*
* 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.sxp.route.util;
import com.google.common.collect.Lists;
import com.google.common.net.InetAddresses;
import java.net.InetAddress;
import java.util.Collection;
import java.util.Collections;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import org.opendaylight.sxp.core.SxpNode;
import org.opendaylight.sxp.core.threading.ThreadsWorker;
import org.opendaylight.sxp.route.spi.Routing;
import org.opendaylight.sxp.util.database.spi.MasterDatabaseInf;
import org.opendaylight.sxp.util.database.spi.SxpDatabaseInf;
import org.opendaylight.sxp.util.time.TimeConv;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.cluster.route.rev161212.sxp.cluster.route.RoutingDefinition;
import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.cluster.route.rev161212.sxp.cluster.route.RoutingDefinitionBuilder;
/**
* Test for {@link RouteUtil}.
*/
@RunWith(MockitoJUnitRunner.class)
public class RouteUtilTest {
private static final String DUMMY_ADDRESS_IPV4 = "1.2.3.4";
private static final String DUMMY_NETMASK_IPV4 = "255.254.253.252";
@Rule
public ExpectedException thrown = ExpectedException.none();
@Mock
public ThreadsWorker threadsWorker;
@Mock
private MasterDatabaseInf masterDatabase;
@Mock
private SxpDatabaseInf sxpDatabase;
public static final String DUMMY_IFACE = "iface123";
@Test
public void addressToString_NPE() throws Exception {
thrown.expect(NullPointerException.class);
RouteUtil.addressToString(null);
}
@Test
public void addressToString() throws Exception {
final String actual = RouteUtil.addressToString(new IpAddress(DUMMY_ADDRESS_IPV4.toCharArray()));
Assert.assertEquals(DUMMY_ADDRESS_IPV4, actual);
}
@Test
public void findSxpNodesOnVirtualIp_empty() throws Exception {
final Collection<SxpNode> sxpNodes = Collections.emptyList();
final IpAddress virtualIp = new IpAddress(DUMMY_ADDRESS_IPV4.toCharArray());
final Collection<SxpNode> actual = RouteUtil.findSxpNodesOnVirtualIp(virtualIp, sxpNodes);
Assert.assertEquals(0, actual.size());
}
@Test
public void findSxpNodesOnVirtualIp_not_found() throws Exception {
final Collection<SxpNode> sxpNodes = Collections.singletonList(createSxpNode("5.6.7.8"));
final IpAddress virtualIp = new IpAddress(DUMMY_ADDRESS_IPV4.toCharArray());
final Collection<SxpNode> actual = RouteUtil.findSxpNodesOnVirtualIp(virtualIp, sxpNodes);
Assert.assertEquals(0, actual.size());
}
@Test
public void findSxpNodesOnVirtualIp() throws Exception {
final Collection<SxpNode> sxpNodes = Lists.newArrayList(
createSxpNode("5.6.7.8"),
createSxpNode(DUMMY_ADDRESS_IPV4));
final IpAddress virtualIp = new IpAddress(DUMMY_ADDRESS_IPV4.toCharArray());
final Collection<SxpNode> actual = RouteUtil.findSxpNodesOnVirtualIp(virtualIp, sxpNodes);
Assert.assertEquals(1, actual.size());
Assert.assertEquals("node-name-1.2.3.4", actual.iterator().next().getName());
}
@Test
public void createOperationalRouteDefinition() throws Exception {
final RoutingDefinition routingDefinition = new RoutingDefinitionBuilder()
.setInterface(DUMMY_IFACE)
.setIpAddress(new IpAddress(DUMMY_ADDRESS_IPV4.toCharArray()))
.setNetmask(new IpAddress(DUMMY_NETMASK_IPV4.toCharArray()))
.build();
final long beforeCreated = (System.currentTimeMillis() / 1000) * 1000;
final RoutingDefinition actual = RouteUtil.createOperationalRouteDefinition(
routingDefinition, true, "dummy explanation");
Assert.assertEquals(DUMMY_ADDRESS_IPV4, String.valueOf(actual.getIpAddress().getValue()));
Assert.assertEquals(DUMMY_NETMASK_IPV4, String.valueOf(actual.getNetmask().getValue()));
Assert.assertEquals(DUMMY_IFACE, actual.getInterface());
Assert.assertTrue(actual.isConsistent());
Assert.assertEquals("dummy explanation", actual.getInfo());
Assert.assertTrue(TimeConv.toLong(actual.getTimestamp()) >= beforeCreated);
}
@Test
public void extractRoutingDefinition() throws Exception {
final Routing routingService = Mockito.mock(Routing.class);
Mockito.when(routingService.getInterface()).thenReturn(DUMMY_IFACE);
Mockito.when(routingService.getVirtualIp()).thenReturn(new IpAddress(DUMMY_ADDRESS_IPV4.toCharArray()));
Mockito.when(routingService.getNetmask()).thenReturn(new IpAddress(DUMMY_NETMASK_IPV4.toCharArray()));
final RoutingDefinition actual = RouteUtil.extractRoutingDefinition(routingService);
Assert.assertEquals(DUMMY_ADDRESS_IPV4, String.valueOf(actual.getIpAddress().getValue()));
Assert.assertEquals(DUMMY_NETMASK_IPV4, String.valueOf(actual.getNetmask().getValue()));
Assert.assertEquals(DUMMY_IFACE, actual.getInterface());
}
private SxpNode createSxpNode(final String ipString) {
final InetAddress sourceIp = InetAddresses.forString(ipString);
final SxpNode sxpNode = Mockito.mock(SxpNode.class);
Mockito.when(sxpNode.getSourceIp()).thenReturn(sourceIp);
Mockito.when(sxpNode.getName()).thenReturn("node-name-" + ipString);
return sxpNode;
}
}