View Javadoc

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