package org.opennaas.extensions.network.test; import java.sql.Connection; import java.sql.DriverManager; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import junit.framework.TestCase; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.Test; import org.opennaas.core.resources.descriptor.CapabilityDescriptor; import org.opennaas.core.resources.descriptor.CapabilityProperty; import org.opennaas.core.resources.descriptor.ResourceDescriptor; import org.opennaas.core.resources.descriptor.network.NetworkTopology; import org.opennaas.core.resources.helpers.ResourceDescriptorSupport; import org.opennaas.extensions.network.helpers.NetworkResourceDescriptorSupport; public class ResourceDescriptorRepositoryTest extends TestCase { private static Log logger = LogFactory.getLog(ResourceDescriptorRepositoryTest.class); private EntityManagerFactory emFactory = null; private EntityManager em = null; private Connection connection = null; @Override protected void setUp() throws Exception { super.setUp(); try { logger.info("Starting in-memory HSQL database for unit tests"); Class.forName("org.hsqldb.jdbcDriver"); connection = DriverManager.getConnection("jdbc:hsqldb:mem:unit-testing-jpa", "sa", ""); } catch (Exception ex) { ex.printStackTrace(); logger.error("Exception in set up", ex); fail("Exception during HSQL database startup."); } try { logger.info("Building JPA EntityManager for unit tests"); emFactory = Persistence.createEntityManagerFactory("ResourceCore-test"); if (emFactory == null) fail("Persistence.createEntityManagerFactory didn't give us one :(."); em = emFactory.createEntityManager(); } catch (Exception ex) { ex.printStackTrace(); logger.error("Exception in set up", ex); fail("Exception during JPA EntityManager instanciation."); } } @Override protected void tearDown() throws Exception { super.tearDown(); logger.info("Shutting down EntityManager."); if (em != null) { em.close(); } if (emFactory != null) { emFactory.close(); } logger.info("Stopping in-memory HSQL database."); try { connection.createStatement().execute("SHUTDOWN"); } catch (Exception ex) { logger.error("Exception in set up", ex); } } @Test public void testBasicPersistence() { try { // Test Save em.getTransaction().begin(); ResourceDescriptor config = ResourceDescriptorSupport.createSampleDescriptor(); em.persist(config); em.getTransaction().commit(); assertNotNull(config); // Test Load em.getTransaction().begin(); ResourceDescriptor loaded = em.find(ResourceDescriptor.class, config.getId()); assertNotNull(loaded); List<CapabilityDescriptor> capabilityDescriptors = loaded.getCapabilityDescriptors(); Iterator<CapabilityDescriptor> capabilityIt = capabilityDescriptors.iterator(); assertEquals(loaded.getInformation().getType(), "ca.inocybe.xxx"); assertEquals(loaded.getInformation().getDescription(), "Test"); assertEquals(loaded.getInformation().getName(), "Resource"); assertEquals(loaded.getInformation().getVersion(), "1.0.0"); while (capabilityIt.hasNext()) { CapabilityDescriptor capabilityDescriptor = capabilityIt.next(); CapabilityProperty prop = capabilityDescriptor.getCapabilityProperties().get(0); assertEquals(prop.getName(), "name"); assertEquals(prop.getValue(), "value"); } em.getTransaction().commit(); } catch (Exception ex) { em.getTransaction().rollback(); logger.error("Exception during testPersistence", ex); fail("Exception during testPersistence"); } } @Test public void testCloningOfPersistentDescriptor() throws Exception { try { // Create persistent descriptor em.getTransaction().begin(); ResourceDescriptor config = ResourceDescriptorSupport.createSampleDescriptor(); em.persist(config); em.getTransaction().commit(); // Load it back em.getTransaction().begin(); ResourceDescriptor loaded = em.find(ResourceDescriptor.class, config.getId()); // Clone it ResourceDescriptor copy = (ResourceDescriptor) loaded.clone(); // Check content of descriptor assertEquals(copy.getInformation().getType(), "ca.inocybe.xxx"); assertEquals(copy.getInformation().getDescription(), "Test"); assertEquals(copy.getInformation().getName(), "Resource"); assertEquals(copy.getInformation().getVersion(), "1.0.0"); for (CapabilityDescriptor descriptor : copy.getCapabilityDescriptors()) { CapabilityProperty prop = descriptor.getCapabilityProperties().get(0); assertEquals(prop.getName(), "name"); assertEquals(prop.getValue(), "value"); } em.getTransaction().commit(); } catch (Exception ex) { em.getTransaction().rollback(); throw ex; } } @Test public void testPersistingClonedPersistentDescriptor() throws Exception { try { // Create persistent descriptor em.getTransaction().begin(); ResourceDescriptor config = ResourceDescriptorSupport.createSampleDescriptor(); em.persist(config); em.getTransaction().commit(); // Clone it and store with new ID em.getTransaction().begin(); ResourceDescriptor loaded = em.find(ResourceDescriptor.class, config.getId()); ResourceDescriptor copy = (ResourceDescriptor) loaded.clone(); copy.setId("2"); em.persist(copy); em.getTransaction().commit(); // Load back the result and check values em.getTransaction().begin(); ResourceDescriptor result = em.find(ResourceDescriptor.class, copy.getId()); // Assert content of descriptor assertEquals(result.getInformation().getType(), "ca.inocybe.xxx"); assertEquals(result.getInformation().getDescription(), "Test"); assertEquals(result.getInformation().getName(), "Resource"); assertEquals(result.getInformation().getVersion(), "1.0.0"); for (CapabilityDescriptor descriptor : result.getCapabilityDescriptors()) { CapabilityProperty prop = descriptor.getCapabilityProperties().get(0); assertEquals(prop.getName(), "name"); assertEquals(prop.getValue(), "value"); } em.getTransaction().commit(); } catch (Exception ex) { em.getTransaction().rollback(); throw ex; } } @Test public void testVirtualResourcePersistence() { try { // Test Save em.getTransaction().begin(); ResourceDescriptor config = ResourceDescriptorSupport.createVirtualResourceDescriptor(); em.persist(config); em.getTransaction().commit(); assertNotNull(config); // Test Load em.getTransaction().begin(); ResourceDescriptor loaded = em.find(ResourceDescriptor.class, config.getId()); assertNotNull(loaded); List<CapabilityDescriptor> capabilityDescriptors = loaded.getCapabilityDescriptors(); Iterator<CapabilityDescriptor> capabilityIt = capabilityDescriptors.iterator(); assertEquals(loaded.getInformation().getType(), "router"); assertEquals(loaded.getInformation().getDescription(), "virtual resource description"); assertEquals(loaded.getInformation().getName(), "logical1"); assertEquals(loaded.getInformation().getVersion(), "1.0.0"); while (capabilityIt.hasNext()) { CapabilityDescriptor capabilityDescriptor = capabilityIt.next(); CapabilityProperty prop = capabilityDescriptor.getCapabilityProperties().get(0); assertEquals(prop.getName(), "name"); assertEquals(prop.getValue(), "value"); } Map<String, String> properties = config.getProperties(); assertNotNull(properties); String key = properties.get("virtual"); assertEquals("true", key); em.getTransaction().commit(); } catch (Exception ex) { em.getTransaction().rollback(); logger.error("Exception during testPersistence", ex); fail("Exception during testPersistence"); } } @Test public void testResourceWithNetworkCapabilitiesPersistence() { try { // Test Save em.getTransaction().begin(); ResourceDescriptor config = NetworkResourceDescriptorSupport.createNetworkDescriptor(); em.persist(config); em.getTransaction().commit(); assertNotNull(config); // Test Load em.getTransaction().begin(); ResourceDescriptor loaded = em.find(ResourceDescriptor.class, config.getId()); assertNotNull(loaded); List<CapabilityDescriptor> capabilityDescriptors = loaded.getCapabilityDescriptors(); Iterator<CapabilityDescriptor> capabilityIt = capabilityDescriptors.iterator(); assertEquals(loaded.getInformation().getType(), "network"); assertEquals(loaded.getInformation().getDescription(), "network description"); assertEquals(loaded.getInformation().getName(), "networklayer1.0"); assertEquals(loaded.getInformation().getVersion(), "1.0.0"); while (capabilityIt.hasNext()) { CapabilityDescriptor capabilityDescriptor = capabilityIt.next(); CapabilityProperty prop = capabilityDescriptor.getCapabilityProperties().get(0); assertEquals(prop.getName(), "name"); assertEquals(prop.getValue(), "value"); } em.getTransaction().commit(); } catch (Exception ex) { logger.error(ex.getMessage(), ex.getCause()); em.getTransaction().rollback(); logger.error("Exception during testPersistence", ex); fail("Exception during testPersistence"); } } @Test public void testResourceWithNetworkDomains() { em.getTransaction().begin(); ResourceDescriptor config = NetworkResourceDescriptorSupport.createNetworkDescriptorWithNetworkDomains(); em.persist(config); em.getTransaction().commit(); assertNotNull(config); // Test Load em.getTransaction().begin(); ResourceDescriptor loaded = em.find(ResourceDescriptor.class, config.getId()); assertNotNull(loaded); assertEquals(loaded.getFileTopology(), "network/network_diffs_layer.xml"); NetworkTopology networkTopology = loaded.getNetworkTopology(); assertNotNull(networkTopology.getNetworkDomains()); assertEquals(networkTopology.getNetworkDomains().size(), 1); /* network description */ assertNotNull(networkTopology.getDevices()); assertEquals(networkTopology.getDevices().get(0).getName(), "router:R-AS2-1"); assertEquals(networkTopology.getDevices().get(1).getName(), "router:R-AS2-2"); assertEquals(networkTopology.getDevices().get(2).getName(), "router:R-AS2-3"); em.getTransaction().commit(); } @Test public void testResourceNetworkTopology() { em.getTransaction().begin(); ResourceDescriptor config = NetworkResourceDescriptorSupport.createNetworkDescriptor(); em.persist(config); em.getTransaction().commit(); assertNotNull(config); // Test Load em.getTransaction().begin(); ResourceDescriptor loaded = em.find(ResourceDescriptor.class, config.getId()); assertNotNull(loaded); assertEquals(loaded.getFileTopology(), "network/network_example1.xml"); /* network description */ NetworkTopology networkTopology = loaded.getNetworkTopology(); assertNotNull(networkTopology.getDevices()); assertEquals(networkTopology.getDevices().get(0).getName(), "router:R-AS2-1"); assertNotNull(networkTopology.getDevices().get(0).getHasInterfaces()); assertEquals(networkTopology.getDevices().get(0).getHasInterfaces().size(), 3); assertEquals(networkTopology.getDevices().get(0).getHasInterfaces().get(0).getResource(), "#router:R-AS2-1:lt-1/2/0.51"); assertEquals(networkTopology.getDevices().get(0).getHasInterfaces().get(1).getResource(), "#router:R-AS2-1:lt-1/2/0.100"); assertEquals(networkTopology.getDevices().get(0).getHasInterfaces().get(2).getResource(), "#router:R-AS2-1:lo0.1"); assertEquals(networkTopology.getDevices().get(1).getName(), "router:R-AS2-2"); assertNotNull(networkTopology.getDevices().get(1).getHasInterfaces()); assertEquals(networkTopology.getDevices().get(1).getHasInterfaces().size(), 3); assertEquals(networkTopology.getDevices().get(1).getHasInterfaces().get(0).getResource(), "#router:R-AS2-2:lt-1/2/0.102"); assertEquals(networkTopology.getDevices().get(1).getHasInterfaces().get(1).getResource(), "#router:R-AS2-2:lt-1/2/0.101"); assertEquals(networkTopology.getDevices().get(1).getHasInterfaces().get(2).getResource(), "#router:R-AS2-2:lo0.3"); assertEquals(networkTopology.getDevices().get(2).getName(), "router:R-AS2-3"); assertNotNull(networkTopology.getDevices().get(2).getHasInterfaces()); assertEquals(networkTopology.getDevices().get(2).getHasInterfaces().size(), 2); assertEquals(networkTopology.getDevices().get(2).getHasInterfaces().get(0).getResource(), "#router:R-AS2-3:lt-1/2/0.103"); assertEquals(networkTopology.getDevices().get(2).getHasInterfaces().get(1).getResource(), "#router:R-AS2-3:lo0.4"); assertNotNull(networkTopology.getInterfaces()); assertEquals(networkTopology.getInterfaces().size(), 8); assertEquals(networkTopology.getInterfaces().get(0).getCapacity(), "1.2E+9"); assertEquals(networkTopology.getInterfaces().get(0).getName(), "router:R-AS2-1:lt-1/2/0.51"); assertEquals(networkTopology.getInterfaces().get(0).getLinkTo().getName(), "#router:R1:lt-1/2/0.50"); assertEquals(networkTopology.getInterfaces().get(1).getCapacity(), "1.2E+9"); assertEquals(networkTopology.getInterfaces().get(1).getName(), "router:R-AS2-1:lt-1/2/0.100"); assertEquals(networkTopology.getInterfaces().get(1).getLinkTo().getName(), "#router:R-AS2-2:lt-1/2/0.101"); assertEquals(networkTopology.getInterfaces().get(2).getName(), "router:R-AS2-1:lo0.1"); assertEquals(networkTopology.getInterfaces().get(3).getCapacity(), "1.2E+9"); assertEquals(networkTopology.getInterfaces().get(3).getName(), "router:R-AS2-2:lt-1/2/0.101"); assertEquals(networkTopology.getInterfaces().get(3).getLinkTo().getName(), "#router:R-AS2-1:lt-1/2/0.100"); assertEquals(networkTopology.getInterfaces().get(4).getCapacity(), "1.2E+9"); assertEquals(networkTopology.getInterfaces().get(4).getName(), "router:R-AS2-2:lt-1/2/0.102"); assertEquals(networkTopology.getInterfaces().get(4).getLinkTo().getName(), "#router:R-AS2-3:lt-1/2/0.103"); assertEquals(networkTopology.getInterfaces().get(5).getName(), "router:R-AS2-2:lo0.3"); assertEquals(networkTopology.getInterfaces().get(6).getCapacity(), "1.2E+9"); assertEquals(networkTopology.getInterfaces().get(6).getName(), "router:R-AS2-3:lt-1/2/0.103"); assertEquals(networkTopology.getInterfaces().get(6).getLinkTo().getName(), "#router:R-AS2-2:lt-1/2/0.102"); assertEquals(networkTopology.getInterfaces().get(7).getName(), "router:R-AS2-3:lo0.4"); em.getTransaction().commit(); } @Test public void testNetworkResourceReferencesPersistence() { em.getTransaction().begin(); ResourceDescriptor config = NetworkResourceDescriptorSupport.createNetworkDescriptor(); em.persist(config); em.getTransaction().commit(); assertNotNull(config); em.getTransaction().begin(); ResourceDescriptor loaded = em.find(ResourceDescriptor.class, config.getId()); assertNotNull(loaded); for (String frienlyName : config.getResourceReferences().keySet()) { assertTrue(loaded.getResourceReferences().containsKey(frienlyName)); assertEquals(config.getResourceReferences().get(frienlyName), loaded.getResourceReferences().get(frienlyName)); } em.getTransaction().commit(); } }