temporalio 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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,19 +1,28 @@
1
1
  use anyhow::anyhow;
2
2
  use futures::future::join_all;
3
- use std::time::Duration;
3
+ use std::{
4
+ sync::atomic::{AtomicU8, Ordering},
5
+ time::Duration,
6
+ };
4
7
  use temporal_client::WorkflowOptions;
5
8
  use temporal_sdk::{
6
9
  interceptors::WorkerInterceptor, ActContext, ActivityCancelledError, CancellableFuture,
7
10
  LocalActivityOptions, WfContext, WorkflowResult,
8
11
  };
12
+ use temporal_sdk_core::replay::HistoryForReplay;
9
13
  use temporal_sdk_core_protos::{
10
14
  coresdk::{
11
- workflow_commands::ActivityCancellationType,
15
+ workflow_commands::workflow_command::Variant, workflow_commands::ActivityCancellationType,
16
+ workflow_completion, workflow_completion::workflow_activation_completion,
12
17
  workflow_completion::WorkflowActivationCompletion, AsJsonPayloadExt,
13
18
  },
14
- temporal::api::common::v1::RetryPolicy,
19
+ temporal::api::{common::v1::RetryPolicy, enums::v1::TimeoutType},
20
+ TestHistoryBuilder,
21
+ };
22
+ use temporal_sdk_core_test_utils::{
23
+ history_from_proto_binary, init_integ_telem, replay_sdk_worker, workflows::la_problem_workflow,
24
+ CoreWfStarter,
15
25
  };
16
- use temporal_sdk_core_test_utils::CoreWfStarter;
17
26
  use tokio_util::sync::CancellationToken;
18
27
 
19
28
  pub async fn echo(_ctx: ActContext, e: String) -> anyhow::Result<String> {
@@ -41,15 +50,7 @@ async fn one_local_activity() {
41
50
  worker.register_wf(wf_name.to_owned(), one_local_activity_wf);
42
51
  worker.register_activity("echo_activity", echo);
43
52
 
44
- worker
45
- .submit_wf(
46
- wf_name.to_owned(),
47
- wf_name.to_owned(),
48
- vec![],
49
- WorkflowOptions::default(),
50
- )
51
- .await
52
- .unwrap();
53
+ starter.start_with_worker(wf_name, &mut worker).await;
53
54
  worker.run_until_done().await.unwrap();
54
55
  }
55
56
 
@@ -72,15 +73,7 @@ async fn local_act_concurrent_with_timer() {
72
73
  worker.register_wf(wf_name.to_owned(), local_act_concurrent_with_timer_wf);
73
74
  worker.register_activity("echo_activity", echo);
74
75
 
75
- worker
76
- .submit_wf(
77
- wf_name.to_owned(),
78
- wf_name.to_owned(),
79
- vec![],
80
- WorkflowOptions::default(),
81
- )
82
- .await
83
- .unwrap();
76
+ starter.start_with_worker(wf_name, &mut worker).await;
84
77
  worker.run_until_done().await.unwrap();
85
78
  }
86
79
 
@@ -104,15 +97,7 @@ async fn local_act_then_timer_then_wait_result() {
104
97
  worker.register_wf(wf_name.to_owned(), local_act_then_timer_then_wait);
105
98
  worker.register_activity("echo_activity", echo);
106
99
 
107
- worker
108
- .submit_wf(
109
- wf_name.to_owned(),
110
- wf_name.to_owned(),
111
- vec![],
112
- WorkflowOptions::default(),
113
- )
114
- .await
115
- .unwrap();
100
+ starter.start_with_worker(wf_name, &mut worker).await;
116
101
  worker.run_until_done().await.unwrap();
117
102
  }
118
103
 
@@ -120,7 +105,7 @@ async fn local_act_then_timer_then_wait_result() {
120
105
  async fn long_running_local_act_with_timer() {
121
106
  let wf_name = "long_running_local_act_with_timer";
122
107
  let mut starter = CoreWfStarter::new(wf_name);
123
- starter.wft_timeout(Duration::from_secs(1));
108
+ starter.workflow_options.task_timeout = Some(Duration::from_secs(1));
124
109
  let mut worker = starter.worker().await;
125
110
  worker.register_wf(wf_name.to_owned(), local_act_then_timer_then_wait);
126
111
  worker.register_activity("echo_activity", |_ctx: ActContext, str: String| async {
@@ -128,15 +113,7 @@ async fn long_running_local_act_with_timer() {
128
113
  Ok(str)
129
114
  });
130
115
 
131
- worker
132
- .submit_wf(
133
- wf_name.to_owned(),
134
- wf_name.to_owned(),
135
- vec![],
136
- WorkflowOptions::default(),
137
- )
138
- .await
139
- .unwrap();
116
+ starter.start_with_worker(wf_name, &mut worker).await;
140
117
  worker.run_until_done().await.unwrap();
141
118
  }
142
119
 
@@ -145,7 +122,7 @@ pub async fn local_act_fanout_wf(ctx: WfContext) -> WorkflowResult<()> {
145
122
  .map(|i| {
146
123
  ctx.local_activity(LocalActivityOptions {
147
124
  activity_type: "echo_activity".to_string(),
148
- input: format!("Hi {}", i)
125
+ input: format!("Hi {i}")
149
126
  .as_json_payload()
150
127
  .expect("serializes fine"),
151
128
  ..Default::default()
@@ -166,15 +143,7 @@ async fn local_act_fanout() {
166
143
  worker.register_wf(wf_name.to_owned(), local_act_fanout_wf);
167
144
  worker.register_activity("echo_activity", echo);
168
145
 
169
- worker
170
- .submit_wf(
171
- wf_name.to_owned(),
172
- wf_name.to_owned(),
173
- vec![],
174
- WorkflowOptions::default(),
175
- )
176
- .await
177
- .unwrap();
146
+ starter.start_with_worker(wf_name, &mut worker).await;
178
147
  worker.run_until_done().await.unwrap();
179
148
  }
180
149
 
@@ -229,7 +198,7 @@ async fn local_act_retry_timer_backoff() {
229
198
  #[case::abandon(ActivityCancellationType::Abandon)]
230
199
  #[tokio::test]
231
200
  async fn cancel_immediate(#[case] cancel_type: ActivityCancellationType) {
232
- let wf_name = format!("cancel_immediate_{:?}", cancel_type);
201
+ let wf_name = format!("cancel_immediate_{cancel_type:?}");
233
202
  let mut starter = CoreWfStarter::new(&wf_name);
234
203
  let mut worker = starter.worker().await;
235
204
  worker.register_wf(&wf_name, move |ctx: WfContext| async move {
@@ -263,17 +232,10 @@ async fn cancel_immediate(#[case] cancel_type: ActivityCancellationType) {
263
232
  }
264
233
  });
265
234
 
266
- worker
267
- .submit_wf(
268
- wf_name.to_owned(),
269
- wf_name.to_owned(),
270
- vec![],
271
- WorkflowOptions::default(),
272
- )
273
- .await
274
- .unwrap();
235
+ starter.start_with_worker(wf_name, &mut worker).await;
275
236
  worker
276
237
  .run_until_done_intercepted(Some(LACancellerInterceptor {
238
+ cancel_on_workflow_completed: false,
277
239
  token: manual_cancel,
278
240
  }))
279
241
  .await
@@ -282,12 +244,29 @@ async fn cancel_immediate(#[case] cancel_type: ActivityCancellationType) {
282
244
 
283
245
  struct LACancellerInterceptor {
284
246
  token: CancellationToken,
247
+ cancel_on_workflow_completed: bool,
285
248
  }
286
249
  #[async_trait::async_trait(?Send)]
287
250
  impl WorkerInterceptor for LACancellerInterceptor {
288
- async fn on_workflow_activation_completion(&self, _: &WorkflowActivationCompletion) {}
251
+ async fn on_workflow_activation_completion(&self, completion: &WorkflowActivationCompletion) {
252
+ if !self.cancel_on_workflow_completed {
253
+ return;
254
+ }
255
+ if let Some(workflow_activation_completion::Status::Successful(
256
+ workflow_completion::Success { commands, .. },
257
+ )) = completion.status.as_ref()
258
+ {
259
+ if let Some(&Variant::CompleteWorkflowExecution(_)) =
260
+ commands.last().and_then(|v| v.variant.as_ref())
261
+ {
262
+ self.token.cancel();
263
+ }
264
+ }
265
+ }
289
266
  fn on_shutdown(&self, _: &temporal_sdk::Worker) {
290
- self.token.cancel()
267
+ if !self.cancel_on_workflow_completed {
268
+ self.token.cancel()
269
+ }
291
270
  }
292
271
  }
293
272
 
@@ -305,12 +284,9 @@ async fn cancel_after_act_starts(
305
284
  )]
306
285
  cancel_type: ActivityCancellationType,
307
286
  ) {
308
- let wf_name = format!(
309
- "cancel_after_act_starts_timer_{:?}_{:?}",
310
- cancel_on_backoff, cancel_type
311
- );
287
+ let wf_name = format!("cancel_after_act_starts_{cancel_on_backoff:?}_{cancel_type:?}");
312
288
  let mut starter = CoreWfStarter::new(&wf_name);
313
- starter.wft_timeout(Duration::from_secs(1));
289
+ starter.workflow_options.task_timeout = Some(Duration::from_secs(1));
314
290
  let mut worker = starter.worker().await;
315
291
  let bo_dur = cancel_on_backoff.unwrap_or_else(|| Duration::from_secs(1));
316
292
  worker.register_wf(&wf_name, move |ctx: WfContext| async move {
@@ -370,21 +346,17 @@ async fn cancel_after_act_starts(
370
346
  }
371
347
  });
372
348
 
373
- worker
374
- .submit_wf(
375
- wf_name.to_owned(),
376
- wf_name.to_owned(),
377
- vec![],
378
- WorkflowOptions::default(),
379
- )
380
- .await
381
- .unwrap();
349
+ starter.start_with_worker(&wf_name, &mut worker).await;
382
350
  worker
383
351
  .run_until_done_intercepted(Some(LACancellerInterceptor {
384
352
  token: manual_cancel,
353
+ // Only needed for this one case since the activity is not drained and prevents worker from shutting down.
354
+ cancel_on_workflow_completed: matches!(cancel_type, ActivityCancellationType::Abandon)
355
+ && cancel_on_backoff.is_none(),
385
356
  }))
386
357
  .await
387
358
  .unwrap();
359
+ starter.shutdown().await;
388
360
  }
389
361
 
390
362
  #[rstest::rstest]
@@ -403,6 +375,11 @@ async fn x_to_close_timeout(#[case] is_schedule: bool) {
403
375
  } else {
404
376
  (None, Some(Duration::from_secs(2)))
405
377
  };
378
+ let timeout_type = if is_schedule {
379
+ TimeoutType::ScheduleToClose
380
+ } else {
381
+ TimeoutType::StartToClose
382
+ };
406
383
 
407
384
  worker.register_wf(wf_name.to_owned(), move |ctx: WfContext| async move {
408
385
  let res = ctx
@@ -422,7 +399,7 @@ async fn x_to_close_timeout(#[case] is_schedule: bool) {
422
399
  ..Default::default()
423
400
  })
424
401
  .await;
425
- assert!(res.timed_out());
402
+ assert_eq!(res.timed_out(), Some(timeout_type));
426
403
  Ok(().into())
427
404
  });
428
405
  worker.register_activity("echo", |ctx: ActContext, _: String| async move {
@@ -435,15 +412,7 @@ async fn x_to_close_timeout(#[case] is_schedule: bool) {
435
412
  Ok(())
436
413
  });
437
414
 
438
- worker
439
- .submit_wf(
440
- wf_name.to_owned(),
441
- wf_name.to_owned(),
442
- vec![],
443
- WorkflowOptions::default(),
444
- )
445
- .await
446
- .unwrap();
415
+ starter.start_with_worker(wf_name, &mut worker).await;
447
416
  worker.run_until_done().await.unwrap();
448
417
  }
449
418
 
@@ -467,43 +436,37 @@ async fn schedule_to_close_timeout_across_timer_backoff(#[case] cached: bool) {
467
436
  activity_type: "echo".to_string(),
468
437
  input: "hi".as_json_payload().expect("serializes fine"),
469
438
  retry_policy: RetryPolicy {
470
- initial_interval: Some(prost_dur!(from_micros(15))),
439
+ initial_interval: Some(prost_dur!(from_millis(15))),
471
440
  backoff_coefficient: 1_000.,
472
- maximum_interval: Some(prost_dur!(from_millis(1500))),
441
+ maximum_interval: Some(prost_dur!(from_millis(1000))),
473
442
  maximum_attempts: 40,
474
443
  non_retryable_error_types: vec![],
475
444
  },
476
- timer_backoff_threshold: Some(Duration::from_secs(1)),
477
- schedule_to_close_timeout: Some(Duration::from_secs(3)),
445
+ timer_backoff_threshold: Some(Duration::from_millis(500)),
446
+ schedule_to_close_timeout: Some(Duration::from_secs(2)),
478
447
  ..Default::default()
479
448
  })
480
449
  .await;
481
- assert!(res.timed_out());
450
+ assert_eq!(res.timed_out(), Some(TimeoutType::ScheduleToClose));
482
451
  Ok(().into())
483
452
  });
484
- worker.register_activity("echo", |_: ActContext, _: String| async {
453
+ let num_attempts: &'static _ = Box::leak(Box::new(AtomicU8::new(0)));
454
+ worker.register_activity("echo", move |_: ActContext, _: String| async {
455
+ num_attempts.fetch_add(1, Ordering::Relaxed);
485
456
  Result::<(), _>::Err(anyhow!("Oh no I failed!"))
486
457
  });
487
458
 
488
- worker
489
- .submit_wf(
490
- wf_name.to_owned(),
491
- wf_name.to_owned(),
492
- vec![],
493
- WorkflowOptions::default(),
494
- )
495
- .await
496
- .unwrap();
459
+ starter.start_with_worker(wf_name, &mut worker).await;
497
460
  worker.run_until_done().await.unwrap();
461
+ // 3 attempts b/c first backoff is very small, then the next 2 attempts take at least 2 seconds
462
+ // b/c of timer backoff.
463
+ assert_eq!(3, num_attempts.load(Ordering::Relaxed));
498
464
  }
499
465
 
500
466
  #[rstest::rstest]
501
467
  #[tokio::test]
502
468
  async fn eviction_wont_make_local_act_get_dropped(#[values(true, false)] short_wft_timeout: bool) {
503
- let wf_name = format!(
504
- "eviction_wont_make_local_act_get_dropped_{}",
505
- short_wft_timeout
506
- );
469
+ let wf_name = format!("eviction_wont_make_local_act_get_dropped_{short_wft_timeout}");
507
470
  let mut starter = CoreWfStarter::new(&wf_name);
508
471
  starter.max_cached_workflows(0);
509
472
  let mut worker = starter.worker().await;
@@ -569,15 +532,7 @@ async fn timer_backoff_concurrent_with_non_timer_backoff() {
569
532
  Result::<(), _>::Err(anyhow!("Oh no I failed!"))
570
533
  });
571
534
 
572
- worker
573
- .submit_wf(
574
- wf_name.to_owned(),
575
- wf_name.to_owned(),
576
- vec![],
577
- WorkflowOptions::default(),
578
- )
579
- .await
580
- .unwrap();
535
+ starter.start_with_worker(wf_name, &mut worker).await;
581
536
  worker.run_until_done().await.unwrap();
582
537
  }
583
538
 
@@ -608,7 +563,7 @@ async fn repro_nondeterminism_with_timer_bug() {
608
563
  _ = r1 => {
609
564
  t1.cancel(&ctx);
610
565
  },
611
- };
566
+ }
612
567
  ctx.timer(Duration::from_secs(1)).await;
613
568
  Ok(().into())
614
569
  });
@@ -632,3 +587,83 @@ async fn repro_nondeterminism_with_timer_bug() {
632
587
  .await
633
588
  .unwrap();
634
589
  }
590
+
591
+ #[rstest::rstest]
592
+ #[tokio::test]
593
+ async fn weird_la_nondeterminism_repro(#[values(true, false)] fix_hist: bool) {
594
+ init_integ_telem();
595
+ let mut hist = history_from_proto_binary(
596
+ "histories/evict_while_la_running_no_interference-85_history.bin",
597
+ )
598
+ .await
599
+ .unwrap();
600
+ if fix_hist {
601
+ // Replace broken ending with accurate ending
602
+ hist.events.truncate(20);
603
+ let mut thb = TestHistoryBuilder::from_history(hist.events);
604
+ thb.add_workflow_task_completed();
605
+ thb.add_workflow_execution_completed();
606
+ hist = thb.get_full_history_info().unwrap().into();
607
+ }
608
+
609
+ let mut worker = replay_sdk_worker([HistoryForReplay::new(hist, "fake".to_owned())]);
610
+ worker.register_wf(
611
+ "evict_while_la_running_no_interference",
612
+ la_problem_workflow,
613
+ );
614
+ worker.register_activity("delay", |_: ActContext, _: String| async {
615
+ tokio::time::sleep(Duration::from_secs(15)).await;
616
+ Ok(())
617
+ });
618
+ worker.run().await.unwrap();
619
+ }
620
+
621
+ #[tokio::test]
622
+ async fn second_weird_la_nondeterminism_repro() {
623
+ init_integ_telem();
624
+ let mut hist = history_from_proto_binary(
625
+ "histories/evict_while_la_running_no_interference-23_history.bin",
626
+ )
627
+ .await
628
+ .unwrap();
629
+ // Chop off uninteresting ending
630
+ hist.events.truncate(24);
631
+ let mut thb = TestHistoryBuilder::from_history(hist.events);
632
+ thb.add_workflow_execution_completed();
633
+ hist = thb.get_full_history_info().unwrap().into();
634
+
635
+ let mut worker = replay_sdk_worker([HistoryForReplay::new(hist, "fake".to_owned())]);
636
+ worker.register_wf(
637
+ "evict_while_la_running_no_interference",
638
+ la_problem_workflow,
639
+ );
640
+ worker.register_activity("delay", |_: ActContext, _: String| async {
641
+ tokio::time::sleep(Duration::from_secs(15)).await;
642
+ Ok(())
643
+ });
644
+ worker.run().await.unwrap();
645
+ }
646
+
647
+ #[tokio::test]
648
+ async fn third_weird_la_nondeterminism_repro() {
649
+ init_integ_telem();
650
+ let mut hist = history_from_proto_binary(
651
+ "histories/evict_while_la_running_no_interference-16_history.bin",
652
+ )
653
+ .await
654
+ .unwrap();
655
+ let mut thb = TestHistoryBuilder::from_history(hist.events);
656
+ thb.add_workflow_task_scheduled_and_started();
657
+ hist = thb.get_full_history_info().unwrap().into();
658
+
659
+ let mut worker = replay_sdk_worker([HistoryForReplay::new(hist, "fake".to_owned())]);
660
+ worker.register_wf(
661
+ "evict_while_la_running_no_interference",
662
+ la_problem_workflow,
663
+ );
664
+ worker.register_activity("delay", |_: ActContext, _: String| async {
665
+ tokio::time::sleep(Duration::from_secs(15)).await;
666
+ Ok(())
667
+ });
668
+ worker.run().await.unwrap();
669
+ }
@@ -0,0 +1,54 @@
1
+ use temporal_client::WorkflowClientTrait;
2
+ use temporal_sdk::{WfContext, WorkflowResult};
3
+ use temporal_sdk_core_protos::coresdk::{AsJsonPayloadExt, FromJsonPayloadExt};
4
+ use temporal_sdk_core_test_utils::CoreWfStarter;
5
+ use uuid::Uuid;
6
+
7
+ static FIELD_A: &str = "cat_name";
8
+ static FIELD_B: &str = "cute_level";
9
+
10
+ async fn memo_upserter(ctx: WfContext) -> WorkflowResult<()> {
11
+ ctx.upsert_memo([
12
+ (FIELD_A.to_string(), "enchi".as_json_payload().unwrap()),
13
+ (FIELD_B.to_string(), 9001.as_json_payload().unwrap()),
14
+ ]);
15
+ Ok(().into())
16
+ }
17
+
18
+ #[tokio::test]
19
+ async fn sends_modify_wf_props() {
20
+ let wf_name = "can_upsert_memo";
21
+ let wf_id = Uuid::new_v4();
22
+ let mut starter = CoreWfStarter::new(wf_name);
23
+ starter.no_remote_activities();
24
+ let mut worker = starter.worker().await;
25
+
26
+ worker.register_wf(wf_name, memo_upserter);
27
+ let run_id = worker
28
+ .submit_wf(wf_id.to_string(), wf_name, vec![], Default::default())
29
+ .await
30
+ .unwrap();
31
+ worker.run_until_done().await.unwrap();
32
+
33
+ let memo = starter
34
+ .get_client()
35
+ .await
36
+ .describe_workflow_execution(wf_id.to_string(), Some(run_id))
37
+ .await
38
+ .unwrap()
39
+ .workflow_execution_info
40
+ .unwrap()
41
+ .memo
42
+ .unwrap()
43
+ .fields;
44
+ let catname = memo.get(FIELD_A).unwrap();
45
+ let cuteness = memo.get(FIELD_B).unwrap();
46
+ for payload in [catname, cuteness] {
47
+ assert_eq!(
48
+ &b"json/plain".to_vec(),
49
+ payload.metadata.get("encoding").unwrap()
50
+ );
51
+ }
52
+ assert_eq!("enchi", String::from_json_payload(catname).unwrap());
53
+ assert_eq!(9001, usize::from_json_payload(cuteness).unwrap());
54
+ }
@@ -2,7 +2,7 @@ use std::{
2
2
  sync::atomic::{AtomicBool, Ordering},
3
3
  time::Duration,
4
4
  };
5
- use temporal_client::WorkflowOptions;
5
+
6
6
  use temporal_sdk::{WfContext, WorkflowResult};
7
7
  use temporal_sdk_core_test_utils::CoreWfStarter;
8
8
 
@@ -27,18 +27,11 @@ pub async fn changes_wf(ctx: WfContext) -> WorkflowResult<()> {
27
27
  async fn writes_change_markers() {
28
28
  let wf_name = "writes_change_markers";
29
29
  let mut starter = CoreWfStarter::new(wf_name);
30
+ starter.no_remote_activities();
30
31
  let mut worker = starter.worker().await;
31
32
  worker.register_wf(wf_name.to_owned(), changes_wf);
32
33
 
33
- worker
34
- .submit_wf(
35
- wf_name.to_owned(),
36
- wf_name.to_owned(),
37
- vec![],
38
- WorkflowOptions::default(),
39
- )
40
- .await
41
- .unwrap();
34
+ starter.start_with_worker(wf_name, &mut worker).await;
42
35
  worker.run_until_done().await.unwrap();
43
36
  }
44
37
 
@@ -67,18 +60,11 @@ pub async fn no_change_then_change_wf(ctx: WfContext) -> WorkflowResult<()> {
67
60
  async fn can_add_change_markers() {
68
61
  let wf_name = "can_add_change_markers";
69
62
  let mut starter = CoreWfStarter::new(wf_name);
63
+ starter.no_remote_activities();
70
64
  let mut worker = starter.worker().await;
71
65
  worker.register_wf(wf_name.to_owned(), no_change_then_change_wf);
72
66
 
73
- worker
74
- .submit_wf(
75
- wf_name.to_owned(),
76
- wf_name.to_owned(),
77
- vec![],
78
- WorkflowOptions::default(),
79
- )
80
- .await
81
- .unwrap();
67
+ starter.start_with_worker(wf_name, &mut worker).await;
82
68
  worker.run_until_done().await.unwrap();
83
69
  }
84
70
 
@@ -97,17 +83,10 @@ pub async fn replay_with_change_marker_wf(ctx: WfContext) -> WorkflowResult<()>
97
83
  async fn replaying_with_patch_marker() {
98
84
  let wf_name = "replaying_with_patch_marker";
99
85
  let mut starter = CoreWfStarter::new(wf_name);
86
+ starter.no_remote_activities();
100
87
  let mut worker = starter.worker().await;
101
88
  worker.register_wf(wf_name.to_owned(), replay_with_change_marker_wf);
102
89
 
103
- worker
104
- .submit_wf(
105
- wf_name.to_owned(),
106
- wf_name.to_owned(),
107
- vec![],
108
- WorkflowOptions::default(),
109
- )
110
- .await
111
- .unwrap();
90
+ starter.start_with_worker(wf_name, &mut worker).await;
112
91
  worker.run_until_done().await.unwrap();
113
92
  }