// // ======================================================================== // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // and Apache License v2.0 which accompanies this distribution. // // The Eclipse Public License is available at // http://www.eclipse.org/legal/epl-v10.html // // The Apache License v2.0 is available at // http://www.opensource.org/licenses/apache2.0.php // // You may elect to redistribute this code under either of these licenses. // ======================================================================== // package org.eclipse.jetty.jmx; import java.lang.management.ManagementFactory; import javax.management.Attribute; import javax.management.MBeanInfo; import javax.management.MBeanOperationInfo; import javax.management.MBeanParameterInfo; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.thread.QueuedThreadPool; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import com.acme.Derived; public class ObjectMBeanTest { private static final Logger LOG = Log.getLogger(ObjectMBeanTest.class); private static MBeanContainer container; @Before public void before() throws Exception { container = new MBeanContainer(ManagementFactory.getPlatformMBeanServer()); } @After public void after() throws Exception { container.destroy(); container = null; } /* * this test uses the com.acme.Derived test classes */ @Test public void testDerivedAttributes() throws Exception { Derived derived = new Derived(); ObjectMBean mbean = (ObjectMBean)ObjectMBean.mbeanFor(derived); ObjectMBean managed = (ObjectMBean)ObjectMBean.mbeanFor(derived.getManagedInstance()); mbean.setMBeanContainer(container); managed.setMBeanContainer(container); container.beanAdded(null,derived); container.beanAdded(null,derived.getManagedInstance()); MBeanInfo toss = managed.getMBeanInfo(); Assert.assertNotNull(mbean.getMBeanInfo()); MBeanInfo info = mbean.getMBeanInfo(); Assert.assertEquals("name does not match","com.acme.Derived",info.getClassName()); Assert.assertEquals("description does not match","Test the mbean stuff",info.getDescription()); // for ( MBeanAttributeInfo i : info.getAttributes()) // { // LOG.debug(i.toString()); // } /* * 2 attributes from lifecycle and 2 from Derived and 1 from MBean */ Assert.assertEquals("attribute count does not match",6,info.getAttributes().length); Assert.assertEquals("attribute values does not match","Full Name",mbean.getAttribute("fname")); mbean.setAttribute(new Attribute("fname","Fuller Name")); Assert.assertEquals("set attribute value does not match","Fuller Name",mbean.getAttribute("fname")); Assert.assertEquals("proxy attribute values do not match","goop",mbean.getAttribute("goop")); // Thread.sleep(100000); } @Test public void testDerivedOperations() throws Exception { Derived derived = new Derived(); ObjectMBean mbean = (ObjectMBean)ObjectMBean.mbeanFor(derived); mbean.setMBeanContainer(container); container.beanAdded(null,derived); MBeanInfo info = mbean.getMBeanInfo(); Assert.assertEquals("operation count does not match",5,info.getOperations().length); MBeanOperationInfo[] opinfos = info.getOperations(); boolean publish = false; boolean doodle = false; boolean good = false; for (int i = 0; i < opinfos.length; ++i) { MBeanOperationInfo opinfo = opinfos[i]; if ("publish".equals(opinfo.getName())) { publish = true; Assert.assertEquals("description doesn't match","publish something",opinfo.getDescription()); } if ("doodle".equals(opinfo.getName())) { doodle = true; Assert.assertEquals("description doesn't match","Doodle something",opinfo.getDescription()); MBeanParameterInfo[] pinfos = opinfo.getSignature(); Assert.assertEquals("parameter description doesn't match","A description of the argument",pinfos[0].getDescription()); Assert.assertEquals("parameter name doesn't match","doodle",pinfos[0].getName()); } // This is a proxied operation on the JMX wrapper if ("good".equals(opinfo.getName())) { good = true; Assert.assertEquals("description does not match","test of proxy operations",opinfo.getDescription()); Assert.assertEquals("execution contexts wrong","not bad",mbean.invoke("good",new Object[] {},new String[] {})); } } Assert.assertTrue("publish operation was not not found",publish); Assert.assertTrue("doodle operation was not not found",doodle); Assert.assertTrue("good operation was not not found",good); } @Test public void testDerivedObjectAttributes() throws Exception { Derived derived = new Derived(); ObjectMBean mbean = (ObjectMBean)ObjectMBean.mbeanFor(derived); ObjectMBean managed = (ObjectMBean)ObjectMBean.mbeanFor(derived.getManagedInstance()); mbean.setMBeanContainer(container); managed.setMBeanContainer(container); Assert.assertNotNull(mbean.getMBeanInfo()); container.beanAdded(null,derived); container.beanAdded(null,derived.getManagedInstance()); container.beanAdded(null,mbean); container.beanAdded(null,managed); // Managed managedInstance = (Managed)mbean.getAttribute("managedInstance"); // Assert.assertNotNull(managedInstance); // Assert.assertEquals("managed instance returning nonsense", "foo", managedInstance.getManaged()); } @Test @Ignore("ignore, used in testing jconsole atm") public void testThreadPool() throws Exception { Derived derived = new Derived(); ObjectMBean mbean = (ObjectMBean)ObjectMBean.mbeanFor(derived); ObjectMBean managed = (ObjectMBean)ObjectMBean.mbeanFor(derived.getManagedInstance()); mbean.setMBeanContainer(container); managed.setMBeanContainer(container); QueuedThreadPool qtp = new QueuedThreadPool(); ObjectMBean bqtp = (ObjectMBean)ObjectMBean.mbeanFor(qtp); bqtp.getMBeanInfo(); container.beanAdded(null,derived); container.beanAdded(null,derived.getManagedInstance()); container.beanAdded(null,mbean); container.beanAdded(null,managed); container.beanAdded(null,qtp); Thread.sleep(10000000); } @Test public void testMethodNameMining() throws Exception { ObjectMBean mbean = new ObjectMBean(new Derived()); Assert.assertEquals("fullName",mbean.toVariableName("getFullName")); Assert.assertEquals("fullName",mbean.toVariableName("getfullName")); Assert.assertEquals("fullName",mbean.toVariableName("isFullName")); Assert.assertEquals("fullName",mbean.toVariableName("isfullName")); Assert.assertEquals("fullName",mbean.toVariableName("setFullName")); Assert.assertEquals("fullName",mbean.toVariableName("setfullName")); Assert.assertEquals("fullName",mbean.toVariableName("FullName")); Assert.assertEquals("fullName",mbean.toVariableName("fullName")); } }