1   /*
2    * $Id: MuleEventTestCase.java 11728 2008-05-13 07:31:11Z dirk.olmes $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.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.mule;
12  
13  import org.mule.MuleManager;
14  import org.mule.impl.MuleDescriptor;
15  import org.mule.impl.MuleEvent;
16  import org.mule.impl.MuleMessage;
17  import org.mule.impl.RequestContext;
18  import org.mule.impl.ResponseOutputStream;
19  import org.mule.impl.endpoint.MuleEndpointURI;
20  import org.mule.tck.AbstractMuleTestCase;
21  import org.mule.tck.testmodels.fruit.Apple;
22  import org.mule.tck.testmodels.fruit.Orange;
23  import org.mule.transformers.AbstractTransformer;
24  import org.mule.transformers.simple.ByteArrayToObject;
25  import org.mule.transformers.simple.SerializableToByteArray;
26  import org.mule.umo.UMOEvent;
27  import org.mule.umo.UMOMessage;
28  import org.mule.umo.endpoint.UMOEndpoint;
29  import org.mule.umo.security.UMOCredentials;
30  import org.mule.umo.transformer.TransformerException;
31  import org.mule.umo.transformer.UMOTransformer;
32  
33  import java.io.Serializable;
34  import java.util.HashMap;
35  import java.util.Properties;
36  
37  public class MuleEventTestCase extends AbstractMuleTestCase
38  {
39  
40      public void testEventInitialise() throws Exception
41      {
42          String data = "Test Data";
43          MuleDescriptor descriptor = getTestDescriptor("orange", Orange.class.getName());
44  
45          MuleEvent event = (MuleEvent)getTestEvent(data, descriptor);
46  
47          assertEquals("Event data should equal " + data, data, event.getMessage().getPayload());
48          assertEquals("Event data should equal " + data, data, event.getMessageAsString(null));
49          assertEquals("Event data should equal " + data, data, event.getTransformedMessage());
50          assertEquals("Event data should be a byte array 9 bytes in length", 9, event
51              .getTransformedMessageAsBytes().length);
52  
53          assertEquals("Event data should be a byte array 9 bytes in length", 9,
54              event.getMessageAsBytes().length);
55          assertEquals("Event data should equal " + data, data, event.getSource());
56  
57          assertEquals("MuleBeanPropertiesRule", event.getMessage().getProperty("MuleBeanPropertiesRule",
58              "MuleBeanPropertiesRule"));
59          event.getMessage().setProperty("Test", "Test1");
60  
61          assertFalse(event.getMessage().getPropertyNames().isEmpty());
62          assertEquals("bla2", event.getMessage().getProperty("bla2", "bla2"));
63          assertEquals("Test1", event.getMessage().getProperty("Test"));
64          assertEquals("Test1", event.getMessage().getProperty("Test", "bla2"));
65          assertNotNull(event.getId());
66      }
67  
68      public void testEventTransformer() throws Exception
69      {
70          String data = "Test Data";
71          UMOEndpoint endpoint = getTestEndpoint("Test", UMOEndpoint.ENDPOINT_TYPE_SENDER);
72          endpoint.setTransformer(new TestEventTransformer());
73          UMOEvent event = getTestEvent(data, endpoint);
74  
75          assertEquals("Event data should equal " + data, data, event.getMessage().getPayload());
76          assertEquals("Event data should equal " + data, data, event.getMessageAsString(null));
77          assertEquals("Event data should equal 'Transformed Test Data'", "Transformed Test Data", event
78              .getTransformedMessage());
79          assertEquals("Event data should be a byte array 28 bytes in length", 21, event
80              .getTransformedMessageAsBytes().length);
81      }
82  
83      public void testEventRewrite() throws Exception
84      {
85          String data = "Test Data";
86          UMOEndpoint endpoint = getTestEndpoint("Test", UMOEndpoint.ENDPOINT_TYPE_SENDER);
87          endpoint.setTransformer(new TestEventTransformer());
88          MuleEvent event = new MuleEvent(new MuleMessage(data), endpoint,
89              getTestSession(getTestComponent(getTestDescriptor("apple", Apple.class.getName()))), true,
90              new ResponseOutputStream(System.out));
91  
92          assertNotNull(event.getId());
93          assertNotNull(event.getSession());
94          assertNotNull(event.getEndpoint());
95          assertNotNull(event.getOutputStream());
96          assertNotNull(event.getMessage());
97          assertEquals(data, event.getMessageAsString(null));
98  
99          UMOEvent event2 = new MuleEvent(new MuleMessage("New Data"), event);
100         assertNotNull(event2.getId());
101         assertEquals(event.getId(), event2.getId());
102         assertNotNull(event2.getSession());
103         assertNotNull(event2.getEndpoint());
104         assertNotNull(event2.getOutputStream());
105         assertNotNull(event2.getMessage());
106         assertEquals("New Data", event2.getMessageAsString(null));
107 
108     }
109 
110     public void testProperties() throws Exception
111     {
112         UMOEvent prevEvent;
113         Properties props;
114         UMOMessage msg;
115         UMOEndpoint endpoint;
116         UMOEvent event;
117 
118         // nowhere
119         prevEvent = getTestEvent("payload");
120         props = new Properties();
121         msg = new MuleMessage("payload", props);
122         endpoint = getTestEndpoint("Test", UMOEndpoint.ENDPOINT_TYPE_SENDER);
123         props = new Properties();
124         endpoint.setProperties(props);
125         event = new MuleEvent(msg, endpoint, prevEvent.getComponent(), prevEvent);
126         assertNull(event.getMessage().getProperty("prop"));
127 
128         // in previous event => previous event
129         prevEvent.getMessage().setProperty("prop", "value0");
130         event = new MuleEvent(msg, endpoint, prevEvent.getComponent(), prevEvent);
131         assertEquals("value0", event.getMessage().getProperty("prop"));
132 
133         // TODO check if this fragment can be removed
134         // in previous event + endpoint => endpoint
135         // This doesn't apply now as the previous event properties will be the same
136         // as the current event props
137         // props = new Properties();
138         // props.put("prop", "value2");
139         // endpoint.setProperties(props);
140         // event = new MuleEvent(msg, endpoint, prevEvent.getComponent(), prevEvent);
141         // assertEquals("value2", event.getProperty("prop"));
142 
143         // in previous event + message => message
144         props = new Properties();
145         props.put("prop", "value1");
146         msg = new MuleMessage("payload", props);
147         endpoint = getTestEndpoint("Test", UMOEndpoint.ENDPOINT_TYPE_SENDER);
148         event = new MuleEvent(msg, endpoint, prevEvent.getComponent(), prevEvent);
149         assertEquals("value1", event.getMessage().getProperty("prop"));
150 
151         // in previous event + endpoint + message => message
152         props = new Properties();
153         props.put("prop", "value1");
154         msg = new MuleMessage("payload", props);
155 
156         Properties props2 = new Properties();
157         props2.put("prop", "value2");
158         endpoint.setProperties(props2);
159         event = new MuleEvent(msg, endpoint, prevEvent.getComponent(), prevEvent);
160         assertEquals("value1", event.getMessage().getProperty("prop"));
161 
162     }
163 
164     /**
165      * See http://mule.mulesource.org/jira/browse/MULE-384 for details.
166      */
167     public void testNoPasswordNoNullPointerException() throws Exception
168     {
169         UMOEndpoint endpoint = getTestEndpoint("AuthTest", UMOEndpoint.ENDPOINT_TYPE_SENDER);
170         // provide the username, but not the password, as is the case for SMTP
171         // cannot set SMTP endpoint type, because the module doesn't have this
172         // dependency
173         endpoint.setEndpointURI(new MuleEndpointURI("test://john.doe@xyz.fr"));
174         UMOEvent event = getTestEvent(new Object(), endpoint);
175         UMOCredentials credentials = event.getCredentials();
176         assertNull("Credentials must not be created for endpoints without a password.", credentials);
177     }
178 
179     public void testEventSerialization() throws Exception
180     {
181         UMOTransformer trans1 = new TestEventTransformer();
182         trans1.setName("OptimusPrime");
183 
184         UMOTransformer trans2 = new TestEventTransformer();
185         trans2.setName("Bumblebee");
186 
187         trans1.setNextTransformer(trans2);
188 
189         MuleManager.getInstance().registerTransformer(trans1);
190         MuleManager.getInstance().registerTransformer(trans2);
191 
192         UMOEndpoint endpoint = getTestEndpoint("Test", UMOEndpoint.ENDPOINT_TYPE_SENDER);
193         endpoint.setTransformer(trans1);
194 
195         // need a session without component        
196         UMOEvent event = RequestContext.setEvent(new MuleEvent(new MuleMessage("payload", new HashMap()), endpoint, getTestSession(null), true));
197 
198         Serializable serialized = (Serializable)new SerializableToByteArray().transform(event);
199         assertNotNull(serialized);
200 
201         // null out the endpoint transformer since we need to verify that it is set
202         // correctly when the event is recreated
203         // NOTE: unused, see note below
204         // endpoint.setTransformer(null);
205 
206         UMOEvent deserialized = (UMOEvent)new ByteArrayToObject().transform(serialized);
207         assertNotNull(deserialized);
208 
209         // NOTE: below we SHOULD be able to re-check that the exisiting endpoint's transformer
210         // is != null, but the lookup in MuleManager is broken and returns a new one :( 
211         UMOTransformer deserializedTransformer = deserialized.getEndpoint().getTransformer();
212         assertEquals(trans1.getName(), deserializedTransformer.getName());
213         assertEquals(trans2.getName(), deserializedTransformer.getNextTransformer().getName());
214     }
215 
216     public static class TestEventTransformer extends AbstractTransformer
217     {
218         public Object doTransform(Object src, String encoding) throws TransformerException
219         {
220             return "Transformed Test Data";
221         }
222     }
223 
224 }