/*
* 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.routing;
import static java.util.stream.Collectors.toList;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mule.runtime.api.message.Message.of;
import org.mule.runtime.api.message.Message;
import org.mule.runtime.core.DefaultEventContext;
import org.mule.runtime.core.api.Event;
import org.mule.runtime.core.api.EventContext;
import org.mule.runtime.core.api.construct.Flow;
import org.mule.runtime.core.internal.message.InternalMessage;
import org.mule.runtime.core.message.GroupCorrelation;
import org.mule.tck.SensingNullMessageProcessor;
import org.mule.tck.junit4.AbstractMuleContextTestCase;
import org.mule.tck.testmodels.fruit.Apple;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
public class SimpleCollectionAggregatorTestCase extends AbstractMuleContextTestCase {
public SimpleCollectionAggregatorTestCase() {
setStartContext(true);
}
@Test
public void testAggregateMultipleEvents() throws Exception {
Flow flow = getTestFlowWithComponent("test", Apple.class);
assertNotNull(flow);
SimpleCollectionAggregator router = new SimpleCollectionAggregator();
SensingNullMessageProcessor sensingMessageProcessor = getSensingNullMessageProcessor();
router.setListener(sensingMessageProcessor);
router.setMuleContext(muleContext);
router.setFlowConstruct(flow);
router.initialise();
EventContext executionContext = DefaultEventContext.create(flow, TEST_CONNECTOR_LOCATION, "foo");
Message message1 = Message.of("test event A");
Message message2 = Message.of("test event B");
Message message3 = Message.of("test event C");
Event event1 =
Event.builder(executionContext).message(message1).groupCorrelation(new GroupCorrelation(3, null)).flow(flow).build();
Event event2 = Event.builder(executionContext).message(message2).flow(flow).build();
Event event3 = Event.builder(executionContext).message(message3).flow(flow).build();
assertNull(router.process(event1));
assertNull(router.process(event2));
Event resultEvent = router.process(event3);
assertNotNull(sensingMessageProcessor.event);
assertThat(resultEvent, equalTo(sensingMessageProcessor.event));
Message nextMessage = sensingMessageProcessor.event.getMessage();
assertNotNull(nextMessage);
assertTrue(nextMessage.getPayload().getValue() instanceof List<?>);
List<InternalMessage> list = (List<InternalMessage>) nextMessage.getPayload().getValue();
assertEquals(3, list.size());
String[] results = new String[3];
list.stream().map(msg -> msg.getPayload().getValue()).collect(toList()).toArray(results);
// Need to sort result because of MULE-5998
Arrays.sort(results);
assertEquals("test event A", results[0]);
assertEquals("test event B", results[1]);
assertEquals("test event C", results[2]);
}
@Test
public void testAggregateSingleEvent() throws Exception {
Flow flow = getTestFlowWithComponent("test", Apple.class);
assertNotNull(flow);
SimpleCollectionAggregator router = new SimpleCollectionAggregator();
SensingNullMessageProcessor sensingMessageProcessor = getSensingNullMessageProcessor();
router.setListener(sensingMessageProcessor);
router.setMuleContext(muleContext);
router.setFlowConstruct(flow);
router.initialise();
EventContext executionContext = DefaultEventContext.create(flow, TEST_CONNECTOR_LOCATION, "foo");
Message message1 = of("test event A");
Event event1 =
Event.builder(executionContext).message(message1).groupCorrelation(new GroupCorrelation(1, null)).flow(flow).build();
Event resultEvent = router.process(event1);
assertNotNull(sensingMessageProcessor.event);
assertThat(resultEvent, equalTo(sensingMessageProcessor.event));
Message nextMessage = sensingMessageProcessor.event.getMessage();
assertNotNull(nextMessage);
assertTrue(nextMessage.getPayload().getValue() instanceof List<?>);
List<InternalMessage> payload = (List<InternalMessage>) nextMessage.getPayload().getValue();
assertEquals(1, payload.size());
assertEquals("test event A", payload.get(0).getPayload().getValue());
}
@Test
public void testAggregateMessageCollections() throws Exception {
Flow flow = getTestFlowWithComponent("test", Apple.class);
assertNotNull(flow);
SimpleCollectionAggregator router = new SimpleCollectionAggregator();
router.setMuleContext(muleContext);
router.setFlowConstruct(flow);
router.initialise();
EventContext executionContext = DefaultEventContext.create(flow, TEST_CONNECTOR_LOCATION, "foo");
Message message1 = of("test event A");
Message message2 = of("test event B");
Message message3 = of("test event C");
Message message4 = of("test event D");
List<Message> list = new ArrayList<>();
List<Message> list2 = new ArrayList<>();
list.add(message1);
list.add(message2);
list2.add(message3);
list2.add(message4);
Message messageCollection1 = Message.of(list);
Message messageCollection2 = Message.of(list2);
Event event1 =
Event.builder(executionContext).message(messageCollection1).groupCorrelation(new GroupCorrelation(2, null)).flow(flow)
.build();
Event event2 =
Event.builder(executionContext).message(messageCollection2).groupCorrelation(new GroupCorrelation(2, null)).flow(flow)
.build();
assertNull(router.process(event1));
Event resultEvent = router.process(event2);
assertNotNull(resultEvent);
Message resultMessage = resultEvent.getMessage();
assertNotNull(resultMessage);
List<InternalMessage> payload = (List<InternalMessage>) resultMessage.getPayload().getValue();
assertEquals(2, payload.size());
assertEquals("test event A", ((List<InternalMessage>) payload.get(0).getPayload().getValue()).get(0).getPayload().getValue());
assertEquals("test event B", ((List<InternalMessage>) payload.get(0).getPayload().getValue()).get(1).getPayload().getValue());
assertEquals("test event C", ((List<InternalMessage>) payload.get(1).getPayload().getValue()).get(0).getPayload().getValue());
assertEquals("test event D", ((List<InternalMessage>) payload.get(1).getPayload().getValue()).get(1).getPayload().getValue());
}
}