/*
* RHQ Management Platform
* Copyright (C) 2005-2013 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.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
package org.rhq.plugins.jbosscache3.test;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.mc4j.ems.connection.EmsConnection;
import org.mc4j.ems.connection.bean.EmsBean;
import org.mc4j.ems.connection.bean.attribute.EmsAttribute;
import org.mc4j.ems.connection.bean.operation.EmsOperation;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.definition.ConfigurationDefinition;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
import org.rhq.core.domain.operation.OperationDefinition;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.pc.util.ComponentUtil;
import org.rhq.core.pc.util.FacetLockType;
import org.rhq.core.pluginapi.operation.OperationFacet;
import org.rhq.core.pluginapi.operation.OperationResult;
public class OperationTest {
private Log log = LogFactory.getLog(OperationTest.class);
private EmsConnection connection;
private static String INTERCEPTOR_NAME = "CacheMgmtInterceptor";
private String[] INTERCEPTOR_STATISTIC_FIELDS = { "HitMissRatio",
"ReadWriteRatio", "AverageWriteTime", "AverageReadTime" };
private static String RESET_STATISTICS_OPERATION_NAME = "resetStatistics";
private static String CACHE_STATUS_ATRIBUTE = "CacheStatus";
public OperationTest(EmsConnection connection) {
this.connection = connection;
}
protected void testOperations() throws Exception {
for (String resourceTypeName : CacheComponentTest.RESOURCE_TYPES) {
ResourceType resourceType = TestHelper.getResourceType(
resourceTypeName, CacheComponentTest.CACHE_PLUGIN_NAME);
Set<OperationDefinition> operationDefinitions = resourceType
.getOperationDefinitions();
Set<Resource> resources = TestHelper.getResources(resourceType);
for (Resource resource : resources) {
log.info("Validating operations for " + resource + "...");
OperationFacet operationFacet = ComponentUtil.getComponent(
resource.getId(), OperationFacet.class,
FacetLockType.WRITE,
CacheComponentTest.OPERATION_FACET_METHOD_TIMEOUT,
true, true, true);
for (OperationDefinition operationDefinition : operationDefinitions) {
String name = operationDefinition.getName();
OperationResult result = operationFacet.invokeOperation(
name, new Configuration());
log.info("Validating operation '" + name + "' result ("
+ result + ")...");
ConfigurationDefinition def = operationDefinition
.getResultsConfigurationDefinition();
if (CacheStatus.CacheOperations.contains(name)) {
Object obj = getEmsAttribute(resource.getResourceKey(),
CACHE_STATUS_ATRIBUTE);
String statusName = obj.toString();
if (CacheStatus.isOperationRunning(statusName)) {
// TODO waiting for result
}
assert (CacheStatus.isOperationFinished(statusName));
}
if (def != null) {
PropertyDefinitionSimple property = def
.getPropertyDefinitionSimple("output");
if (property != null) {
Object emsOperationRes = getEmsOperationResult(
resource.getResourceKey(), name);
String value = result.getComplexResults()
.getSimpleValue("output", "");
String type = getOperationResultType(resource
.getResourceKey(), name);
assert (TestHelper.compareValues(value, type,
emsOperationRes));
}
}
if (name.equals(RESET_STATISTICS_OPERATION_NAME)) {
String resourceName = resource.getResourceKey();
if (resourceName.contains("INTERCEPTOR_NAME"))
assert testResetFields(
INTERCEPTOR_STATISTIC_FIELDS, resource);
}
}
}
}
return;
}
protected boolean testResetFields(String[] fields, Resource resource) {
try {
for (String metricName : fields) {
String value = TestHelper.getMetricValue(resource, metricName);
Double dValue = Double.valueOf(value);
if (!dValue.equals(0))
return false;
}
return true;
} catch (Exception e) {
return false;
}
}
protected Object getEmsOperationResult(String beanName, String operationName) {
EmsBean bean = connection.getBean(beanName);
EmsOperation operation = bean.getOperation(operationName);
Object obj = operation.invoke(new Object[] {});
return obj;
}
protected String getOperationResultType(String beanName,
String operationName) {
EmsBean bean = connection.getBean(beanName);
EmsOperation operation = bean.getOperation(operationName);
return operation.getReturnType();
}
protected Object getEmsAttribute(String beanName, String attName) {
EmsBean bean = connection.getBean(beanName);
EmsAttribute att = bean.getAttribute(attName);
Object obj = att.getValue();
return obj;
}
}