package com.google.code.joto.eventrecorder.ext.calls; import java.lang.reflect.Method; import java.util.Date; import java.util.List; import junit.framework.TestCase; import com.google.code.joto.eventrecorder.RecordEventData; import com.google.code.joto.eventrecorder.RecordEventSummary; import com.google.code.joto.eventrecorder.impl.DefaultMemoryRecordEventStore; import com.google.code.joto.eventrecorder.spy.calls.EventMethodRequestData; import com.google.code.joto.eventrecorder.spy.calls.EventMethodResponseData; import com.google.code.joto.eventrecorder.spy.calls.MethodEventWriterProxyTransformer; import com.google.code.joto.eventrecorder.writer.RecordEventWriter; import com.google.code.joto.testobj.SerializableObj; /** * JUnit test for MethodEventWriterInvocationHandler * */ public class MethodEventWriterInvocationHandlerTest extends TestCase { public static IFoo createFooProxyRecorder(IFoo targetObjCallToRecord, RecordEventWriter eventWriter) { MethodEventWriterProxyTransformer proxyTransformer = new MethodEventWriterProxyTransformer(eventWriter, null); IFoo fooProxy = (IFoo) proxyTransformer.createProxy(new Class[] { IFoo.class }, targetObjCallToRecord); return fooProxy; } private static class TestData { IFoo impl; DefaultMemoryRecordEventStore eventStore; RecordEventWriter eventWriter; IFoo fooProxy; public TestData() { impl = new DefaultSerializableFoo(); eventStore = new DefaultMemoryRecordEventStore(); eventWriter = eventStore.getEventWriter(); fooProxy = createFooProxyRecorder(impl, eventWriter); } } public MethodEventWriterInvocationHandlerTest(String name) { super(name); } public void testFooSimple() { TestData d = new TestData(); IFoo fooProxy = d.fooProxy; String res = fooProxy.methSimple("test", 1); assertEquals("test1", res); List<RecordEventSummary> events = d.eventStore.getEvents(); assertEquals(2, events.size()); RecordEventSummary eventRequest = events.get(0); RecordEventData eventRequestData = d.eventStore.getEventData(eventRequest); assertNotNull(eventRequestData); EventMethodRequestData requestData = (EventMethodRequestData) eventRequestData.getObjectData(); assertNotNull(requestData); assertTrue(requestData.getExpr().getClass() == d.impl.getClass()); Method methodSimple; try { methodSimple = IFoo.class.getMethod("methSimple", new Class[] { String.class, int.class} ); } catch(Exception ex) { throw new RuntimeException(ex); } // assertSame(methodSimple, requestData.getMethod()); //wrong! assertEquals(methodSimple, requestData.getMethod()); assertEquals(2, requestData.getArguments().length); assertEquals("test", requestData.getArguments()[0]); assertEquals(Integer.valueOf(1), requestData.getArguments()[1]); RecordEventSummary eventResponse = events.get(1); RecordEventData eventResponseData = d.eventStore.getEventData(eventResponse); assertNotNull(eventResponseData); EventMethodResponseData responseData = (EventMethodResponseData) eventResponseData.getObjectData(); assertNotNull(responseData); assertEquals(eventRequest.getEventId(), eventResponse.getCorrelatedEventId()); assertEquals("test1", responseData.getResult()); assertNull(responseData.getException()); // call more.. fooProxy.methSimple("test", 1); assertEquals(4, d.eventStore.getEvents().size()); } public void testAllFooMethods() { TestData d = new TestData(); IFoo fooProxy = d.fooProxy; doCallFooMethods(fooProxy); } public static void doCallFooMethods(IFoo p) { p.methVoid(1); p.methVoidFromPrimitives(0, 0.0f, 0.0, '\0', false, (byte)0); p.methVoidFromPrimitives(1, 1.0f, 1.0, 'a', true, (byte)1); p.methVoidFromPrimitivesArrays( new int[] { 0, 1 }, new float[] { 0.0f, 1.0f }, new double[] { 0.0, 1.0 }, new char[] { '\0', 'a', '0', '\\', '\'' }, new boolean[] { false, true }, new byte[] { (byte)0, (byte)1 }); p.methVoidFromObj(new SerializableObj(), "a", new Date(), Integer.valueOf(1), new Float(1.0f), new Double(1.0)); p.methVoidFromObjArrays( new Object[] { null, new SerializableObj() }, new String[] { null, "", "a", "\"", "\\" }, new Date[] { null, new Date() } , new Integer[] { null, new Integer(0), new Integer(1) }, new Float[] { null, new Float(0.0f), new Float(1.0f) }, new Double[] { null, new Double(0.0), new Double(1.0) }); p.methInt(); p.methFloat(); p.methDouble(); p.methObj(); p.methString(); p.methObjArray(); p.methIntArray(); p.methFloatArray(); p.methStringArray(); } }