View Javadoc

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