blob: 0e52bf669188db119e1b11724adef18225a63871 [file] [log] [blame]
/*
* 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;
}
}
}