def METHOD_NAME(self):
    spec, subprocesses = self.load_workflow_spec('collaboration.bpmn', 'process_buddy')
    workflow = BpmnWorkflow(spec, subprocesses)
    start = workflow.get_tasks_from_spec_name('Start')[0]
    # Set up some data to be evaluated so that the workflow can proceed
    start.data['lover_name'] = 'Peggy'
    workflow.do_engine_steps()
    # An external message should be created
    messages = workflow.get_events()
    self.assertEqual(len(messages), 1)
    self.assertEqual(len(workflow.bpmn_events), 0)
    receive = workflow.get_tasks_from_spec_name('EventReceiveLetter')[0]
    # Waiting Events should contain details about what we are no waiting on.
    events = workflow.waiting_events()
    self.assertEqual(1, len(events))
    self.assertEqual("MessageEventDefinition", events[0].event_type)
    self.assertEqual("Love Letter Response", events[0].name)
    self.assertEqual(['lover'], events[0].value[0].correlation_keys)
    self.assertEqual('from_name', events[0].value[0].retrieval_expression)
    self.assertEqual('lover_name', events[0].value[0].name)
    message = BpmnEvent(
        receive.task_spec.event_definition,
        {'from_name': 'Peggy', 'other_nonsense': 1001}
    )
    workflow.send_event(message)
    workflow.do_engine_steps()
    self.assertEqual(receive.state, TaskState.COMPLETED)
    self.assertEqual(workflow.last_task.data, {'from_name': 'Peggy', 'lover_name': 'Peggy', 'other_nonsense': 1001})
    self.assertEqual(workflow.correlations, {'lover':{'lover_name':'Peggy'}})
    self.assertEqual(workflow.is_completed(), True)