package org.rhq.enterprise.server.inventory; import static java.util.Arrays.asList; import java.sql.Connection; import java.util.ArrayList; import java.util.List; import org.dbunit.database.DatabaseConfig; import org.dbunit.database.DatabaseConnection; import org.dbunit.database.IDatabaseConnection; import org.dbunit.dataset.IDataSet; import org.dbunit.dataset.datatype.IDataTypeFactory; import org.dbunit.dataset.xml.FlatXmlDataSet; import org.dbunit.dataset.xml.FlatXmlProducer; import org.dbunit.ext.oracle.Oracle10DataTypeFactory; import org.dbunit.ext.oracle.OracleDataTypeFactory; import org.dbunit.ext.postgresql.PostgresqlDataTypeFactory; import org.dbunit.operation.DatabaseOperation; import org.testng.annotations.Test; import org.xml.sax.InputSource; import org.rhq.core.domain.resource.InventoryStatus; import org.rhq.core.domain.resource.Resource; import org.rhq.core.domain.resource.ResourceType; import org.rhq.enterprise.server.test.AbstractEJB3Test; import org.rhq.enterprise.server.util.LookupUtil; public class InventoryManagerBeanTest extends AbstractEJB3Test { private static List<Integer> deletedTypeIds = asList(1, 2, 3, 4, 5); @Override protected void beforeMethod() throws Exception { initDB(); getTransactionManager().begin(); InventoryManagerLocal inventoryMgr = LookupUtil.getInventoryManager(); inventoryMgr.markTypesDeleted(deletedTypeIds, true); getTransactionManager().commit(); } @Override protected void afterMethod() throws Exception { cleanDB(); } @SuppressWarnings("unchecked") @Test public void markTypesAndTheirChildTypesForDeletion() { List<ResourceType> resourceTypes = getEntityManager() .createQuery("from ResourceType t where t.id in (:resourceTypeIds)") .setParameter("resourceTypeIds", deletedTypeIds).getResultList(); assertEquals("Failed to retrieve all resource types", 5, resourceTypes.size()); List<Integer> typesNotDeleted = new ArrayList<Integer>(); for (ResourceType type : resourceTypes) { if (!type.isDeleted()) { typesNotDeleted.add(type.getId()); } } assertEquals("Failed to mark for deletion resource types with the following ids: " + typesNotDeleted + ".", 0, typesNotDeleted.size()); } @SuppressWarnings("unchecked") @Test public void uninventoryResourcesOfTypesMarkedForDeletion() { List<Resource> resources = getEntityManager().createQuery("from Resource r where r.id in (:resourceIds)") .setParameter("resourceIds", asList(1, 2)).getResultList(); assertEquals("Failed to retrieve all resources", 2, resources.size()); List<Integer> resourcesNotDeleted = new ArrayList<Integer>(); for (Resource resource : resources) { if (resource.getInventoryStatus() != InventoryStatus.UNINVENTORIED) { resourcesNotDeleted.add(resource.getId()); } } assertEquals( "Resources of types marked for deletion should be uninventoried. Resources with the following ids " + "should have been uninventoried: " + resourcesNotDeleted + ".", 0, resourcesNotDeleted.size()); } @Test public void getDeletedTypes() { InventoryManagerLocal inventoryMgr = LookupUtil.getInventoryManager(); List<ResourceType> deletedTypes = inventoryMgr.getDeletedTypes(); // protect against other db detritus, just look for the ones we expect int resultSize = deletedTypes.size(); assertTrue("Expected at least five deleted types", resultSize >= 5); List<Integer> resultIds = new ArrayList<Integer>(resultSize); for (ResourceType rt : deletedTypes) { resultIds.add(rt.getId()); } for (Integer id : deletedTypeIds) { assert (resultIds.contains(id)); } } @Test public void deletedTypeIsReadyForRemovalWhenThereResourcesOfThatType() { InventoryManagerLocal inventoryMgr = LookupUtil.getInventoryManager(); ResourceType deletedType = getEntityManager().find(ResourceType.class, 4); assertTrue(deletedType + " should be ready for removal", inventoryMgr.isReadyForPermanentRemoval(deletedType)); } @Test public void typeThatIsNotDeletedIsNotReadyForRemoval() { InventoryManagerLocal inventoryMgr = LookupUtil.getInventoryManager(); ResourceType resourceType = getEntityManager().find(ResourceType.class, 6); assertFalse(resourceType + " is not ready for removal because it is not deleted.", inventoryMgr.isReadyForPermanentRemoval(resourceType)); } public void initDB() throws Exception { Connection connection = null; try { connection = getConnection(); IDatabaseConnection conn = new DatabaseConnection(connection); setDbType(conn); DatabaseOperation.REFRESH.execute(conn, getDataSet()); } finally { if (connection != null) { connection.close(); } } } public void cleanDB() throws Exception { Connection connection = null; try { connection = getConnection(); IDatabaseConnection conn = new DatabaseConnection(connection); setDbType(conn); DatabaseOperation.DELETE.execute(conn, getDataSet()); } finally { if (connection != null) { connection.close(); } } } void setDbType(IDatabaseConnection connection) throws Exception { DatabaseConfig dbConfig = connection.getConfig(); String name = connection.getConnection().getMetaData().getDatabaseProductName().toLowerCase(); int major = connection.getConnection().getMetaData().getDatabaseMajorVersion(); IDataTypeFactory type = null; if (name.contains("postgres")) { type = new PostgresqlDataTypeFactory(); } else if (name.contains("oracle")) { if (major >= 10) { type = new Oracle10DataTypeFactory(); } else { type = new OracleDataTypeFactory(); } } if (type != null) { dbConfig.setProperty("http://www.dbunit.org/properties/datatypeFactory", type); } } IDataSet getDataSet() throws Exception { FlatXmlProducer xmlProducer = new FlatXmlProducer(new InputSource(getClass().getResourceAsStream( getDataSetFile()))); xmlProducer.setColumnSensing(true); return new FlatXmlDataSet(xmlProducer); } String getDataSetFile() { return getClass().getSimpleName() + ".xml"; } }