View Javadoc

1   /*
2    * $Id: ReflectionEntryPointResolverTestCase.java 20321 2010-11-24 15:21:24Z dfeist $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
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          //test that the correct methd was called
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       * Tests entrypoint discovery when there is more than one discoverable method
87       * with MuleEventContext parameter.
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         //This should fail because the Kiwi.bite() method has a void return type, and by default
101         //void methods are ignorred
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             //Add handler code here
139             return r;
140         }
141     }
142 }