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;
8   
9   import org.mule.api.MuleEvent;
10  import org.mule.api.endpoint.EndpointBuilder;
11  import org.mule.api.endpoint.ImmutableEndpoint;
12  import org.mule.api.routing.filter.Filter;
13  import org.mule.api.security.Credentials;
14  import org.mule.api.service.Service;
15  import org.mule.api.transformer.Transformer;
16  import org.mule.api.transformer.TransformerException;
17  import org.mule.endpoint.EndpointURIEndpointBuilder;
18  import org.mule.routing.MessageFilter;
19  import org.mule.routing.filters.PayloadTypeFilter;
20  import org.mule.tck.junit4.AbstractMuleContextTestCase;
21  import org.mule.transformer.AbstractTransformer;
22  import org.mule.transformer.simple.ByteArrayToObject;
23  import org.mule.transformer.simple.SerializableToByteArray;
24  
25  import java.io.Serializable;
26  import java.util.ArrayList;
27  import java.util.Arrays;
28  import java.util.List;
29  
30  import org.junit.Test;
31  
32  import static org.junit.Assert.assertEquals;
33  import static org.junit.Assert.assertNotNull;
34  import static org.junit.Assert.assertNull;
35  import static org.junit.Assert.assertSame;
36  import static org.junit.Assert.assertTrue;
37  
38  
39  public class MuleEventTestCase extends AbstractMuleContextTestCase
40  {
41  
42  //    @Test
43  //    public void testEventInitialise() throws Exception
44  //    {
45  //        String data = "Test Data";
46  //
47  //        DefaultMuleEvent event = (DefaultMuleEvent)getTestEvent(data, getTestService("orange", Orange.class));
48  //        RequestContext.setEvent(event);
49  //        
50  //        assertEquals("MuleEvent data should equal " + data, data, event.getMessage().getPayload());
51  //        assertEquals("MuleEvent data should equal " + data, data, event.getMessageAsString());
52  //        assertEquals("MuleEvent data should equal " + data, data, event.transformMessage());
53  //        assertEquals("MuleEvent data should be a byte array 9 bytes in length", 9, event
54  //            .transformMessageToBytes().length);
55  //
56  //        assertEquals("MuleEvent data should be a byte array 9 bytes in length", 9,
57  //            event.getMessageAsBytes().length);
58  //        assertEquals("MuleEvent data should equal " + data, data, event.getSource());
59  //
60  //        assertEquals("MuleBeanPropertiesRule", event.getMessage().getProperty("MuleBeanPropertiesRule",
61  //            "MuleBeanPropertiesRule"));
62  //        event.getMessage().setProperty("Test", "Test1");
63  //
64  //        assertFalse(event.getMessage().getPropertyNames().isEmpty());
65  //        assertEquals("bla2", event.getMessage().getProperty("bla2", "bla2"));
66  //        assertEquals("Test1", event.getMessage().getProperty("Test"));
67  //        assertEquals("Test1", event.getMessage().getProperty("Test", "bla2"));
68  //        assertNotNull(event.getId());
69  //    }
70  //
71  //    @Test
72  //    public void testEventTransformer() throws Exception
73  //    {
74  //        String data = "Test Data";
75  //        ImmutableEndpoint endpoint = getTestOutboundEndpoint("Test",CollectionUtils.singletonList(new TestEventTransformer()));
76  //        MuleEvent event = getTestEvent(data, endpoint);
77  //        RequestContext.setEvent(event);
78  //        
79  //        assertEquals("MuleEvent data should equal " + data, data, event.getMessage().getPayload());
80  //        assertEquals("MuleEvent data should equal " + data, data, event.getMessageAsString());
81  //        assertEquals("MuleEvent data should equal 'Transformed Test Data'", "Transformed Test Data", event
82  //            .transformMessage());
83  //        assertEquals("MuleEvent data should be a byte array 28 bytes in length", 21, event
84  //            .transformMessageToBytes().length);
85  //    }
86  //
87  //    @Test
88  //    public void testEventRewrite() throws Exception
89  //    {
90  //        String data = "Test Data";
91  //        ImmutableEndpoint endpoint = getTestOutboundEndpoint("Test", CollectionUtils.singletonList(new TestEventTransformer()));
92  //        DefaultMuleEvent event = new DefaultMuleEvent(new DefaultMuleMessage(data), endpoint,
93  //            getTestSession(getTestService("apple", Apple.class), muleContext), true,
94  //            new ResponseOutputStream(System.out));
95  //
96  //        assertNotNull(event.getId());
97  //        assertNotNull(event.getSession());
98  //        assertNotNull(event.getEndpoint());
99  //        assertNotNull(event.getOutputStream());
100 //        assertNotNull(event.getMessage());
101 //        assertEquals(data, event.getMessageAsString());
102 //
103 //        MuleEvent event2 = new DefaultMuleEvent(new DefaultMuleMessage("New Data"), event);
104 //        assertNotNull(event2.getId());
105 //        assertEquals(event.getId(), event2.getId());
106 //        assertNotNull(event2.getSession());
107 //        assertNotNull(event2.getEndpoint());
108 //        assertNotNull(event2.getOutputStream());
109 //        assertNotNull(event2.getMessage());
110 //        assertEquals("New Data", event2.getMessageAsString());
111 //
112 //    }
113 //
114 //    @Test
115 //    public void testProperties() throws Exception
116 //    {
117 //        MuleEvent prevEvent;
118 //        Properties props;
119 //        MuleMessage msg;
120 //        ImmutableEndpoint endpoint;
121 //        MuleEvent event;
122 //
123 //        // nowhere
124 //        prevEvent = getTestEvent("payload");
125 //        props = new Properties();
126 //        msg = new DefaultMuleMessage("payload", props);
127 //        props = new Properties();
128 //        endpoint = getTestOutboundEndpoint("Test", null, null, null, props);
129 //        event = new DefaultMuleEvent(msg, endpoint, prevEvent.getService(), prevEvent);
130 //        assertNull(event.getMessage().getProperty("prop"));
131 //
132 //        // in previous event => previous event
133 //        prevEvent.getMessage().setProperty("prop", "value0");
134 //        event = new DefaultMuleEvent(msg, endpoint, prevEvent.getService(), prevEvent);
135 //        assertEquals("value0", event.getMessage().getProperty("prop"));
136 //
137 //        // TODO check if this fragment can be removed
138 //        // in previous event + endpoint => endpoint
139 //        // This doesn't apply now as the previous event properties will be the same
140 //        // as the current event props
141 //        // props = new Properties();
142 //        // props.put("prop", "value2");
143 //        // endpoint.setProperties(props);
144 //        // event = new DefaultMuleEvent(msg, endpoint, prevEvent.getComponent(), prevEvent);
145 //        // assertEquals("value2", event.getProperty("prop"));
146 //
147 //        // in previous event + message => message
148 //        props = new Properties();
149 //        props.put("prop", "value1");
150 //        msg = new DefaultMuleMessage("payload", props);
151 //        endpoint = getTestOutboundEndpoint("Test");
152 //        event = new DefaultMuleEvent(msg, endpoint, prevEvent.getService(), prevEvent);
153 //        assertEquals("value1", event.getMessage().getProperty("prop"));
154 //
155 //        // in previous event + endpoint + message => message
156 //        props = new Properties();
157 //        props.put("prop", "value1");
158 //        msg = new DefaultMuleMessage("payload", props);
159 //
160 //        Properties props2 = new Properties();
161 //        props2.put("prop", "value2");
162 //        endpoint = getTestOutboundEndpoint("Test", null, null, null, props2);
163 //        event = new DefaultMuleEvent(msg, endpoint, prevEvent.getService(), prevEvent);
164 //        assertEquals("value1", event.getMessage().getProperty("prop"));
165 //
166 //    }
167 //
168     /*
169      * See http://mule.mulesoft.org/jira/browse/MULE-384 for details.
170      */
171     @Test
172     public void testNoPasswordNoNullPointerException() throws Exception
173     {
174         // provide the username, but not the password, as is the case for SMTP
175         // cannot set SMTP endpoint type, because the module doesn't have this
176         // dependency
177         ImmutableEndpoint endpoint = getTestOutboundEndpoint("AuthTest", "test://john.doe@xyz.fr");
178         MuleEvent event = getTestEvent(new Object(), endpoint);
179         Credentials credentials = event.getCredentials();
180         assertNull("Credentials must not be created for endpoints without a password.", credentials);
181     }
182 
183     @Test
184     public void testEventSerialization() throws Exception
185     {
186         Transformer trans1 = new TestEventTransformer();
187         trans1.setName("OptimusPrime");
188 
189         Transformer trans2 = new TestEventTransformer();
190         trans2.setName("Bumblebee");
191 
192         List<Transformer> transformers = new ArrayList<Transformer>();
193         transformers.add(trans1);
194         transformers.add(trans2);
195 
196         ImmutableEndpoint endpoint = getTestOutboundEndpoint("Test", null, transformers, 
197             new PayloadTypeFilter(Object.class), null);
198 
199         MuleEvent event = RequestContext.setEvent(getTestEvent("payload", endpoint));
200         Serializable serialized = (Serializable) new SerializableToByteArray().transform(event);
201         assertNotNull(serialized);
202         ByteArrayToObject trans = new ByteArrayToObject();
203         trans.setMuleContext(muleContext);
204         MuleEvent deserialized = (MuleEvent) trans.transform(serialized);
205         
206         // Assert that deserialized event is not null and has muleContext
207         assertNotNull(deserialized);
208         assertNotNull(deserialized.getMuleContext());
209 
210         // Assert that deserialized event has session with same id
211         assertNotNull(deserialized.getSession());
212         assertEquals(event.getSession().getId(), deserialized.getSession().getId());
213 
214         // Assert that deserialized event has service and that the service is the same instance
215         assertNotNull(deserialized.getSession().getFlowConstruct());
216         assertEquals(event.getSession().getFlowConstruct(), deserialized.getSession().getFlowConstruct());
217         assertSame(event.getSession().getFlowConstruct(), deserialized.getSession().getFlowConstruct());
218 
219         // Assert that deserialized event has endpoint and that the endpoint is the same instance
220         assertNotNull(deserialized.getEndpoint());    
221         assertEquals(endpoint, deserialized.getEndpoint());
222 
223         List deserializedTransformers = deserialized.getEndpoint().getTransformers();
224         assertEquals(2, deserializedTransformers.size());
225         assertEquals(trans1.getName(), ((Transformer) deserializedTransformers.get(0)).getName());
226         assertEquals(trans2.getName(), ((Transformer) deserializedTransformers.get(1)).getName());
227         assertEquals(PayloadTypeFilter.class, deserialized.getEndpoint().getFilter().getClass());
228     }
229     
230     @Test
231     public void testEventSerializationRestart() throws Exception
232     {
233         // Create and register artifacts
234         MuleEvent event = createEventToSerialize();
235         muleContext.start();
236         List transformers = event.getEndpoint().getTransformers();
237         ImmutableEndpoint endpoint = event.getEndpoint();
238 
239         //Serialize
240         Serializable serialized = (Serializable) new SerializableToByteArray().transform(event);
241         assertNotNull(serialized);
242 
243         // Simulate mule cold restart
244         muleContext.dispose();
245         muleContext = createMuleContext();
246         muleContext.start();
247         ByteArrayToObject trans = new ByteArrayToObject();
248         trans.setMuleContext(muleContext);
249 
250         // Recreate and register artifacts (this would happen if using any kind of static config e.g. XML)
251         createAndRegisterTransformersEndpointBuilderService();
252 
253         //Deserialize
254         MuleEvent deserialized = (MuleEvent) trans.transform(serialized);
255 
256         // Assert that deserialized event is not null and has muleContext
257         assertNotNull(deserialized);
258         assertNotNull(deserialized.getMuleContext());
259 
260         // Assert that deserialized event has session with same id
261         assertNotNull(deserialized.getSession());
262         assertEquals(event.getSession().getId(), deserialized.getSession().getId());
263 
264         // Assert that deserialized event has service and that the service is the
265         // same instance
266         assertNotNull(deserialized.getSession().getFlowConstruct());
267 
268         Service service = (Service) event.getSession().getFlowConstruct();
269         Service deserializedService = (Service) deserialized.getSession().getFlowConstruct();
270         
271         // Unable to test services for equality because of need for equals() everywhere.  See MULE-3720
272         // assertEquals(event.getSession().getService(), deserialized.getSession().getService());
273         assertEquals(service.getName(), deserializedService.getName());
274         assertEquals(service.getInitialState(), deserializedService.getInitialState());
275         assertEquals(service.getExceptionListener().getClass(), deserializedService.getExceptionListener().getClass());
276         assertEquals(service.getComponent().getClass(), deserializedService.getComponent().getClass());
277         
278         // Assert that deserialized event has endpoint and that the endpoint is the
279         // same instance
280         assertNotNull(deserialized.getEndpoint());
281         // Unable to test endpoint for equality because of need for equals() everywhere.  See MULE-3720
282         // assertEquals(endpoint, deserialized.getEndpoint());
283         // Test some individual attributes instead
284         assertEquals(endpoint.getEncoding(), deserialized.getEndpoint().getEncoding());
285         assertEquals(endpoint.getEndpointBuilderName(), deserialized.getEndpoint().getEndpointBuilderName());
286         assertEquals(endpoint.getEndpointURI(), deserialized.getEndpoint().getEndpointURI());
287         assertEquals(endpoint.getProtocol(), deserialized.getEndpoint().getProtocol());
288         assertEquals(endpoint.getResponseTimeout(), deserialized.getEndpoint().getResponseTimeout());
289         assertEquals(endpoint.getConnector().getClass(), deserialized.getEndpoint().getConnector().getClass());
290         
291         List deserializedTransformers = deserialized.getEndpoint().getTransformers();
292         assertEquals(2, deserializedTransformers.size());
293         assertEquals(((Transformer) transformers.get(0)).getName(),
294             ((Transformer) deserializedTransformers.get(0)).getName());
295         assertEquals(((Transformer) transformers.get(1)).getName(),
296             ((Transformer) deserializedTransformers.get(1)).getName());
297         assertEquals(PayloadTypeFilter.class, deserialized.getEndpoint().getFilter().getClass());
298     }
299     
300     @Test
301     public void testMuleCredentialsSerialization() throws Exception
302     {
303         String username = "mule";
304         String password = "rulez";
305         String url = "test://" + username + ":" + password + "@localhost";
306         ImmutableEndpoint endpoint = getTestOutboundEndpoint("Test", url);
307         ByteArrayToObject trans = new ByteArrayToObject();
308         trans.setMuleContext(muleContext);
309 
310         MuleEvent event = RequestContext.setEvent(getTestEvent("payload", endpoint));
311         Serializable serialized = (Serializable) new SerializableToByteArray().transform(event);
312         assertNotNull(serialized);
313 
314         MuleEvent deserialized = (MuleEvent) trans.transform(serialized);
315         assertNotNull(deserialized);
316         
317         Credentials credentials = deserialized.getCredentials();
318         assertNotNull(credentials);
319         assertEquals(username, credentials.getUsername());
320         assertTrue(Arrays.equals(password.toCharArray(), credentials.getPassword()));
321     }
322     
323     private MuleEvent createEventToSerialize() throws Exception
324     {
325         createAndRegisterTransformersEndpointBuilderService();
326         ImmutableEndpoint endpoint = muleContext.getEndpointFactory().getInboundEndpoint(
327             muleContext.getRegistry().lookupEndpointBuilder("epBuilderTest"));
328         Service service = muleContext.getRegistry().lookupService("appleService");
329         return RequestContext.setEvent(getTestEvent("payload", service, endpoint));
330     }
331 
332     private void createAndRegisterTransformersEndpointBuilderService() throws Exception
333     {
334         Transformer trans1 = new TestEventTransformer();
335         trans1.setName("OptimusPrime");
336         muleContext.getRegistry().registerTransformer(trans1);
337 
338         Transformer trans2 = new TestEventTransformer();
339         trans2.setName("Bumblebee");
340         muleContext.getRegistry().registerTransformer(trans2);
341 
342         List<Transformer> transformers = new ArrayList<Transformer>();
343         transformers.add(trans1);
344         transformers.add(trans2);
345 
346         Filter filter = new PayloadTypeFilter(Object.class);
347         EndpointBuilder endpointBuilder = new EndpointURIEndpointBuilder("test://serializationTest",
348             muleContext);
349         endpointBuilder.setTransformers(transformers);
350         endpointBuilder.setName("epBuilderTest");
351         endpointBuilder.addMessageProcessor(new MessageFilter(filter));
352         muleContext.getRegistry().registerEndpointBuilder("epBuilderTest", endpointBuilder);
353 
354         getTestService();
355     }
356 
357     private static class TestEventTransformer extends AbstractTransformer
358     {
359         public Object doTransform(Object src, String encoding) throws TransformerException
360         {
361             return "Transformed Test Data";
362         }
363     }
364 
365 }