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