1
2
3
4
5
6
7
8
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
55
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 }