1
2
3
4
5
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
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
108
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 }