/*
* 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.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.management.ObjectName;
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.rhq.core.domain.measurement.MeasurementDefinition;
import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.pc.PluginContainer;
import org.rhq.core.pc.util.ComponentUtil;
import org.rhq.core.pc.util.FacetLockType;
import org.rhq.core.pluginapi.measurement.MeasurementFacet;
import org.rhq.plugins.jbossas5.ProfileServiceComponent;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Optional;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class CacheComponentTest {
public static final long MEASUREMENT_FACET_METHOD_TIMEOUT = 10000;
public static final long OPERATION_FACET_METHOD_TIMEOUT = 10000;
private Log log = LogFactory.getLog(CacheComponentTest.class);
public static final String CACHE_PLUGIN_NAME = "JBossCache3";
private static final String CACHE_RESOURCE_TYPE_NAME = "Cache";
private static final String ADDED_RESOURCE = "foo:config=test,testName=testValue,Dname=testName,service=ExampleCacheJmxWrapper";
private EmsConnection connection;
private OperationTest operationTest;
private RemoteClientTest remoteClientTest;
public static String[] RESOURCE_TYPES = { "Interceptor", "Data Container",
"RPC Manager", "RegionManager", "Transaction Table",
"Tx Interceptor", "Lock Manager", "Cache" };
public static String[] JMX_COMPONENT_NAMES = { "CacheMgmtInterceptor",
"DataContainer", "RPCManager", "RegionManager", "TransactionTable",
"TxInterceptor", "MVCCLockManager" };
public static String searchString = "*:*,jmx-resource=";
private String REGEX = "(,|:)jmx-resource=[^,]*(,|\\z)";
@Test(groups = "jbosscache3.test")
public void testDiscovery() throws Exception {
PluginContainer.getInstance().getInventoryManager()
.executeServiceScanImmediately();
Set<Resource> resources = TestHelper.getResources(TestHelper
.getResourceType(CACHE_RESOURCE_TYPE_NAME, CACHE_PLUGIN_NAME));
ObjectName testResource = new ObjectName(ADDED_RESOURCE);
for (int i = 0; i < RESOURCE_TYPES.length - 1; i++) {
System.out.println(RESOURCE_TYPES[i]);
ResourceType type = TestHelper.getResourceType(RESOURCE_TYPES[i],
CACHE_PLUGIN_NAME);
if (type != null) {
Set<Resource> res = TestHelper.getResources(type);
List<EmsBean> beans = connection.queryBeans(searchString
+ JMX_COMPONENT_NAMES[i]);
assert (res.size() == beans.size());
resources.addAll(res);
} else {
assert (connection.queryBeans(
searchString + JMX_COMPONENT_NAMES[i]).size() == 0);
}
}
boolean isTestExamplePresent = false;
Set cacheNames = new HashSet();
Pattern p = Pattern.compile(REGEX);
for (Resource resource : resources) {
ObjectName resourceName = new ObjectName(resource.getResourceKey());
if (resourceName.equals(testResource)) {
isTestExamplePresent = true;
}
String beanName = resource.getResourceKey();
Matcher m = p.matcher(beanName);
if (m.find()) {
beanName = m.replaceFirst(m.group(2).equals(",") ? m.group(1)
: "");
if (!cacheNames.contains(beanName)) {
EmsBean bean = connection.getBean(beanName);
if (bean != null)
cacheNames.add(beanName);
}
}
}
ResourceType type = TestHelper.getResourceType(
CACHE_RESOURCE_TYPE_NAME, CACHE_PLUGIN_NAME);
Set<Resource> res = TestHelper.getResources(type);
for (Resource resource : res) {
assert (cacheNames.contains(resource.getResourceKey()));
}
assert (res.size() == cacheNames.size());
assert !resources.isEmpty();
assert isTestExamplePresent;
}
@Test(groups = "jbosscache3.test")
public void testMetrics() {
try {
PluginContainer.getInstance().getInventoryManager()
.executeServiceScanImmediately();
for (String resourceTypeName : RESOURCE_TYPES) {
ResourceType cacheResourceType = TestHelper.getResourceType(
resourceTypeName, CACHE_PLUGIN_NAME);
testResouceTypeMetrics(cacheResourceType);
}
ResourceType cacheResourceType = TestHelper.getResourceType(
CACHE_RESOURCE_TYPE_NAME, CACHE_PLUGIN_NAME);
testResouceTypeMetrics(cacheResourceType);
return;
} catch (Exception e) {
log.error("Metric test failed", e);
org.testng.Assert.fail("Metric test failed", e);
}
}
@Test(dependsOnMethods = "testMetrics")
public void testMetricRefreshing(){
try {
log.info("Starting Refresh Test");
remoteClientTest.runTest();
Thread.sleep(3000);
testMetrics();
} catch (Exception e) {
log.error("Metric Refhreshing test failed", e);
org.testng.Assert.fail("Metric Refhreshing test failed", e);
}
}
private void testResouceTypeMetrics(ResourceType cacheResourceType)
throws Exception {
Set<MeasurementDefinition> metricDefinitions = cacheResourceType
.getMetricDefinitions();
Set<Resource> resources = TestHelper.getResources(cacheResourceType);
for (Resource resource : resources) {
log.info("Validating metrics for " + resource + "...");
MeasurementFacet measurementFacet = ComponentUtil.getComponent(
resource.getId(), MeasurementFacet.class,
FacetLockType.READ, MEASUREMENT_FACET_METHOD_TIMEOUT, true,
true, true);
EmsBean relatedBean = connection.getBean(resource.getResourceKey());
for (MeasurementDefinition metricDefinition : metricDefinitions) {
String compValue = TestHelper.getMetricValue(metricDefinition,
measurementFacet);
EmsAttribute atr = relatedBean.getAttribute(metricDefinition
.getName());
log.info(" Validating Metric "
+ metricDefinition.getName() + ". (plugin value=" +compValue + ", bean value=" + atr.getValue() + ")");
String beanValue = String.valueOf(atr.getValue());
assert (TestHelper.compareValues(compValue, atr.getType(), atr
.getValue()));
}
}
}
@Test(groups = "jbosscache3.test")
public void testOperations() {
try {
PluginContainer.getInstance().getInventoryManager()
.executeServiceScanImmediately();
operationTest = new OperationTest(connection);
operationTest.testOperations();
} catch (Exception e) {
log.error("Operation test failed", e);
org.testng.Assert.fail("Operation test failed", e);
}
}
@BeforeSuite(groups = "jbosscache3.test")
@Parameters( { "principal", "credentials", "testJarPath", "xmlFilePath" })
public void start(@Optional String principal, @Optional String credentials,
@Optional String testJarPath, String xmlFilePath) {
try {
TestHelper.startContainer(principal, credentials);
ProfileServiceComponent serverComp = (ProfileServiceComponent) AppServerUtils
.getASComponentProxy(ProfileServiceComponent.class);
connection = serverComp.getEmsConnection();
remoteClientTest = new RemoteClientTest();
remoteClientTest.deployXmlExample(xmlFilePath);
remoteClientTest.deployCacheExample(testJarPath);
remoteClientTest.runTest();
PluginContainer.getInstance().getInventoryManager()
.executeServiceScanImmediately();
} catch (java.lang.IllegalStateException e) {
if (remoteClientTest != null) {
log.info("Object already deployed (" + e + ").");
remoteClientTest.runTest();
} else {
throw e;
}
} catch (Exception e) {
org.testng.Assert.fail("Failed to start PC...", e);
log.error("Failed to start PC...", e);
}
}
@AfterSuite(groups = "jbosscache3.test")
public void stop() {
try {
log.info("Stopping PC...");
remoteClientTest.runClientClean();
remoteClientTest.undeployCacheExample();
PluginContainer.getInstance().shutdown();
log.info("PC stopped.");
} catch (Exception e) {
log.error("Failed to stop PC...", e);
org.testng.Assert.fail("Failed to stop PC..", e);
}
}
}