/* * RHQ Management Platform * Copyright (C) 2011 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.core.domain.drift; import static org.rhq.core.domain.drift.DriftConfigurationDefinition.BaseDirValueContext.fileSystem; import static org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode.normal; import static org.rhq.core.domain.drift.DriftDefinitionComparator.CompareMode.BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS; import static org.rhq.core.domain.resource.ResourceCategory.SERVER; import static org.rhq.test.AssertUtils.assertPropertiesMatch; import java.util.List; import org.testng.Assert; import org.testng.annotations.Test; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.resource.ResourceType; import org.rhq.core.domain.shared.ResourceTypeBuilder; import org.rhq.core.domain.shared.TransactionCallback; import org.rhq.core.domain.test.AbstractEJB3Test; public class DriftDefinitionTemplateTest extends AbstractEJB3Test { private final String RESOURCE_TYPE_NAME = DriftDefinitionTemplateTest.class.getName(); private ResourceType resourceType; @Override protected void beforeMethod() { purgeDB(); executeInTransaction(false, new TransactionCallback() { @Override public void execute() throws Exception { try { createResourceType(); em.persist(resourceType); } catch (Exception e) { System.out.println("BEFORE METHOD FAILURE, TEST DID NOT RUN!!!"); e.printStackTrace(); throw e; } } }); } @Override protected void afterMethod() { purgeDB(); } private void purgeDB() { executeInTransaction(false, new TransactionCallback() { @Override public void execute() throws Exception { List<?> results = em.createQuery("select t from ResourceType t where t.name = :name") .setParameter("name", RESOURCE_TYPE_NAME).getResultList(); if (results.isEmpty()) { return; } ResourceType type = (ResourceType) results.get(0); for (DriftDefinitionTemplate template : type.getDriftDefinitionTemplates()) { em.remove(template); } em.remove(type); } }); } private void createResourceType() { resourceType = new ResourceTypeBuilder().createResourceType().withId(0) .withName(DriftDefinitionTemplateTest.class.getName()).withCategory(SERVER) .withPlugin(DriftDefinitionTemplateTest.class.getName().toLowerCase()).build(); } @Test(groups = { "DriftDefinitionTemplate", "drift.ejb" }) public void saveAndLoadTemplate() { final DriftDefinitionTemplate template = new DriftDefinitionTemplate(); template.setResourceType(resourceType); template.setChangeSetId("1"); DriftDefinition driftDef = new DriftDefinition(new Configuration()); driftDef.setName("saveAndLoadTemplate"); driftDef.setDescription("Testing save and load"); driftDef.setEnabled(true); driftDef.setDriftHandlingMode(normal); driftDef.setInterval(1800L); driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); template.setTemplateDefinition(driftDef); executeInTransaction(new TransactionCallback() { @Override public void execute() throws Exception { em.persist(template); em.flush(); em.clear(); DriftDefinitionTemplate savedTemplate = em.find(DriftDefinitionTemplate.class, template.getId()); Assert.assertNotNull(savedTemplate, "Failed to persist " + template.toString(false)); assertDriftTemplateEquals("Failed to persist template", savedTemplate, template); assertPropertiesMatch("Failed to persist " + template.toString(false), template.getResourceType(), resourceType, "driftDefinitionTemplates"); } }); } @Test(groups = { "DriftDefinitionTemplate", "drift.ejb" }) public void deleteTemplate() { final DriftDefinitionTemplate template = new DriftDefinitionTemplate(); template.setResourceType(resourceType); template.setChangeSetId("1"); DriftDefinition driftDef = new DriftDefinition(new Configuration()); driftDef.setName("saveAndLoadTemplate"); driftDef.setDescription("Testing save and load"); driftDef.setEnabled(true); driftDef.setDriftHandlingMode(normal); driftDef.setInterval(1800L); driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); template.setTemplateDefinition(driftDef); executeInTransaction(new TransactionCallback() { @Override public void execute() throws Exception { em.persist(template); em.flush(); em.clear(); DriftDefinitionTemplate savedTemplate = em.find(DriftDefinitionTemplate.class, template.getId()); em.remove(savedTemplate); em.flush(); em.clear(); DriftDefinitionTemplate deletedTemplate = em.find(DriftDefinitionTemplate.class, template.getId()); assertNull("Failed to delete" + template.toString(false), deletedTemplate); Configuration config = em.find(Configuration.class, template.getConfiguration().getId()); assertNull("Deleting " + template.toString(false) + " should cascade to its " + "underlying configuration object", config); assertNotNull("Deleting " + template.toString(false) + " should not cascade to " + "its parent resource type", em.find(ResourceType.class, resourceType.getId())); } }); } @Test(groups = { "DriftDefinitionTemplate", "drift.ejb" }) public void addTemplateToResourceType() { final DriftDefinitionTemplate template = new DriftDefinitionTemplate(); template.setChangeSetId("1"); DriftDefinition driftDef = new DriftDefinition(new Configuration()); driftDef.setName("saveAndLoadTemplate"); driftDef.setDescription("Testing save and load"); driftDef.setEnabled(true); driftDef.setDriftHandlingMode(normal); driftDef.setInterval(1800L); driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); template.setTemplateDefinition(driftDef); executeInTransaction(new TransactionCallback() { @Override public void execute() throws Exception { resourceType.addDriftDefinitionTemplate(template); resourceType = em.merge(resourceType); em.flush(); em.clear(); ResourceType updatedType = em.find(ResourceType.class, resourceType.getId()); assertFalse("Failed to persist drift definition template", updatedType.getDriftDefinitionTemplates() .isEmpty()); DriftDefinitionTemplate savedTemplate = updatedType.getDriftDefinitionTemplates().iterator().next(); assertDriftTemplateEquals("Failed to add template to existing resource type", template, savedTemplate); } }); } @Test(groups = { "DriftDefinitionTemplate", "drift.ejb" }) public void deleteResourceTypeShouldCascadeToTemplates() { final DriftDefinitionTemplate template = new DriftDefinitionTemplate(); template.setResourceType(resourceType); template.setChangeSetId("1"); DriftDefinition driftDef = new DriftDefinition(new Configuration()); driftDef.setName("cascadeDelete"); driftDef.setDescription("testing cascade delete"); driftDef.setEnabled(true); driftDef.setDriftHandlingMode(normal); driftDef.setInterval(1800L); driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); template.setTemplateDefinition(driftDef); executeInTransaction(new TransactionCallback() { @Override public void execute() throws Exception { em.persist(template); em.flush(); em.clear(); ResourceType typeToDelete = em.find(ResourceType.class, resourceType.getId()); em.remove(typeToDelete); em.flush(); em.clear(); assertNull("Deleting " + resourceType + " should have cascaded to " + template.toString(false), em.find(DriftDefinitionTemplate.class, template.getId())); } }); } @Test(groups = { "DriftDefinitionTemplate", "drift.ejb" }) public void persistTemplateAndDefinition() { final DriftDefinition driftDef = new DriftDefinition(new Configuration()); driftDef.setName("addDefToTemplate"); driftDef.setEnabled(true); driftDef.setDriftHandlingMode(normal); driftDef.setInterval(1800L); driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); final DriftDefinitionTemplate template = new DriftDefinitionTemplate(); template.setName("saveAndLoadTemplate"); template.setDescription("Testing save and load"); template.setResourceType(resourceType); template.setChangeSetId("1"); template.setTemplateDefinition(driftDef); executeInTransaction(new TransactionCallback() { @Override public void execute() throws Exception { template.addDriftDefinition(driftDef); em.persist(template); em.flush(); em.clear(); DriftDefinitionTemplate savedTemplate = em.find(DriftDefinitionTemplate.class, template.getId()); assertNotNull("Failed to persist template", savedTemplate); assertEquals("Failed to add definition to template", 1, savedTemplate.getDriftDefinitions().size()); DriftDefinition savedDefinition = savedTemplate.getDriftDefinitions().iterator().next(); assertPropertiesMatch("Failed to persist definition", driftDef, savedDefinition, "id", "configuration", "template"); } }); } @Test(groups = { "DriftDefinitionTemplate", "drift.ejb" }) public void deleteTemplateShouldNotCascadeToDefinitions() { final DriftDefinition driftDef = new DriftDefinition(new Configuration()); driftDef.setName("addDefToTemplate"); driftDef.setEnabled(true); driftDef.setDriftHandlingMode(normal); driftDef.setInterval(1800L); driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); final DriftDefinitionTemplate template = new DriftDefinitionTemplate(); template.setName("saveAndLoadTemplate"); template.setDescription("Testing save and load"); template.setResourceType(resourceType); template.setChangeSetId("1"); template.setTemplateDefinition(driftDef); executeInTransaction(new TransactionCallback() { @Override public void execute() throws Exception { em.persist(template); driftDef.setTemplate(template); em.persist(driftDef); em.flush(); em.clear(); DriftDefinitionTemplate templateToDelete = em.find(DriftDefinitionTemplate.class, template.getId()); DriftDefinition def = em.find(DriftDefinition.class, driftDef.getId()); def.setTemplate(null); em.remove(templateToDelete); em.flush(); em.clear(); Assert.assertNotNull(em.find(DriftDefinition.class, driftDef.getId()), "Deleting the template should not delete its definitions"); } }); } private void assertDriftTemplateEquals(String msg, DriftDefinitionTemplate expected, DriftDefinitionTemplate actual) { assertPropertiesMatch(msg + ": basic drift definition template properties do not match", expected, actual, "id", "resourceType", "ctime", "templateDefinition"); assertDriftDefEquals(msg + ": template definitions do not match", expected.getTemplateDefinition(), actual.getTemplateDefinition()); } private void assertDriftDefEquals(String msg, DriftDefinition expected, DriftDefinition actual) { DriftDefinitionComparator comparator = new DriftDefinitionComparator( BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS); assertEquals(msg, 0, comparator.compare(expected, actual)); } }