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.transformer.simple;
8   
9   import org.mule.DefaultMuleEvent;
10  import org.mule.DefaultMuleMessage;
11  import org.mule.RequestContext;
12  import org.mule.api.MuleMessage;
13  import org.mule.api.transformer.Transformer;
14  import org.mule.tck.MuleTestUtils;
15  import org.mule.tck.testmodels.fruit.Apple;
16  import org.mule.transformer.AbstractTransformerTestCase;
17  
18  import java.io.IOException;
19  import java.io.ObjectOutputStream;
20  import java.util.Arrays;
21  import java.util.HashMap;
22  import java.util.Map;
23  
24  import org.apache.commons.io.output.ByteArrayOutputStream;
25  
26  public class SerializedMuleMessageTransformersTestCase extends AbstractTransformerTestCase
27  {
28      
29      private MuleMessage testObject = null;
30  
31      @Override
32      protected void doSetUp() throws Exception
33      {
34          Map<String, Object> props = new HashMap<String, Object>();
35          props.put("object", new Apple());
36          props.put("number", 1);
37          props.put("string", "hello");
38          testObject = new DefaultMuleMessage("test", props, muleContext);
39          
40          RequestContext.setEvent(
41                  new DefaultMuleEvent(testObject, getTestOutboundEndpoint("test"),
42                  MuleTestUtils.getTestSession(muleContext)));
43      }
44  
45      @Override
46      protected void doTearDown() throws Exception
47      {
48          RequestContext.clear();
49      }
50  
51      @Override
52      public void testTransform() throws Exception
53      {
54          // this depends on the ordering of properties in the map.
55          // because we now make a copy of maps in RequestContext this order can change
56      }
57  
58      @Override
59      public Transformer getTransformer() throws Exception
60      {
61          return createObject(MuleMessageToByteArray.class);
62      }
63  
64      @Override
65      public Transformer getRoundTripTransformer() throws Exception
66      {
67          return createObject(ByteArrayToMuleMessage.class);
68      }
69  
70      @Override
71      public Object getTestData()
72      {
73          return testObject;
74      }
75  
76      @Override
77      public Object getResultData()
78      {
79          try
80          {
81              ByteArrayOutputStream bs;
82              ObjectOutputStream os;
83  
84              bs = new ByteArrayOutputStream();
85              os = new ObjectOutputStream(bs);
86              os.writeObject(testObject);
87              os.flush();
88              os.close();
89              return bs.toByteArray();
90          }
91          catch (IOException e)
92          {
93              throw new IllegalStateException(e.getMessage());
94          }
95      }
96  
97      @Override
98      public boolean compareResults(Object src, Object result)
99      {
100         if (src == null && result == null)
101         {
102             return true;
103         }
104         if (src == null || result == null)
105         {
106             return false;
107         }
108         return Arrays.equals((byte[])src, (byte[])result);
109     }
110 
111     @Override
112     public boolean compareRoundtripResults(Object src, Object result)
113     {
114         if (src == null && result == null)
115         {
116             return true;
117         }
118         if (src == null || result == null)
119         {
120             return false;
121         }
122         if (src instanceof MuleMessage && result instanceof MuleMessage)
123         {
124             MuleMessage sourceMuleMessage = (MuleMessage) src;
125             MuleMessage resultMuleMessage = (MuleMessage) result;
126             
127             boolean payloadsAreEqual = comparePayloads(sourceMuleMessage, resultMuleMessage);
128             boolean objectPropertiesAreEqual = compareObjectProperties(sourceMuleMessage, resultMuleMessage);
129             boolean stringPropertiesAreEqual = compareStringProperties(sourceMuleMessage, resultMuleMessage);
130             boolean intPropertiesAreEqual = compareIntProperties(sourceMuleMessage, resultMuleMessage);
131                         
132             return payloadsAreEqual 
133                 && objectPropertiesAreEqual
134                 && stringPropertiesAreEqual 
135                 && intPropertiesAreEqual;
136         }
137         else
138         {
139             return false;
140         }
141     }
142     
143     private boolean comparePayloads(MuleMessage src, MuleMessage result)
144     {
145         Object sourcePayload = src.getPayload();
146         Object resultPayload = result.getPayload();
147         return sourcePayload.equals(resultPayload);
148     }
149     
150     private boolean compareObjectProperties(MuleMessage src, MuleMessage result)
151     {
152         Object sourceObjectProperty = src.getOutboundProperty("object");
153         Object resultObjectProperty = result.getOutboundProperty("object");
154         return sourceObjectProperty.equals(resultObjectProperty);
155     }
156     
157     private boolean compareStringProperties(MuleMessage src, MuleMessage result)
158     {
159         Object sourceStringProperty = src.getOutboundProperty("string");
160         Object resultStringProperty = result.getOutboundProperty("string");
161         return sourceStringProperty.equals(resultStringProperty);
162     }
163 
164     private boolean compareIntProperties(MuleMessage src, MuleMessage result)
165     {
166         int sourceIntProperty = src.getOutboundProperty("number", -1);
167         int resultIntProperty = result.getOutboundProperty("number", -2);
168         return (sourceIntProperty == resultIntProperty);
169     }
170 
171 }