/* * 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.el.context; import static java.util.Collections.singletonMap; import static org.hamcrest.CoreMatchers.anyOf; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.hasItems; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mule.runtime.api.message.Message.of; import org.mule.runtime.api.message.Message; import org.mule.runtime.core.api.Event; import org.mule.runtime.core.internal.message.InternalMessage; import java.util.Collection; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import javax.activation.DataHandler; import org.apache.commons.collections.keyvalue.DefaultMapEntry; import org.junit.Before; import org.junit.Test; public class MessagePropertiesTestCase extends AbstractELTestCase { private Event event; public MessagePropertiesTestCase(String mvelOptimizer) { super(mvelOptimizer); } @Before public void setup() throws Exception { event = Event.builder(context).message(of("")).build(); } @Test public void inboundPropertyMap() throws Exception { event = Event.builder(context) .message(InternalMessage.builder().payload("").inboundProperties(singletonMap("foo", "bar")).build()) .build(); assertTrue(evaluate("message.inboundProperties", event) instanceof Map); } @Test public void assignToInboundPropertyMap() throws Exception { assertFinalProperty("message.inboundProperties='foo'", event); } @Test public void inboundProperty() throws Exception { event = Event.builder(context) .message(InternalMessage.builder().payload("").inboundProperties(singletonMap("foo", "bar")).build()) .build(); assertEquals("bar", evaluate("message.inboundProperties['foo']", event)); } @Test public void assignValueToInboundProperty() throws Exception { event = Event.builder(context) .message(InternalMessage.builder().payload("").inboundProperties(singletonMap("foo", "bar")).build()) .build(); assertUnsupportedOperation("message.inboundProperties['foo']='bar'", event); } @Test public void assignValueToNewInboundProperty() throws Exception { assertUnsupportedOperation("message.inboundProperties['foo_new']='bar'", event); } @Test public void outboundPropertyMap() throws Exception { event = Event.builder(event).message(InternalMessage.builder(event.getMessage()).addOutboundProperty("foo", "bar").build()) .build(); assertTrue(evaluate("message.outboundProperties", event) instanceof Map); } @Test public void assignToOutboundPropertyMap() throws Exception { assertFinalProperty("message.outboundProperties='foo'", event); } @Test public void outboundProperty() throws Exception { event = Event.builder(event).message(InternalMessage.builder(event.getMessage()).addOutboundProperty("foo", "bar").build()) .build(); assertEquals("bar", evaluate("message.outboundProperties['foo']", event)); } @Test public void assignValueToOutboundProperty() throws Exception { event = Event.builder(event) .message(InternalMessage.builder(event.getMessage()).addOutboundProperty("foo", "bar_old").build()).build(); Event.Builder eventBuilder = Event.builder(event); evaluate("message.outboundProperties['foo']='bar'", event, eventBuilder); assertEquals("bar", ((InternalMessage) eventBuilder.build().getMessage()).getOutboundProperty("foo")); } @Test public void assignValueToNewOutboundProperty() throws Exception { Event.Builder eventBuilder = Event.builder(event); evaluate("message.outboundProperties['foo']='bar'", event, eventBuilder); assertEquals("bar", ((InternalMessage) eventBuilder.build().getMessage()).getOutboundProperty("foo")); } @Test public void inboundClear() throws Exception { assertUnsupportedOperation("message.inboundProperties.clear())", event); } @Test public void inboundSize() throws Exception { Message message = event.getMessage(); mock(DataHandler.class); event = Event.builder(event) .message(InternalMessage.builder(message).addInboundProperty("foo", "abc").addInboundProperty("bar", "xyz").build()) .build(); assertEquals(2, evaluate("message.inboundProperties.size()", event)); } @Test public void inboundKeySet() throws Exception { Message message = event.getMessage(); mock(DataHandler.class); event = Event.builder(event) .message(InternalMessage.builder(message).addInboundProperty("foo", "abc").addInboundProperty("bar", "xyz").build()) .build(); assertThat((Iterable<String>) evaluate("message.inboundProperties.keySet()", event), hasItems("foo", "bar")); } @Test public void inboundContainsKey() throws Exception { Message message = event.getMessage(); mock(DataHandler.class); event = Event.builder(event).message(InternalMessage.builder(message).addInboundProperty("foo", "abc").build()).build(); assertTrue((Boolean) evaluate("message.inboundProperties.containsKey('foo')", event)); assertFalse((Boolean) evaluate("message.inboundProperties.containsKey('bar')", event)); } @Test public void inboundContainsValue() throws Exception { Message message = event.getMessage(); event = Event.builder(event).message(InternalMessage.builder(message).addInboundProperty("foo", "abc").build()).build(); assertTrue((Boolean) evaluate("message.inboundProperties.containsValue('abc')", event)); assertFalse((Boolean) evaluate("message.inboundProperties.containsValue('xyz')", event)); } @SuppressWarnings("unchecked") @Test public void inboundEntrySet() throws Exception { Message message = event.getMessage(); event = Event.builder(event) .message(InternalMessage.builder(message).addInboundProperty("foo", "abc").addInboundProperty("bar", "xyz").build()) .build(); Set<Map.Entry<String, Object>> entrySet = (Set<Entry<String, Object>>) evaluate("message.inboundProperties.entrySet()", event); assertEquals(2, entrySet.size()); entrySet.contains(new DefaultMapEntry("foo", "abc")); entrySet.contains(new DefaultMapEntry("bar", "xyz")); } @SuppressWarnings("unchecked") @Test public void inboundValues() throws Exception { Message message = event.getMessage(); event = Event.builder(event) .message(InternalMessage.builder(message).addInboundProperty("foo", "abc").addInboundProperty("bar", "xyz").build()) .build(); Collection<DataHandler> values = (Collection<DataHandler>) evaluate("message.inboundProperties.values()", event); assertEquals(2, values.size()); values.contains("abc"); values.contains("xyz"); } @Test public void inboundIsEmpty() throws Exception { Message message = event.getMessage(); assertTrue((Boolean) evaluate("message.inboundProperties.isEmpty()", event)); event = Event.builder(event) .message(InternalMessage.builder(message).addInboundProperty("foo", "abc").addInboundProperty("bar", "xyz").build()) .build(); assertFalse((Boolean) evaluate("message.inboundProperties.isEmpty()", event)); } @Test public void inboundPutAll() throws Exception { assertUnsupportedOperation("message.inboundProperties.putAll(['foo': 'abc','bar': 'xyz'])", event); } @Test public void inboundRemove() throws Exception { assertUnsupportedOperation("message.inboundProperties.remove('foo')", event); } @Test public void outboundClear() throws Exception { event = Event.builder(event).message(InternalMessage.builder(event.getMessage()).addOutboundProperty("foo", "abc") .addOutboundProperty("bar", "xyz").build()).build(); Event.Builder eventBuilder = Event.builder(event); evaluate("message.outboundProperties.clear()", event, eventBuilder); assertEquals(0, ((InternalMessage) eventBuilder.build().getMessage()).getOutboundPropertyNames().size()); } @Test public void outboundSize() throws Exception { event = Event.builder(event).message(InternalMessage.builder(event.getMessage()).addOutboundProperty("foo", "abc") .addOutboundProperty("bar", "xyz").build()).build(); assertEquals(2, evaluate("message.outboundProperties.size()", event)); } @Test public void outboundKeySet() throws Exception { event = Event.builder(event).message(InternalMessage.builder(event.getMessage()).addOutboundProperty("foo", "abc") .addOutboundProperty("bar", "xyz").build()).build(); assertThat(evaluate("message.outboundProperties.keySet().toArray()[0]", event), anyOf(equalTo("foo"), equalTo("bar"))); assertThat(evaluate("message.outboundProperties.keySet().toArray()[1]", event), anyOf(equalTo("foo"), equalTo("bar"))); } @Test public void outboundContainsKey() throws Exception { event = Event.builder(event).message(InternalMessage.builder(event.getMessage()).addOutboundProperty("foo", "abc").build()) .build(); assertTrue((Boolean) evaluate("message.outboundProperties.containsKey('foo')", event)); assertFalse((Boolean) evaluate("message.outboundProperties.containsKey('bar')", event)); } @Test public void outboundContainsValue() throws Exception { event = Event.builder(event).message(InternalMessage.builder(event.getMessage()).addOutboundProperty("foo", "abc").build()) .build(); assertTrue((Boolean) evaluate("message.outboundProperties.containsValue('abc')", event)); assertFalse((Boolean) evaluate("message.outboundProperties.containsValue('xyz')", event)); } @SuppressWarnings("unchecked") @Test public void outboundEntrySet() throws Exception { event = Event.builder(event).message(InternalMessage.builder(event.getMessage()).addOutboundProperty("foo", "abc") .addOutboundProperty("bar", "xyz").build()).build(); Set<Map.Entry<String, Object>> entrySet = (Set<Entry<String, Object>>) evaluate("message.outboundProperties.entrySet()", event); assertEquals(2, entrySet.size()); entrySet.contains(new DefaultMapEntry("foo", "abc")); entrySet.contains(new DefaultMapEntry("bar", "xyz")); } @SuppressWarnings("unchecked") @Test public void outboundValues() throws Exception { event = Event.builder(event).message(InternalMessage.builder(event.getMessage()).addOutboundProperty("foo", "abc") .addOutboundProperty("bar", "xyz").build()).build(); Collection<DataHandler> values = (Collection<DataHandler>) evaluate("message.outboundProperties.values()", event); assertEquals(2, values.size()); values.contains("abc"); values.contains("xyz"); } @Test public void outboundIsEmpty() throws Exception { assertTrue((Boolean) evaluate("message.outboundProperties.isEmpty()", event)); event = Event.builder(event).message(InternalMessage.builder(event.getMessage()).addOutboundProperty("foo", "abc") .addOutboundProperty("bar", "xyz").build()).build(); assertFalse((Boolean) evaluate("message.outboundProperties.isEmpty()", event)); } @Test public void outboundPutAll() throws Exception { Event.Builder eventBuilder = Event.builder(event); evaluate("message.outboundProperties.putAll(['foo': 'abc','bar': 'xyz'])", event, eventBuilder); assertEquals("abc", evaluate("message.outboundProperties['foo']", eventBuilder.build())); assertEquals("xyz", evaluate("message.outboundProperties['bar']", eventBuilder.build())); } @Test public void outboundInboundRemove() throws Exception { event = Event.builder(event).message(InternalMessage.builder(event.getMessage()).addOutboundProperty("foo", "abc").build()) .build(); Event.Builder eventBuilder = Event.builder(event); assertFalse((Boolean) evaluate("message.outboundProperties.isEmpty()", event)); evaluate("message.outboundProperties.remove('foo')", event, eventBuilder); assertTrue((Boolean) evaluate("message.outboundProperties.isEmpty()", eventBuilder.build())); } }