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();
event.getSession().setProperty("key", "value");
event.getSession().setProperty("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(2, processedEvent.getSession().getPropertyNamesAsSet().size());
assertEquals("value", processedEvent.getSession().getProperty("key"));
assertEquals(nonSerializable, processedEvent.getSession().getProperty("key2"));
// Session properties set after new flow are available in message processor
// before new flow
processedEvent.getSession().setProperty("newKey", "newValue");
assertEquals(3, processedEvent.getSession().getPropertyNamesAsSet().size());
assertEquals("newValue", processedEvent.getSession().getProperty("newKey"));
assertEquals(3, event.getSession().getPropertyNamesAsSet().size());
assertEquals("newValue", event.getSession().getProperty("newKey"));
flow.stop();
flow.dispose();
}