def test_get_history(monkeypatch): """Test the decider history """ from tests.fixtures.flows import example events = decider_events.history.get('events') half = int(len(events) / 2) events = events[:half * 2] pool_1 = events[half:] pool_2 = events[:half] identity = 'identity' d = decider.DeciderWorker(example) d.client.poll_for_decision_task = MagicMock( return_value={'events': pool_2}) resp = d.get_history(identity, { 'events': pool_1, 'nextPageToken': 'nextPage' }) d.client.poll_for_decision_task.assert_called_with( domain=example.domain, next_page_token='nextPage', identity=identity, taskList=dict(name=d.task_list)) assert len(resp) == len( [evt for evt in events if evt['eventType'].startswith('Decision')])
def test_create_decisions_from_flow_exception(monkeypatch): """Test exception is raised and workflow fails when exception raised. """ mock(monkeypatch) from tests.fixtures.flows import example decider_worker = decider.DeciderWorker(example) decider_worker.logger.error = MagicMock() decider_worker.on_exception = MagicMock() exception = Exception('test') monkeypatch.setattr(decider.activity, 'find_available_activities', MagicMock(side_effect=exception)) mock_decisions = MagicMock() mock_activity_states = MagicMock() mock_context = MagicMock() decider_worker.create_decisions_from_flow(mock_decisions, mock_activity_states, mock_context) mock_decisions.fail_workflow_execution.assert_called_with( reason=str(exception)) assert decider_worker.on_exception.called decider_worker.logger.error.assert_called_with(exception, exc_info=True)
def test_create_decisions_from_flow_exception(monkeypatch): """Test exception is raised and workflow fails when exception raised. """ from tests.fixtures.flows import example decider_worker = decider.DeciderWorker(example, register=False) decider_worker.logger.error = MagicMock() decider_worker.on_exception = MagicMock() exception = Exception('test') monkeypatch.setattr(decider.activity, 'find_available_activities', MagicMock(side_effect=exception)) decisions = [] mock_activity_states = MagicMock() mock_context = MagicMock() decider_worker.create_decisions_from_flow(decisions, mock_activity_states, mock_context) failed_execution = dict( decisionType='FailWorkflowExecution', failWorkflowExecutionDecisionAttributes=dict(reason=str(exception))) assert failed_execution in decisions assert decider_worker.on_exception.called decider_worker.logger.error.assert_called_with(exception, exc_info=True)
def test_running_workflow(monkeypatch): """Test running a workflow. """ mock(monkeypatch) from tests.fixtures.flows import example d = decider.DeciderWorker(example) d.poll = MagicMock(return_value=decider_events.history) d.complete = MagicMock() d.create_decisions_from_flow = MagicMock() # Via flow. d.run() assert d.create_decisions_from_flow.called # Via custom decider spy = MagicMock() def custom_decider(schedule): spy() example.decider = custom_decider d.run() assert spy.called
def test_create_decider(monkeypatch): """Create a decider and check the behavior of the registration. """ mock(monkeypatch) from tests.fixtures.flows import example d = decider.DeciderWorker(example) assert len(d.activities) == 4 assert d.flow assert d.domain monkeypatch.setattr(decider.DeciderWorker, 'register', MagicMock()) d = decider.DeciderWorker(example) assert d.register.called monkeypatch.setattr(decider.DeciderWorker, 'register', MagicMock()) dec = decider.DeciderWorker(example, register=False) assert not dec.register.called
def run_decider(flow, **kwargs): """Launch the SWF decider process. Args: flow (module): Garcon flow module. """ worker = decider.DeciderWorker(flow) while True: worker.run() time.sleep(1)
def test_running_workflow_without_events(monkeypatch): """Test running a workflow without having any events. """ from tests.fixtures.flows import example d = decider.DeciderWorker(example, register=False) d.client.poll_for_decision_task = MagicMock(return_value={}) d.get_history = MagicMock() d.run() assert not d.get_history.called
def test_running_workflow_without_events(monkeypatch): """Test running a workflow without having any events. """ mock(monkeypatch) from tests.fixtures.flows import example d = decider.DeciderWorker(example) d.poll = MagicMock(return_value={}) d.get_history = MagicMock() d.run() assert not d.get_history.called
def test_get_activity_states(monkeypatch): """Test get activity states from history. """ mock(monkeypatch) from tests.fixtures.flows import example events = decider_events.history.get('events') d = decider.DeciderWorker(example) history = d.get_history({'events': events}) states = d.get_activity_states(history) for activity_name, activity_instances in states.items(): for activity_instance, activity_state in activity_instances.items(): assert isinstance(activity_state, activity.ActivityState)
def test_running_workflow_exception(monkeypatch): """Run a decider with an exception raised during poll. """ mock(monkeypatch) from tests.fixtures.flows import example d = decider.DeciderWorker(example) d.poll = MagicMock(return_value=decider_events.history) d.complete = MagicMock() d.create_decisions_from_flow = MagicMock() d.poll.side_effect = Exception('test') d.on_exception = MagicMock() d.run() assert d.on_exception.called assert not d.complete.called
def test_running_workflow_identity(monkeypatch): """Test running a workflow with and without identity. """ mock(monkeypatch) from tests.fixtures.flows import example d = decider.DeciderWorker(example) d.poll = MagicMock() d.complete = MagicMock() d.create_decisions_from_flow = MagicMock() # assert running decider without identity d.run() d.poll.assert_called_with(identity=None) # assert running decider with identity d.run('foo') d.poll.assert_called_with(identity='foo')
def test_running_workflow_exception(monkeypatch): """Run a decider with an exception raised during poll. """ from tests.fixtures.flows import example d = decider.DeciderWorker(example, register=False) d.client.poll_for_decision_task = MagicMock( return_value=decider_events.history) d.complete = MagicMock() d.create_decisions_from_flow = MagicMock() exception = Exception('test') d.client.poll_for_decision_task.side_effect = exception d.on_exception = MagicMock() d.logger.error = MagicMock() d.run() assert d.on_exception.called d.logger.error.assert_called_with(exception, exc_info=True) assert not d.complete.called
def test_running_workflow_identity(monkeypatch): """Test running a workflow with and without identity. """ from tests.fixtures.flows import example d = decider.DeciderWorker(example, register=False) d.client.poll_for_decision_task = MagicMock() d.complete = MagicMock() d.create_decisions_from_flow = MagicMock() # assert running decider without identity d.run() d.client.poll_for_decision_task.assert_called_with( domain=d.domain, taskList=dict(name=d.task_list), identity='') # assert running decider with identity d.run('foo') d.client.poll_for_decision_task.assert_called_with( domain=d.domain, taskList=dict(name=d.task_list), identity='foo')
def test_get_history(monkeypatch): """Test the decider history """ mock(monkeypatch) from tests.fixtures.flows import example events = decider_events.history.get('events') half = int(len(events) / 2) events = events[:half * 2] pool_1 = events[half:] pool_2 = events[:half] d = decider.DeciderWorker(example) d.poll = MagicMock(return_value={'events': pool_2}) resp = d.get_history({'events': pool_1, 'nextPageToken': 'nextPage'}) d.poll.assert_called_with(next_page_token='nextPage') assert len(resp) == len( [evt for evt in events if evt['eventType'].startswith('Decision')])
from garcon import activity from garcon import decider from threading import Thread import boto3 import time import workflow client = boto3.client('swf', region_name='us-east-1') deciderworker = decider.DeciderWorker(client, workflow) client.start_workflow_execution(domain=workflow.domain, workflowId='unique-workflow-identifier', workflowType=dict(name=workflow.name, version='1.0'), taskList=dict(name=workflow.name)) Thread(target=activity.ActivityWorker(client, workflow).run).start() while (True): deciderworker.run() time.sleep(1)
from garcon import activity from garcon import decider from threading import Thread import boto.swf.layer2 as swf import time import test_flow deciderworker = decider.DeciderWorker(test_flow) swf.WorkflowType(name=test_flow.name, domain=test_flow.domain, version='1.0', task_list=test_flow.name).start() Thread(target=activity.ActivityWorker(test_flow).run).start() while (True): deciderworker.run() time.sleep(1)
from garcon import activity from garcon import decider from threading import Thread import time import boto3 import workflow # Initiate the workflow on the dev domain and custom_decider name. client = boto3.client('swf', region_name='us-east-1') workflow = workflow.Workflow(client, 'dev', 'custom_decider') deciderworker = decider.DeciderWorker(workflow) client.start_workflow_execution( domain=workflow.domain, workflowId='unique-workflow-identifier', workflowType=dict( name=workflow.name, version='1.0'), executionStartToCloseTimeout='3600', taskStartToCloseTimeout='3600', childPolicy='TERMINATE', taskList=dict(name=workflow.name)) Thread(target=activity.ActivityWorker(workflow).run).start() while(True): deciderworker.run() time.sleep(1)
import time from garcon import decider import flow hello_world_flow = flow.Flow('dev', '1.0') decider_worker = decider.DeciderWorker(hello_world_flow) while(True): decider_worker.run() time.sleep(1)