View Javadoc
1   /*
2    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
3    * The software in this package is published under the terms of the CPAL v1.0
4    * license, a copy of which has been included with this distribution in the
5    * LICENSE.txt file.
6    */
7   package org.mule.module.scripting.expression;
8   
9   import static org.junit.Assert.assertEquals;
10  import static org.junit.Assert.assertFalse;
11  import static org.junit.Assert.assertNotNull;
12  import static org.junit.Assert.assertSame;
13  import static org.junit.Assert.assertTrue;
14  import static org.junit.Assert.fail;
15  
16  import org.mule.DefaultMuleMessage;
17  import org.mule.api.MuleMessage;
18  import org.mule.api.MuleRuntimeException;
19  import org.mule.tck.junit4.AbstractMuleContextTestCase;
20  import org.mule.tck.testmodels.fruit.Apple;
21  import org.mule.tck.testmodels.fruit.Banana;
22  import org.mule.tck.testmodels.fruit.FruitBowl;
23  
24  import java.util.Arrays;
25  
26  import groovyjarjarasm.asm.ClassWriter;
27  import groovyjarjarasm.asm.Opcodes;
28  import org.junit.Test;
29  
30  public class GroovyExpressionEvaluatorTestCase extends AbstractMuleContextTestCase
31  {
32  
33      @Test
34      public void testWithExpressions()
35      {
36          FruitBowl payload = createFruitBowl();
37          DefaultMuleMessage msg = new DefaultMuleMessage(payload, muleContext);
38          GroovyExpressionEvaluator e = new GroovyExpressionEvaluator();
39          e.setMuleContext(muleContext);
40          Object value = e.evaluate("payload.apple.washed", msg);
41          assertNotNull(value);
42          assertTrue(value instanceof Boolean);
43          assertTrue((Boolean) value);
44  
45          value = e.evaluate("message.payload.banana.bitten", msg);
46          assertNotNull(value);
47          assertTrue(value instanceof Boolean);
48          assertTrue((Boolean) value);
49      }
50  
51      @Test(expected = MuleRuntimeException.class)
52      public void testThrowsExceptionOnScriptError() throws Exception
53      {
54          FruitBowl payload = createFruitBowl();
55          DefaultMuleMessage msg = new DefaultMuleMessage(payload, muleContext);
56  
57          GroovyExpressionEvaluator e = new GroovyExpressionEvaluator();
58          e.setMuleContext(muleContext);
59          e.evaluate("unexistent", msg);
60      }
61  
62      @Test
63      public void testRegistrySyntax() throws Exception
64      {
65          Apple apple = new Apple();
66          muleContext.getRegistry().registerObject("name.with.dots", apple);
67          Object result = muleContext.getExpressionManager().evaluate(
68                  "#[groovy:registry.lookupObject('name.with.dots')]", null);
69  
70          assertNotNull(result);
71          assertSame(apple, result);
72  
73          // try various map-style access in groovy for simpler syntax
74          result = muleContext.getExpressionManager().evaluate(
75              "#[groovy:registry.'name.with.dots']", null);
76          assertNotNull(result);
77          assertSame(apple, result);
78  
79          result = muleContext.getExpressionManager().evaluate(
80                  "#[groovy:registry['name.with.dots']]", null);
81          assertNotNull(result);
82          assertSame(apple, result);
83  
84          result = muleContext.getExpressionManager().evaluate(
85                  "#[groovy:registry.'name.with.dots'.washed]", null);
86          assertNotNull(result);
87          assertEquals(false, result);
88      }
89  
90      @Test
91      public void testComplexExpressionLowLevelParsing() throws Exception
92      {
93          final GroovyExpressionEvaluator evaluator = new GroovyExpressionEvaluator();
94          evaluator.setMuleContext(muleContext);
95          muleContext.getExpressionManager().registerEvaluator(evaluator);
96  
97          MuleMessage msg = new DefaultMuleMessage(Arrays.asList(0, "test"), muleContext);
98          String result = muleContext.getExpressionManager().parse("#[groovy:payload[0]] - #[groovy:payload[1].toUpperCase()]",
99                                                                   msg);
100 
101         assertNotNull(result);
102         assertEquals("Expressions didn't evaluate correctly",
103                      "0 - TEST", result);
104     }
105 
106     /**
107      * See: MULE-4797 GroovyExpressionEvaluator script is unable to load user classes
108      * when used with hot deployment See:
109      */
110     @Test
111     public void testUseContextClassLoaderToResolveClasses() throws ClassNotFoundException
112     {
113         ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
114         try
115         {
116             Thread.currentThread().setContextClassLoader(new MyClassClassLoader());
117             assertFalse((Boolean) muleContext.getExpressionManager().evaluate(
118                 "groovy:payload instanceof MyClass", new DefaultMuleMessage("test", muleContext)));
119         }
120         catch (Exception e)
121         {
122             fail(e.getMessage());
123         }
124         finally
125         {
126             Thread.currentThread().setContextClassLoader(originalClassLoader);
127         }
128     }
129 
130     private FruitBowl createFruitBowl()
131     {
132         Apple apple = new Apple();
133         apple.wash();
134         Banana banana = new Banana();
135         banana.bite();
136 
137         return new FruitBowl(apple, banana);
138     }
139 
140     class MyClassClassLoader extends ClassLoader
141     {
142         @Override
143         protected Class<?> findClass(String name) throws ClassNotFoundException
144         {
145             if (name.equals("MyClass"))
146             {
147                 ClassWriter cw = new ClassWriter(true);
148                 cw.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC, "MyClass", null, "java/lang/Object", null);
149                 return defineClass(name, cw.toByteArray(), 0, cw.toByteArray().length);
150             }
151             else
152             {
153                 return super.findClass(name);
154             }
155         }
156     }
157 }