/* * 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; import static java.util.Collections.emptyMap; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.hamcrest.collection.IsEmptyCollection.empty; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mule.runtime.api.message.NullAttributes.NULL_ATTRIBUTES; import org.mule.runtime.api.message.Attributes; import org.mule.runtime.api.message.Message; import org.mule.runtime.core.internal.message.InternalMessage; import org.mule.tck.junit4.AbstractMuleContextTestCase; import org.mule.tck.testmodels.fruit.Apple; import org.mule.tck.testmodels.fruit.Orange; import java.io.Serializable; import java.util.HashMap; import java.util.Map; import org.junit.Test; public class DefaultMuleMessageTestCase extends AbstractMuleContextTestCase { public static final String FOO_PROPERTY = "foo"; private Attributes testAttributes = NULL_ATTRIBUTES; @Test public void testMessagePropertiesAccessors() { Map<String, Serializable> properties = createMessageProperties(); properties.put("number", "24"); properties.put("decimal", "24.3"); properties.put("boolean", "true"); Apple apple = new Apple(true); properties.put("apple", apple); InternalMessage message = (InternalMessage) InternalMessage.builder().payload(TEST_MESSAGE).outboundProperties(properties).build(); assertTrue(message.getOutboundProperty("boolean", false)); assertEquals(new Integer(24), message.getOutboundProperty("number", 0)); assertEquals(new Byte((byte) 24), message.getOutboundProperty("number", (byte) 0)); assertEquals(new Long(24), message.getOutboundProperty("number", 0l)); assertEquals(new Float(24.3), message.getOutboundProperty("decimal", 0f)); Double d = message.getOutboundProperty("decimal", 0d); assertEquals(new Double(24.3), d); assertEquals("true", message.getOutboundProperty("boolean", "")); assertEquals(apple, message.getOutboundProperty("apple")); try { message.getOutboundProperty("apple", new Orange()); fail("Orange is not assignable to Apple"); } catch (IllegalArgumentException e) { // expected } // Test null assertNull(message.getOutboundProperty("banana")); assertNull(message.getOutboundProperty("blah")); // Test default value assertEquals(new Float(24.3), message.getOutboundProperty("blah", 24.3f)); } @Test public void testClearProperties() { InternalMessage payload = (InternalMessage) InternalMessage.builder(createMuleMessage()).addOutboundProperty(FOO_PROPERTY, "fooValue").build(); assertThat(payload.getOutboundPropertyNames(), hasSize(2)); assertThat(payload.getInboundPropertyNames(), empty()); payload = (InternalMessage) InternalMessage.builder(payload).outboundProperties(emptyMap()).build(); assertThat(payload.getOutboundPropertyNames(), empty()); // See http://www.mulesoft.org/jira/browse/MULE-4968 for additional test needed here } // // helpers // private Map<String, Serializable> createMessageProperties() { HashMap<String, Serializable> map = new HashMap<>(); map.put("MessageProperties", "MessageProperties"); return map; } private Message createMuleMessage() { return InternalMessage.builder().payload(TEST_PAYLOAD).attributes(testAttributes) .addOutboundProperty("Message", "Message").build(); } @Test(expected = UnsupportedOperationException.class) public void testPropertyNamesImmutable() throws Exception { InternalMessage message = (InternalMessage) createMuleMessage(); message.getOutboundPropertyNames().add("other"); } @Test(expected = UnsupportedOperationException.class) public void testInboundPropertyNamesAddImmutable() throws Exception { InternalMessage message = (InternalMessage) createMuleMessage(); message.getOutboundPropertyNames().add("other"); } @Test(expected = UnsupportedOperationException.class) public void testOutboundPropertyNamesImmutable() throws Exception { Message message = createMuleMessage(); ((InternalMessage) message).getOutboundPropertyNames().add("other"); } @Test public void usesNullPayloadAsNull() throws Exception { Message message = InternalMessage.builder(createMuleMessage()).addOutboundProperty(FOO_PROPERTY, null).build(); assertThat(((InternalMessage) message).getOutboundProperty(FOO_PROPERTY), is(nullValue())); } }