package org.jolokia.backend;
import java.lang.instrument.Instrumentation;
import java.lang.management.ManagementFactory;
import java.util.*;
import javax.management.*;
import org.jolokia.backend.executor.MBeanServerExecutor;
import org.jolokia.detector.ServerDetector;
import org.jolokia.detector.ServerHandle;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import static org.testng.Assert.*;
/**
* @author roland
* @since 07.03.13
*/
public class MBeanServersTest implements NotificationListener {
MBeanServer ownServer = MBeanServerFactory.newMBeanServer();
TestLookup lookup = new TestLookup();
private boolean notificationCalled = false;
@BeforeMethod
public void setup() {
notificationCalled = false;
}
@Test
public void simple() throws ListenerNotFoundException, InstanceNotFoundException {
MBeanServers servers = new MBeanServers(getTestDetectors(), this);
checkForServers(servers.getMBeanServers(), ManagementFactory.getPlatformMBeanServer(), ownServer);
assertFalse(notificationCalled);
servers.destroy();
try {
ManagementFactory.getPlatformMBeanServer().removeNotificationListener(MBeanServerDelegate.DELEGATE_NAME,servers);
fail("Exception should be thrown");
} catch (ListenerNotFoundException exp) {
}
}
@Test
public void withJolokiaMBeanServerFromStart() throws MalformedObjectNameException, NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException, InstanceNotFoundException {
registerJolokiaMBeanServer();
MBeanServers servers = new MBeanServers(getTestDetectors(),this);
checkForServers(servers.getMBeanServers(),ManagementFactory.getPlatformMBeanServer(), ownServer,lookup.getJolokiaMBeanServer());
assertFalse(notificationCalled);
assertEquals(lookup.getJolokiaMBeanServer(), servers.getJolokiaMBeanServer());
unregisterJolokiaMBeanServer();
servers.destroy();
}
@Test
public void withJolokiaMBeanServerFromKickingInLater() throws MalformedObjectNameException, NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException, InstanceNotFoundException {
MBeanServers servers = new MBeanServers(getTestDetectors(),this);
registerJolokiaMBeanServer();
MBeanServer jolokiaMBeanServer = lookup.getJolokiaMBeanServer();
checkForServers(servers.getMBeanServers(),ManagementFactory.getPlatformMBeanServer(), ownServer,jolokiaMBeanServer);
assertFalse(notificationCalled);
jolokiaMBeanServer.registerMBean(new Dummy(), new ObjectName("dummy:type=dummy"));
assertTrue(notificationCalled);
assertEquals(jolokiaMBeanServer, servers.getJolokiaMBeanServer());
jolokiaMBeanServer.unregisterMBean(new ObjectName("dummy:type=dummy"));
unregisterJolokiaMBeanServer();
servers.destroy();
}
@Test
public void dump() {
MBeanServers servers = new MBeanServers(getTestDetectors(),this);
String dump = servers.dump();
assertTrue(dump.contains("java.lang"));
assertTrue(dump.contains("type=Memory"));
}
private void checkForServers(Set<MBeanServerConnection> pFoundServers, MBeanServer... pToCheck) {
int count = 0;
for (MBeanServerConnection c : pFoundServers) {
for (MBeanServer s : pToCheck) {
if (c.equals(s)) {
count++;
}
}
}
assertEquals(count, pToCheck.length);
}
private void registerJolokiaMBeanServer() throws MalformedObjectNameException, NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException {
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
server.registerMBean(lookup,new ObjectName("jolokia:type=MBeanServer"));
}
private void unregisterJolokiaMBeanServer() throws MalformedObjectNameException, MBeanRegistrationException, InstanceNotFoundException {
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
server.unregisterMBean(new ObjectName("jolokia:type=MBeanServer"));
}
public void handleNotification(Notification notification, Object handback) {
notificationCalled = true;
}
private List<ServerDetector> getTestDetectors() {
List<ServerDetector> ret = new ArrayList<ServerDetector>();
ret.add(new ServerDetector() {
public ServerHandle detect(MBeanServerExecutor pMBeanServerExecutor) {
return null;
}
public void addMBeanServers(Set<MBeanServerConnection> pMBeanServers) {
pMBeanServers.add(ownServer);
}
public void jvmAgentStartup(Instrumentation instrumentation) {
}
});
return ret;
}
public static class TestLookup implements TestLookupMBean {
MBeanServer server = MBeanServerFactory.newMBeanServer();
public MBeanServer getJolokiaMBeanServer() {
return server;
}
}
public static interface TestLookupMBean {
MBeanServer getJolokiaMBeanServer();
}
public static class Dummy implements DummyMBean {}
public static interface DummyMBean {}
}