/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.core.transformer.simple; import static org.mule.runtime.core.api.Event.setCurrentEvent; import org.mule.runtime.api.message.Message; import org.mule.runtime.core.internal.message.InternalMessage; import org.mule.runtime.core.api.transformer.Transformer; import org.mule.runtime.core.session.DefaultMuleSession; import org.mule.tck.core.transformer.AbstractTransformerTestCase; import org.mule.tck.testmodels.fruit.Apple; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import org.apache.commons.io.output.ByteArrayOutputStream; import org.junit.Ignore; public class SerializedMuleMessageTransformersTestCase extends AbstractTransformerTestCase { private Message testObject = null; @Override protected void doSetUp() throws Exception { Map<String, Serializable> props = new HashMap<>(); props.put("object", new Apple()); props.put("number", 1); props.put("string", "hello"); testObject = InternalMessage.builder().payload("test").outboundProperties(props).build(); setCurrentEvent(eventBuilder().message(testObject).session(new DefaultMuleSession()).build()); } @Override protected void doTearDown() throws Exception { setCurrentEvent(null); } @Override public void testTransform() throws Exception { // this depends on the ordering of properties in the map. // because we now make a copy of maps in RequestContext this order can change } @Override public Transformer getTransformer() throws Exception { return createObject(MuleMessageToByteArray.class); } @Override public Transformer getRoundTripTransformer() throws Exception { return createObject(ByteArrayToMuleMessage.class); } @Override public Object getTestData() { // return SerializationUtils.serialize(testObject); return testObject; } @Override public Object getResultData() { try { ByteArrayOutputStream bs; ObjectOutputStream os; bs = new ByteArrayOutputStream(); os = new ObjectOutputStream(bs); os.writeObject(testObject); os.flush(); os.close(); return bs.toByteArray(); } catch (IOException e) { throw new IllegalStateException(e.getMessage()); } } @Override public boolean compareResults(Object src, Object result) { if (src == null && result == null) { return true; } if (src == null || result == null) { return false; } return Arrays.equals((byte[]) src, (byte[]) result); } @Override @Ignore("See MULE-6046") public void testRoundTrip() throws Exception {} @Override public boolean compareRoundtripResults(Object src, Object result) { if (src == null && result == null) { return true; } if (src == null || result == null) { return false; } if (src instanceof InternalMessage && result instanceof InternalMessage) { InternalMessage sourceMuleMessage = (InternalMessage) src; InternalMessage resultMuleMessage = (InternalMessage) result; boolean payloadsAreEqual = comparePayloads(sourceMuleMessage, resultMuleMessage); boolean objectPropertiesAreEqual = compareObjectProperties(sourceMuleMessage, resultMuleMessage); boolean stringPropertiesAreEqual = compareStringProperties(sourceMuleMessage, resultMuleMessage); boolean intPropertiesAreEqual = compareIntProperties(sourceMuleMessage, resultMuleMessage); return payloadsAreEqual && objectPropertiesAreEqual && stringPropertiesAreEqual && intPropertiesAreEqual; } else { return false; } } private boolean comparePayloads(InternalMessage src, InternalMessage result) { Object sourcePayload = src.getPayload().getValue(); Object resultPayload = result.getPayload().getValue(); return sourcePayload.equals(resultPayload); } private boolean compareObjectProperties(InternalMessage src, InternalMessage result) { Object sourceObjectProperty = src.getOutboundProperty("object"); Object resultObjectProperty = result.getOutboundProperty("object"); return sourceObjectProperty.equals(resultObjectProperty); } private boolean compareStringProperties(InternalMessage src, InternalMessage result) { Object sourceStringProperty = src.getOutboundProperty("string"); Object resultStringProperty = result.getOutboundProperty("string"); return sourceStringProperty.equals(resultStringProperty); } private boolean compareIntProperties(InternalMessage src, InternalMessage result) { int sourceIntProperty = src.getOutboundProperty("number", -1); int resultIntProperty = result.getOutboundProperty("number", -2); return (sourceIntProperty == resultIntProperty); } }