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.test.transformers;
8   
9   import org.mule.DefaultMuleMessage;
10  import org.mule.api.MuleMessage;
11  import org.mule.api.transformer.TransformerException;
12  import org.mule.expression.ExpressionConfig;
13  import org.mule.expression.transformers.ExpressionArgument;
14  import org.mule.expression.transformers.ExpressionTransformer;
15  import org.mule.tck.junit4.AbstractMuleContextTestCase;
16  
17  import groovyjarjarasm.asm.ClassWriter;
18  import groovyjarjarasm.asm.Opcodes;
19  import org.junit.Test;
20  
21  import static org.junit.Assert.assertEquals;
22  import static org.junit.Assert.assertFalse;
23  import static org.junit.Assert.assertTrue;
24  import static org.junit.Assert.fail;
25  
26  public class ExpressionTransformerTestCase extends AbstractMuleContextTestCase
27  {
28  
29      /**
30       * See: MULE-4797 GroovyExpressionEvaluator script is unable to load user classes
31       * when used with hot deployment.
32       * 
33       * @throws TransformerException
34       */
35      @Test
36      public void testExpressionEvaluationClassLoader() throws ClassNotFoundException, TransformerException
37      {
38          ExpressionTransformer transformer = new ExpressionTransformer();
39          transformer.setMuleContext(muleContext);
40          transformer.addArgument(new ExpressionArgument("test", new ExpressionConfig(
41              "payload instanceof MyClass", "groovy", null), false));
42  
43          ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
44          try
45          {
46              Thread.currentThread().setContextClassLoader(new MyClassClassLoader());
47              transformer.initialise();
48          }
49          catch (Exception e)
50          {
51              fail(e.getMessage());
52          }
53          finally
54          {
55              Thread.currentThread().setContextClassLoader(originalClassLoader);
56          }
57  
58          assertFalse((Boolean) transformer.transform("test"));
59      }
60  
61      @Test
62      public void testNullPayloadIsConsideredAsNullResult() throws Exception
63      {
64          ExpressionTransformer transformer = new ExpressionTransformer();
65          transformer.setMuleContext(muleContext);
66          transformer.setReturnSourceIfNull(true);
67          ExpressionConfig config = new ExpressionConfig("null", "groovy", null);
68          ExpressionArgument argument = new ExpressionArgument("test", config, false);
69          argument.setMuleContext(muleContext);
70          transformer.addArgument(argument);
71  
72          MuleMessage message = new DefaultMuleMessage("Test", muleContext);
73          Object result = transformer.transformMessage(message, null);
74          assertTrue(result instanceof MuleMessage);
75          MuleMessage transformedMessage = (MuleMessage) result;
76  
77          assertEquals("Test", transformedMessage.getPayload());
78  
79      }
80  
81      class MyClassClassLoader extends ClassLoader
82      {
83          @Override
84          protected Class<?> findClass(String name) throws ClassNotFoundException
85          {
86              if (name.equals("MyClass"))
87              {
88                  ClassWriter cw = new ClassWriter(true);
89                  cw.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC, "MyClass", null, "java/lang/Object", null);
90                  return defineClass(name, cw.toByteArray(), 0, cw.toByteArray().length);
91              }
92              else
93              {
94                  return super.findClass(name);
95              }
96          }
97      }
98  }