temporalio 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (310) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +180 -7
  3. data/bridge/Cargo.lock +208 -76
  4. data/bridge/Cargo.toml +5 -2
  5. data/bridge/sdk-core/Cargo.toml +1 -1
  6. data/bridge/sdk-core/README.md +20 -10
  7. data/bridge/sdk-core/client/Cargo.toml +1 -1
  8. data/bridge/sdk-core/client/src/lib.rs +227 -59
  9. data/bridge/sdk-core/client/src/metrics.rs +17 -8
  10. data/bridge/sdk-core/client/src/raw.rs +13 -12
  11. data/bridge/sdk-core/client/src/retry.rs +132 -43
  12. data/bridge/sdk-core/core/Cargo.toml +28 -15
  13. data/bridge/sdk-core/core/benches/workflow_replay.rs +13 -10
  14. data/bridge/sdk-core/core/src/abstractions.rs +225 -36
  15. data/bridge/sdk-core/core/src/core_tests/activity_tasks.rs +217 -79
  16. data/bridge/sdk-core/core/src/core_tests/determinism.rs +165 -2
  17. data/bridge/sdk-core/core/src/core_tests/local_activities.rs +565 -34
  18. data/bridge/sdk-core/core/src/core_tests/queries.rs +247 -90
  19. data/bridge/sdk-core/core/src/core_tests/workers.rs +3 -5
  20. data/bridge/sdk-core/core/src/core_tests/workflow_cancels.rs +1 -1
  21. data/bridge/sdk-core/core/src/core_tests/workflow_tasks.rs +430 -67
  22. data/bridge/sdk-core/core/src/ephemeral_server/mod.rs +106 -12
  23. data/bridge/sdk-core/core/src/internal_flags.rs +136 -0
  24. data/bridge/sdk-core/core/src/lib.rs +148 -34
  25. data/bridge/sdk-core/core/src/protosext/mod.rs +1 -1
  26. data/bridge/sdk-core/core/src/replay/mod.rs +185 -41
  27. data/bridge/sdk-core/core/src/telemetry/log_export.rs +190 -0
  28. data/bridge/sdk-core/core/src/telemetry/metrics.rs +219 -140
  29. data/bridge/sdk-core/core/src/telemetry/mod.rs +326 -315
  30. data/bridge/sdk-core/core/src/telemetry/prometheus_server.rs +20 -14
  31. data/bridge/sdk-core/core/src/test_help/mod.rs +85 -21
  32. data/bridge/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +112 -156
  33. data/bridge/sdk-core/core/src/worker/activities/activity_task_poller_stream.rs +89 -0
  34. data/bridge/sdk-core/core/src/worker/activities/local_activities.rs +364 -128
  35. data/bridge/sdk-core/core/src/worker/activities.rs +263 -170
  36. data/bridge/sdk-core/core/src/worker/client/mocks.rs +23 -3
  37. data/bridge/sdk-core/core/src/worker/client.rs +48 -6
  38. data/bridge/sdk-core/core/src/worker/mod.rs +186 -75
  39. data/bridge/sdk-core/core/src/worker/workflow/bridge.rs +1 -3
  40. data/bridge/sdk-core/core/src/worker/workflow/driven_workflow.rs +13 -24
  41. data/bridge/sdk-core/core/src/worker/workflow/history_update.rs +879 -226
  42. data/bridge/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +101 -48
  43. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +8 -12
  44. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +6 -9
  45. data/bridge/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +90 -32
  46. data/bridge/sdk-core/core/src/worker/workflow/machines/complete_workflow_state_machine.rs +6 -9
  47. data/bridge/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +7 -10
  48. data/bridge/sdk-core/core/src/worker/workflow/machines/fail_workflow_state_machine.rs +6 -9
  49. data/bridge/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +160 -83
  50. data/bridge/sdk-core/core/src/worker/workflow/machines/mod.rs +36 -54
  51. data/bridge/sdk-core/core/src/worker/workflow/machines/modify_workflow_properties_state_machine.rs +179 -0
  52. data/bridge/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +104 -157
  53. data/bridge/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +8 -12
  54. data/bridge/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +9 -13
  55. data/bridge/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +10 -4
  56. data/bridge/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +14 -11
  57. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines/local_acts.rs +6 -17
  58. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +395 -299
  59. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_task_state_machine.rs +12 -20
  60. data/bridge/sdk-core/core/src/worker/workflow/managed_run/managed_wf_test.rs +33 -18
  61. data/bridge/sdk-core/core/src/worker/workflow/managed_run.rs +1032 -374
  62. data/bridge/sdk-core/core/src/worker/workflow/mod.rs +525 -392
  63. data/bridge/sdk-core/core/src/worker/workflow/run_cache.rs +40 -57
  64. data/bridge/sdk-core/core/src/worker/workflow/wft_extraction.rs +125 -0
  65. data/bridge/sdk-core/core/src/worker/workflow/wft_poller.rs +3 -6
  66. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream/saved_wf_inputs.rs +117 -0
  67. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream/tonic_status_serde.rs +24 -0
  68. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream.rs +456 -681
  69. data/bridge/sdk-core/core-api/Cargo.toml +6 -4
  70. data/bridge/sdk-core/core-api/src/errors.rs +1 -34
  71. data/bridge/sdk-core/core-api/src/lib.rs +7 -45
  72. data/bridge/sdk-core/core-api/src/telemetry.rs +141 -0
  73. data/bridge/sdk-core/core-api/src/worker.rs +27 -1
  74. data/bridge/sdk-core/etc/deps.svg +115 -140
  75. data/bridge/sdk-core/etc/regen-depgraph.sh +5 -0
  76. data/bridge/sdk-core/fsm/rustfsm_procmacro/src/lib.rs +18 -15
  77. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr +1 -1
  78. data/bridge/sdk-core/fsm/rustfsm_trait/src/lib.rs +8 -3
  79. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-16_history.bin +0 -0
  80. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-23_history.bin +0 -0
  81. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-85_history.bin +0 -0
  82. data/bridge/sdk-core/protos/api_upstream/buf.yaml +0 -3
  83. data/bridge/sdk-core/protos/api_upstream/build/go.mod +7 -0
  84. data/bridge/sdk-core/protos/api_upstream/build/go.sum +5 -0
  85. data/bridge/sdk-core/protos/api_upstream/{temporal/api/enums/v1/cluster.proto → build/tools.go} +7 -18
  86. data/bridge/sdk-core/protos/api_upstream/go.mod +6 -0
  87. data/bridge/sdk-core/protos/api_upstream/temporal/api/batch/v1/message.proto +12 -9
  88. data/bridge/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +15 -26
  89. data/bridge/sdk-core/protos/api_upstream/temporal/api/common/v1/message.proto +13 -2
  90. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/batch_operation.proto +3 -2
  91. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/command_type.proto +4 -9
  92. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/common.proto +3 -2
  93. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/event_type.proto +10 -8
  94. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +28 -2
  95. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/namespace.proto +2 -2
  96. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/query.proto +2 -2
  97. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/reset.proto +2 -2
  98. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/schedule.proto +2 -2
  99. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +2 -2
  100. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/update.proto +24 -19
  101. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/workflow.proto +2 -2
  102. data/bridge/sdk-core/protos/api_upstream/temporal/api/errordetails/v1/message.proto +2 -2
  103. data/bridge/sdk-core/protos/api_upstream/temporal/api/failure/v1/message.proto +2 -2
  104. data/bridge/sdk-core/protos/api_upstream/temporal/api/filter/v1/message.proto +2 -2
  105. data/bridge/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +62 -26
  106. data/bridge/sdk-core/protos/api_upstream/temporal/api/namespace/v1/message.proto +4 -2
  107. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +24 -61
  108. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +2 -21
  109. data/bridge/sdk-core/protos/api_upstream/temporal/api/protocol/v1/message.proto +57 -0
  110. data/bridge/sdk-core/protos/api_upstream/temporal/api/query/v1/message.proto +2 -2
  111. data/bridge/sdk-core/protos/api_upstream/temporal/api/replication/v1/message.proto +2 -2
  112. data/bridge/sdk-core/protos/api_upstream/temporal/api/schedule/v1/message.proto +110 -31
  113. data/bridge/sdk-core/protos/api_upstream/temporal/api/sdk/v1/task_complete_metadata.proto +63 -0
  114. data/bridge/sdk-core/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +4 -4
  115. data/bridge/sdk-core/protos/api_upstream/temporal/api/update/v1/message.proto +71 -6
  116. data/bridge/sdk-core/protos/api_upstream/temporal/api/version/v1/message.proto +2 -2
  117. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflow/v1/message.proto +3 -2
  118. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +111 -36
  119. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +19 -5
  120. data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_result/activity_result.proto +1 -0
  121. data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_task/activity_task.proto +1 -0
  122. data/bridge/sdk-core/protos/local/temporal/sdk/core/child_workflow/child_workflow.proto +1 -0
  123. data/bridge/sdk-core/protos/local/temporal/sdk/core/common/common.proto +1 -0
  124. data/bridge/sdk-core/protos/local/temporal/sdk/core/core_interface.proto +1 -0
  125. data/bridge/sdk-core/protos/local/temporal/sdk/core/external_data/external_data.proto +1 -0
  126. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +9 -0
  127. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +9 -1
  128. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_completion/workflow_completion.proto +6 -0
  129. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/request_response.proto +2 -2
  130. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/service.proto +2 -2
  131. data/bridge/sdk-core/sdk/Cargo.toml +4 -3
  132. data/bridge/sdk-core/sdk/src/interceptors.rs +36 -3
  133. data/bridge/sdk-core/sdk/src/lib.rs +94 -25
  134. data/bridge/sdk-core/sdk/src/workflow_context.rs +13 -2
  135. data/bridge/sdk-core/sdk/src/workflow_future.rs +10 -13
  136. data/bridge/sdk-core/sdk-core-protos/Cargo.toml +5 -2
  137. data/bridge/sdk-core/sdk-core-protos/build.rs +36 -2
  138. data/bridge/sdk-core/sdk-core-protos/src/history_builder.rs +164 -104
  139. data/bridge/sdk-core/sdk-core-protos/src/history_info.rs +27 -23
  140. data/bridge/sdk-core/sdk-core-protos/src/lib.rs +252 -74
  141. data/bridge/sdk-core/sdk-core-protos/src/task_token.rs +12 -2
  142. data/bridge/sdk-core/test-utils/Cargo.toml +4 -1
  143. data/bridge/sdk-core/test-utils/src/canned_histories.rs +106 -296
  144. data/bridge/sdk-core/test-utils/src/histfetch.rs +1 -1
  145. data/bridge/sdk-core/test-utils/src/lib.rs +161 -50
  146. data/bridge/sdk-core/test-utils/src/wf_input_saver.rs +50 -0
  147. data/bridge/sdk-core/test-utils/src/workflows.rs +29 -0
  148. data/bridge/sdk-core/tests/fuzzy_workflow.rs +130 -0
  149. data/bridge/sdk-core/tests/{load_tests.rs → heavy_tests.rs} +125 -51
  150. data/bridge/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +25 -3
  151. data/bridge/sdk-core/tests/integ_tests/heartbeat_tests.rs +10 -5
  152. data/bridge/sdk-core/tests/integ_tests/metrics_tests.rs +239 -0
  153. data/bridge/sdk-core/tests/integ_tests/polling_tests.rs +4 -60
  154. data/bridge/sdk-core/tests/integ_tests/queries_tests.rs +5 -128
  155. data/bridge/sdk-core/tests/integ_tests/visibility_tests.rs +83 -25
  156. data/bridge/sdk-core/tests/integ_tests/workflow_tests/activities.rs +93 -69
  157. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +1 -0
  158. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +6 -13
  159. data/bridge/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +1 -0
  160. data/bridge/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +6 -2
  161. data/bridge/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +3 -10
  162. data/bridge/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +151 -116
  163. data/bridge/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +54 -0
  164. data/bridge/sdk-core/tests/integ_tests/workflow_tests/patches.rs +7 -28
  165. data/bridge/sdk-core/tests/integ_tests/workflow_tests/replay.rs +115 -24
  166. data/bridge/sdk-core/tests/integ_tests/workflow_tests/resets.rs +1 -0
  167. data/bridge/sdk-core/tests/integ_tests/workflow_tests/signals.rs +18 -14
  168. data/bridge/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +6 -20
  169. data/bridge/sdk-core/tests/integ_tests/workflow_tests/timers.rs +10 -21
  170. data/bridge/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +6 -4
  171. data/bridge/sdk-core/tests/integ_tests/workflow_tests.rs +27 -18
  172. data/bridge/sdk-core/tests/main.rs +8 -16
  173. data/bridge/sdk-core/tests/runner.rs +75 -36
  174. data/bridge/sdk-core/tests/wf_input_replay.rs +32 -0
  175. data/bridge/src/connection.rs +117 -82
  176. data/bridge/src/lib.rs +356 -42
  177. data/bridge/src/runtime.rs +10 -3
  178. data/bridge/src/test_server.rs +153 -0
  179. data/bridge/src/worker.rs +133 -9
  180. data/lib/gen/temporal/api/batch/v1/message_pb.rb +8 -6
  181. data/lib/gen/temporal/api/command/v1/message_pb.rb +10 -16
  182. data/lib/gen/temporal/api/common/v1/message_pb.rb +5 -1
  183. data/lib/gen/temporal/api/enums/v1/batch_operation_pb.rb +2 -1
  184. data/lib/gen/temporal/api/enums/v1/command_type_pb.rb +3 -3
  185. data/lib/gen/temporal/api/enums/v1/common_pb.rb +2 -1
  186. data/lib/gen/temporal/api/enums/v1/event_type_pb.rb +5 -4
  187. data/lib/gen/temporal/api/enums/v1/failed_cause_pb.rb +9 -1
  188. data/lib/gen/temporal/api/enums/v1/namespace_pb.rb +1 -1
  189. data/lib/gen/temporal/api/enums/v1/query_pb.rb +1 -1
  190. data/lib/gen/temporal/api/enums/v1/reset_pb.rb +1 -1
  191. data/lib/gen/temporal/api/enums/v1/schedule_pb.rb +1 -1
  192. data/lib/gen/temporal/api/enums/v1/task_queue_pb.rb +1 -1
  193. data/lib/gen/temporal/api/enums/v1/update_pb.rb +7 -10
  194. data/lib/gen/temporal/api/enums/v1/workflow_pb.rb +1 -1
  195. data/lib/gen/temporal/api/errordetails/v1/message_pb.rb +1 -1
  196. data/lib/gen/temporal/api/failure/v1/message_pb.rb +1 -1
  197. data/lib/gen/temporal/api/filter/v1/message_pb.rb +1 -1
  198. data/lib/gen/temporal/api/history/v1/message_pb.rb +34 -25
  199. data/lib/gen/temporal/api/namespace/v1/message_pb.rb +2 -1
  200. data/lib/gen/temporal/api/operatorservice/v1/request_response_pb.rb +14 -51
  201. data/lib/gen/temporal/api/operatorservice/v1/service_pb.rb +1 -1
  202. data/lib/gen/temporal/api/protocol/v1/message_pb.rb +30 -0
  203. data/lib/gen/temporal/api/query/v1/message_pb.rb +1 -1
  204. data/lib/gen/temporal/api/replication/v1/message_pb.rb +1 -1
  205. data/lib/gen/temporal/api/schedule/v1/message_pb.rb +22 -1
  206. data/lib/gen/temporal/api/sdk/v1/task_complete_metadata_pb.rb +23 -0
  207. data/lib/gen/temporal/api/taskqueue/v1/message_pb.rb +2 -2
  208. data/lib/gen/temporal/api/testservice/v1/request_response_pb.rb +49 -0
  209. data/lib/gen/temporal/api/testservice/v1/service_pb.rb +21 -0
  210. data/lib/gen/temporal/api/update/v1/message_pb.rb +49 -3
  211. data/lib/gen/temporal/api/version/v1/message_pb.rb +1 -1
  212. data/lib/gen/temporal/api/workflow/v1/message_pb.rb +2 -1
  213. data/lib/gen/temporal/api/workflowservice/v1/request_response_pb.rb +47 -20
  214. data/lib/gen/temporal/api/workflowservice/v1/service_pb.rb +1 -1
  215. data/lib/gen/temporal/sdk/core/activity_result/activity_result_pb.rb +13 -9
  216. data/lib/gen/temporal/sdk/core/activity_task/activity_task_pb.rb +10 -6
  217. data/lib/gen/temporal/sdk/core/child_workflow/child_workflow_pb.rb +13 -9
  218. data/lib/gen/temporal/sdk/core/common/common_pb.rb +7 -3
  219. data/lib/gen/temporal/sdk/core/core_interface_pb.rb +9 -3
  220. data/lib/gen/temporal/sdk/core/external_data/external_data_pb.rb +7 -3
  221. data/lib/gen/temporal/sdk/core/workflow_activation/workflow_activation_pb.rb +28 -21
  222. data/lib/gen/temporal/sdk/core/workflow_commands/workflow_commands_pb.rb +32 -24
  223. data/lib/gen/temporal/sdk/core/workflow_completion/workflow_completion_pb.rb +12 -5
  224. data/lib/temporalio/activity/context.rb +102 -0
  225. data/lib/temporalio/activity/info.rb +67 -0
  226. data/lib/temporalio/activity.rb +85 -0
  227. data/lib/temporalio/bridge/connect_options.rb +15 -0
  228. data/lib/temporalio/bridge/error.rb +8 -0
  229. data/lib/temporalio/bridge/retry_config.rb +24 -0
  230. data/lib/temporalio/bridge/tls_options.rb +19 -0
  231. data/lib/temporalio/bridge.rb +14 -0
  232. data/lib/{temporal → temporalio}/client/implementation.rb +57 -56
  233. data/lib/{temporal → temporalio}/client/workflow_handle.rb +35 -35
  234. data/lib/{temporal → temporalio}/client.rb +19 -32
  235. data/lib/temporalio/connection/retry_config.rb +44 -0
  236. data/lib/temporalio/connection/service.rb +20 -0
  237. data/lib/temporalio/connection/test_service.rb +92 -0
  238. data/lib/temporalio/connection/tls_options.rb +51 -0
  239. data/lib/temporalio/connection/workflow_service.rb +731 -0
  240. data/lib/temporalio/connection.rb +86 -0
  241. data/lib/{temporal → temporalio}/data_converter.rb +76 -35
  242. data/lib/{temporal → temporalio}/error/failure.rb +6 -6
  243. data/lib/{temporal → temporalio}/error/workflow_failure.rb +4 -2
  244. data/lib/{temporal → temporalio}/errors.rb +19 -1
  245. data/lib/{temporal → temporalio}/failure_converter/base.rb +5 -5
  246. data/lib/{temporal → temporalio}/failure_converter/basic.rb +58 -52
  247. data/lib/temporalio/failure_converter.rb +7 -0
  248. data/lib/temporalio/interceptor/activity_inbound.rb +22 -0
  249. data/lib/temporalio/interceptor/activity_outbound.rb +24 -0
  250. data/lib/{temporal → temporalio}/interceptor/chain.rb +7 -6
  251. data/lib/{temporal → temporalio}/interceptor/client.rb +27 -2
  252. data/lib/temporalio/interceptor.rb +22 -0
  253. data/lib/{temporal → temporalio}/payload_codec/base.rb +5 -5
  254. data/lib/{temporal → temporalio}/payload_converter/base.rb +3 -3
  255. data/lib/{temporal → temporalio}/payload_converter/bytes.rb +4 -3
  256. data/lib/{temporal → temporalio}/payload_converter/composite.rb +7 -5
  257. data/lib/{temporal → temporalio}/payload_converter/encoding_base.rb +4 -4
  258. data/lib/{temporal → temporalio}/payload_converter/json.rb +4 -3
  259. data/lib/{temporal → temporalio}/payload_converter/nil.rb +4 -3
  260. data/lib/temporalio/payload_converter.rb +14 -0
  261. data/lib/{temporal → temporalio}/retry_policy.rb +17 -7
  262. data/lib/{temporal → temporalio}/retry_state.rb +1 -1
  263. data/lib/temporalio/runtime.rb +25 -0
  264. data/lib/temporalio/testing/time_skipping_handle.rb +32 -0
  265. data/lib/temporalio/testing/time_skipping_interceptor.rb +23 -0
  266. data/lib/temporalio/testing/workflow_environment.rb +112 -0
  267. data/lib/temporalio/testing.rb +175 -0
  268. data/lib/{temporal → temporalio}/timeout_type.rb +2 -2
  269. data/lib/temporalio/version.rb +3 -0
  270. data/lib/temporalio/worker/activity_runner.rb +114 -0
  271. data/lib/temporalio/worker/activity_worker.rb +164 -0
  272. data/lib/temporalio/worker/reactor.rb +46 -0
  273. data/lib/temporalio/worker/runner.rb +63 -0
  274. data/lib/temporalio/worker/sync_worker.rb +124 -0
  275. data/lib/temporalio/worker/thread_pool_executor.rb +51 -0
  276. data/lib/temporalio/worker.rb +204 -0
  277. data/lib/temporalio/workflow/async.rb +46 -0
  278. data/lib/{temporal → temporalio}/workflow/execution_info.rb +4 -4
  279. data/lib/{temporal → temporalio}/workflow/execution_status.rb +1 -1
  280. data/lib/temporalio/workflow/future.rb +138 -0
  281. data/lib/{temporal → temporalio}/workflow/id_reuse_policy.rb +6 -6
  282. data/lib/temporalio/workflow/info.rb +76 -0
  283. data/lib/{temporal → temporalio}/workflow/query_reject_condition.rb +5 -5
  284. data/lib/temporalio.rb +12 -3
  285. data/temporalio.gemspec +11 -6
  286. metadata +137 -64
  287. data/bridge/sdk-core/Cargo.lock +0 -2606
  288. data/bridge/sdk-core/bridge-ffi/Cargo.toml +0 -24
  289. data/bridge/sdk-core/bridge-ffi/LICENSE.txt +0 -23
  290. data/bridge/sdk-core/bridge-ffi/build.rs +0 -25
  291. data/bridge/sdk-core/bridge-ffi/include/sdk-core-bridge.h +0 -249
  292. data/bridge/sdk-core/bridge-ffi/src/lib.rs +0 -825
  293. data/bridge/sdk-core/bridge-ffi/src/wrappers.rs +0 -211
  294. data/bridge/sdk-core/core/src/log_export.rs +0 -62
  295. data/bridge/sdk-core/core/src/worker/workflow/machines/mutable_side_effect_state_machine.rs +0 -127
  296. data/bridge/sdk-core/core/src/worker/workflow/machines/side_effect_state_machine.rs +0 -71
  297. data/bridge/sdk-core/protos/api_upstream/temporal/api/cluster/v1/message.proto +0 -83
  298. data/bridge/sdk-core/protos/local/temporal/sdk/core/bridge/bridge.proto +0 -210
  299. data/bridge/sdk-core/sdk/src/conversions.rs +0 -8
  300. data/lib/bridge.so +0 -0
  301. data/lib/gen/temporal/api/cluster/v1/message_pb.rb +0 -67
  302. data/lib/gen/temporal/api/enums/v1/cluster_pb.rb +0 -26
  303. data/lib/gen/temporal/sdk/core/bridge/bridge_pb.rb +0 -222
  304. data/lib/temporal/bridge.rb +0 -14
  305. data/lib/temporal/connection.rb +0 -736
  306. data/lib/temporal/failure_converter.rb +0 -8
  307. data/lib/temporal/payload_converter.rb +0 -14
  308. data/lib/temporal/runtime.rb +0 -22
  309. data/lib/temporal/version.rb +0 -3
  310. data/lib/temporal.rb +0 -8
@@ -1,7 +1,7 @@
1
1
  use crate::{
2
2
  test_help::{
3
3
  build_mock_pollers, canned_histories, hist_to_poll_resp, mock_worker, single_hist_mock_sg,
4
- MockPollCfg, ResponseType, TEST_Q,
4
+ MockPollCfg, ResponseType,
5
5
  },
6
6
  worker::{client::mocks::mock_workflow_client, LEGACY_QUERY_ID},
7
7
  };
@@ -16,22 +16,24 @@ use temporal_sdk_core_protos::{
16
16
  remove_from_cache::EvictionReason, workflow_activation_job, WorkflowActivationJob,
17
17
  },
18
18
  workflow_commands::{
19
- ActivityCancellationType, CompleteWorkflowExecution, ContinueAsNewWorkflowExecution,
20
- QueryResult, QuerySuccess, RequestCancelActivity,
19
+ query_result, ActivityCancellationType, CompleteWorkflowExecution,
20
+ ContinueAsNewWorkflowExecution, QueryResult, QuerySuccess, RequestCancelActivity,
21
21
  },
22
22
  workflow_completion::WorkflowActivationCompletion,
23
23
  },
24
24
  temporal::api::{
25
25
  common::v1::Payload,
26
+ enums::v1::EventType,
26
27
  failure::v1::Failure,
27
- history::v1::History,
28
+ history::v1::{history_event, ActivityTaskCancelRequestedEventAttributes, History},
28
29
  query::v1::WorkflowQuery,
29
30
  workflowservice::v1::{
30
31
  GetWorkflowExecutionHistoryResponse, RespondWorkflowTaskCompletedResponse,
31
32
  },
32
33
  },
34
+ TestHistoryBuilder,
33
35
  };
34
- use temporal_sdk_core_test_utils::{schedule_activity_cmd, start_timer_cmd};
36
+ use temporal_sdk_core_test_utils::{schedule_activity_cmd, start_timer_cmd, WorkerTestHelpers};
35
37
 
36
38
  #[rstest::rstest]
37
39
  #[case::with_history(true)]
@@ -44,9 +46,9 @@ async fn legacy_query(#[case] include_history: bool) {
44
46
  let mut header = HashMap::new();
45
47
  header.insert("head".to_string(), Payload::from(b"er"));
46
48
  let tasks = [
47
- hist_to_poll_resp(&t, wfid.to_owned(), 1.into(), TEST_Q.to_string()),
49
+ hist_to_poll_resp(&t, wfid.to_owned(), 1.into()),
48
50
  {
49
- let mut pr = hist_to_poll_resp(&t, wfid.to_owned(), 1.into(), TEST_Q.to_string());
51
+ let mut pr = hist_to_poll_resp(&t, wfid.to_owned(), 1.into());
50
52
  pr.query = Some(WorkflowQuery {
51
53
  query_type: "query-type".to_string(),
52
54
  query_args: Some(b"hi".into()),
@@ -57,7 +59,7 @@ async fn legacy_query(#[case] include_history: bool) {
57
59
  }
58
60
  pr
59
61
  },
60
- hist_to_poll_resp(&t, wfid.to_owned(), 2.into(), TEST_Q.to_string()),
62
+ hist_to_poll_resp(&t, wfid.to_owned(), 2.into()),
61
63
  ];
62
64
  let mut mock = MockPollCfg::from_resp_batches(wfid, t, tasks, mock_workflow_client());
63
65
  mock.num_expected_legacy_query_resps = 1;
@@ -155,29 +157,21 @@ async fn new_queries(#[case] num_queries: usize) {
155
157
  let t = canned_histories::single_timer("1");
156
158
  let mut header = HashMap::new();
157
159
  header.insert("head".to_string(), Payload::from(b"er"));
158
- let tasks = VecDeque::from(vec![
159
- hist_to_poll_resp(&t, wfid.to_owned(), 1.into(), TEST_Q.to_string()),
160
- {
161
- let mut pr = hist_to_poll_resp(
162
- &t,
163
- wfid.to_owned(),
164
- ResponseType::OneTask(2),
165
- TEST_Q.to_string(),
160
+ let tasks = VecDeque::from(vec![hist_to_poll_resp(&t, wfid.to_owned(), 1.into()), {
161
+ let mut pr = hist_to_poll_resp(&t, wfid.to_owned(), ResponseType::OneTask(2));
162
+ pr.queries = HashMap::new();
163
+ for i in 1..=num_queries {
164
+ pr.queries.insert(
165
+ format!("q{i}"),
166
+ WorkflowQuery {
167
+ query_type: "query-type".to_string(),
168
+ query_args: Some(b"hi".into()),
169
+ header: Some(header.clone().into()),
170
+ },
166
171
  );
167
- pr.queries = HashMap::new();
168
- for i in 1..=num_queries {
169
- pr.queries.insert(
170
- format!("q{}", i),
171
- WorkflowQuery {
172
- query_type: "query-type".to_string(),
173
- query_args: Some(b"hi".into()),
174
- header: Some(header.clone().into()),
175
- },
176
- );
177
- }
178
- pr
179
- },
180
- ]);
172
+ }
173
+ pr
174
+ }]);
181
175
  let mut mock_client = mock_workflow_client();
182
176
  mock_client.expect_respond_legacy_query().times(0);
183
177
  let mut mock = single_hist_mock_sg(wfid, t, tasks, mock_client, true);
@@ -212,7 +206,7 @@ async fn new_queries(#[case] num_queries: usize) {
212
206
  let mut qresults: Vec<_> = (1..=num_queries)
213
207
  .map(|i| {
214
208
  QueryResult {
215
- query_id: format!("q{}", i),
209
+ query_id: format!("q{i}"),
216
210
  variant: Some(
217
211
  QuerySuccess {
218
212
  response: Some(query_resp.into()),
@@ -237,19 +231,16 @@ async fn new_queries(#[case] num_queries: usize) {
237
231
  async fn legacy_query_failure_on_wft_failure() {
238
232
  let wfid = "fake_wf_id";
239
233
  let t = canned_histories::single_timer("1");
240
- let tasks = VecDeque::from(vec![
241
- hist_to_poll_resp(&t, wfid.to_owned(), 1.into(), TEST_Q.to_string()),
242
- {
243
- let mut pr = hist_to_poll_resp(&t, wfid.to_owned(), 1.into(), TEST_Q.to_string());
244
- pr.query = Some(WorkflowQuery {
245
- query_type: "query-type".to_string(),
246
- query_args: Some(b"hi".into()),
247
- header: None,
248
- });
249
- pr.history = Some(History { events: vec![] });
250
- pr
251
- },
252
- ]);
234
+ let tasks = VecDeque::from(vec![hist_to_poll_resp(&t, wfid.to_owned(), 1.into()), {
235
+ let mut pr = hist_to_poll_resp(&t, wfid.to_owned(), 1.into());
236
+ pr.query = Some(WorkflowQuery {
237
+ query_type: "query-type".to_string(),
238
+ query_args: Some(b"hi".into()),
239
+ header: None,
240
+ });
241
+ pr.history = Some(History { events: vec![] });
242
+ pr
243
+ }]);
253
244
  let mut mock = MockPollCfg::from_resp_batches(wfid, t, tasks, mock_workflow_client());
254
245
  mock.num_expected_legacy_query_resps = 1;
255
246
  let mut mock = build_mock_pollers(mock);
@@ -292,12 +283,7 @@ async fn query_failure_because_nondeterminism(#[values(true, false)] legacy: boo
292
283
  let wfid = "fake_wf_id";
293
284
  let t = canned_histories::single_timer("1");
294
285
  let tasks = [{
295
- let mut pr = hist_to_poll_resp(
296
- &t,
297
- wfid.to_owned(),
298
- ResponseType::AllHistory,
299
- TEST_Q.to_string(),
300
- );
286
+ let mut pr = hist_to_poll_resp(&t, wfid.to_owned(), ResponseType::AllHistory);
301
287
  if legacy {
302
288
  pr.query = Some(WorkflowQuery {
303
289
  query_type: "query-type".to_string(),
@@ -356,12 +342,7 @@ async fn legacy_query_after_complete(#[values(false, true)] full_history: bool)
356
342
  t
357
343
  };
358
344
  let query_with_hist_task = {
359
- let mut pr = hist_to_poll_resp(
360
- &t,
361
- wfid.to_owned(),
362
- ResponseType::AllHistory,
363
- TEST_Q.to_string(),
364
- );
345
+ let mut pr = hist_to_poll_resp(&t, wfid.to_owned(), ResponseType::AllHistory);
365
346
  pr.query = Some(WorkflowQuery {
366
347
  query_type: "query-type".to_string(),
367
348
  query_args: Some(b"hi".into()),
@@ -375,15 +356,7 @@ async fn legacy_query_after_complete(#[values(false, true)] full_history: bool)
375
356
  let mut tasks = if full_history {
376
357
  vec![]
377
358
  } else {
378
- vec![
379
- hist_to_poll_resp(
380
- &t,
381
- wfid.to_owned(),
382
- ResponseType::AllHistory,
383
- TEST_Q.to_string(),
384
- )
385
- .resp,
386
- ]
359
+ vec![hist_to_poll_resp(&t, wfid.to_owned(), ResponseType::AllHistory).resp]
387
360
  };
388
361
  tasks.extend([query_with_hist_task.clone(), query_with_hist_task]);
389
362
 
@@ -456,29 +429,14 @@ async fn query_cache_miss_causes_page_fetch_dont_reply_wft_too_early(
456
429
  QueryHists::Empty => {
457
430
  // Create a no-history poll response. This happens to be easiest to do by just ripping
458
431
  // out the history after making a normal one.
459
- let mut pr = hist_to_poll_resp(
460
- &t,
461
- wfid.to_owned(),
462
- ResponseType::AllHistory,
463
- TEST_Q.to_string(),
464
- );
432
+ let mut pr = hist_to_poll_resp(&t, wfid.to_owned(), ResponseType::AllHistory);
465
433
  pr.history = Some(Default::default());
466
434
  pr
467
435
  }
468
- QueryHists::Full => hist_to_poll_resp(
469
- &t,
470
- wfid.to_owned(),
471
- ResponseType::AllHistory,
472
- TEST_Q.to_string(),
473
- ),
436
+ QueryHists::Full => hist_to_poll_resp(&t, wfid.to_owned(), ResponseType::AllHistory),
474
437
  QueryHists::Partial => {
475
438
  // Create a partial task
476
- hist_to_poll_resp(
477
- &t,
478
- wfid.to_owned(),
479
- ResponseType::OneTask(2),
480
- TEST_Q.to_string(),
481
- )
439
+ hist_to_poll_resp(&t, wfid.to_owned(), ResponseType::OneTask(2))
482
440
  }
483
441
  };
484
442
  pr.queries = HashMap::new();
@@ -579,12 +537,7 @@ async fn query_replay_with_continue_as_new_doesnt_reply_empty_command() {
579
537
  let wfid = "fake_wf_id";
580
538
  let t = canned_histories::single_timer("1");
581
539
  let query_with_hist_task = {
582
- let mut pr = hist_to_poll_resp(
583
- &t,
584
- wfid.to_owned(),
585
- ResponseType::ToTaskNum(1),
586
- TEST_Q.to_string(),
587
- );
540
+ let mut pr = hist_to_poll_resp(&t, wfid.to_owned(), ResponseType::ToTaskNum(1));
588
541
  pr.queries = HashMap::new();
589
542
  pr.queries.insert(
590
543
  "the-query".to_string(),
@@ -682,7 +635,7 @@ async fn legacy_query_response_gets_not_found_not_fatal() {
682
635
  let wfid = "fake_wf_id";
683
636
  let t = canned_histories::single_timer("1");
684
637
  let tasks = [{
685
- let mut pr = hist_to_poll_resp(&t, wfid.to_owned(), 1.into(), TEST_Q.to_string());
638
+ let mut pr = hist_to_poll_resp(&t, wfid.to_owned(), 1.into());
686
639
  pr.query = Some(WorkflowQuery {
687
640
  query_type: "query-type".to_string(),
688
641
  query_args: Some(b"hi".into()),
@@ -734,3 +687,207 @@ async fn legacy_query_response_gets_not_found_not_fatal() {
734
687
 
735
688
  core.shutdown().await;
736
689
  }
690
+
691
+ #[tokio::test]
692
+ async fn new_query_fail() {
693
+ let wfid = "fake_wf_id";
694
+ let t = canned_histories::single_timer("1");
695
+ let tasks = VecDeque::from(vec![{
696
+ let mut pr = hist_to_poll_resp(&t, wfid.to_owned(), 1.into());
697
+ pr.queries = HashMap::new();
698
+ pr.queries.insert(
699
+ "q1".to_string(),
700
+ WorkflowQuery {
701
+ query_type: "query-type".to_string(),
702
+ query_args: Some(b"hi".into()),
703
+ header: Default::default(),
704
+ },
705
+ );
706
+ pr
707
+ }]);
708
+ let mut mock_client = mock_workflow_client();
709
+ mock_client
710
+ .expect_complete_workflow_task()
711
+ .times(1)
712
+ .returning(|resp| {
713
+ // Verify there is a failed query response along w/ start timer cmd
714
+ assert_eq!(resp.commands.len(), 1);
715
+ assert_matches!(
716
+ resp.query_responses.as_slice(),
717
+ &[QueryResult {
718
+ variant: Some(query_result::Variant::Failed(_)),
719
+ ..
720
+ }]
721
+ );
722
+ Ok(RespondWorkflowTaskCompletedResponse::default())
723
+ });
724
+
725
+ let mut mock = single_hist_mock_sg(wfid, t, tasks, mock_client, true);
726
+ mock.worker_cfg(|wc| wc.max_cached_workflows = 10);
727
+ let core = mock_worker(mock);
728
+
729
+ let task = core.poll_workflow_activation().await.unwrap();
730
+ assert_matches!(
731
+ task.jobs[0],
732
+ WorkflowActivationJob {
733
+ variant: Some(workflow_activation_job::Variant::StartWorkflow(_)),
734
+ }
735
+ );
736
+
737
+ core.complete_workflow_activation(WorkflowActivationCompletion::from_cmd(
738
+ task.run_id,
739
+ start_timer_cmd(1, Duration::from_secs(1)),
740
+ ))
741
+ .await
742
+ .unwrap();
743
+ let task = core.poll_workflow_activation().await.unwrap();
744
+ assert_matches!(
745
+ task.jobs[0],
746
+ WorkflowActivationJob {
747
+ variant: Some(workflow_activation_job::Variant::QueryWorkflow(_)),
748
+ }
749
+ );
750
+ core.complete_workflow_activation(WorkflowActivationCompletion::from_cmd(
751
+ task.run_id,
752
+ QueryResult {
753
+ query_id: "q1".to_string(),
754
+ variant: Some(query_result::Variant::Failed("ahhh".into())),
755
+ }
756
+ .into(),
757
+ ))
758
+ .await
759
+ .unwrap();
760
+ }
761
+
762
+ /// This test verifies that if we get a task with a legacy query in it while in the middle of
763
+ /// processing some local-only work (in this case, resolving an activity as soon as it was
764
+ /// cancelled) that we do not combine the legacy query with the resolve job.
765
+ #[tokio::test]
766
+ async fn legacy_query_combined_with_timer_fire_repro() {
767
+ let wfid = "fake_wf_id";
768
+ let mut t = TestHistoryBuilder::default();
769
+ t.add_by_type(EventType::WorkflowExecutionStarted);
770
+ t.add_full_wf_task();
771
+ let scheduled_event_id = t.add_activity_task_scheduled("1");
772
+ let timer_started_event_id = t.add_by_type(EventType::TimerStarted);
773
+ t.add_timer_fired(timer_started_event_id, "1".to_string());
774
+ t.add_full_wf_task();
775
+ t.add(
776
+ history_event::Attributes::ActivityTaskCancelRequestedEventAttributes(
777
+ ActivityTaskCancelRequestedEventAttributes {
778
+ scheduled_event_id,
779
+ ..Default::default()
780
+ },
781
+ ),
782
+ );
783
+
784
+ let tasks = [
785
+ hist_to_poll_resp(&t, wfid.to_owned(), ResponseType::ToTaskNum(1)),
786
+ {
787
+ // One task is super important here - as we need to look like we hit the cache
788
+ // to apply this query right away
789
+ let mut pr = hist_to_poll_resp(&t, wfid.to_owned(), ResponseType::OneTask(2));
790
+ pr.queries = HashMap::new();
791
+ pr.queries.insert(
792
+ "the-query".to_string(),
793
+ WorkflowQuery {
794
+ query_type: "query-type".to_string(),
795
+ query_args: Some(b"hi".into()),
796
+ header: None,
797
+ },
798
+ );
799
+ pr
800
+ },
801
+ {
802
+ let mut pr = hist_to_poll_resp(&t, wfid.to_owned(), ResponseType::ToTaskNum(2));
803
+ // Strip history, we need to look like we hit the cache for a legacy query
804
+ pr.history = Some(History { events: vec![] });
805
+ pr.query = Some(WorkflowQuery {
806
+ query_type: "query-type".to_string(),
807
+ query_args: Some(b"hi".into()),
808
+ header: None,
809
+ });
810
+ pr
811
+ },
812
+ ];
813
+ let mut mock = mock_workflow_client();
814
+ mock.expect_respond_legacy_query()
815
+ .times(1)
816
+ .returning(move |_, _| Ok(Default::default()));
817
+ let mut mock = single_hist_mock_sg(wfid, t, tasks, mock, true);
818
+ mock.worker_cfg(|wc| wc.max_cached_workflows = 1);
819
+ let core = mock_worker(mock);
820
+
821
+ let task = core.poll_workflow_activation().await.unwrap();
822
+ core.complete_workflow_activation(WorkflowActivationCompletion::from_cmds(
823
+ task.run_id,
824
+ vec![
825
+ schedule_activity_cmd(
826
+ 1,
827
+ "whatever",
828
+ "1",
829
+ ActivityCancellationType::TryCancel,
830
+ Duration::from_secs(60),
831
+ Duration::from_secs(60),
832
+ ),
833
+ start_timer_cmd(1, Duration::from_secs(1)),
834
+ ],
835
+ ))
836
+ .await
837
+ .unwrap();
838
+
839
+ let task = core.poll_workflow_activation().await.unwrap();
840
+ core.complete_workflow_activation(WorkflowActivationCompletion::from_cmds(
841
+ task.run_id,
842
+ vec![
843
+ RequestCancelActivity { seq: 1 }.into(),
844
+ QueryResult {
845
+ query_id: "the-query".to_string(),
846
+ variant: Some(
847
+ QuerySuccess {
848
+ response: Some("whatever".into()),
849
+ }
850
+ .into(),
851
+ ),
852
+ }
853
+ .into(),
854
+ ],
855
+ ))
856
+ .await
857
+ .unwrap();
858
+
859
+ // First should get the activity resolve
860
+ let task = core.poll_workflow_activation().await.unwrap();
861
+ assert_matches!(
862
+ task.jobs.as_slice(),
863
+ [WorkflowActivationJob {
864
+ variant: Some(workflow_activation_job::Variant::ResolveActivity(_)),
865
+ }]
866
+ );
867
+ core.complete_execution(&task.run_id).await;
868
+
869
+ // Then the query
870
+ let task = core.poll_workflow_activation().await.unwrap();
871
+ assert_matches!(
872
+ task.jobs.as_slice(),
873
+ [WorkflowActivationJob {
874
+ variant: Some(workflow_activation_job::Variant::QueryWorkflow(_)),
875
+ }]
876
+ );
877
+ core.complete_workflow_activation(WorkflowActivationCompletion::from_cmd(
878
+ task.run_id,
879
+ QueryResult {
880
+ query_id: LEGACY_QUERY_ID.to_string(),
881
+ variant: Some(
882
+ QuerySuccess {
883
+ response: Some("whatever".into()),
884
+ }
885
+ .into(),
886
+ ),
887
+ }
888
+ .into(),
889
+ ))
890
+ .await
891
+ .unwrap();
892
+ core.shutdown().await;
893
+ }
@@ -24,7 +24,7 @@ use tokio::sync::{watch, Barrier};
24
24
  #[tokio::test]
25
25
  async fn after_shutdown_of_worker_get_shutdown_err() {
26
26
  let t = canned_histories::single_timer("1");
27
- let worker = build_fake_worker("fake_wf_id", t, &[1]);
27
+ let worker = build_fake_worker("fake_wf_id", t, [1]);
28
28
  let res = worker.poll_workflow_activation().await.unwrap();
29
29
  assert_eq!(res.jobs.len(), 1);
30
30
  let run_id = res.run_id;
@@ -53,7 +53,7 @@ async fn after_shutdown_of_worker_get_shutdown_err() {
53
53
  #[tokio::test]
54
54
  async fn shutdown_worker_can_complete_pending_activation() {
55
55
  let t = canned_histories::single_timer("1");
56
- let worker = build_fake_worker("fake_wf_id", t, &[2]);
56
+ let worker = build_fake_worker("fake_wf_id", t, [2]);
57
57
  let res = worker.poll_workflow_activation().await.unwrap();
58
58
  assert_eq!(res.jobs.len(), 1);
59
59
  // Complete the timer, will queue PA
@@ -190,9 +190,7 @@ async fn complete_with_task_not_found_during_shutdown() {
190
190
  complete_order.borrow_mut().push(1);
191
191
  };
192
192
  tokio::join!(shutdown_fut, poll_fut, complete_fut);
193
- // Shutdown will currently complete first before the actual eviction reply since the
194
- // workflow task is marked complete as soon as we get not found back from the server.
195
- assert_eq!(&complete_order.into_inner(), &[1, 3, 2])
193
+ assert_eq!(&complete_order.into_inner(), &[1, 2, 3])
196
194
  }
197
195
 
198
196
  #[tokio::test]
@@ -107,7 +107,7 @@ async fn timer_then_cancel_req_then_timer_then_cancelled() {
107
107
  async fn immediate_cancel() {
108
108
  let wfid = "fake_wf_id";
109
109
  let t = canned_histories::immediate_wf_cancel();
110
- let core = build_fake_worker(wfid, t, &[1]);
110
+ let core = build_fake_worker(wfid, t, [1]);
111
111
 
112
112
  poll_and_reply(
113
113
  &core,