1   /*
2    * $Id: XmlUMOMessageTransformersTestCase.java 8721 2007-10-01 10:28:29Z holger $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.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.transformers.xml;
12  
13  import org.mule.impl.MuleEvent;
14  import org.mule.impl.MuleMessage;
15  import org.mule.impl.RequestContext;
16  import org.mule.tck.MuleTestUtils;
17  import org.mule.tck.testmodels.fruit.Apple;
18  import org.mule.umo.UMOMessage;
19  import org.mule.umo.transformer.UMOTransformer;
20  
21  import java.util.HashMap;
22  import java.util.Map;
23  
24  import org.custommonkey.xmlunit.XMLAssert;
25  
26  public class XmlUMOMessageTransformersTestCase extends AbstractXmlTransformerTestCase
27  {
28      private UMOMessage testObject = null;
29  
30      // @Override
31      protected void doSetUp() throws Exception
32      {
33          RequestContext.setEvent(new MuleEvent(testObject, getTestEndpoint("test", "sender"), MuleTestUtils
34              .getTestSession(), true));
35      }
36  
37      // @Override
38      protected void doTearDown() throws Exception
39      {
40          RequestContext.clear();
41      }
42  
43      public XmlUMOMessageTransformersTestCase()
44      {
45          Map props = new HashMap();
46          props.put("object", new Apple());
47          props.put("number", new Integer(1));
48          props.put("string", "hello");
49          testObject = new MuleMessage("test", props);
50      }
51  
52      public UMOTransformer getTransformer() throws Exception
53      {
54          ObjectToXml t = new ObjectToXml();
55          t.setAcceptUMOMessage(true);
56          return t;
57      }
58  
59      public UMOTransformer getRoundTripTransformer() throws Exception
60      {
61          return new XmlToObject();
62      }
63  
64      public Object getTestData()
65      {
66          return testObject;
67      }
68  
69      public Object getResultData()
70      {
71          return "<org.mule.impl.MuleMessage>\n"
72                          + "  <adapter class=\"org.mule.providers.DefaultMessageAdapter\">\n"
73                          + "    <message class=\"string\">test</message>\n"
74                          + "    <properties class=\"edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap\">\n"
75                          + "      <entry>\n"
76                          + "        <string>string</string>\n"
77                          + "        <string>hello</string>\n"
78                          + "      </entry>\n"
79                          + "      <entry>\n"
80                          + "        <string>object</string>\n"
81                          + "        <org.mule.tck.testmodels.fruit.Apple>\n"
82                          + "          <bitten>false</bitten>\n"
83                          + "          <washed>false</washed>\n"
84                          + "        </org.mule.tck.testmodels.fruit.Apple>\n"
85                          + "      </entry>\n"
86                          + "      <entry>\n"
87                          + "        <string>number</string>\n"
88                          + "        <int>1</int>\n"
89                          + "      </entry>\n"
90                          + "    </properties>\n"
91                          + "    <attachments class=\"edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap\"/>\n"
92                          + "    <encoding>UTF-8</encoding>\n"
93                          + "    <id>" + testObject.getUniqueId() + "</id>\n"
94                          + "  </adapter>\n"
95                          + "</org.mule.impl.MuleMessage>";
96      }
97  
98      /**
99       * Different JVMs serialize fields to XML in a different order, in which case we
100      * need to check for the actual contents. We reconstruct the UMOMessages from the
101      * generated XML and compare them as objects.
102      */
103     // @Override
104     public boolean compareResults(Object expected, Object result)
105     {
106         if (!super.compareResults(expected, result))
107         {
108             // apparently the generic XML comparison did not work, so check again;
109             // this is currently the case when running on Mustang
110             try
111             {
112                 XMLAssert.assertXpathEvaluatesTo("3", "count(//adapter/properties/entry)", (String)result);
113                 // depending on your VM and the phase of the moon this is either "number" or "object"
114                 XMLAssert.assertXpathEvaluatesTo("number", "//adapter/properties/entry/string/text()", (String)result);
115                 XMLAssert.assertXpathEvaluatesTo("false", "//adapter/properties/entry/org.mule.tck.testmodels.fruit.Apple/bitten", (String)result);
116             }
117             catch (Exception ex)
118             {
119                 fail(ex.getMessage());
120             }
121         }
122 
123         return true;
124     }
125 
126     // @Override
127     public boolean compareRoundtripResults(Object expected, Object result)
128     {
129         if (expected == null && result == null)
130         {
131             return true;
132         }
133 
134         if (expected == null || result == null)
135         {
136             return false;
137         }
138 
139         if (expected instanceof UMOMessage && result instanceof UMOMessage)
140         {
141             return ((UMOMessage)expected).getPayload().equals(((UMOMessage)result).getPayload())
142                             && ((UMOMessage)expected).getProperty("object").equals(
143                                 ((UMOMessage)result).getProperty("object"))
144                             && ((UMOMessage)expected).getProperty("string").equals(
145                                 ((UMOMessage)result).getProperty("string"))
146                             && ((UMOMessage)expected).getIntProperty("number", -1) == ((UMOMessage)result)
147                                 .getIntProperty("number", -2);
148         }
149         else
150         {
151             return false;
152         }
153     }
154 
155     // @Override
156     protected void doTestClone(UMOTransformer original, UMOTransformer clone) throws Exception
157     {
158         super.doTestClone(original, clone);
159 
160         ObjectToXml t1 = (ObjectToXml) original;
161         ObjectToXml t2 = (ObjectToXml) clone;
162 
163         // The XStream instance must not be the same
164         assertNotSame("xstream", t1.getXStream(), t2.getXStream());
165 
166         // The driver class name must be equal
167         assertEquals("driverClassName", t1.getDriverClassName(), t2.getDriverClassName());
168 
169         // The aliases and converters must be equal but not identical
170         assertEquals("aliases", t1.getAliases(), t2.getAliases());
171         if (t1.getAliases() != null && t2.getAliases() != null)
172         {
173             assertNotSame("aliases", t1.getAliases(), t2.getAliases());
174         }
175 
176         assertEquals("converters", t1.getConverters(), t2.getConverters());
177         if (t1.getConverters() != null && t2.getConverters() != null)
178         {
179             assertNotSame("converters", t1.getConverters(), t2.getConverters());
180         }
181     }
182 
183 }