View Javadoc

1   /*
2    * $Id: DefaultMuleMessageSerializationTestCase.java 22377 2011-07-11 12:41:42Z dirk.olmes $
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 org.mule.api.MuleMessage;
14  import org.mule.api.transformer.TransformerException;
15  import org.mule.tck.junit4.AbstractMuleContextTestCase;
16  import org.mule.transformer.simple.ObjectToByteArray;
17  import org.mule.transformer.types.DataTypeFactory;
18  import org.mule.transformer.types.SimpleDataType;
19  import org.mule.util.StringDataSource;
20  import org.mule.util.store.DeserializationPostInitialisable;
21  
22  import java.io.ByteArrayInputStream;
23  import java.io.InputStream;
24  import java.util.Arrays;
25  
26  import javax.activation.DataHandler;
27  
28  import org.apache.commons.lang.SerializationUtils;
29  import org.junit.Ignore;
30  import org.junit.Test;
31  
32  import static org.junit.Assert.assertEquals;
33  import static org.junit.Assert.assertTrue;
34  
35  public class DefaultMuleMessageSerializationTestCase extends AbstractMuleContextTestCase
36  {
37      private static final String INNER_TEST_MESSAGE = "TestTestTestHello";
38  
39      @Test
40      public void testSerializablePayload() throws Exception
41      {
42          MuleMessage message = new DefaultMuleMessage(TEST_MESSAGE, muleContext);
43          message.setOutboundProperty("foo", "bar");
44  
45          MuleMessage deserializedMessage = serializationRoundtrip(message);
46  
47          assertEquals(TEST_MESSAGE, deserializedMessage.getPayload());
48          assertEquals("bar", deserializedMessage.getOutboundProperty("foo"));
49      }
50  
51      @Test
52      public void testNonSerializablePayload() throws Exception
53      {
54          // add a transformer to the registry that can convert a NonSerializable to byte[]. This
55          // will be used during Serialization
56          muleContext.getRegistry().registerTransformer(new NonSerializableToByteArray());
57  
58          MuleMessage message = new DefaultMuleMessage(new NonSerializable(), muleContext);
59          message.setOutboundProperty("foo", "bar");
60  
61          MuleMessage deserializedMessage = serializationRoundtrip(message);
62  
63          assertTrue(deserializedMessage.getPayload() instanceof byte[]);
64          assertEquals(INNER_TEST_MESSAGE, deserializedMessage.getPayloadAsString());
65      }
66  
67      @Test
68      public void testStreamPayloadSerialization() throws Exception
69      {
70          InputStream stream = new ByteArrayInputStream(TEST_MESSAGE.getBytes());
71          MuleMessage message = new DefaultMuleMessage(stream, muleContext);
72          message.setOutboundProperty("foo", "bar");
73  
74          MuleMessage deserializedMessage = serializationRoundtrip(message);
75  
76          assertEquals(byte[].class, deserializedMessage.getPayload().getClass());
77          byte[] payload = (byte[]) deserializedMessage.getPayload();
78          assertTrue(Arrays.equals(TEST_MESSAGE.getBytes(), payload));
79      }
80  
81      @Test
82      @Ignore("see MULE-2964")
83      public void testAttachments() throws Exception
84      {
85          String attachmentName = "the-attachment";
86  
87          MuleMessage message = new DefaultMuleMessage(TEST_MESSAGE, muleContext);
88          DataHandler dataHandler = new DataHandler(new StringDataSource("attachment content"));
89          message.addAttachment(attachmentName, dataHandler);
90  
91          MuleMessage deserializedMessage = serializationRoundtrip(message);
92  
93          assertEquals(1, deserializedMessage.getAttachmentNames().size());
94          assertTrue(deserializedMessage.getAttachmentNames().contains(attachmentName));
95      }
96  
97      private MuleMessage serializationRoundtrip(MuleMessage message) throws Exception
98      {
99          byte[] serialized = SerializationUtils.serialize(message);
100         MuleMessage deserializedMessage = (MuleMessage) SerializationUtils.deserialize(serialized);
101         DeserializationPostInitialisable.Implementation.init(deserializedMessage, muleContext);
102         return deserializedMessage;
103     }
104 
105     static class NonSerializable
106     {
107         private String content = INNER_TEST_MESSAGE;
108 
109         String getContent()
110         {
111             return content;
112         }
113     }
114 
115     static class NonSerializableToByteArray extends ObjectToByteArray
116     {
117         public NonSerializableToByteArray()
118         {
119             super();
120             registerSourceType(new SimpleDataType<NonSerializable>(NonSerializable.class));
121             setReturnDataType(DataTypeFactory.BYTE_ARRAY);
122         }
123 
124         @Override
125         public Object doTransform(Object src, String outputEncoding) throws TransformerException
126         {
127             String content = ((NonSerializable) src).getContent();
128             return content.getBytes();
129         }
130     }
131 }