package org.opennaas.extensions.genericnetwork.test.topology; /* * #%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.Set; import junit.framework.Assert; import org.junit.Before; import org.junit.Test; import org.opennaas.core.resources.ObjectSerializer; import org.opennaas.core.resources.SerializationException; import org.opennaas.extensions.genericnetwork.model.driver.DevicePortId; 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; import org.opennaas.extensions.genericnetwork.model.topology.TopologyElementState; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; public class TopologySerializationTest { private Topology topology; @Before public void initTopology() { topology = generateSampleTopology(); } @Test public void topologySerializationDeserializationTest() throws SerializationException { inverseSerializationTest(topology); } @Test public void linkDeserializationUsesPortReferencesTest() throws SerializationException { String xml = ObjectSerializer.toXml(topology); Topology generated = (Topology) ObjectSerializer.fromXml(xml, Topology.class); List<Port> ports = new ArrayList<Port>(); for (NetworkElement ne : generated.getNetworkElements()) { ports.addAll(ne.getPorts()); } List<Port> referencedPorts = new ArrayList<Port>(); for (Link link : generated.getLinks()) { referencedPorts.add(link.getSrcPort()); referencedPorts.add(link.getDstPort()); } boolean isReferenced; for (Port referenced : referencedPorts) { isReferenced = false; for (Port p : ports) { if (referenced == p) { isReferenced = true; break; } } Assert.assertTrue("Port " + referenced.getId() + " must be a reference to an existing port", isReferenced); } } /** * Checks that serialization s(x) and deserialization d(x) are inverse functions one of the other. It does so by checking that composition of * these methods form the identity: d(s(x)) = x * * @param x * @throws SerializationException */ private Object inverseSerializationTest(Object x) throws SerializationException { String xml = ObjectSerializer.toXml(x); System.out.println(xml); Object generated = ObjectSerializer.fromXml(xml, x.getClass()); String xml2 = ObjectSerializer.toXml(generated); Assert.assertEquals(x, generated); return generated; } /** * Creates a sample topology forming a triangle with 2 switches and a domain, having 2 ports each. * * @return */ private Topology generateSampleTopology() { Port p1 = new Port(); p1.setId("1"); p1.setState(new TopologyElementState()); p1.getState().setCongested(false); Port p2 = new Port(); p2.setId("2"); p2.setState(new TopologyElementState()); p2.getState().setCongested(true); Port p3 = new Port(); p3.setId("3"); Port p4 = new Port(); p4.setId("4"); Port p5 = new Port(); p5.setId("5"); Port p6 = new Port(); p6.setId("6"); Set<Port> s1ports = new HashSet<Port>(); s1ports.add(p1); s1ports.add(p2); Set<Port> s2ports = new HashSet<Port>(); s2ports.add(p3); s2ports.add(p4); Set<Port> d1ports = new HashSet<Port>(); d1ports.add(p5); d1ports.add(p6); Switch s1 = new Switch(); s1.setId("ofswitch:s1"); s1.setPorts(s1ports); Switch s2 = new Switch(); s2.setId("ofswitch:s2"); s2.setPorts(s2ports); Domain d1 = new Domain(); d1.setId("genericnetwork:n1"); d1.setPorts(d1ports); Set<NetworkElement> networkElements = new HashSet<NetworkElement>(); networkElements.add(s1); networkElements.add(s2); networkElements.add(d1); Link link1 = new Link(); link1.setSrcPort(p2); link1.setDstPort(p3); Link link2 = new Link(); link2.setSrcPort(p4); link2.setDstPort(p5); Link link3 = new Link(); link3.setSrcPort(p6); link3.setDstPort(p1); Set<Link> links = new HashSet<Link>(); links.add(link1); links.add(link2); links.add(link3); DevicePortId devicePortIdSwitch1 = new DevicePortId(); devicePortIdSwitch1.setDeviceId("ofswitch:s1"); devicePortIdSwitch1.setDevicePortId(p1.getId()); DevicePortId devicePortIdSwitch2 = new DevicePortId(); devicePortIdSwitch2.setDeviceId("ofswitch:s2"); devicePortIdSwitch2.setDevicePortId(p4.getId()); BiMap<String, DevicePortId> portMap = HashBiMap.create(); portMap.put(p5.getId(), devicePortIdSwitch1); portMap.put(p6.getId(), devicePortIdSwitch2); Topology topology = new Topology(); topology.setLinks(links); topology.setNetworkElements(networkElements); topology.setNetworkDevicePortIdsMap(portMap); return topology; } }