1
2
3
4
5
6
7
8
9
10
11 package org.mule.mule.model;
12
13 import org.mule.RequestContext;
14 import org.mule.api.MuleEventContext;
15 import org.mule.api.model.InvocationResult;
16 import org.mule.model.resolvers.ReflectionEntryPointResolver;
17 import org.mule.tck.AbstractMuleTestCase;
18 import org.mule.tck.testmodels.fruit.Apple;
19 import org.mule.tck.testmodels.fruit.Banana;
20 import org.mule.tck.testmodels.fruit.Fruit;
21 import org.mule.tck.testmodels.fruit.FruitBowl;
22 import org.mule.tck.testmodels.fruit.FruitLover;
23 import org.mule.tck.testmodels.fruit.Kiwi;
24 import org.mule.tck.testmodels.fruit.Orange;
25 import org.mule.tck.testmodels.fruit.WaterMelon;
26 import org.mule.transport.NullPayload;
27
28 import java.lang.reflect.Method;
29
30 import org.mockito.cglib.proxy.Enhancer;
31 import org.mockito.cglib.proxy.MethodInterceptor;
32 import org.mockito.cglib.proxy.MethodProxy;
33
34 public class ReflectionEntryPointResolverTestCase extends AbstractMuleTestCase
35 {
36
37 public void testExplicitMethodMatch() throws Exception
38 {
39 ReflectionEntryPointResolver resolver = new ReflectionEntryPointResolver();
40 InvocationResult result = resolver.invoke(new WaterMelon(), getTestEventContext("blah"));
41 assertEquals(result.getState(), InvocationResult.State.SUCCESSFUL);
42 }
43
44 public void testExplicitMethodMatchComplexObject() throws Exception
45 {
46 ReflectionEntryPointResolver resolver = new ReflectionEntryPointResolver();
47 InvocationResult result = resolver.invoke(new FruitBowl(), getTestEventContext(new FruitLover("Mmmm")));
48 assertEquals(result.getState(), InvocationResult.State.SUCCESSFUL);
49 }
50
51 public void testMethodMatchWithArguments() throws Exception
52 {
53 ReflectionEntryPointResolver resolver = new ReflectionEntryPointResolver();
54 InvocationResult result = resolver.invoke(new FruitBowl(), getTestEventContext(new Object[]{new Apple(), new Banana()}));
55 assertEquals(result.getState(), InvocationResult.State.SUCCESSFUL);
56 assertTrue(result.getResult() instanceof Fruit[]);
57
58 assertTrue(((Fruit[]) result.getResult())[0] instanceof Apple);
59 assertTrue(((Fruit[]) result.getResult())[1] instanceof Banana);
60 assertEquals("addAppleAndBanana", result.getMethodCalled());
61
62 result = resolver.invoke(new FruitBowl(), getTestEventContext(new Object[]{new Banana(), new Apple()}));
63 assertEquals(result.getState(), InvocationResult.State.SUCCESSFUL);
64 assertTrue(result.getResult() instanceof Fruit[]);
65 assertTrue(((Fruit[]) result.getResult())[0] instanceof Banana);
66 assertTrue(((Fruit[]) result.getResult())[1] instanceof Apple);
67 assertEquals("addBananaAndApple", result.getMethodCalled());
68 }
69
70 public void testExplicitMethodMatchSetArrayFail() throws Exception
71 {
72 ReflectionEntryPointResolver resolver = new ReflectionEntryPointResolver();
73 InvocationResult result = resolver.invoke(new FruitBowl(), getTestEventContext(new Fruit[]{new Apple(), new Orange()}));
74 assertEquals("Test should have failed because the arguments were not wrapped properly: ",
75 result.getState(), InvocationResult.State.FAILED);
76 }
77
78 public void testExplicitMethodMatchSetArrayPass() throws Exception
79 {
80 ReflectionEntryPointResolver resolver = new ReflectionEntryPointResolver();
81 InvocationResult result = resolver.invoke(new FruitBowl(), getTestEventContext(new Object[]{new Fruit[]{new Apple(), new Orange()}}));
82 assertEquals(result.getState(), InvocationResult.State.SUCCESSFUL);
83 }
84
85
86
87
88
89 public void testFailEntryPointMultiplePayloadMatches() throws Exception
90 {
91 ReflectionEntryPointResolver resolver = new ReflectionEntryPointResolver();
92 RequestContext.setEvent(getTestEvent("Hello"));
93 InvocationResult result = resolver.invoke(new MultiplePayloadsTestObject(), RequestContext.getEventContext());
94 assertEquals(result.getState(), InvocationResult.State.FAILED);
95 }
96
97 public void testMatchOnNoArgs() throws Exception
98 {
99 ReflectionEntryPointResolver resolver = new ReflectionEntryPointResolver();
100
101
102 InvocationResult result = resolver.invoke(new Kiwi(), getTestEventContext(NullPayload.getInstance()));
103 assertEquals(result.getState(), InvocationResult.State.FAILED);
104
105 resolver.setAcceptVoidMethods(true);
106 result = resolver.invoke(new Kiwi(), getTestEventContext(NullPayload.getInstance()));
107 assertEquals(result.getState(), InvocationResult.State.SUCCESSFUL);
108 assertEquals("bite", result.getMethodCalled());
109 }
110
111 public void testAnnotatedMethodOnProxyWithMethodSet() throws Exception
112 {
113 ReflectionEntryPointResolver resolver = new ReflectionEntryPointResolver();
114
115 Enhancer e = new Enhancer();
116 e.setSuperclass(WaterMelon.class);
117 e.setCallback(new DummyMethodCallback());
118 Object proxy = e.create();
119
120 MuleEventContext context = getTestEventContext("Blah");
121 InvocationResult result = resolver.invoke(proxy, context);
122 assertEquals(result.getState(), InvocationResult.State.SUCCESSFUL);
123 }
124
125 private class DummyMethodCallback implements MethodInterceptor
126 {
127 public DummyMethodCallback()
128 {
129 super();
130 }
131
132 public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable
133 {
134 System.out.println("before: " + method.getName());
135 Object r = proxy.invokeSuper(obj, args);
136 System.out.println("after: " + method.getName());
137
138
139 return r;
140 }
141 }
142 }