package org.rhq.enterprise.server.resource.metadata; import static java.util.Arrays.asList; import static java.util.Collections.EMPTY_LIST; import org.testng.annotations.Test; import org.rhq.core.domain.bundle.BundleType; import org.rhq.core.domain.configuration.definition.ConfigurationDefinition; import org.rhq.core.domain.content.PackageType; import org.rhq.core.domain.resource.ResourceType; public class ContentMetadataManagerBeanTest extends MetadataBeanTest { @Test(groups = { "plugin.metadata", "Content.NewPlugin" }) public void registerContentPlugin() throws Exception { createPlugin("content-test-plugin", "1.0", "plugin_v1.xml"); } @Test(groups = { "plugin.metadata", "Content.UpgradePlugin" }, dependsOnGroups = { "Content.NewPlugin" }) public void upgradeContentPlugin() throws Exception { createPlugin("content-test-plugin", "2.0", "plugin_v2.xml"); } @Test(groups = { "plugin.metadata", "Content.UpgradePlugin" }, dependsOnMethods = { "upgradeContentPlugin" }) public void addPackageTypes() throws Exception { assertResourceTypeAssociationEquals("ContentServer1", "ContentMetadataManagerBeanTestPlugin", "packageTypes", asList("ContentServer1.Content.1", "ContentServer1.Content.2")); } @Test(groups = { "plugin.metadata", "Content.UpgradePlugin" }, dependsOnMethods = { "upgradeContentPlugin" }) public void deletePackageTypes() throws Exception { assertResourceTypeAssociationEquals("ContentServer2", "ContentMetadataManagerBeanTestPlugin", "packageTypes", EMPTY_LIST); } @Test(groups = { "plugin.metadata", "Content.UpgradePlugin" }, dependsOnMethods = { "upgradeContentPlugin" }) public void deletePackageTypesThatExistsInOldResourceTypeButNotInNewResourceType() throws Exception { assertResourceTypeAssociationEquals("ContentServer3", "ContentMetadataManagerBeanTestPlugin", "packageTypes", asList("ContentServer3.Content.2", "ContentServer3.Content.3")); } @Test(groups = { "plugin.metadata", "Content.UpgradePlugin" }, dependsOnMethods = { "upgradeContentPlugin" }) public void addPackageThatAreAddedInNewResourceType() throws Exception { assertResourceTypeAssociationEquals("ContentServer4", "ContentMetadataManagerBeanTestPlugin", "packageTypes", asList("ContentServer4.Content.1", "ContentServer4.Content.2")); } @Test(groups = { "plugin.metadata", "Content.UpgradePlugin" }, dependsOnMethods = { "upgradeContentPlugin" }) public void addNewDeploymentConfigurationDefinition() throws Exception { PackageType packageType = loadPackageType("ContentServer", "ContentMetadataManagerBeanTestPlugin", "ContentServer.Content.1"); ConfigurationDefinition deploymentConfigDef = packageType.getDeploymentConfigurationDefinition(); assertNotNull( "Failed to create new deployment configuration definition for package type that previously did not have one", deploymentConfigDef); assertEquals("Expected to find 1 property definition in new deployment configuration definition", 1, deploymentConfigDef.getPropertyDefinitions().size()); assertNotNull("Expected to find 1 property definition, <version>, in new deployment configuration definition", deploymentConfigDef.get("version")); } @Test(groups = { "plugin.metadata", "Content.UpgradePlugin" }, dependsOnMethods = { "upgradeContentPlugin" }) public void updateDeploymentConfigDefThatExistsInOldAndNewResourceType() throws Exception { PackageType packageType = loadPackageType("ContentServer5", "ContentMetadataManagerBeanTestPlugin", "ContentServer5.Content.1"); ConfigurationDefinition deploymentConfigDef = packageType.getDeploymentConfigurationDefinition(); assertNotNull("Failed to update deployment configuration definition for package type", deploymentConfigDef); assertEquals("Expected to find 2 property definitions in updated deployment configuration definition", 2, deploymentConfigDef.getPropertyDefinitions().size()); assertNotNull("Expected existing property definition to be retained across update", deploymentConfigDef.get("x")); assertNotNull("Expected new property definition to be added during update", deploymentConfigDef.get("y")); } @Test(groups = { "plugin.metadata", "Content.UpgradePlugin" }, dependsOnMethods = { "upgradeContentPlugin" }) public void deleteDeploymentConfigDefThatIsRemovedInNewResourceType() { PackageType packageType = loadPackageType("ContentServer5", "ContentMetadataManagerBeanTestPlugin", "ContentServer5.Content.2"); assertNull( "Expected deployment configuration definition to be removed since it was removed from new resource type", packageType.getDeploymentConfigurationDefinition()); } @Test(groups = { "plugin.metadata", "Content.UpgradePlugin" }, dependsOnMethods = { "upgradeContentPlugin" }) public void updateBundleType() { ResourceType resourceType = loadResourceTypeWithBundleType("ContentServer7", "ContentMetadataManagerBeanTestPlugin"); BundleType bundleType = resourceType.getBundleType(); assertNotNull("Failed to upgrade bundle type", bundleType); assertEquals("Failed to upgrade bundle type correctly. The bundle type name is wrong", "ContentServer.Bundle.2", bundleType.getName()); } @Test(groups = { "plugin.metadata", "Content.UpgradePlugin" }, dependsOnMethods = { "upgradeContentPlugin" }) public void addBundleTypeThatOnlyExistsInNewResourceType() { ResourceType resourceType = loadResourceTypeWithBundleType("ContentServer6", "ContentMetadataManagerBeanTestPlugin"); BundleType bundleType = resourceType.getBundleType(); assertNotNull("Expected to find bundle type added during upgrade", bundleType); assertEquals("Failed to correctly add bundle type during upgrade", "ContentServer6.Bundle.1", bundleType.getName()); } // this needs to be the last test executed in the class, it does cleanup @Test(priority = 10, alwaysRun = true, dependsOnGroups = { "Content.UpgradePlugin" }) public void afterClassWorkTest() throws Exception { afterClassWork(); } PackageType loadPackageType(String resourceType, String plugin, String packageType) { return (PackageType) getEntityManager() .createQuery( "from PackageType p left join fetch p.deploymentConfigurationDefinition pdcd " + "where p.name = :packageType and " + "p.resourceType.name = :resourceType and " + "p.resourceType.plugin = :plugin").setParameter("packageType", packageType) .setParameter("plugin", plugin).setParameter("resourceType", resourceType).getSingleResult(); } ResourceType loadResourceTypeWithBundleType(String resourceType, String plugin) { return (ResourceType) getEntityManager() .createQuery( "from ResourceType t left join fetch t.bundleType tbt where t.name = :resourceType and t.plugin = :plugin") .setParameter("resourceType", resourceType).setParameter("plugin", plugin).getSingleResult(); } }