/* * (c) Rob Gordon 2006 */ package org.oddjob.jmx.handlers; import java.util.Properties; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; import junit.framework.TestCase; import org.apache.commons.beanutils.DynaBean; import org.apache.commons.beanutils.DynaClass; import org.mockito.Mockito; import org.oddjob.MockStateful; import org.oddjob.Stateful; import org.oddjob.framework.JobDestroyedException; import org.oddjob.input.InputRequest; import org.oddjob.jmx.RemoteOperation; import org.oddjob.jmx.client.ClientSession; import org.oddjob.jmx.client.MockClientSession; import org.oddjob.jmx.client.MockClientSideToolkit; import org.oddjob.jmx.server.MockServerContext; import org.oddjob.jmx.server.MockServerSession; import org.oddjob.jmx.server.MockServerSideToolkit; import org.oddjob.jmx.server.ServerContext; import org.oddjob.jmx.server.ServerInterfaceHandler; import org.oddjob.jmx.server.ServerLoopBackException; import org.oddjob.jmx.server.ServerSession; import org.oddjob.jobs.tasks.BasicTask; import org.oddjob.jobs.tasks.Task; import org.oddjob.jobs.tasks.TaskException; import org.oddjob.jobs.tasks.TaskExecutor; import org.oddjob.jobs.tasks.TaskState; import org.oddjob.jobs.tasks.TaskView; import org.oddjob.state.JobState; import org.oddjob.state.StateEvent; import org.oddjob.state.StateListener; public class TaskExecutorHandlerFactoryTest extends TestCase { private class OurTaskView extends MockStateful implements TaskView { StateListener l; public void addStateListener(StateListener listener) { assertNull(l); l = listener; l.jobStateChange(new StateEvent(this, JobState.READY)); } public void removeStateListener(StateListener listener) { assertNotNull(l); l = null; } @Override public Object getTaskResponse() { return "Apples"; } } private class OurTaskExecutor implements TaskExecutor { @Override public InputRequest[] getParameterInfo() { return new InputRequest[0]; } @Override public TaskView execute(Task task) throws TaskException { return new OurTaskView(); } } private class MockTaskViewProxy implements Stateful, DynaBean { private StateListener stateListener; @Override public boolean contains(String arg0, String arg1) { throw new RuntimeException("Unexpected"); } @Override public Object get(String property) { assertEquals("taskResponse", property); return "Hello"; } @Override public Object get(String arg0, int arg1) { throw new RuntimeException("Unexpected"); } @Override public Object get(String arg0, String arg1) { throw new RuntimeException("Unexpected"); } @Override public DynaClass getDynaClass() { throw new RuntimeException("Unexpected"); } @Override public void remove(String arg0, String arg1) { throw new RuntimeException("Unexpected"); } @Override public void set(String arg0, Object arg1) { throw new RuntimeException("Unexpected"); } @Override public void set(String arg0, int arg1, Object arg2) { throw new RuntimeException("Unexpected"); } @Override public void set(String arg0, String arg1, Object arg2) { throw new RuntimeException("Unexpected"); } @Override public void addStateListener(StateListener listener) throws JobDestroyedException { stateListener = listener; } @Override public void removeStateListener(StateListener listener) { stateListener = null; } @Override public StateEvent lastStateEvent() { return new StateEvent(this, TaskState.INPROGRESS); } } private class OurClientToolkit extends MockClientSideToolkit { ServerInterfaceHandler server; MockTaskViewProxy mockTaskViewProxy = new MockTaskViewProxy(); @SuppressWarnings("unchecked") @Override public <T> T invoke(RemoteOperation<T> remoteOperation, Object... args) throws Throwable { return (T) server.invoke(remoteOperation, args); } @Override public ClientSession getClientSession() { return new MockClientSession() { @Override public Object create(ObjectName objectName) { return mockTaskViewProxy; } }; } } private class OurServerSideToolkit extends MockServerSideToolkit { @Override public ServerSession getServerSession() { return new MockServerSession() { @Override public ObjectName createMBeanFor(Object child, ServerContext childContext) { try { return new ObjectName("Foo:name=Foo"); } catch (MalformedObjectNameException e) { throw new RuntimeException(e); } } }; } @Override public ServerContext getContext() { return new MockServerContext() { @Override public ServerContext addChild(Object child) throws ServerLoopBackException { return this; } }; } } public void testExecuteTaskAndAddRemoveListenerToView() throws Exception { TaskExecutorHandlerFactory test = new TaskExecutorHandlerFactory(); OurTaskExecutor taskExecutor = new OurTaskExecutor(); OurServerSideToolkit serverToolkit = new OurServerSideToolkit(); // create the handler ServerInterfaceHandler serverHandler = test.createServerHandler( taskExecutor, serverToolkit); OurClientToolkit clientToolkit = new OurClientToolkit(); TaskExecutor local = new TaskExecutorHandlerFactory.ClientTaskExecutorHandlerFactory( ).createClientHandler(null, clientToolkit); clientToolkit.server = serverHandler; assertNotNull(local.getParameterInfo()); TaskView view = local.execute(new BasicTask(new Properties())); view.addStateListener(Mockito.mock(StateListener.class)); assertNotNull(clientToolkit.mockTaskViewProxy.stateListener); view.removeStateListener(Mockito.mock(StateListener.class)); assertNull(clientToolkit.mockTaskViewProxy.stateListener); assertEquals(TaskState.INPROGRESS, view.lastStateEvent().getState()); assertEquals("Hello", view.getTaskResponse()); } }