/* * 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.enterprise.server.drift; import static java.util.Arrays.asList; import static org.apache.commons.io.IOUtils.toInputStream; 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.drift.DriftFileStatus.LOADED; import static org.rhq.enterprise.server.util.LookupUtil.getJPADriftServer; import static org.rhq.test.AssertUtils.assertPropertiesMatch; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.testng.annotations.Test; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.criteria.JPADriftChangeSetCriteria; import org.rhq.core.domain.drift.Drift; import org.rhq.core.domain.drift.DriftDefinition; import org.rhq.core.domain.drift.JPADrift; import org.rhq.core.domain.drift.JPADriftChangeSet; import org.rhq.core.domain.drift.JPADriftFile; import org.rhq.core.domain.drift.JPADriftSet; import org.rhq.core.domain.drift.dto.DriftChangeSetDTO; import org.rhq.core.domain.drift.dto.DriftDTO; import org.rhq.core.domain.drift.dto.DriftFileDTO; import org.rhq.core.domain.util.PageList; import org.rhq.enterprise.server.test.TransactionCallback; import org.rhq.test.AssertUtils; @Test public class JPADriftServerBeanTest extends AbstractDriftServerTest { private JPADriftServerLocal jpaDriftServer; private final String DRIFT_FILE_1_ID = NAME_PREFIX + "a1b2c3d4"; private final String DRIFT_FILE_2_ID = NAME_PREFIX + "1ab2b3c4d"; private JPADriftFile driftFile1; private JPADriftFile driftFile2; @Override protected void beforeMethod(Method testMethod) throws Exception { super.beforeMethod(testMethod); jpaDriftServer = getJPADriftServer(); driftFile1 = jpaDriftServer.persistDriftFile(new JPADriftFile(DRIFT_FILE_1_ID)); driftFile2 = jpaDriftServer.persistDriftFile(new JPADriftFile(DRIFT_FILE_2_ID)); String driftFile1Content = "drift file 1 content..."; String driftFile2Content = "drift file 2 content..."; jpaDriftServer.persistDriftFileData(driftFile1, toInputStream(driftFile1Content), driftFile1Content.length()); jpaDriftServer.persistDriftFileData(driftFile2, toInputStream(driftFile2Content), driftFile2Content.length()); driftFile1 = jpaDriftServer.getDriftFile(getOverlord(), DRIFT_FILE_1_ID); driftFile2 = jpaDriftServer.getDriftFile(getOverlord(), DRIFT_FILE_2_ID); assertDriftFilePersisted(driftFile1, "driftFile1", driftFile1Content); assertDriftFilePersisted(driftFile2, "driftFile2", driftFile2Content); } public void persistResourceChangeSet() { // first create and persist the drift definition final DriftDefinition driftDef = new DriftDefinition(new Configuration()); driftDef.setName(NAME_PREFIX + "persistResourceChangeSet"); driftDef.setEnabled(true); driftDef.setDriftHandlingMode(normal); driftDef.setInterval(2400L); driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); driftDef.setResource(resource); executeInTransaction(false, new TransactionCallback() { @Override public void execute() throws Exception { em.persist(driftDef); } }); // create the change set to be persisted DriftChangeSetDTO changeSet = new DriftChangeSetDTO(); changeSet.setCategory(COVERAGE); changeSet.setVersion(1); changeSet.setDriftDefinitionId(driftDef.getId()); changeSet.setResourceId(resource.getId()); changeSet.setDriftHandlingMode(normal); changeSet.setCtime(System.currentTimeMillis()); DriftDTO drift1 = new DriftDTO(); drift1.setCategory(FILE_ADDED); drift1.setPath("drift.1"); drift1.setChangeSet(changeSet); drift1.setCtime(System.currentTimeMillis()); drift1.setNewDriftFile(toDTo(driftFile1)); DriftDTO drift2 = new DriftDTO(); drift2.setCategory(FILE_ADDED); drift2.setPath("drift.2"); drift2.setChangeSet(changeSet); drift2.setCtime(System.currentTimeMillis()); drift2.setNewDriftFile(toDTo(driftFile2)); Set<DriftDTO> drifts = new HashSet<DriftDTO>(); drifts.add(drift1); drifts.add(drift2); changeSet.setDrifts(drifts); String newChangeSetId = jpaDriftServer.persistChangeSet(getOverlord(), changeSet); // verify that the change set was persisted JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); criteria.addFilterId(newChangeSetId); criteria.fetchDrifts(true); PageList<JPADriftChangeSet> changeSets = jpaDriftServer.findDriftChangeSetsByCriteria(getOverlord(), criteria); assertEquals("Expected to find one change set", 1, changeSets.size()); JPADriftChangeSet jpaChangeSet = changeSets.get(0); assertEquals("Expected change set to contain two drifts. This could be a result of the change set not being " + "persisted correctly or the criteria fetch being done incorrectly.", 2, jpaChangeSet.getDrifts().size()); AssertUtils.assertPropertiesMatch("The change set was not persisted correctly", changeSet, jpaChangeSet, "id", "drifts", "class", "ctime"); List<? extends Drift> expectedDrifts = asList(drift1, drift2); List<? extends Drift> actualDrifts = new ArrayList(jpaChangeSet.getDrifts()); // We ignore the id and ctime properties because those are set by JPADriftServerBean // and are somewhat implmentation specific. We ignore the directory property because // it is really a calculated property. newDriftFile has to be compared separately // since it does not implement equals. AssertUtils.assertCollectionMatchesNoOrder("The change set drifts were not persisted correctly", (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "directory", "newDriftFile", "class"); assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift1, drift1.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(), "class", "ctime"); assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift2, drift2.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(), "class", "ctime"); } public void persistTemplateChangeSet() { // create the change set to be persisted // // Note that we do not set the drift definition id or resource id since // the change set is not owned by a resource. It is owned by the // resource type. DriftChangeSetDTO changeSet = new DriftChangeSetDTO(); changeSet.setCategory(COVERAGE); changeSet.setVersion(1); changeSet.setDriftHandlingMode(normal); changeSet.setCtime(System.currentTimeMillis()); DriftDTO drift1 = new DriftDTO(); drift1.setCategory(FILE_ADDED); drift1.setPath("drift.1"); drift1.setChangeSet(changeSet); drift1.setCtime(System.currentTimeMillis()); drift1.setNewDriftFile(toDTo(driftFile1)); DriftDTO drift2 = new DriftDTO(); drift2.setCategory(FILE_ADDED); drift2.setPath("drift.2"); drift2.setChangeSet(changeSet); drift2.setCtime(System.currentTimeMillis()); drift2.setNewDriftFile(toDTo(driftFile2)); Set<DriftDTO> drifts = new HashSet<DriftDTO>(); drifts.add(drift1); drifts.add(drift2); changeSet.setDrifts(drifts); String newChangeSetId = jpaDriftServer.persistChangeSet(getOverlord(), changeSet); // verify that the change set was persisted JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); criteria.addFilterId(newChangeSetId); criteria.fetchDrifts(true); PageList<JPADriftChangeSet> changeSets = jpaDriftServer.findDriftChangeSetsByCriteria(getOverlord(), criteria); assertEquals("Expected to find one change set", 1, changeSets.size()); JPADriftChangeSet jpaChangeSet = changeSets.get(0); assertEquals("Expected change set to contain two drifts. This could be a result of the change set not being " + "persisted correctly or the criteria fetch being done incorrectly.", 2, jpaChangeSet.getDrifts().size()); AssertUtils.assertPropertiesMatch("The change set was not persisted correctly", changeSet, jpaChangeSet, "id", "drifts", "class", "ctime"); List<? extends Drift> expectedDrifts = asList(drift1, drift2); List<? extends Drift> actualDrifts = new ArrayList(jpaChangeSet.getDrifts()); // We ignore the id and ctime properties because those are set by JPADriftServerBean // and are somewhat implmentation specific. We ignore the directory property because // it is really a calculated property. newDriftFile has to be compared separately // since it does not implement equals. AssertUtils.assertCollectionMatchesNoOrder("The change set drifts were not persisted correctly", (List<Drift>) expectedDrifts, (List<Drift>) actualDrifts, "id", "ctime", "changeSet", "directory", "newDriftFile", "class"); assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift1, drift1.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.1").getNewDriftFile(), "class", "ctime"); assertPropertiesMatch("The newDriftFile property was not set correctly for " + drift2, drift2.getNewDriftFile(), findDriftByPath(actualDrifts, "drift.2").getNewDriftFile(), "class", "ctime"); } public void copyChangeSet() { // first create the change set that will be copied final JPADriftChangeSet changeSet = new JPADriftChangeSet(null, 0, COVERAGE, null); changeSet.setDriftHandlingMode(normal); final JPADrift drift1 = new JPADrift(changeSet, "drift.1", FILE_ADDED, null, driftFile1); final JPADrift drift2 = new JPADrift(changeSet, "drift.2", FILE_ADDED, null, driftFile2); final JPADriftSet driftSet = new JPADriftSet(); driftSet.addDrift(drift1); driftSet.addDrift(drift2); // next create the drift definition final DriftDefinition driftDef = new DriftDefinition(new Configuration()); driftDef.setName(NAME_PREFIX + "copyChangeSet"); driftDef.setEnabled(true); driftDef.setDriftHandlingMode(normal); driftDef.setInterval(2400L); driftDef.setBasedir(new DriftDefinition.BaseDirectory(fileSystem, "/foo/bar/test")); driftDef.setResource(resource); // persist the change set and drift definition executeInTransaction(false, new TransactionCallback() { @Override public void execute() throws Exception { em.persist(changeSet); em.persist(driftDef); em.persist(driftSet); changeSet.setInitialDriftSet(driftSet); em.merge(changeSet); } }); jpaDriftServer.copyChangeSet(getOverlord(), changeSet.getId(), driftDef.getId(), resource.getId()); // verify that the change set was created for the definition JPADriftChangeSetCriteria criteria = new JPADriftChangeSetCriteria(); criteria.addFilterDriftDefinitionId(driftDef.getId()); criteria.addFilterCategory(COVERAGE); PageList<JPADriftChangeSet> changeSets = jpaDriftServer.findDriftChangeSetsByCriteria(getOverlord(), criteria); assertEquals("Expected to get back one change set", 1, changeSets.size()); JPADriftChangeSet newChangeSet = changeSets.get(0); Set<JPADrift> expectedDrifts = new HashSet<JPADrift>(asList(drift1, drift2)); Set<JPADrift> actualDrifts = newChangeSet.getDrifts(); AssertUtils.assertCollectionMatchesNoOrder("The change set drifts were not copied correctly", expectedDrifts, actualDrifts, "changeSet", "newDriftFile"); } private DriftFileDTO toDTo(JPADriftFile driftFile) { DriftFileDTO dto = new DriftFileDTO(); dto.setHashId(driftFile.getHashId()); dto.setDataSize(driftFile.getDataSize()); dto.setStatus(driftFile.getStatus()); return dto; } private void assertDriftFilePersisted(JPADriftFile driftFile, String name, String content) { assertNotNull("Failed to get " + name + " Was it persisted?", driftFile); assertEquals("The content for " + name + " is wrong", content, jpaDriftServer.getDriftFileBits(driftFile.getHashId())); assertEquals("The drift file status is wrong", LOADED, driftFile.getStatus()); } }