package org.opennaas.extensions.genericnetwork.test.model.helpers;
/*
* #%L
* OpenNaaS :: Generic Network
* %%
* Copyright (C) 2007 - 2014 FundaciĆ³ Privada i2CAT, Internet i InnovaciĆ³ a Catalunya
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.Assert;
import org.junit.Test;
import org.opennaas.extensions.genericnetwork.model.circuit.NetworkConnection;
import org.opennaas.extensions.genericnetwork.model.circuit.Route;
import org.opennaas.extensions.genericnetwork.model.helpers.CircuitTopologyHelper;
import org.opennaas.extensions.genericnetwork.model.topology.Domain;
import org.opennaas.extensions.genericnetwork.model.topology.Link;
import org.opennaas.extensions.genericnetwork.model.topology.NetworkElement;
import org.opennaas.extensions.genericnetwork.model.topology.Port;
import org.opennaas.extensions.genericnetwork.model.topology.Switch;
import org.opennaas.extensions.genericnetwork.model.topology.Topology;
/**
* Unit tests for {@link CircuitTopologyHelper}
*
* @author Julio Carlos Barrera
*
*/
public class CircuitTopologyHelperTests {
@Test
public void networkElementNetworkConnectionMapTest() {
// generate map
Map<NetworkElement, NetworkConnection> networkConnectionsMap = CircuitTopologyHelper.networkElementNetworkConnectionMap(generateRoute(),
generateTopology());
Assert.assertEquals("Map must contain 3 elements", 3, networkConnectionsMap.size());
// check D1 - NC1
NetworkElement d1 = generateNetworkElement(Domain.class, "D1", 3);
Assert.assertTrue("Map must contain D1", networkConnectionsMap.containsKey(d1));
NetworkConnection nc1 = generateNetworkConnection("NC1", generatePortFromId("D1P1"), generatePortFromId("D1P3"));
Assert.assertEquals("Map must contain the relation D1 - NC1", nc1, networkConnectionsMap.get(d1));
// check D2 - NC3
NetworkElement d2 = generateNetworkElement(Domain.class, "D2", 3);
Assert.assertTrue("Map must contain D2", networkConnectionsMap.containsKey(d2));
NetworkConnection nc3 = generateNetworkConnection("NC3", generatePortFromId("D2P1"), generatePortFromId("D2P3"));
Assert.assertEquals("Map must contain the relation D2 - NC3", nc3, networkConnectionsMap.get(d2));
// check D3 - NC5
NetworkElement d3 = generateNetworkElement(Domain.class, "D3", 3);
Assert.assertTrue("Map must contain D3", networkConnectionsMap.containsKey(d3));
NetworkConnection nc5 = generateNetworkConnection("NC5", generatePortFromId("D3P1"), generatePortFromId("D3P3"));
Assert.assertEquals("Map must contain the relation D3 - NC5", nc5, networkConnectionsMap.get(d3));
}
@Test
public void getNetworkElementWithPortsTest() {
Set<NetworkElement> networkElements = generateNetworkElements();
NetworkElement ne = CircuitTopologyHelper.getNetworkElementWithPorts(networkElements, generatePortFromId("D1P1"), generatePortFromId("D1P3"));
Assert.assertNotNull("Network Element must not be null", ne);
Assert.assertTrue("NetworkElement must be a Domain", ne instanceof Domain);
Domain domain = (Domain) ne;
Assert.assertEquals("Domain must be D1", "D1", domain.getId());
ne = CircuitTopologyHelper.getNetworkElementWithPorts(networkElements, generatePortFromId("D1P1"), generatePortFromId("D2P1"));
Assert.assertNull("Network Element must be null", ne);
}
/**
* Generates a Route with this NetworkConnection's:<br>
* D1P1 -> D1P3 -> D2P1 -> D2P3 -> D3P1 -> D3P3
*
* @return
*/
public static Route generateRoute() {
Route route = new Route();
route.setId("R1");
List<NetworkConnection> networkConnections = new ArrayList<NetworkConnection>();
networkConnections.add(generateNetworkConnection("NC1", generatePortFromId("D1P1"), generatePortFromId("D1P3")));
networkConnections.add(generateNetworkConnection("NC2", generatePortFromId("D1P3"), generatePortFromId("D2P1")));
networkConnections.add(generateNetworkConnection("NC3", generatePortFromId("D2P1"), generatePortFromId("D2P3")));
networkConnections.add(generateNetworkConnection("NC4", generatePortFromId("D2P3"), generatePortFromId("D3P1")));
networkConnections.add(generateNetworkConnection("NC5", generatePortFromId("D3P1"), generatePortFromId("D3P3")));
route.setNetworkConnections(networkConnections);
return route;
}
private static NetworkConnection generateNetworkConnection(String id, Port srcPort, Port dstPort) {
NetworkConnection networkConnection = new NetworkConnection();
networkConnection.setId(id);
networkConnection.setName(id);
networkConnection.setSource(srcPort);
networkConnection.setDestination(dstPort);
return networkConnection;
}
private static Topology generateTopology() {
Topology topology = new Topology();
topology.setNetworkElements(generateNetworkElements());
topology.setLinks(generateLinks());
return topology;
}
/**
* Generates this Links:<br>
* D1P3 -> D2P1 and D2P3 -> D3P1
*
* @return
*/
private static Set<Link> generateLinks() {
Set<Link> links = new HashSet<Link>();
links.add(generateLink(generatePortFromId("D1P3"), generatePortFromId("D2P1")));
links.add(generateLink(generatePortFromId("D2P3"), generatePortFromId("D3P1")));
return links;
}
private static Link generateLink(Port srcPort, Port dstPort) {
Link link = new Link();
link.setSrcPort(srcPort);
link.setDstPort(dstPort);
return link;
}
/**
* Generates a Set<NetworkElement> with:
*
* <pre>
* {@code
* Domain "D1" {
* Port "D1P1";
* Port "D1P2";
* Port "D1P3";
* }
*
* Domain "D2" {
* Port "D2P1";
* Port "D2P2";
* Port "D2P3";
* }
*
* Domain "D3" {
* Port "D3P1";
* Port "D3P2";
* Port "D3P3";
* }
* }
* </pre>
*
* @return
*/
private static Set<NetworkElement> generateNetworkElements() {
Set<NetworkElement> networkElements = new HashSet<NetworkElement>();
// add 3 domains with 3 ports each one
networkElements.addAll(generateNetworkElementsSet(Domain.class, 3, 3));
// add 3 switches with 3 ports each one
networkElements.addAll(generateNetworkElementsSet(Switch.class, 3, 3));
return networkElements;
}
private static Set<NetworkElement> generateNetworkElementsSet(Class<? extends NetworkElement> networkElementClass, int networkElementNum,
int portNumber) {
Set<NetworkElement> networkElementsSet = new HashSet<NetworkElement>();
// add networkElementNum NetworkElements
for (int i = 1; i <= networkElementNum; i++) {
NetworkElement networkElement = generateNetworkElement(networkElementClass, ((networkElementClass == Domain.class) ? "D" : "S") + i,
portNumber);
networkElementsSet.add(networkElement);
}
return networkElementsSet;
}
private static NetworkElement generateNetworkElement(Class<? extends NetworkElement> networkElementClass, String id, int portNumber) {
NetworkElement networkElement = null;
try {
networkElement = networkElementClass.newInstance();
networkElement.setId(id);
Set<Port> ports = new HashSet<Port>();
// add portNumber ports
for (int j = 1; j <= portNumber; j++) {
ports.add(generatePortFromId(networkElement.getId() + "P" + j));
}
networkElement.setPorts(ports);
} catch (Exception e) {
// ignore, it should not happen
}
return networkElement;
}
private static Port generatePortFromId(String portId) {
Port port = new Port();
port.setId(portId);
return port;
}
}