def test_dictionary_key(self): e = {} d1 = DecisionId(DecisionTarget.ACTIVITY, 123) d2 = DecisionId(DecisionTarget.CHILD_WORKFLOW, 456) e[d1] = "abc" e[d2] = "def" self.assertEqual(e[d1], "abc") self.assertEqual(e[d2], "def")
def test_get_decisions_none(self): state_machine: DecisionStateMachine = Mock() state_machine.get_decision = MagicMock(return_value=None) self.decider.decisions[DecisionId(DecisionTarget.ACTIVITY, 10)] = state_machine decisions = self.decider.get_decisions() self.assertEqual(0, len(decisions))
def schedule_activity_task(self, schedule: ScheduleActivityTaskDecisionAttributes) -> int: # PORT: addAllMissingVersionMarker(false, Optional.empty()); next_decision_event_id = self.next_decision_event_id decision_id = DecisionId(DecisionTarget.ACTIVITY, next_decision_event_id) self.activity_id_to_scheduled_event_id[schedule.activity_id] = next_decision_event_id self.add_decision(decision_id, ActivityDecisionStateMachine(decision_id, schedule_attributes=schedule)) return next_decision_event_id
def cancel_timer(self, start_event_id: int, immediate_cancellation_callback: Callable): decision: DecisionStateMachine = self.get_decision(DecisionId(DecisionTarget.TIMER, start_event_id)) if decision.is_done(): return True if decision.cancel(immediate_cancellation_callback): self.next_decision_event_id += 1 return decision.is_done()
def test_get_decisions(self): decision = Decision() state_machine: DecisionStateMachine = Mock() state_machine.get_decision = MagicMock(return_value=decision) self.decider.decisions[DecisionId(DecisionTarget.ACTIVITY, 10)] = state_machine decisions = self.decider.get_decisions() self.assertEqual(1, len(decisions)) self.assertIs(decision, decisions[0])
def start_timer(self, request: StartTimerDecisionAttributes): start_event_id = self.next_decision_event_id decision_id = DecisionId(DecisionTarget.TIMER, start_event_id) self.add_decision( decision_id, TimerDecisionStateMachine(decision_id, start_timer_attributes=request)) return start_event_id
def test_handle_activity_task_scheduled(self): state_machine: DecisionStateMachine = Mock() self.decider.decisions[DecisionId(DecisionTarget.ACTIVITY, 10)] = state_machine event = HistoryEvent(event_id=10) self.decider.handle_activity_task_scheduled(event) state_machine.handle_initiated_event.assert_called() args, kwargs = state_machine.handle_initiated_event.call_args_list[0] self.assertIn(event, args)
def test_activity_task_closed(self): state_machine: DecisionStateMachine = Mock() state_machine.is_done = MagicMock(return_value=True) self.decider.decisions[DecisionId(DecisionTarget.ACTIVITY, 10)] = state_machine ret = self.decider.handle_activity_task_closed(10) self.assertTrue(ret) state_machine.handle_completion_event.assert_called_once() state_machine.is_done.assert_called_once()
def test_schedule_activity_task(self): schedule_attributes = ScheduleActivityTaskDecisionAttributes() self.decider.schedule_activity_task(schedule_attributes) expected_decision_id = DecisionId(DecisionTarget.ACTIVITY, 0) self.assertEqual(1, self.decider.next_decision_event_id) self.assertEqual(1, len(self.decider.decisions)) state_machine: ActivityDecisionStateMachine = self.decider.decisions[expected_decision_id] self.assertIs(schedule_attributes, state_machine.schedule_attributes) self.assertEqual(expected_decision_id, state_machine.id)
def test_start_timer(decider): request = StartTimerDecisionAttributes() assert decider.start_timer(request) == DECISION_EVENT_ID decision_id = DecisionId(DecisionTarget.TIMER, DECISION_EVENT_ID) assert decision_id in decider.decisions state_machine = decider.decisions[decision_id] assert isinstance(state_machine, TimerDecisionStateMachine) assert state_machine.id == decision_id assert state_machine.start_timer_attributes == request
def cancel_workflow_execution(self): logger.info("Canceling workflow: %s", self.execution_id) decision = Decision() attr = CancelWorkflowExecutionDecisionAttributes() attr.details = None decision.cancel_workflow_execution_decision_attributes = attr decision.decision_type = DecisionType.CancelWorkflowExecution decision_id = DecisionId(DecisionTarget.SELF, 0) self.add_decision(decision_id, CompleteWorkflowStateMachine(decision_id, decision)) self.completed = True
def complete_workflow_execution(self, ret_value): # PORT: addAllMissingVersionMarker(false, Optional.empty()); decision = Decision() attr = CompleteWorkflowExecutionDecisionAttributes() attr.result = json.dumps(ret_value) decision.complete_workflow_execution_decision_attributes = attr decision.decision_type = DecisionType.CompleteWorkflowExecution decision_id = DecisionId(DecisionTarget.SELF, 0) self.add_decision(decision_id, CompleteWorkflowStateMachine(decision_id, decision)) self.completed = True
def fail_workflow_execution(self, exception): # PORT: addAllMissingVersionMarker(false, Optional.empty()); decision = Decision() fail_attributes = FailWorkflowExecutionDecisionAttributes() fail_attributes.reason = "WorkflowFailureException" fail_attributes.details = serialize_exception(exception) decision.fail_workflow_execution_decision_attributes = fail_attributes decision.decision_type = DecisionType.FailWorkflowExecution decision_id = DecisionId(DecisionTarget.SELF, 0) self.add_decision(decision_id, CompleteWorkflowStateMachine(decision_id, decision)) self.completed = True
def record_marker(self, marker_name: str, header: Header, details: bytes): marker = RecordMarkerDecisionAttributes() marker.marker_name = marker_name marker.header = header marker.details = details decision = Decision() decision.decision_type = DecisionType.RecordMarker decision.record_marker_decision_attributes = marker next_decision_event_id = self.decider.next_decision_event_id decision_id = DecisionId(DecisionTarget.MARKER, next_decision_event_id) self.decider.add_decision(decision_id, MarkerDecisionStateMachine(id=decision_id, decision=decision))
def setUp(self) -> None: self.schedule_attributes = ScheduleActivityTaskDecisionAttributes() self.schedule_attributes.activity_id = "123" self.state_machine: ActivityDecisionStateMachine = ActivityDecisionStateMachine( DecisionId(DecisionTarget.ACTIVITY, 888), schedule_attributes=self.schedule_attributes)
def handle_activity_task_scheduled(self, event: HistoryEvent): decision = self.get_decision( DecisionId(DecisionTarget.ACTIVITY, event.event_id)) decision.handle_initiated_event(event)
def handle_activity_task_started(self, event: HistoryEvent): attr = event.activity_task_started_event_attributes decision = self.get_decision( DecisionId(DecisionTarget.ACTIVITY, attr.scheduled_event_id)) decision.handle_started_event(event)
def test_notify_decision_sent(self): state_machine: DecisionStateMachine = Mock() self.decider.decisions[DecisionId(DecisionTarget.ACTIVITY, 10)] = state_machine self.decider.notify_decision_sent() state_machine.handle_decision_task_started_event.assert_called_once()
def handle_activity_task_closed(self, scheduled_event_id: int) -> bool: decision: DecisionStateMachine = self.get_decision( DecisionId(DecisionTarget.ACTIVITY, scheduled_event_id)) assert decision decision.handle_completion_event() return decision.is_done()
def test_get_decision(self): state_machine = DecisionStateMachine() decision_id = DecisionId(DecisionTarget.ACTIVITY, 20) self.decider.decisions[decision_id] = state_machine self.assertIs(state_machine, self.decider.get_decision(decision_id))
def test_get_decision_not_found(self): decision_id = DecisionId(DecisionTarget.ACTIVITY, 20) with self.assertRaises(NonDeterministicWorkflowException): self.decider.get_decision(decision_id)
def setUp(self) -> None: self.state_machine = DecisionStateMachineBase( DecisionId(DecisionTarget.ACTIVITY, 123))
def handle_timer_closed(self, attributes: TimerFiredEventAttributes) -> bool: decision = self.get_decision( DecisionId(DecisionTarget.TIMER, attributes.started_event_id)) decision.handle_completion_event() return decision.is_done()
def mock_decision(decider): decision_id = DecisionId(DecisionTarget.TIMER, DECISION_EVENT_ID) decision = MagicMock() decider.add_decision(decision_id, decision) decision.is_done = Mock(return_value=True) return decision
def test_get_id(self): self.assertEqual(DecisionId(DecisionTarget.ACTIVITY, 123), self.state_machine.get_id())
def handle_cancel_timer_failed(self, event: HistoryEvent) -> bool: started_event_id = event.event_id decision = self.get_decision( DecisionId(DecisionTarget.TIMER, started_event_id)) decision.handle_cancellation_failure_event(event) return decision.is_done()
def handle_timer_canceled(self, event: HistoryEvent) -> bool: attributes = event.timer_canceled_event_attributes decision = self.get_decision( DecisionId(DecisionTarget.TIMER, attributes.started_event_id)) decision.handle_cancellation_event() return decision.is_done()
def setUp(self) -> None: self.decision_id = DecisionId(DecisionTarget.SELF, 256) self.decision = Decision() self.state_machine = CompleteWorkflowStateMachine( self.decision_id, self.decision)
def handle_timer_started(self, event: HistoryEvent): decision = self.get_decision( DecisionId(DecisionTarget.TIMER, event.event_id)) decision.handle_initiated_event(event)
def decision(decider): decision_id = DecisionId(DecisionTarget.TIMER, DECISION_EVENT_ID) decision = TimerDecisionStateMachine(decision_id, start_timer_attributes=StartTimerDecisionAttributes()) decider.add_decision(decision_id, decision) return decision