package org.rhq.enterprise.server.resource.metadata; import static java.util.Arrays.asList; import static java.util.Collections.EMPTY_LIST; import java.util.ArrayList; import java.util.List; import org.testng.annotations.Test; import org.rhq.core.domain.configuration.definition.ConfigurationDefinition; import org.rhq.core.domain.operation.OperationDefinition; import org.rhq.core.domain.resource.ResourceType; public class OperationMetadataManagerBeanTest extends MetadataBeanTest { @Test(groups = {"plugin.metadata", "Operations.NewPlugin"}) public void registerOperationsPlugin() throws Exception { createPlugin("operation-test-plugin", "1.0", "plugin_v1.xml"); } @Test(groups = {"plugin.metadata", "Operations.NewPlugin"}, dependsOnMethods = {"registerOperationsPlugin"}) public void createTypeWithOperationDefWithNoParamsAndNoResults() throws Exception { assertResourceTypeAssociationEquals( "OperationServer1", "OperationMetadataManagerBeanTestPlugin", "operationDefinitions", asList("OperationServer1.Operation1") ); } @Test(groups = {"plugin.metadata", "Operations.NewPlugin"}, dependsOnMethods = {"registerOperationsPlugin"}) public void createTypeWithOperationDefWithParams() { ResourceType resourceType = loadResourceTypeWithOperationDefs("OperationServer11", "OperationMetadataManagerBeanTestPlugin"); List<OperationDefinition> operationDefs = new ArrayList<OperationDefinition>(resourceType.getOperationDefinitions()); assertEquals("Expected to find an operation definition", 1, operationDefs.size()); ConfigurationDefinition params = operationDefs.get(0).getParametersConfigurationDefinition(); assertNotNull("Expected to find parameters for operation definition", params); assertEquals("Expected to find 2 parameters", 2, params.getPropertyDefinitions().size()); assertNotNull("Expected to find parameter named <param1>", params.get("param1")); assertNotNull("Expected to find parameter named <param2>", params.get("param2")); } @Test(groups = {"plugin.metadata", "Operations.UpgradePlugin"}, dependsOnGroups = {"Operations.NewPlugin"}) public void upgradeOperationsPlugin() throws Exception { createPlugin("operation-test-plugin", "2.0", "plugin_v2.xml"); } @Test(groups = {"plugin.metadata", "Operations.UpgradePlugin"}, dependsOnMethods = {"upgradeOperationsPlugin"}) public void addOperationToTypeThatPreviouslyHadNoOperations() throws Exception { assertResourceTypeAssociationEquals( "OperationServer2", "OperationMetadataManagerBeanTestPlugin", "operationDefinitions", asList("OperationServer2.Operation1") ); } @Test(groups = {"plugin.metadata", "Operations.UpgradePlugin"}, dependsOnMethods = {"upgradeOperationsPlugin"}) public void removeOperationDefFromTypeThatPreviouslyDefinedOperationDef() throws Exception { assertResourceTypeAssociationEquals( "OperationServer21", "OperationMetadataManagerBeanTestPlugin", "operationDefinitions", EMPTY_LIST ); } @Test(groups = {"plugin.metadata", "Operations.UpgradePlugin"}, dependsOnMethods = {"upgradeOperationsPlugin"}) public void removeParamsFromUpgradedOperationDef() { OperationDefinition operationDef = loadOperationDefinition("OperationServer22.Operation1", "OperationServer22", "OperationMetadataManagerBeanTestPlugin"); assertNull("Operation parameters should have been removed", operationDef.getParametersConfigurationDefinition()); } @Test(groups = {"plugin.metadata", "Operations.UpgradePlugin"}, dependsOnMethods = {"upgradeOperationsPlugin"}) public void addResultsToUpgradedOperationDef() { OperationDefinition operationDef = loadOperationDefinition("OperationServer23.Operation1", "OperationServer23", "OperationMetadataManagerBeanTestPlugin"); ConfigurationDefinition resultsDef = operationDef.getResultsConfigurationDefinition(); assertNotNull("Results definition should have been added", resultsDef); assertEquals("Expected results to contain one property", 1, resultsDef.getPropertyDefinitions().size()); assertNotNull("Expected results to contain property named <exitCode>", resultsDef.get("exitCode")); } @Test(groups = {"plugin.metadata", "Operations.UpgradePlugin"}, dependsOnMethods = {"upgradeOperationsPlugin"}) public void addParamsToUpgradedOperationDef() { OperationDefinition operationDef = loadOperationDefinition("OperationServer24.Operation1", "OperationServer24", "OperationMetadataManagerBeanTestPlugin"); ConfigurationDefinition paramsDef = operationDef.getParametersConfigurationDefinition(); assertNotNull("Operation parameters definition should have been added.", paramsDef); assertEquals("Expected to find one parameter definition.", 1, paramsDef.getPropertyDefinitions().size()); assertNotNull("Expected parameters to contain property named <param1>", paramsDef.getPropertyDefinitions().get("param1")); } @Test(groups = {"plugin.metadata", "Operations.UpgradePlugin"}, dependsOnMethods = {"upgradeOperationsPlugin"}) public void removeResultsInUpgradedOperationDef() { OperationDefinition operationDef = loadOperationDefinition("OperationServer24.Operation1", "OperationServer24", "OperationMetadataManagerBeanTestPlugin"); ConfigurationDefinition resultsDef = operationDef.getResultsConfigurationDefinition(); assertNull("Results definition should have been removed", resultsDef); } // this needs to be the last test executed in the class, it does cleanup @Test(priority = 10, alwaysRun = true, dependsOnGroups = { "Operations.UpgradePlugin" }) public void afterClassWorkTest() throws Exception { afterClassWork(); } ResourceType loadResourceTypeWithOperationDefs(String resourceType, String plugin) { return (ResourceType) getEntityManager().createQuery( "from ResourceType t left join fetch t.operationDefinitions tod " + "where t.name = :resourceType and t.plugin = :plugin") .setParameter("resourceType", resourceType) .setParameter("plugin", plugin) .getSingleResult(); } OperationDefinition loadOperationDefinition(String opName, String resourceType, String plugin) { return (OperationDefinition) getEntityManager().createQuery( "from OperationDefinition o " + "where o.name = :operationName and o.resourceType.name = :resourceType and o.resourceType.plugin = :plugin") .setParameter("operationName", opName) .setParameter("resourceType", resourceType) .setParameter("plugin", plugin) .getSingleResult(); } }