/*
* RHQ Management Platform
* Copyright (C) 2011-2012 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.DriftCategory.FILE_ADDED;
import static org.rhq.core.domain.drift.DriftChangeSetCategory.COVERAGE;
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.resource.ResourceCategory.SERVER;
import java.util.List;
import org.testng.annotations.Test;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.drift.DriftConfigurationDefinition.DriftHandlingMode;
import org.rhq.core.domain.measurement.Availability;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.shared.ResourceBuilder;
import org.rhq.core.domain.shared.ResourceTypeBuilder;
import org.rhq.core.domain.shared.TransactionCallback;
import org.rhq.core.domain.test.AbstractEJB3Test;
public class JPADriftChangeSetTest extends AbstractEJB3Test {
private final String RESOURCE_TYPE_NAME = JPADriftChangeSetTest.class.getName();
private final String DRIFT_DEFINITION_NAME = JPADriftChangeSetTest.class.getName();
private ResourceType resourceType;
private Resource resource;
private int resourceCount;
private DriftDefinition definition;
@Override
protected void beforeMethod() {
purgeDB();
executeInTransaction(false, new TransactionCallback() {
@Override
public void execute() throws Exception {
try {
resourceType = createResourceType();
em.persist(resourceType);
resource = createResource(resourceType);
definition = createDriftDefinition();
resource.addDriftDefinition(definition);
getEntityManager().persist(resource);
} 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 {
try {
// get rid of mandatory avail records on a resource
List<Availability> avails = (List<Availability>) em
.createQuery("SELECT a FROM Availability a WHERE a.resource.resourceType.name = :name")
.setParameter("name", RESOURCE_TYPE_NAME).getResultList();
for (Availability a : avails) {
em.remove(a);
}
List<Resource> resources = (List<Resource>) em
.createQuery("SELECT r from Resource r where r.resourceType.name = :name")
.setParameter("name", RESOURCE_TYPE_NAME).getResultList();
for (Resource resource : resources) {
em.remove(resource);
}
List<ResourceType> resourceTypes = (List<ResourceType>) em
.createQuery("Select rt from ResourceType rt where rt.name = :name")
.setParameter("name", RESOURCE_TYPE_NAME).getResultList();
for (ResourceType type : resourceTypes) {
em.remove(type);
}
} catch (Exception e) {
System.out.println("AFTER METHOD FAILURE, TEST DID NOT COMPLETE!!!");
e.printStackTrace();
throw e;
}
}
});
}
private ResourceType createResourceType() {
return new ResourceTypeBuilder().createResourceType().withId(0).withName(JPADriftChangeSetTest.class.getName())
.withCategory(SERVER).withPlugin(JPADriftChangeSetTest.class.getName().toLowerCase()).build();
}
private Resource createResource(ResourceType type) {
return new ResourceBuilder().createResource().withId(0)
.withName(JPADriftChangeSetTest.class.getSimpleName() + "_" + resourceCount++)
.withResourceKey(JPADriftChangeSetTest.class.getSimpleName() + "_" + resourceCount)
.withUuid(JPADriftChangeSetTest.class.getSimpleName() + "_" + resourceCount).withResourceType(type).build();
}
private DriftDefinition createDriftDefinition() {
DriftDefinition def = new DriftDefinition(new Configuration());
def.setName(DRIFT_DEFINITION_NAME);
def.setEnabled(true);
def.setDriftHandlingMode(normal);
def.setInterval(1800L);
def.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test"));
return def;
}
@Test(groups = { "JPADriftChangeSet", "drift.ejb" })
public void saveAndLoadInitialChangeSet() {
executeInTransaction(new TransactionCallback() {
@Override
public void execute() throws Exception {
JPADriftChangeSet changeSet = new JPADriftChangeSet(resource, 0, COVERAGE, definition);
changeSet.setDriftHandlingMode(DriftHandlingMode.normal);
em.persist(changeSet);
em.flush();
JPADriftSet driftSet = new JPADriftSet();
driftSet.addDrift(new JPADrift(changeSet, "drift.1", FILE_ADDED, null, null));
em.persist(driftSet);
changeSet.setInitialDriftSet(driftSet);
em.merge(changeSet);
em.flush();
em.clear();
JPADriftChangeSet savedChangeSet = em.find(JPADriftChangeSet.class, Integer.parseInt(changeSet.getId()));
assertNotNull("Failed to persist change set", savedChangeSet);
JPADriftSet savedDriftSet = savedChangeSet.getInitialDriftSet();
assertNotNull("Failed to persist drift set", savedDriftSet);
assertEquals("Failed to persist drift belonging to drift set", 1, savedDriftSet.getDrifts().size());
}
});
}
}