View Javadoc

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