/*
* JBoss, Home of Professional Open Source
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.test.profileservice.test;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryUsage;
import java.lang.management.RuntimeMXBean;
import java.lang.management.ThreadInfo;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.jboss.deployers.spi.management.ManagementView;
import org.jboss.managed.api.ComponentType;
import org.jboss.managed.api.ManagedComponent;
import org.jboss.managed.api.ManagedOperation;
import org.jboss.managed.api.ManagedProperty;
import org.jboss.managed.plugins.ManagedOperationMatcher;
import org.jboss.managed.plugins.jmx.ManagementFactoryUtils;
import org.jboss.metatype.api.types.SimpleMetaType;
import org.jboss.metatype.api.values.ArrayValue;
import org.jboss.metatype.api.values.CompositeValue;
import org.jboss.metatype.api.values.MetaValue;
import org.jboss.metatype.api.values.MetaValueFactory;
import org.jboss.metatype.api.values.SimpleValue;
import org.jboss.metatype.api.values.SimpleValueSupport;
/**
* Tests of the ManagedObjects corresponding to the server platform mbeans.
*
* @author Scott.Stark@jboss.org
* @version $Revision: 104372 $
*/
public class PlatformMBeanUnitTestCase extends AbstractProfileServiceTest
{
public PlatformMBeanUnitTestCase(String name)
{
super(name);
}
@Override
protected String getProfileName()
{
return "profileservice";
}
/**
* Test the ManagedObject for the ManagementFactory.CLASS_LOADING_MXBEAN_NAME
*/
public void testClassLoadingMXBean()
throws Exception
{
ManagementView mgtView = getManagementView();
ComponentType type = new ComponentType("MBean", "Platform");
ManagedComponent clMC = mgtView.getComponent(ManagementFactory.CLASS_LOADING_MXBEAN_NAME, type);
assertEquals(ManagementFactory.CLASS_LOADING_MXBEAN_NAME, clMC.getName());
Map<String, ManagedProperty> props = clMC.getProperties();
assertNotNull(props);
// totalLoadedClassCount
ManagedProperty totalLoadedClassCount = props.get("totalLoadedClassCount");
assertNotNull(totalLoadedClassCount);
assertEquals(SimpleMetaType.LONG_PRIMITIVE, totalLoadedClassCount.getMetaType());
assertEquals("the total number of classes loaded.", totalLoadedClassCount.getDescription());
SimpleValue totalLoadedClassCountSV = SimpleValue.class.cast(totalLoadedClassCount.getValue());
assertNotNull(totalLoadedClassCountSV);
getLog().debug("totalLoadedClassCountSV"+totalLoadedClassCountSV);
SimpleValue sv1 = SimpleValueSupport.wrap(new Long(100));
assertTrue("> 100 classes loaded", sv1.compareTo(totalLoadedClassCountSV) < 0);
// loadedClassCount
ManagedProperty loadedClassCount = props.get("loadedClassCount");
assertNotNull(loadedClassCount);
assertEquals(SimpleMetaType.INTEGER_PRIMITIVE, loadedClassCount.getMetaType());
assertEquals("the number of currently loaded classes.", loadedClassCount.getDescription());
SimpleValue loadedClassCountSV = SimpleValue.class.cast(loadedClassCount.getValue());
assertNotNull(loadedClassCountSV);
getLog().debug("loadedClassCountSV"+loadedClassCountSV);
assertTrue("> 100 classes loaded", sv1.compareTo(loadedClassCountSV) < 0);
// unloadedClassCount
ManagedProperty unloadedClassCount = props.get("unloadedClassCount");
assertNotNull(unloadedClassCount);
assertEquals(SimpleMetaType.LONG_PRIMITIVE, unloadedClassCount.getMetaType());
assertEquals("the total number of unloaded classes.", unloadedClassCount.getDescription());
SimpleValue unloadedClassCountSV = SimpleValue.class.cast(unloadedClassCount.getValue());
assertNotNull(unloadedClassCountSV);
getLog().debug("unloadedClassCountSV"+unloadedClassCountSV);
// verbose
ManagedProperty verbose = props.get("verbose");
assertNotNull(verbose);
assertEquals(SimpleMetaType.BOOLEAN_PRIMITIVE, verbose.getMetaType());
assertEquals("the verbose output flag for the class loading system.", verbose.getDescription());
SimpleValue verboseSV = SimpleValue.class.cast(verbose.getValue());
assertNotNull(verboseSV);
getLog().debug("verboseSV"+verboseSV);
}
public void testMemoryMXBean()
throws Exception
{
ManagementView mgtView = getManagementView();
ComponentType type = new ComponentType("MBean", "Platform");
ManagedComponent mo = mgtView.getComponent(ManagementFactory.MEMORY_MXBEAN_NAME, type);
assertNotNull(mo);
assertEquals(ManagementFactory.MEMORY_MXBEAN_NAME, mo.getName());
Map<String, ManagedProperty> props = mo.getProperties();
assertNotNull(props);
// heapMemoryUsage
ManagedProperty heapMemoryUsage = props.get("heapMemoryUsage");
assertNotNull(heapMemoryUsage);
assertEquals("object representing the heap memory usage.", heapMemoryUsage.getDescription());
CompositeValue heapMemoryUsageMV = CompositeValue.class.cast(heapMemoryUsage.getValue());
assertNotNull(heapMemoryUsageMV);
getLog().debug("heapMemoryUsageMV; "+heapMemoryUsageMV);
MemoryUsage heapMemoryUsageMU = ManagementFactoryUtils.unwrapMemoryUsage(heapMemoryUsageMV);
assertTrue(heapMemoryUsageMU.getInit() >= 0);
assertTrue(heapMemoryUsageMU.getUsed() >= 1000);
assertTrue(heapMemoryUsageMU.getMax() >= heapMemoryUsageMU.getCommitted());
assertTrue(heapMemoryUsageMU.getCommitted() >= heapMemoryUsageMU.getUsed());
// nonHeapMemoryUsage
ManagedProperty nonHeapMemoryUsage = props.get("nonHeapMemoryUsage");
assertNotNull(nonHeapMemoryUsage);
assertEquals("object representing the non-heap memory usage.", nonHeapMemoryUsage.getDescription());
CompositeValue nonHeapMemoryUsageMV = CompositeValue.class.cast(nonHeapMemoryUsage.getValue());
assertNotNull(nonHeapMemoryUsageMV);
getLog().debug("nonHeapMemoryUsageMV; "+nonHeapMemoryUsageMV);
MemoryUsage nonHeapMemoryUsageMU = ManagementFactoryUtils.unwrapMemoryUsage(nonHeapMemoryUsageMV);
assertTrue(nonHeapMemoryUsageMU.getInit() >= 0);
assertTrue(nonHeapMemoryUsageMU.getUsed() >= 1000);
// Ignore undefined nonHeap max memory, seen with IBM JDK 6
if(nonHeapMemoryUsageMU.getMax() != -1)
assertTrue(nonHeapMemoryUsageMU.getMax() >= nonHeapMemoryUsageMU.getCommitted());
assertTrue(nonHeapMemoryUsageMU.getCommitted() >= nonHeapMemoryUsageMU.getUsed());
// objectPendingFinalizationCount
ManagedProperty objectPendingFinalizationCount = props.get("objectPendingFinalizationCount");
assertNotNull(objectPendingFinalizationCount);
assertEquals("the approximate number objects for which finalization is pending.", objectPendingFinalizationCount.getDescription());
MetaValue objectPendingFinalizationCountMV = objectPendingFinalizationCount.getValue();
assertNotNull(objectPendingFinalizationCountMV);
getLog().debug("objectPendingFinalizationCountMV; "+objectPendingFinalizationCountMV);
// verbose
ManagedProperty verbose = props.get("verbose");
assertNotNull(verbose);
assertEquals(SimpleMetaType.BOOLEAN_PRIMITIVE, verbose.getMetaType());
assertEquals("the verbose output flag for the memory system.", verbose.getDescription());
SimpleValue verboseSV = SimpleValue.class.cast(verbose.getValue());
assertNotNull(verboseSV);
getLog().debug("verboseSV; "+verboseSV);
// The gc op
Set<ManagedOperation> ops = mo.getOperations();
assertNotNull(ops);
assertEquals("There is 1 op", 1, ops.size());
ManagedOperation gc = ops.iterator().next();
assertEquals("gc", gc.getName());
assertEquals("Runs the garbage collector", gc.getDescription());
gc.invoke();
}
public void testThreadMXBean()
throws Exception
{
ManagementView mgtView = getManagementView();
//mgtView.reloadProfile();
ComponentType type = new ComponentType("MBean", "Platform");
ManagedComponent mo = mgtView.getComponent(ManagementFactory.THREAD_MXBEAN_NAME, type);
assertNotNull(mo);
assertEquals(ManagementFactory.THREAD_MXBEAN_NAME, mo.getName());
// Test ThreadInfo MetaValue wrap/unwrap
MetaValueFactory metaValueFactory = MetaValueFactory.getInstance();
// Properties
ManagedProperty allThreadIds = mo.getProperty("allThreadIds");
assertNotNull(allThreadIds);
MetaValue allThreadIdsMV = allThreadIds.getValue();
assertTrue("allThreadIds is Array", allThreadIdsMV instanceof ArrayValue);
ArrayValue idsArray = ArrayValue.class.cast(allThreadIdsMV);
assertTrue(idsArray.getLength() > 10);
SimpleValue tid0SV = SimpleValue.class.cast(idsArray.getValue(0));
ManagedProperty currentThreadCpuTime = mo.getProperty("currentThreadCpuTime");
assertNotNull(currentThreadCpuTime);
long x = (Long) metaValueFactory.unwrap(currentThreadCpuTime.getValue());
assertTrue(x > 1000);
ManagedProperty currentThreadUserTime = mo.getProperty("currentThreadUserTime");
assertNotNull(currentThreadUserTime);
ManagedProperty daemonThreadCount = mo.getProperty("daemonThreadCount");
assertNotNull(daemonThreadCount);
x = (Integer) metaValueFactory.unwrap(daemonThreadCount.getValue());
assertTrue(x > 1);
ManagedProperty peakThreadCount = mo.getProperty("peakThreadCount");
assertNotNull(peakThreadCount);
x = (Integer) metaValueFactory.unwrap(peakThreadCount.getValue());
assertTrue(x > 10);
ManagedProperty threadCount = mo.getProperty("threadCount");
assertNotNull(threadCount);
x = (Integer) metaValueFactory.unwrap(threadCount.getValue());
assertTrue(x > 10);
ManagedProperty totalStartedThreadCount = mo.getProperty("totalStartedThreadCount");
assertNotNull(totalStartedThreadCount);
x = (Long) metaValueFactory.unwrap(totalStartedThreadCount.getValue());
assertTrue(x > 10);
ManagedProperty currentThreadCpuTimeSupported = mo.getProperty("currentThreadCpuTimeSupported");
assertNotNull(currentThreadCpuTimeSupported);
Boolean flag = (Boolean) metaValueFactory.unwrap(currentThreadCpuTimeSupported.getValue());
assertNotNull(flag);
ManagedProperty threadContentionMonitoringEnabled = mo.getProperty("threadContentionMonitoringEnabled");
assertNotNull(threadContentionMonitoringEnabled);
flag = (Boolean) metaValueFactory.unwrap(threadContentionMonitoringEnabled.getValue());
assertNotNull(flag);
ManagedProperty threadContentionMonitoringSupported = mo.getProperty("threadContentionMonitoringSupported");
assertNotNull(threadContentionMonitoringSupported);
flag = (Boolean) metaValueFactory.unwrap(threadContentionMonitoringSupported.getValue());
assertNotNull(flag);
ManagedProperty threadCpuTimeEnabled = mo.getProperty("threadCpuTimeEnabled");
assertNotNull(threadCpuTimeEnabled);
flag = (Boolean) metaValueFactory.unwrap(threadCpuTimeEnabled.getValue());
assertNotNull(flag);
ManagedProperty threadCpuTimeSupported = mo.getProperty("threadCpuTimeSupported");
assertNotNull(threadCpuTimeSupported);
flag = (Boolean) metaValueFactory.unwrap(threadCpuTimeSupported.getValue());
assertNotNull(flag);
// Ops
Set<ManagedOperation> ops = mo.getOperations();
log.debug(ops);
String javaSpecVersion = System.getProperty("java.specification.version");
if (javaSpecVersion.equals("1.5") || javaSpecVersion.equals("5.0"))
assertEquals(mo + " has wrong number of ManagedOperations.", 8, ops.size());
else if (javaSpecVersion.equals("1.6") || javaSpecVersion.equals("6.0"))
assertEquals(mo + " has wrong number of ManagedOperations.", 11, ops.size());
ManagedOperation getThreadInfo = ManagedOperationMatcher.findOperation(ops,
"getThreadInfo", SimpleMetaType.LONG_PRIMITIVE, SimpleMetaType.INTEGER_PRIMITIVE);
assertNotNull("getThreadInfo", getThreadInfo);
log.debug(getThreadInfo);
MetaValue tid0InfoMV = getThreadInfo.invoke(tid0SV);
assertNotNull(tid0InfoMV);
assertTrue(tid0InfoMV instanceof CompositeValue);
log.debug(tid0InfoMV);
CompositeValue tid0InfoCV = (CompositeValue) tid0InfoMV;
ThreadInfo tid0Info = ManagementFactoryUtils.unwrapThreadInfo(tid0InfoCV);
log.debug(tid0Info);
}
public void testRuntimeMXBean()
throws Exception
{
ManagementView mgtView = getManagementView();
ComponentType type = new ComponentType("MBean", "Platform");
ManagedComponent mo = mgtView.getComponent(ManagementFactory.RUNTIME_MXBEAN_NAME, type);
assertNotNull(mo);
assertEquals(ManagementFactory.RUNTIME_MXBEAN_NAME, mo.getName());
RuntimeMXBean mbean = ManagementFactory.getRuntimeMXBean();
MetaValueFactory metaValueFactory = MetaValueFactory.getInstance();
ManagedProperty bootClassPath = mo.getProperty("bootClassPath");
String x = (String) metaValueFactory.unwrap(bootClassPath.getValue());
assertTrue(x.length() > 0);
ManagedProperty classPath = mo.getProperty("classPath");
x = (String) metaValueFactory.unwrap(classPath.getValue());
assertTrue(x.length() > 0);
ManagedProperty libraryPath = mo.getProperty("libraryPath");
x = (String) metaValueFactory.unwrap(libraryPath.getValue());
assertTrue(x.length() > 0);
ManagedProperty managementSpecVersion = mo.getProperty("managementSpecVersion");
x = (String) metaValueFactory.unwrap(managementSpecVersion.getValue());
assertEquals(mbean.getManagementSpecVersion(), x);
ManagedProperty specName = mo.getProperty("specName");
x = (String) metaValueFactory.unwrap(specName.getValue());
assertEquals(mbean.getSpecName(), x);
ManagedProperty specVendor = mo.getProperty("specVendor");
x = (String) metaValueFactory.unwrap(specVendor.getValue());
assertEquals(mbean.getSpecVendor(), x);
ManagedProperty specVersion = mo.getProperty("specVersion");
x = (String) metaValueFactory.unwrap(specVersion.getValue());
assertEquals(mbean.getSpecVersion(), x);
ManagedProperty vmName = mo.getProperty("vmName");
x = (String) metaValueFactory.unwrap(vmName.getValue());
assertEquals(mbean.getVmName(), x);
ManagedProperty vmVendor = mo.getProperty("vmVendor");
x = (String) metaValueFactory.unwrap(vmVendor.getValue());
assertEquals(mbean.getVmVendor(), x);
ManagedProperty vmVersion = mo.getProperty("vmVersion");
x = (String) metaValueFactory.unwrap(vmVersion.getValue());
assertEquals(mbean.getVmVersion(), x);
ManagedProperty startTime = mo.getProperty("startTime");
long time = (Long) metaValueFactory.unwrap(startTime.getValue());
assertTrue(time > 10000000);
ManagedProperty uptime = mo.getProperty("uptime");
time = (Long) metaValueFactory.unwrap(uptime.getValue());
ManagedProperty inputArguments = mo.getProperty("inputArguments");
List<String> ls = (List<String>) metaValueFactory.unwrap(inputArguments.getValue());
assertTrue(ls.size() > 0);
ManagedProperty systemProperties = mo.getProperty("systemProperties");
MetaValue sysPropsMV = systemProperties.getValue();
Map<String, String> sysProps = (Map<String, String>) metaValueFactory.unwrap(sysPropsMV);
log.debug(sysProps);
assertNotNull(sysProps.get("jboss.home.dir"));
assertTrue(sysProps.get("jboss.home.dir") instanceof String);
assertNotNull(sysProps.get("jboss.server.home.dir"));
assertNotNull(sysProps.get("jboss.common.lib.url"));
assertNotNull(sysProps.get("jboss.server.base.url"));
}
public void testOperatingSystemMXBean()
throws Exception
{
ManagementView mgtView = getManagementView();
ComponentType type = new ComponentType("MBean", "Platform");
ManagedComponent mo = mgtView.getComponent(ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME, type);
assertNotNull(mo);
assertEquals(ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME, mo.getName());
ManagedProperty arch = mo.getProperty("arch");
assertNotNull(arch);
ManagedProperty availableProcessors = mo.getProperty("availableProcessors");
assertNotNull(availableProcessors);
SimpleValue procsSV = (SimpleValue) availableProcessors.getValue();
Integer procs = (Integer) procsSV.getValue();
assertTrue(procs.intValue() >= 1);
ManagedProperty version = mo.getProperty("version");
assertNotNull(version);
log.debug(version.getValue());
}
}