package org.oddjob.jmx.server; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.HashSet; import java.util.Set; import junit.framework.TestCase; import org.oddjob.arooa.ArooaSession; import org.oddjob.arooa.MockClassResolver; import org.oddjob.arooa.registry.MockBeanRegistry; import org.oddjob.arooa.registry.ServerId; import org.oddjob.arooa.standard.StandardArooaSession; import org.oddjob.jmx.RemoteOddjobBean; import org.oddjob.jmx.Utils; import org.oddjob.jmx.client.ClientHandlerResolver; import org.oddjob.jmx.handlers.RunnableHandlerFactory; import org.oddjob.util.MockThreadManager; public class ObjectMBeanServerInfoTest extends TestCase { private class OurClassResolver extends MockClassResolver { @Override public Class<?> findClass(String className) { try { return Class.forName(className); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } } private class OurServerSession extends MockServerSession { ArooaSession session = new StandardArooaSession(); @Override public ArooaSession getArooaSession() { return session; } } private class OurDirectory extends MockBeanRegistry { @Override public String getIdFor(Object component) { return "x"; } } /** * Test creating and registering an OddjobMBean. */ public void testServerInfo() throws Exception { Runnable myJob = new Runnable() { public void run() { } }; ServerInterfaceManagerFactoryImpl imf = new ServerInterfaceManagerFactoryImpl(); imf.addServerHandlerFactories( new ServerInterfaceHandlerFactory[] { new RunnableHandlerFactory()}); ServerModel sm = new ServerModelImpl( new ServerId("//test"), new MockThreadManager(), imf); ServerContext serverContext = new ServerContextImpl( myJob, sm, new OurDirectory()); final OddjobMBean ojmb = new OddjobMBean( myJob, OddjobMBeanFactory.objectName(0), new OurServerSession(), serverContext); RemoteOddjobBean rob = (RemoteOddjobBean) Proxy.newProxyInstance( getClass().getClassLoader(), new Class[] { RemoteOddjobBean.class }, new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return ojmb.invoke(method.getName(), args, Utils.classArray2StringArray(method.getParameterTypes())); } }); ServerInfo info = rob.serverInfo(); assertEquals("url", "//test:x", info.getAddress().toString()); Set<Class<?>> interfaces = new HashSet<Class<?>>(); for (int i = 0; i < info.getClientResolvers().length; ++i) { ClientHandlerResolver<?> resolver = info.getClientResolvers()[i]; interfaces.add(resolver.resolve(new OurClassResolver()).interfaceClass()); } assertTrue("runnable", interfaces.contains(Runnable.class)); } }