| 
									
										
										
										
											2015-10-04 23:37:50 +02:00
										 |  |  | from freezegun import freeze_time | 
					
						
							| 
									
										
										
										
											2016-02-04 17:14:33 -05:00
										 |  |  | import sure  # noqa | 
					
						
							| 
									
										
										
										
											2015-10-01 21:25:25 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  | from moto.swf.models import ActivityType, Timeout, WorkflowType, WorkflowExecution | 
					
						
							| 
									
										
										
										
											2016-01-17 18:00:57 -05:00
										 |  |  | from moto.swf.exceptions import SWFDefaultUndefinedFault | 
					
						
							| 
									
										
										
										
											2015-10-26 06:31:00 +01:00
										 |  |  | from ..utils import ( | 
					
						
							| 
									
										
										
										
											2015-11-09 23:44:49 +01:00
										 |  |  |     auto_start_decision_tasks, | 
					
						
							| 
									
										
										
										
											2015-10-25 11:30:11 +01:00
										 |  |  |     get_basic_domain, | 
					
						
							|  |  |  |     get_basic_workflow_type, | 
					
						
							| 
									
										
										
										
											2015-10-26 06:31:00 +01:00
										 |  |  |     make_workflow_execution, | 
					
						
							| 
									
										
										
										
											2015-10-25 11:30:11 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-26 23:16:59 +01:00
										 |  |  | VALID_ACTIVITY_TASK_ATTRIBUTES = { | 
					
						
							|  |  |  |     "activityId": "my-activity-001", | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  |     "activityType": {"name": "test-activity", "version": "v1.1"}, | 
					
						
							|  |  |  |     "taskList": {"name": "task-list-name"}, | 
					
						
							| 
									
										
										
										
											2015-10-26 23:16:59 +01:00
										 |  |  |     "scheduleToStartTimeout": "600", | 
					
						
							|  |  |  |     "scheduleToCloseTimeout": "600", | 
					
						
							|  |  |  |     "startToCloseTimeout": "600", | 
					
						
							|  |  |  |     "heartbeatTimeout": "300", | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-02 05:03:10 +02:00
										 |  |  | def test_workflow_execution_creation(): | 
					
						
							| 
									
										
										
										
											2015-10-25 11:30:11 +01:00
										 |  |  |     domain = get_basic_domain() | 
					
						
							| 
									
										
										
										
											2015-10-04 23:37:50 +02:00
										 |  |  |     wft = get_basic_workflow_type() | 
					
						
							| 
									
										
										
										
											2015-10-25 11:30:11 +01:00
										 |  |  |     wfe = WorkflowExecution(domain, wft, "ab1234", child_policy="TERMINATE") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     wfe.domain.should.equal(domain) | 
					
						
							| 
									
										
										
										
											2015-10-04 11:09:18 +02:00
										 |  |  |     wfe.workflow_type.should.equal(wft) | 
					
						
							| 
									
										
										
										
											2015-10-02 05:03:10 +02:00
										 |  |  |     wfe.child_policy.should.equal("TERMINATE") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-04 11:09:18 +02:00
										 |  |  | def test_workflow_execution_creation_child_policy_logic(): | 
					
						
							| 
									
										
										
										
											2015-10-25 11:30:11 +01:00
										 |  |  |     domain = get_basic_domain() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-04 11:09:18 +02:00
										 |  |  |     WorkflowExecution( | 
					
						
							| 
									
										
										
										
											2015-10-25 11:30:11 +01:00
										 |  |  |         domain, | 
					
						
							| 
									
										
										
										
											2015-10-04 11:09:18 +02:00
										 |  |  |         WorkflowType( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             "test-workflow", | 
					
						
							|  |  |  |             "v1.0", | 
					
						
							|  |  |  |             task_list="queue", | 
					
						
							|  |  |  |             default_child_policy="ABANDON", | 
					
						
							| 
									
										
										
										
											2015-10-04 11:09:18 +02:00
										 |  |  |             default_execution_start_to_close_timeout="300", | 
					
						
							|  |  |  |             default_task_start_to_close_timeout="300", | 
					
						
							|  |  |  |         ), | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "ab1234", | 
					
						
							| 
									
										
										
										
											2015-10-04 11:09:18 +02:00
										 |  |  |     ).child_policy.should.equal("ABANDON") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     WorkflowExecution( | 
					
						
							| 
									
										
										
										
											2015-10-25 11:30:11 +01:00
										 |  |  |         domain, | 
					
						
							| 
									
										
										
										
											2015-10-04 11:09:18 +02:00
										 |  |  |         WorkflowType( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             "test-workflow", | 
					
						
							|  |  |  |             "v1.0", | 
					
						
							|  |  |  |             task_list="queue", | 
					
						
							| 
									
										
										
										
											2015-10-04 11:09:18 +02:00
										 |  |  |             default_execution_start_to_close_timeout="300", | 
					
						
							|  |  |  |             default_task_start_to_close_timeout="300", | 
					
						
							|  |  |  |         ), | 
					
						
							|  |  |  |         "ab1234", | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         child_policy="REQUEST_CANCEL", | 
					
						
							| 
									
										
										
										
											2015-10-04 11:09:18 +02:00
										 |  |  |     ).child_policy.should.equal("REQUEST_CANCEL") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-05 10:05:35 +02:00
										 |  |  |     WorkflowExecution.when.called_with( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         domain, WorkflowType("test-workflow", "v1.0"), "ab1234" | 
					
						
							| 
									
										
										
										
											2015-10-05 10:05:35 +02:00
										 |  |  |     ).should.throw(SWFDefaultUndefinedFault) | 
					
						
							| 
									
										
										
										
											2015-10-04 11:09:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-02 05:03:10 +02:00
										 |  |  | def test_workflow_execution_string_representation(): | 
					
						
							| 
									
										
										
										
											2015-10-25 11:30:11 +01:00
										 |  |  |     wfe = make_workflow_execution(child_policy="TERMINATE") | 
					
						
							| 
									
										
										
										
											2015-10-02 05:03:10 +02:00
										 |  |  |     str(wfe).should.match(r"^WorkflowExecution\(run_id: .*\)") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-02 05:03:10 +02:00
										 |  |  | def test_workflow_execution_generates_a_random_run_id(): | 
					
						
							| 
									
										
										
										
											2015-10-25 11:30:11 +01:00
										 |  |  |     domain = get_basic_domain() | 
					
						
							| 
									
										
										
										
											2015-10-04 23:37:50 +02:00
										 |  |  |     wft = get_basic_workflow_type() | 
					
						
							| 
									
										
										
										
											2015-10-25 11:30:11 +01:00
										 |  |  |     wfe1 = WorkflowExecution(domain, wft, "ab1234", child_policy="TERMINATE") | 
					
						
							|  |  |  |     wfe2 = WorkflowExecution(domain, wft, "ab1235", child_policy="TERMINATE") | 
					
						
							| 
									
										
										
										
											2015-10-02 05:03:10 +02:00
										 |  |  |     wfe1.run_id.should_not.equal(wfe2.run_id) | 
					
						
							| 
									
										
										
										
											2015-10-02 17:42:28 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-02 17:42:28 +02:00
										 |  |  | def test_workflow_execution_short_dict_representation(): | 
					
						
							| 
									
										
										
										
											2015-10-25 11:30:11 +01:00
										 |  |  |     domain = get_basic_domain() | 
					
						
							| 
									
										
										
										
											2015-10-04 11:09:18 +02:00
										 |  |  |     wf_type = WorkflowType( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "test-workflow", | 
					
						
							|  |  |  |         "v1.0", | 
					
						
							|  |  |  |         task_list="queue", | 
					
						
							|  |  |  |         default_child_policy="ABANDON", | 
					
						
							| 
									
										
										
										
											2015-10-04 11:09:18 +02:00
										 |  |  |         default_execution_start_to_close_timeout="300", | 
					
						
							|  |  |  |         default_task_start_to_close_timeout="300", | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2015-10-25 11:30:11 +01:00
										 |  |  |     wfe = WorkflowExecution(domain, wf_type, "ab1234") | 
					
						
							| 
									
										
										
										
											2015-10-02 17:42:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     sd = wfe.to_short_dict() | 
					
						
							|  |  |  |     sd["workflowId"].should.equal("ab1234") | 
					
						
							|  |  |  |     sd.should.contain("runId") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-02 17:42:28 +02:00
										 |  |  | def test_workflow_execution_medium_dict_representation(): | 
					
						
							| 
									
										
										
										
											2015-10-25 11:30:11 +01:00
										 |  |  |     domain = get_basic_domain() | 
					
						
							| 
									
										
										
										
											2015-10-04 11:09:18 +02:00
										 |  |  |     wf_type = WorkflowType( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "test-workflow", | 
					
						
							|  |  |  |         "v1.0", | 
					
						
							|  |  |  |         task_list="queue", | 
					
						
							|  |  |  |         default_child_policy="ABANDON", | 
					
						
							| 
									
										
										
										
											2015-10-04 11:09:18 +02:00
										 |  |  |         default_execution_start_to_close_timeout="300", | 
					
						
							|  |  |  |         default_task_start_to_close_timeout="300", | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2015-10-25 11:30:11 +01:00
										 |  |  |     wfe = WorkflowExecution(domain, wf_type, "ab1234") | 
					
						
							| 
									
										
										
										
											2015-10-02 17:42:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     md = wfe.to_medium_dict() | 
					
						
							|  |  |  |     md["execution"].should.equal(wfe.to_short_dict()) | 
					
						
							|  |  |  |     md["workflowType"].should.equal(wf_type.to_short_dict()) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     md["startTimestamp"].should.be.a("float") | 
					
						
							| 
									
										
										
										
											2015-10-02 17:42:28 +02:00
										 |  |  |     md["executionStatus"].should.equal("OPEN") | 
					
						
							| 
									
										
										
										
											2015-11-05 02:22:02 +01:00
										 |  |  |     md["cancelRequested"].should.be.falsy | 
					
						
							| 
									
										
										
										
											2015-10-02 17:42:28 +02:00
										 |  |  |     md.should_not.contain("tagList") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     wfe.tag_list = ["foo", "bar", "baz"] | 
					
						
							|  |  |  |     md = wfe.to_medium_dict() | 
					
						
							|  |  |  |     md["tagList"].should.equal(["foo", "bar", "baz"]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-02 17:42:28 +02:00
										 |  |  | def test_workflow_execution_full_dict_representation(): | 
					
						
							| 
									
										
										
										
											2015-10-25 11:30:11 +01:00
										 |  |  |     domain = get_basic_domain() | 
					
						
							| 
									
										
										
										
											2015-10-04 11:09:18 +02:00
										 |  |  |     wf_type = WorkflowType( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "test-workflow", | 
					
						
							|  |  |  |         "v1.0", | 
					
						
							|  |  |  |         task_list="queue", | 
					
						
							|  |  |  |         default_child_policy="ABANDON", | 
					
						
							| 
									
										
										
										
											2015-10-04 11:09:18 +02:00
										 |  |  |         default_execution_start_to_close_timeout="300", | 
					
						
							|  |  |  |         default_task_start_to_close_timeout="300", | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2015-10-25 11:30:11 +01:00
										 |  |  |     wfe = WorkflowExecution(domain, wf_type, "ab1234") | 
					
						
							| 
									
										
										
										
											2015-10-02 17:42:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     fd = wfe.to_full_dict() | 
					
						
							|  |  |  |     fd["executionInfo"].should.equal(wfe.to_medium_dict()) | 
					
						
							|  |  |  |     fd["openCounts"]["openTimers"].should.equal(0) | 
					
						
							| 
									
										
										
										
											2020-02-15 01:18:08 +10:00
										 |  |  |     fd["openCounts"]["openDecisionTasks"].should.equal(0) | 
					
						
							|  |  |  |     fd["openCounts"]["openActivityTasks"].should.equal(0) | 
					
						
							|  |  |  |     fd["executionConfiguration"].should.equal( | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "childPolicy": "ABANDON", | 
					
						
							|  |  |  |             "executionStartToCloseTimeout": "300", | 
					
						
							|  |  |  |             "taskList": {"name": "queue"}, | 
					
						
							|  |  |  |             "taskStartToCloseTimeout": "300", | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_closed_workflow_execution_full_dict_representation(): | 
					
						
							|  |  |  |     domain = get_basic_domain() | 
					
						
							|  |  |  |     wf_type = WorkflowType( | 
					
						
							|  |  |  |         "test-workflow", | 
					
						
							|  |  |  |         "v1.0", | 
					
						
							|  |  |  |         task_list="queue", | 
					
						
							|  |  |  |         default_child_policy="ABANDON", | 
					
						
							|  |  |  |         default_execution_start_to_close_timeout="300", | 
					
						
							|  |  |  |         default_task_start_to_close_timeout="300", | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     wfe = WorkflowExecution(domain, wf_type, "ab1234") | 
					
						
							|  |  |  |     wfe.execution_status = "CLOSED" | 
					
						
							|  |  |  |     wfe.close_status = "CANCELED" | 
					
						
							|  |  |  |     wfe.close_timestamp = 1420066801.123 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     fd = wfe.to_full_dict() | 
					
						
							|  |  |  |     medium_dict = wfe.to_medium_dict() | 
					
						
							|  |  |  |     medium_dict["closeStatus"] = "CANCELED" | 
					
						
							|  |  |  |     medium_dict["closeTimestamp"] = 1420066801.123 | 
					
						
							|  |  |  |     fd["executionInfo"].should.equal(medium_dict) | 
					
						
							|  |  |  |     fd["openCounts"]["openTimers"].should.equal(0) | 
					
						
							| 
									
										
										
										
											2015-10-02 17:42:28 +02:00
										 |  |  |     fd["openCounts"]["openDecisionTasks"].should.equal(0) | 
					
						
							|  |  |  |     fd["openCounts"]["openActivityTasks"].should.equal(0) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     fd["executionConfiguration"].should.equal( | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "childPolicy": "ABANDON", | 
					
						
							|  |  |  |             "executionStartToCloseTimeout": "300", | 
					
						
							|  |  |  |             "taskList": {"name": "queue"}, | 
					
						
							|  |  |  |             "taskStartToCloseTimeout": "300", | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2015-10-04 23:37:50 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-04 17:14:33 -05:00
										 |  |  | def test_workflow_execution_list_dict_representation(): | 
					
						
							|  |  |  |     domain = get_basic_domain() | 
					
						
							|  |  |  |     wf_type = WorkflowType( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "test-workflow", | 
					
						
							|  |  |  |         "v1.0", | 
					
						
							|  |  |  |         task_list="queue", | 
					
						
							|  |  |  |         default_child_policy="ABANDON", | 
					
						
							|  |  |  |         default_execution_start_to_close_timeout="300", | 
					
						
							|  |  |  |         default_task_start_to_close_timeout="300", | 
					
						
							| 
									
										
										
										
											2016-02-04 17:14:33 -05:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     wfe = WorkflowExecution(domain, wf_type, "ab1234") | 
					
						
							| 
									
										
										
										
											2016-02-04 17:14:33 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ld = wfe.to_list_dict() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ld["workflowType"]["version"].should.equal("v1.0") | 
					
						
							|  |  |  |     ld["workflowType"]["name"].should.equal("test-workflow") | 
					
						
							|  |  |  |     ld["executionStatus"].should.equal("OPEN") | 
					
						
							|  |  |  |     ld["execution"]["workflowId"].should.equal("ab1234") | 
					
						
							|  |  |  |     ld["execution"].should.contain("runId") | 
					
						
							|  |  |  |     ld["cancelRequested"].should.be.false | 
					
						
							|  |  |  |     ld.should.contain("startTimestamp") | 
					
						
							| 
									
										
										
										
											2016-02-04 17:14:33 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-11 14:02:55 +02:00
										 |  |  | def test_workflow_execution_schedule_decision_task(): | 
					
						
							| 
									
										
										
										
											2015-10-25 11:30:11 +01:00
										 |  |  |     wfe = make_workflow_execution() | 
					
						
							| 
									
										
										
										
											2015-10-11 14:02:55 +02:00
										 |  |  |     wfe.open_counts["openDecisionTasks"].should.equal(0) | 
					
						
							|  |  |  |     wfe.schedule_decision_task() | 
					
						
							|  |  |  |     wfe.open_counts["openDecisionTasks"].should.equal(1) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-11 14:02:55 +02:00
										 |  |  | def test_workflow_execution_start_decision_task(): | 
					
						
							| 
									
										
										
										
											2015-10-25 11:30:11 +01:00
										 |  |  |     wfe = make_workflow_execution() | 
					
						
							| 
									
										
										
										
											2015-10-11 14:02:55 +02:00
										 |  |  |     wfe.schedule_decision_task() | 
					
						
							|  |  |  |     dt = wfe.decision_tasks[0] | 
					
						
							|  |  |  |     wfe.start_decision_task(dt.task_token, identity="srv01") | 
					
						
							|  |  |  |     dt = wfe.decision_tasks[0] | 
					
						
							|  |  |  |     dt.state.should.equal("STARTED") | 
					
						
							| 
									
										
										
										
											2015-10-11 19:14:31 +02:00
										 |  |  |     wfe.events()[-1].event_type.should.equal("DecisionTaskStarted") | 
					
						
							| 
									
										
										
										
											2015-11-23 14:51:58 +01:00
										 |  |  |     wfe.events()[-1].event_attributes["identity"].should.equal("srv01") | 
					
						
							| 
									
										
										
										
											2015-10-11 14:02:55 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-12 08:38:14 +02:00
										 |  |  | def test_workflow_execution_history_events_ids(): | 
					
						
							| 
									
										
										
										
											2015-10-25 11:30:11 +01:00
										 |  |  |     wfe = make_workflow_execution() | 
					
						
							| 
									
										
										
										
											2015-11-23 14:51:58 +01:00
										 |  |  |     wfe._add_event("WorkflowExecutionStarted") | 
					
						
							|  |  |  |     wfe._add_event("DecisionTaskScheduled") | 
					
						
							|  |  |  |     wfe._add_event("DecisionTaskStarted") | 
					
						
							| 
									
										
										
										
											2015-10-12 08:38:14 +02:00
										 |  |  |     ids = [evt.event_id for evt in wfe.events()] | 
					
						
							|  |  |  |     ids.should.equal([1, 2, 3]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-24 04:35:21 +02:00
										 |  |  | @freeze_time("2015-01-01 12:00:00") | 
					
						
							|  |  |  | def test_workflow_execution_start(): | 
					
						
							| 
									
										
										
										
											2015-10-25 11:30:11 +01:00
										 |  |  |     wfe = make_workflow_execution() | 
					
						
							| 
									
										
										
										
											2015-10-24 04:35:21 +02:00
										 |  |  |     wfe.events().should.equal([]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     wfe.start() | 
					
						
							| 
									
										
										
										
											2015-11-03 09:09:00 +01:00
										 |  |  |     wfe.start_timestamp.should.equal(1420113600.0) | 
					
						
							| 
									
										
										
										
											2015-10-24 04:35:21 +02:00
										 |  |  |     wfe.events().should.have.length_of(2) | 
					
						
							|  |  |  |     wfe.events()[0].event_type.should.equal("WorkflowExecutionStarted") | 
					
						
							|  |  |  |     wfe.events()[1].event_type.should.equal("DecisionTaskScheduled") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-24 04:35:21 +02:00
										 |  |  | @freeze_time("2015-01-02 12:00:00") | 
					
						
							| 
									
										
										
										
											2015-10-12 23:32:11 +02:00
										 |  |  | def test_workflow_execution_complete(): | 
					
						
							| 
									
										
										
										
											2015-10-25 11:30:11 +01:00
										 |  |  |     wfe = make_workflow_execution() | 
					
						
							| 
									
										
										
										
											2015-10-12 23:32:11 +02:00
										 |  |  |     wfe.complete(123, result="foo") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     wfe.execution_status.should.equal("CLOSED") | 
					
						
							| 
									
										
										
										
											2015-10-24 04:35:21 +02:00
										 |  |  |     wfe.close_status.should.equal("COMPLETED") | 
					
						
							| 
									
										
										
										
											2015-11-03 09:09:00 +01:00
										 |  |  |     wfe.close_timestamp.should.equal(1420200000.0) | 
					
						
							| 
									
										
										
										
											2015-10-12 23:32:11 +02:00
										 |  |  |     wfe.events()[-1].event_type.should.equal("WorkflowExecutionCompleted") | 
					
						
							| 
									
										
										
										
											2015-11-23 14:51:58 +01:00
										 |  |  |     wfe.events()[-1].event_attributes["decisionTaskCompletedEventId"].should.equal(123) | 
					
						
							|  |  |  |     wfe.events()[-1].event_attributes["result"].should.equal("foo") | 
					
						
							| 
									
										
										
										
											2015-10-12 23:32:11 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-24 04:35:21 +02:00
										 |  |  | @freeze_time("2015-01-02 12:00:00") | 
					
						
							|  |  |  | def test_workflow_execution_fail(): | 
					
						
							| 
									
										
										
										
											2015-10-25 11:30:11 +01:00
										 |  |  |     wfe = make_workflow_execution() | 
					
						
							| 
									
										
										
										
											2015-10-24 04:35:21 +02:00
										 |  |  |     wfe.fail(123, details="some details", reason="my rules") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     wfe.execution_status.should.equal("CLOSED") | 
					
						
							|  |  |  |     wfe.close_status.should.equal("FAILED") | 
					
						
							| 
									
										
										
										
											2015-11-03 09:09:00 +01:00
										 |  |  |     wfe.close_timestamp.should.equal(1420200000.0) | 
					
						
							| 
									
										
										
										
											2015-10-24 04:35:21 +02:00
										 |  |  |     wfe.events()[-1].event_type.should.equal("WorkflowExecutionFailed") | 
					
						
							| 
									
										
										
										
											2015-11-23 14:51:58 +01:00
										 |  |  |     wfe.events()[-1].event_attributes["decisionTaskCompletedEventId"].should.equal(123) | 
					
						
							|  |  |  |     wfe.events()[-1].event_attributes["details"].should.equal("some details") | 
					
						
							|  |  |  |     wfe.events()[-1].event_attributes["reason"].should.equal("my rules") | 
					
						
							| 
									
										
										
										
											2015-10-24 04:35:21 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-31 21:13:44 +01:00
										 |  |  | @freeze_time("2015-01-01 12:00:00") | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  | def test_workflow_execution_schedule_activity_task(): | 
					
						
							|  |  |  |     wfe = make_workflow_execution() | 
					
						
							| 
									
										
										
										
											2015-10-31 21:13:44 +01:00
										 |  |  |     wfe.latest_activity_task_timestamp.should.be.none | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-26 23:16:59 +01:00
										 |  |  |     wfe.schedule_activity_task(123, VALID_ACTIVITY_TASK_ATTRIBUTES) | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-03 09:09:00 +01:00
										 |  |  |     wfe.latest_activity_task_timestamp.should.equal(1420113600.0) | 
					
						
							| 
									
										
										
										
											2015-10-31 21:13:44 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  |     wfe.open_counts["openActivityTasks"].should.equal(1) | 
					
						
							|  |  |  |     last_event = wfe.events()[-1] | 
					
						
							|  |  |  |     last_event.event_type.should.equal("ActivityTaskScheduled") | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     last_event.event_attributes["decisionTaskCompletedEventId"].should.equal(123) | 
					
						
							|  |  |  |     last_event.event_attributes["taskList"]["name"].should.equal("task-list-name") | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     wfe.activity_tasks.should.have.length_of(1) | 
					
						
							|  |  |  |     task = wfe.activity_tasks[0] | 
					
						
							|  |  |  |     task.activity_id.should.equal("my-activity-001") | 
					
						
							|  |  |  |     task.activity_type.name.should.equal("test-activity") | 
					
						
							| 
									
										
										
										
											2015-10-26 10:55:55 +01:00
										 |  |  |     wfe.domain.activity_task_lists["task-list-name"].should.contain(task) | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  | def test_workflow_execution_schedule_activity_task_without_task_list_should_take_default(): | 
					
						
							|  |  |  |     wfe = make_workflow_execution() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     wfe.domain.add_type(ActivityType("test-activity", "v1.2", task_list="foobar")) | 
					
						
							|  |  |  |     wfe.schedule_activity_task( | 
					
						
							|  |  |  |         123, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "activityId": "my-activity-001", | 
					
						
							|  |  |  |             "activityType": {"name": "test-activity", "version": "v1.2"}, | 
					
						
							|  |  |  |             "scheduleToStartTimeout": "600", | 
					
						
							|  |  |  |             "scheduleToCloseTimeout": "600", | 
					
						
							|  |  |  |             "startToCloseTimeout": "600", | 
					
						
							|  |  |  |             "heartbeatTimeout": "300", | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     wfe.open_counts["openActivityTasks"].should.equal(1) | 
					
						
							|  |  |  |     last_event = wfe.events()[-1] | 
					
						
							|  |  |  |     last_event.event_type.should.equal("ActivityTaskScheduled") | 
					
						
							| 
									
										
										
										
											2015-11-23 14:51:58 +01:00
										 |  |  |     last_event.event_attributes["taskList"]["name"].should.equal("foobar") | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     task = wfe.activity_tasks[0] | 
					
						
							| 
									
										
										
										
											2015-10-26 10:55:55 +01:00
										 |  |  |     wfe.domain.activity_task_lists["foobar"].should.contain(task) | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  | def test_workflow_execution_schedule_activity_task_should_fail_if_wrong_attributes(): | 
					
						
							|  |  |  |     wfe = make_workflow_execution() | 
					
						
							|  |  |  |     at = ActivityType("test-activity", "v1.1") | 
					
						
							|  |  |  |     at.status = "DEPRECATED" | 
					
						
							|  |  |  |     wfe.domain.add_type(at) | 
					
						
							|  |  |  |     wfe.domain.add_type(ActivityType("test-activity", "v1.2")) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     hsh = { | 
					
						
							|  |  |  |         "activityId": "my-activity-001", | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  |         "activityType": {"name": "test-activity-does-not-exists", "version": "v1.1"}, | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     wfe.schedule_activity_task(123, hsh) | 
					
						
							|  |  |  |     last_event = wfe.events()[-1] | 
					
						
							|  |  |  |     last_event.event_type.should.equal("ScheduleActivityTaskFailed") | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     last_event.event_attributes["cause"].should.equal("ACTIVITY_TYPE_DOES_NOT_EXIST") | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     hsh["activityType"]["name"] = "test-activity" | 
					
						
							|  |  |  |     wfe.schedule_activity_task(123, hsh) | 
					
						
							|  |  |  |     last_event = wfe.events()[-1] | 
					
						
							|  |  |  |     last_event.event_type.should.equal("ScheduleActivityTaskFailed") | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     last_event.event_attributes["cause"].should.equal("ACTIVITY_TYPE_DEPRECATED") | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     hsh["activityType"]["version"] = "v1.2" | 
					
						
							|  |  |  |     wfe.schedule_activity_task(123, hsh) | 
					
						
							|  |  |  |     last_event = wfe.events()[-1] | 
					
						
							|  |  |  |     last_event.event_type.should.equal("ScheduleActivityTaskFailed") | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     last_event.event_attributes["cause"].should.equal("DEFAULT_TASK_LIST_UNDEFINED") | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  |     hsh["taskList"] = {"name": "foobar"} | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  |     wfe.schedule_activity_task(123, hsh) | 
					
						
							|  |  |  |     last_event = wfe.events()[-1] | 
					
						
							|  |  |  |     last_event.event_type.should.equal("ScheduleActivityTaskFailed") | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     last_event.event_attributes["cause"].should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "DEFAULT_SCHEDULE_TO_START_TIMEOUT_UNDEFINED" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     hsh["scheduleToStartTimeout"] = "600" | 
					
						
							|  |  |  |     wfe.schedule_activity_task(123, hsh) | 
					
						
							|  |  |  |     last_event = wfe.events()[-1] | 
					
						
							|  |  |  |     last_event.event_type.should.equal("ScheduleActivityTaskFailed") | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     last_event.event_attributes["cause"].should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "DEFAULT_SCHEDULE_TO_CLOSE_TIMEOUT_UNDEFINED" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     hsh["scheduleToCloseTimeout"] = "600" | 
					
						
							|  |  |  |     wfe.schedule_activity_task(123, hsh) | 
					
						
							|  |  |  |     last_event = wfe.events()[-1] | 
					
						
							|  |  |  |     last_event.event_type.should.equal("ScheduleActivityTaskFailed") | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     last_event.event_attributes["cause"].should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "DEFAULT_START_TO_CLOSE_TIMEOUT_UNDEFINED" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     hsh["startToCloseTimeout"] = "600" | 
					
						
							|  |  |  |     wfe.schedule_activity_task(123, hsh) | 
					
						
							|  |  |  |     last_event = wfe.events()[-1] | 
					
						
							|  |  |  |     last_event.event_type.should.equal("ScheduleActivityTaskFailed") | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  |     last_event.event_attributes["cause"].should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "DEFAULT_HEARTBEAT_TIMEOUT_UNDEFINED" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     wfe.open_counts["openActivityTasks"].should.equal(0) | 
					
						
							|  |  |  |     wfe.activity_tasks.should.have.length_of(0) | 
					
						
							| 
									
										
										
										
											2015-10-26 10:55:55 +01:00
										 |  |  |     wfe.domain.activity_task_lists.should.have.length_of(0) | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     hsh["heartbeatTimeout"] = "300" | 
					
						
							|  |  |  |     wfe.schedule_activity_task(123, hsh) | 
					
						
							|  |  |  |     last_event = wfe.events()[-1] | 
					
						
							|  |  |  |     last_event.event_type.should.equal("ActivityTaskScheduled") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     task = wfe.activity_tasks[0] | 
					
						
							| 
									
										
										
										
											2015-10-26 10:55:55 +01:00
										 |  |  |     wfe.domain.activity_task_lists["foobar"].should.contain(task) | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  |     wfe.open_counts["openDecisionTasks"].should.equal(0) | 
					
						
							|  |  |  |     wfe.open_counts["openActivityTasks"].should.equal(1) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  | def test_workflow_execution_schedule_activity_task_failure_triggers_new_decision(): | 
					
						
							|  |  |  |     wfe = make_workflow_execution() | 
					
						
							|  |  |  |     wfe.start() | 
					
						
							|  |  |  |     task_token = wfe.decision_tasks[-1].task_token | 
					
						
							|  |  |  |     wfe.start_decision_task(task_token) | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  |     wfe.complete_decision_task( | 
					
						
							|  |  |  |         task_token, | 
					
						
							|  |  |  |         execution_context="free-form execution context", | 
					
						
							|  |  |  |         decisions=[ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "decisionType": "ScheduleActivityTask", | 
					
						
							|  |  |  |                 "scheduleActivityTaskDecisionAttributes": { | 
					
						
							|  |  |  |                     "activityId": "my-activity-001", | 
					
						
							|  |  |  |                     "activityType": { | 
					
						
							|  |  |  |                         "name": "test-activity-does-not-exist", | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                         "version": "v1.2", | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  |                     }, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 }, | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "decisionType": "ScheduleActivityTask", | 
					
						
							|  |  |  |                 "scheduleActivityTaskDecisionAttributes": { | 
					
						
							|  |  |  |                     "activityId": "my-activity-001", | 
					
						
							|  |  |  |                     "activityType": { | 
					
						
							|  |  |  |                         "name": "test-activity-does-not-exist", | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                         "version": "v1.2", | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  |                     }, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |                 }, | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  |             }, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         ], | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-31 21:13:44 +01:00
										 |  |  |     wfe.latest_execution_context.should.equal("free-form execution context") | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  |     wfe.open_counts["openActivityTasks"].should.equal(0) | 
					
						
							|  |  |  |     wfe.open_counts["openDecisionTasks"].should.equal(1) | 
					
						
							|  |  |  |     last_events = wfe.events()[-3:] | 
					
						
							|  |  |  |     last_events[0].event_type.should.equal("ScheduleActivityTaskFailed") | 
					
						
							|  |  |  |     last_events[1].event_type.should.equal("ScheduleActivityTaskFailed") | 
					
						
							|  |  |  |     last_events[2].event_type.should.equal("DecisionTaskScheduled") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  | def test_workflow_execution_schedule_activity_task_with_same_activity_id(): | 
					
						
							|  |  |  |     wfe = make_workflow_execution() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-26 23:16:59 +01:00
										 |  |  |     wfe.schedule_activity_task(123, VALID_ACTIVITY_TASK_ATTRIBUTES) | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  |     wfe.open_counts["openActivityTasks"].should.equal(1) | 
					
						
							|  |  |  |     last_event = wfe.events()[-1] | 
					
						
							|  |  |  |     last_event.event_type.should.equal("ActivityTaskScheduled") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-26 23:16:59 +01:00
										 |  |  |     wfe.schedule_activity_task(123, VALID_ACTIVITY_TASK_ATTRIBUTES) | 
					
						
							| 
									
										
										
										
											2015-10-26 00:43:35 +01:00
										 |  |  |     wfe.open_counts["openActivityTasks"].should.equal(1) | 
					
						
							|  |  |  |     last_event = wfe.events()[-1] | 
					
						
							|  |  |  |     last_event.event_type.should.equal("ScheduleActivityTaskFailed") | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     last_event.event_attributes["cause"].should.equal("ACTIVITY_ID_ALREADY_IN_USE") | 
					
						
							| 
									
										
										
										
											2015-10-26 23:16:59 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-26 23:16:59 +01:00
										 |  |  | def test_workflow_execution_start_activity_task(): | 
					
						
							|  |  |  |     wfe = make_workflow_execution() | 
					
						
							|  |  |  |     wfe.schedule_activity_task(123, VALID_ACTIVITY_TASK_ATTRIBUTES) | 
					
						
							|  |  |  |     task_token = wfe.activity_tasks[-1].task_token | 
					
						
							|  |  |  |     wfe.start_activity_task(task_token, identity="worker01") | 
					
						
							|  |  |  |     task = wfe.activity_tasks[-1] | 
					
						
							|  |  |  |     task.state.should.equal("STARTED") | 
					
						
							|  |  |  |     wfe.events()[-1].event_type.should.equal("ActivityTaskStarted") | 
					
						
							| 
									
										
										
										
											2015-11-23 14:51:58 +01:00
										 |  |  |     wfe.events()[-1].event_attributes["identity"].should.equal("worker01") | 
					
						
							| 
									
										
										
										
											2015-10-27 05:17:33 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-27 05:17:33 +01:00
										 |  |  | def test_complete_activity_task(): | 
					
						
							|  |  |  |     wfe = make_workflow_execution() | 
					
						
							|  |  |  |     wfe.schedule_activity_task(123, VALID_ACTIVITY_TASK_ATTRIBUTES) | 
					
						
							|  |  |  |     task_token = wfe.activity_tasks[-1].task_token | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     wfe.open_counts["openActivityTasks"].should.equal(1) | 
					
						
							|  |  |  |     wfe.open_counts["openDecisionTasks"].should.equal(0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     wfe.start_activity_task(task_token, identity="worker01") | 
					
						
							|  |  |  |     wfe.complete_activity_task(task_token, result="a superb result") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     task = wfe.activity_tasks[-1] | 
					
						
							|  |  |  |     task.state.should.equal("COMPLETED") | 
					
						
							|  |  |  |     wfe.events()[-2].event_type.should.equal("ActivityTaskCompleted") | 
					
						
							|  |  |  |     wfe.events()[-1].event_type.should.equal("DecisionTaskScheduled") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     wfe.open_counts["openActivityTasks"].should.equal(0) | 
					
						
							|  |  |  |     wfe.open_counts["openDecisionTasks"].should.equal(1) | 
					
						
							| 
									
										
										
										
											2015-11-01 21:55:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-01 21:55:07 +01:00
										 |  |  | def test_terminate(): | 
					
						
							|  |  |  |     wfe = make_workflow_execution() | 
					
						
							|  |  |  |     wfe.schedule_decision_task() | 
					
						
							|  |  |  |     wfe.terminate() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     wfe.execution_status.should.equal("CLOSED") | 
					
						
							|  |  |  |     wfe.close_status.should.equal("TERMINATED") | 
					
						
							|  |  |  |     wfe.close_cause.should.equal("OPERATOR_INITIATED") | 
					
						
							|  |  |  |     wfe.open_counts["openDecisionTasks"].should.equal(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     last_event = wfe.events()[-1] | 
					
						
							|  |  |  |     last_event.event_type.should.equal("WorkflowExecutionTerminated") | 
					
						
							|  |  |  |     # take default child_policy if not provided (as here) | 
					
						
							| 
									
										
										
										
											2015-11-23 14:51:58 +01:00
										 |  |  |     last_event.event_attributes["childPolicy"].should.equal("ABANDON") | 
					
						
							| 
									
										
										
										
											2015-11-04 22:03:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-05 02:22:02 +01:00
										 |  |  | def test_first_timeout(): | 
					
						
							| 
									
										
										
										
											2015-11-04 22:03:58 +01:00
										 |  |  |     wfe = make_workflow_execution() | 
					
						
							| 
									
										
										
										
											2015-11-05 02:22:02 +01:00
										 |  |  |     wfe.first_timeout().should.be.none | 
					
						
							| 
									
										
										
										
											2015-11-04 22:03:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     with freeze_time("2015-01-01 12:00:00"): | 
					
						
							|  |  |  |         wfe.start() | 
					
						
							| 
									
										
										
										
											2015-11-05 02:22:02 +01:00
										 |  |  |         wfe.first_timeout().should.be.none | 
					
						
							| 
									
										
										
										
											2015-11-04 22:03:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     with freeze_time("2015-01-01 14:01"): | 
					
						
							|  |  |  |         # 2 hours timeout reached | 
					
						
							| 
									
										
										
										
											2015-11-05 02:22:02 +01:00
										 |  |  |         wfe.first_timeout().should.be.a(Timeout) | 
					
						
							| 
									
										
										
										
											2015-11-09 23:44:49 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-02 14:02:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-23 21:37:43 -05:00
										 |  |  | # See moto/swf/models/workflow_execution.py "_process_timeouts()" for more | 
					
						
							|  |  |  | # details | 
					
						
							| 
									
										
										
										
											2015-11-09 23:44:49 +01:00
										 |  |  | def test_timeouts_are_processed_in_order_and_reevaluated(): | 
					
						
							|  |  |  |     # Let's make a Workflow Execution with the following properties: | 
					
						
							|  |  |  |     # - execution start to close timeout of 8 mins | 
					
						
							|  |  |  |     # - (decision) task start to close timeout of 5 mins | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     # Now start the workflow execution, and look at the history 15 mins later: | 
					
						
							|  |  |  |     # - a first decision task is fired just after workflow execution start | 
					
						
							|  |  |  |     # - the first decision task should have timed out after 5 mins | 
					
						
							|  |  |  |     # - that fires a new decision task (which we hack to start automatically) | 
					
						
							|  |  |  |     # - then the workflow timeouts after 8 mins (shows gradual reevaluation) | 
					
						
							|  |  |  |     # - but the last scheduled decision task should *not* timeout (workflow closed) | 
					
						
							|  |  |  |     with freeze_time("2015-01-01 12:00:00"): | 
					
						
							|  |  |  |         wfe = make_workflow_execution( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             execution_start_to_close_timeout=8 * 60, task_start_to_close_timeout=5 * 60 | 
					
						
							| 
									
										
										
										
											2015-11-09 23:44:49 +01:00
										 |  |  |         ) | 
					
						
							|  |  |  |         # decision will automatically start | 
					
						
							|  |  |  |         wfe = auto_start_decision_tasks(wfe) | 
					
						
							|  |  |  |         wfe.start() | 
					
						
							|  |  |  |         event_idx = len(wfe.events()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with freeze_time("2015-01-01 12:08:00"): | 
					
						
							|  |  |  |         wfe._process_timeouts() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         event_types = [e.event_type for e in wfe.events()[event_idx:]] | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         event_types.should.equal( | 
					
						
							|  |  |  |             [ | 
					
						
							|  |  |  |                 "DecisionTaskTimedOut", | 
					
						
							|  |  |  |                 "DecisionTaskScheduled", | 
					
						
							|  |  |  |                 "DecisionTaskStarted", | 
					
						
							|  |  |  |                 "WorkflowExecutionTimedOut", | 
					
						
							|  |  |  |             ] | 
					
						
							|  |  |  |         ) |