/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.felix.ipojo.handler.jmx.test; import org.apache.felix.ipojo.ComponentInstance; import org.junit.Before; import org.junit.Test; import org.osgi.framework.Bundle; import javax.management.*; import java.lang.management.ManagementFactory; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertNotNull; import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.assertTrue; /** * Test the good behaviour of the EventAdminHandler. * * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a> */ public class TestMBean extends Common { /** * The MBean server used to access exposed MBeans. */ private MBeanServer m_server; /** * Initialize test. */ @Before public void setUp() { m_server = ManagementFactory.getPlatformMBeanServer(); for (Bundle bundle : bc.getBundles()) { System.out.println(bundle.getSymbolicName() + " - " + bundle.getState()); } } /** * Test the MBean exposed by the simple component, defined without * annotations and with the brand new JMX handler syntax. */ @Test public void testMBeanWithoutAnnotations() throws MalformedObjectNameException, IntrospectionException, InstanceNotFoundException, ListenerNotFoundException, ReflectionException, MBeanException { // Create an instance of the component ComponentInstance componentInstance = ipojoHelper .createComponentInstance("org.apache.felix.ipojo.handler.jmx.components.SimpleManagedComponent"); String instanceName = componentInstance.getInstanceName(); ObjectName objectName = new ObjectName( "org.apache.felix.ipojo.handler.jmx.components:type=org.apache.felix.ipojo.handler.jmx.components.SimpleManagedComponent,instance=" + instanceName); doTest(objectName); } /** * Test the MBean exposed by the simple component, defined without * annotations and with the deprecated JMX handler syntax. */ @Test public void testMBeanWithoutAnnotationsDeprecated() throws MalformedObjectNameException, IntrospectionException, InstanceNotFoundException, ListenerNotFoundException, ReflectionException, MBeanException { // Create an instance of the component ComponentInstance componentInstance = ipojoHelper .createComponentInstance("org.apache.felix.ipojo.handler.jmx.components.SimpleManagedComponentDeprecated"); String instanceName = componentInstance.getInstanceName(); ObjectName objectName = new ObjectName( "org.apache.felix.ipojo.handler.jmx.components:type=org.apache.felix.ipojo.handler.jmx.components.SimpleManagedComponent,instance=" + instanceName); doTest(objectName); } /** * Test the MBean exposed by the simple component, defined with * annotations. */ @Test public void testMBeanWithAnnotations() throws MalformedObjectNameException, IntrospectionException, InstanceNotFoundException, ListenerNotFoundException, ReflectionException, MBeanException { // Create an instance of the component ComponentInstance componentInstance = ipojoHelper .createComponentInstance("org.apache.felix.ipojo.handler.jmx.components.SimpleManagedComponentAnnotated"); String instanceName = componentInstance.getInstanceName(); ObjectName objectName = new ObjectName( "org.apache.felix.ipojo.handler.jmx.components:type=org.apache.felix.ipojo.handler.jmx.components.SimpleManagedComponentAnnotated,instance=" + instanceName); doTest(objectName); } /** * Test the MBean exposed by the simple component, defined with * annotations. */ @Test public void testMBeanWithAnnotationsDeprecated() throws MalformedObjectNameException, IntrospectionException, InstanceNotFoundException, ListenerNotFoundException, ReflectionException, MBeanException { // Create an instance of the component ComponentInstance componentInstance = ipojoHelper .createComponentInstance("org.apache.felix.ipojo.handler.jmx.components.SimpleManagedComponentAnnotatedDeprecated"); String instanceName = componentInstance.getInstanceName(); ObjectName objectName = new ObjectName( "org.apache.felix.ipojo.handler.jmx.components:type=org.apache.felix.ipojo.handler.jmx.components.SimpleManagedComponentAnnotatedDeprecated,instance=" + instanceName); doTest(objectName); } /** * Utility method used to test the MBean with the given objectName. * * @param objectName the objectName of the MBean to test. */ private void doTest(ObjectName objectName) throws IntrospectionException, InstanceNotFoundException, ReflectionException, MBeanException, ListenerNotFoundException { // Get the MBean from the platform MBean server MBeanInfo mBeanInfo = m_server.getMBeanInfo(objectName); ObjectInstance objectInstance = m_server.getObjectInstance(objectName); assertNotNull(mBeanInfo); assertNotNull(objectInstance); // Check that the property is exposed MBeanAttributeInfo[] attributes = mBeanInfo.getAttributes(); assertEquals(1, attributes.length); MBeanAttributeInfo attribute = attributes[0]; assertEquals("integer", attribute.getName()); assertEquals("int", attribute.getType()); assertTrue(attribute.isReadable()); assertFalse(attribute.isWritable()); // Check that both methods are exposed MBeanOperationInfo[] operations = mBeanInfo.getOperations(); assertEquals(2, operations.length); MBeanOperationInfo getOperation; MBeanOperationInfo setOperation; // Order is not important if (operations[0].getName().equals("getIntegerValue")) { getOperation = operations[0]; setOperation = operations[1]; } else { setOperation = operations[0]; getOperation = operations[1]; } // Check the 'get' operation assertEquals("getIntegerValue", getOperation.getName()); assertEquals("Get the value of the integer", getOperation.getDescription()); assertEquals("int", getOperation.getReturnType()); MBeanParameterInfo[] getOperationParams = getOperation.getSignature(); assertEquals(0, getOperationParams.length); // Check the 'set' operation assertEquals("setIntegerValue", setOperation.getName()); assertEquals("Set the value of the integer", setOperation.getDescription()); assertEquals("int", setOperation.getReturnType()); MBeanParameterInfo[] setOperationParams = setOperation.getSignature(); assertEquals(1, setOperationParams.length); assertEquals("int", setOperationParams[0].getType()); // Call the methods and test the result, also test notifications CustomNotificationListener listener = new CustomNotificationListener(); m_server.addNotificationListener(objectName, listener, null, null); int value1 = 123; int value2 = 456; m_server.invoke(objectName, "setIntegerValue", new Object[]{value1}, new String[]{"int"}); m_server.invoke(objectName, "setIntegerValue", new Object[]{value2}, new String[]{"int"}); int result = (Integer) m_server.invoke(objectName, "getIntegerValue", new Object[0], new String[0]); assertEquals(value2, result); m_server.removeNotificationListener(objectName, listener, null, null); //assertEquals(2, listener.getCount()); } /** * Custom listener used to count MBean notifications. * * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a> */ private class CustomNotificationListener implements NotificationListener { /** * Counter for the notifications. */ private int m_counter = 0; /** * Notified ! * * @param notification the notification * @param handback ignored */ public void handleNotification(Notification notification, Object handback) { m_counter++; } /** * Return the notification count of this listener. * * @return the notification count of this listener. */ public int getCount() { return m_counter; } } }