MuleMessage message = new DefaultMuleMessage("data", muleContext);
MuleEvent event = new DefaultMuleEvent(message, MessageExchangePattern.REQUEST_RESPONSE,
getTestService());
SensingNullMessageProcessor flowListener = new SensingNullMessageProcessor();
Flow flow = new Flow("flow", muleContext);
flow.setMessageProcessors(Collections.<MessageProcessor> singletonList(flowListener));
flow.initialise();
flow.start();
Object nonSerializable = new Object();
message.setInvocationProperty("key", "value");
message.setInvocationProperty("key2", nonSerializable);
flow.process(event);
flowListener.latch.await(RECEIVE_TIMEOUT, TimeUnit.MILLISECONDS);
MuleEvent processedEvent = flowListener.event;
// Event is copied, but session isn't
assertNotSame(processedEvent, event);
assertEquals(processedEvent, event);
assertSame(processedEvent.getSession(), event.getSession());
// Session properties available before new flow are available after too
assertEquals("value", processedEvent.getMessage().getInvocationProperty("key"));
assertEquals(nonSerializable, processedEvent.getMessage().getInvocationProperty("key2"));
// Session properties set after new flow are available in message processor
// before new flow
processedEvent.getMessage().setInvocationProperty("newKey", "newValue");
assertEquals("newValue", processedEvent.getMessage().getInvocationProperty("newKey"));
assertEquals("newValue", event.getMessage().getInvocationProperty("newKey"));
flow.stop();
flow.dispose();
}