temporalio 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (316) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +130 -0
  3. data/bridge/Cargo.lock +2865 -0
  4. data/bridge/Cargo.toml +26 -0
  5. data/bridge/sdk-core/ARCHITECTURE.md +76 -0
  6. data/bridge/sdk-core/Cargo.lock +2606 -0
  7. data/bridge/sdk-core/Cargo.toml +2 -0
  8. data/bridge/sdk-core/LICENSE.txt +23 -0
  9. data/bridge/sdk-core/README.md +107 -0
  10. data/bridge/sdk-core/arch_docs/diagrams/README.md +10 -0
  11. data/bridge/sdk-core/arch_docs/diagrams/sticky_queues.puml +40 -0
  12. data/bridge/sdk-core/arch_docs/diagrams/workflow_internals.svg +1 -0
  13. data/bridge/sdk-core/arch_docs/sticky_queues.md +51 -0
  14. data/bridge/sdk-core/bridge-ffi/Cargo.toml +24 -0
  15. data/bridge/sdk-core/bridge-ffi/LICENSE.txt +23 -0
  16. data/bridge/sdk-core/bridge-ffi/build.rs +25 -0
  17. data/bridge/sdk-core/bridge-ffi/include/sdk-core-bridge.h +249 -0
  18. data/bridge/sdk-core/bridge-ffi/src/lib.rs +825 -0
  19. data/bridge/sdk-core/bridge-ffi/src/wrappers.rs +211 -0
  20. data/bridge/sdk-core/client/Cargo.toml +40 -0
  21. data/bridge/sdk-core/client/LICENSE.txt +23 -0
  22. data/bridge/sdk-core/client/src/lib.rs +1294 -0
  23. data/bridge/sdk-core/client/src/metrics.rs +165 -0
  24. data/bridge/sdk-core/client/src/raw.rs +931 -0
  25. data/bridge/sdk-core/client/src/retry.rs +674 -0
  26. data/bridge/sdk-core/client/src/workflow_handle/mod.rs +185 -0
  27. data/bridge/sdk-core/core/Cargo.toml +116 -0
  28. data/bridge/sdk-core/core/LICENSE.txt +23 -0
  29. data/bridge/sdk-core/core/benches/workflow_replay.rs +73 -0
  30. data/bridge/sdk-core/core/src/abstractions.rs +166 -0
  31. data/bridge/sdk-core/core/src/core_tests/activity_tasks.rs +911 -0
  32. data/bridge/sdk-core/core/src/core_tests/child_workflows.rs +221 -0
  33. data/bridge/sdk-core/core/src/core_tests/determinism.rs +107 -0
  34. data/bridge/sdk-core/core/src/core_tests/local_activities.rs +515 -0
  35. data/bridge/sdk-core/core/src/core_tests/mod.rs +100 -0
  36. data/bridge/sdk-core/core/src/core_tests/queries.rs +736 -0
  37. data/bridge/sdk-core/core/src/core_tests/replay_flag.rs +65 -0
  38. data/bridge/sdk-core/core/src/core_tests/workers.rs +259 -0
  39. data/bridge/sdk-core/core/src/core_tests/workflow_cancels.rs +124 -0
  40. data/bridge/sdk-core/core/src/core_tests/workflow_tasks.rs +2070 -0
  41. data/bridge/sdk-core/core/src/ephemeral_server/mod.rs +515 -0
  42. data/bridge/sdk-core/core/src/lib.rs +175 -0
  43. data/bridge/sdk-core/core/src/log_export.rs +62 -0
  44. data/bridge/sdk-core/core/src/pollers/mod.rs +54 -0
  45. data/bridge/sdk-core/core/src/pollers/poll_buffer.rs +297 -0
  46. data/bridge/sdk-core/core/src/protosext/mod.rs +428 -0
  47. data/bridge/sdk-core/core/src/replay/mod.rs +71 -0
  48. data/bridge/sdk-core/core/src/retry_logic.rs +202 -0
  49. data/bridge/sdk-core/core/src/telemetry/metrics.rs +383 -0
  50. data/bridge/sdk-core/core/src/telemetry/mod.rs +412 -0
  51. data/bridge/sdk-core/core/src/telemetry/prometheus_server.rs +77 -0
  52. data/bridge/sdk-core/core/src/test_help/mod.rs +875 -0
  53. data/bridge/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +580 -0
  54. data/bridge/sdk-core/core/src/worker/activities/local_activities.rs +1042 -0
  55. data/bridge/sdk-core/core/src/worker/activities.rs +464 -0
  56. data/bridge/sdk-core/core/src/worker/client/mocks.rs +87 -0
  57. data/bridge/sdk-core/core/src/worker/client.rs +347 -0
  58. data/bridge/sdk-core/core/src/worker/mod.rs +566 -0
  59. data/bridge/sdk-core/core/src/worker/workflow/bridge.rs +37 -0
  60. data/bridge/sdk-core/core/src/worker/workflow/driven_workflow.rs +110 -0
  61. data/bridge/sdk-core/core/src/worker/workflow/history_update.rs +458 -0
  62. data/bridge/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +911 -0
  63. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +298 -0
  64. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +171 -0
  65. data/bridge/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +860 -0
  66. data/bridge/sdk-core/core/src/worker/workflow/machines/complete_workflow_state_machine.rs +140 -0
  67. data/bridge/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +161 -0
  68. data/bridge/sdk-core/core/src/worker/workflow/machines/fail_workflow_state_machine.rs +133 -0
  69. data/bridge/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +1448 -0
  70. data/bridge/sdk-core/core/src/worker/workflow/machines/mod.rs +342 -0
  71. data/bridge/sdk-core/core/src/worker/workflow/machines/mutable_side_effect_state_machine.rs +127 -0
  72. data/bridge/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +712 -0
  73. data/bridge/sdk-core/core/src/worker/workflow/machines/side_effect_state_machine.rs +71 -0
  74. data/bridge/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +443 -0
  75. data/bridge/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +439 -0
  76. data/bridge/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +169 -0
  77. data/bridge/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +246 -0
  78. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines/local_acts.rs +96 -0
  79. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +1184 -0
  80. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_task_state_machine.rs +277 -0
  81. data/bridge/sdk-core/core/src/worker/workflow/managed_run/managed_wf_test.rs +198 -0
  82. data/bridge/sdk-core/core/src/worker/workflow/managed_run.rs +647 -0
  83. data/bridge/sdk-core/core/src/worker/workflow/mod.rs +1143 -0
  84. data/bridge/sdk-core/core/src/worker/workflow/run_cache.rs +145 -0
  85. data/bridge/sdk-core/core/src/worker/workflow/wft_poller.rs +88 -0
  86. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream.rs +940 -0
  87. data/bridge/sdk-core/core-api/Cargo.toml +31 -0
  88. data/bridge/sdk-core/core-api/LICENSE.txt +23 -0
  89. data/bridge/sdk-core/core-api/src/errors.rs +95 -0
  90. data/bridge/sdk-core/core-api/src/lib.rs +151 -0
  91. data/bridge/sdk-core/core-api/src/worker.rs +135 -0
  92. data/bridge/sdk-core/etc/deps.svg +187 -0
  93. data/bridge/sdk-core/etc/dynamic-config.yaml +2 -0
  94. data/bridge/sdk-core/etc/otel-collector-config.yaml +36 -0
  95. data/bridge/sdk-core/etc/prometheus.yaml +6 -0
  96. data/bridge/sdk-core/fsm/Cargo.toml +18 -0
  97. data/bridge/sdk-core/fsm/LICENSE.txt +23 -0
  98. data/bridge/sdk-core/fsm/README.md +3 -0
  99. data/bridge/sdk-core/fsm/rustfsm_procmacro/Cargo.toml +27 -0
  100. data/bridge/sdk-core/fsm/rustfsm_procmacro/LICENSE.txt +23 -0
  101. data/bridge/sdk-core/fsm/rustfsm_procmacro/src/lib.rs +647 -0
  102. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/progress.rs +8 -0
  103. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.rs +18 -0
  104. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.stderr +12 -0
  105. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dynamic_dest_pass.rs +41 -0
  106. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/forgot_name_fail.rs +14 -0
  107. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/forgot_name_fail.stderr +11 -0
  108. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/handler_arg_pass.rs +32 -0
  109. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/handler_pass.rs +31 -0
  110. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/medium_complex_pass.rs +46 -0
  111. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.rs +29 -0
  112. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr +12 -0
  113. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/simple_pass.rs +32 -0
  114. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/struct_event_variant_fail.rs +18 -0
  115. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/struct_event_variant_fail.stderr +5 -0
  116. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_more_item_event_variant_fail.rs +11 -0
  117. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_more_item_event_variant_fail.stderr +5 -0
  118. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_zero_item_event_variant_fail.rs +11 -0
  119. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_zero_item_event_variant_fail.stderr +5 -0
  120. data/bridge/sdk-core/fsm/rustfsm_trait/Cargo.toml +14 -0
  121. data/bridge/sdk-core/fsm/rustfsm_trait/LICENSE.txt +23 -0
  122. data/bridge/sdk-core/fsm/rustfsm_trait/src/lib.rs +249 -0
  123. data/bridge/sdk-core/fsm/src/lib.rs +2 -0
  124. data/bridge/sdk-core/histories/fail_wf_task.bin +0 -0
  125. data/bridge/sdk-core/histories/timer_workflow_history.bin +0 -0
  126. data/bridge/sdk-core/integ-with-otel.sh +7 -0
  127. data/bridge/sdk-core/protos/api_upstream/README.md +9 -0
  128. data/bridge/sdk-core/protos/api_upstream/api-linter.yaml +40 -0
  129. data/bridge/sdk-core/protos/api_upstream/buf.yaml +12 -0
  130. data/bridge/sdk-core/protos/api_upstream/dependencies/gogoproto/gogo.proto +141 -0
  131. data/bridge/sdk-core/protos/api_upstream/temporal/api/batch/v1/message.proto +86 -0
  132. data/bridge/sdk-core/protos/api_upstream/temporal/api/cluster/v1/message.proto +83 -0
  133. data/bridge/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +259 -0
  134. data/bridge/sdk-core/protos/api_upstream/temporal/api/common/v1/message.proto +112 -0
  135. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/batch_operation.proto +46 -0
  136. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/cluster.proto +40 -0
  137. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/command_type.proto +57 -0
  138. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/common.proto +55 -0
  139. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/event_type.proto +168 -0
  140. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +97 -0
  141. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/namespace.proto +51 -0
  142. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/query.proto +50 -0
  143. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/reset.proto +41 -0
  144. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/schedule.proto +60 -0
  145. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +59 -0
  146. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/update.proto +51 -0
  147. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/workflow.proto +122 -0
  148. data/bridge/sdk-core/protos/api_upstream/temporal/api/errordetails/v1/message.proto +108 -0
  149. data/bridge/sdk-core/protos/api_upstream/temporal/api/failure/v1/message.proto +114 -0
  150. data/bridge/sdk-core/protos/api_upstream/temporal/api/filter/v1/message.proto +56 -0
  151. data/bridge/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +751 -0
  152. data/bridge/sdk-core/protos/api_upstream/temporal/api/namespace/v1/message.proto +97 -0
  153. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +161 -0
  154. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +99 -0
  155. data/bridge/sdk-core/protos/api_upstream/temporal/api/query/v1/message.proto +61 -0
  156. data/bridge/sdk-core/protos/api_upstream/temporal/api/replication/v1/message.proto +55 -0
  157. data/bridge/sdk-core/protos/api_upstream/temporal/api/schedule/v1/message.proto +300 -0
  158. data/bridge/sdk-core/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +108 -0
  159. data/bridge/sdk-core/protos/api_upstream/temporal/api/update/v1/message.proto +46 -0
  160. data/bridge/sdk-core/protos/api_upstream/temporal/api/version/v1/message.proto +59 -0
  161. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflow/v1/message.proto +145 -0
  162. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +1124 -0
  163. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +401 -0
  164. data/bridge/sdk-core/protos/grpc/health/v1/health.proto +63 -0
  165. data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_result/activity_result.proto +78 -0
  166. data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_task/activity_task.proto +79 -0
  167. data/bridge/sdk-core/protos/local/temporal/sdk/core/bridge/bridge.proto +210 -0
  168. data/bridge/sdk-core/protos/local/temporal/sdk/core/child_workflow/child_workflow.proto +77 -0
  169. data/bridge/sdk-core/protos/local/temporal/sdk/core/common/common.proto +15 -0
  170. data/bridge/sdk-core/protos/local/temporal/sdk/core/core_interface.proto +30 -0
  171. data/bridge/sdk-core/protos/local/temporal/sdk/core/external_data/external_data.proto +30 -0
  172. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +261 -0
  173. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +297 -0
  174. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_completion/workflow_completion.proto +29 -0
  175. data/bridge/sdk-core/protos/testsrv_upstream/api-linter.yaml +38 -0
  176. data/bridge/sdk-core/protos/testsrv_upstream/buf.yaml +13 -0
  177. data/bridge/sdk-core/protos/testsrv_upstream/dependencies/gogoproto/gogo.proto +141 -0
  178. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/request_response.proto +63 -0
  179. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/service.proto +90 -0
  180. data/bridge/sdk-core/rustfmt.toml +1 -0
  181. data/bridge/sdk-core/sdk/Cargo.toml +47 -0
  182. data/bridge/sdk-core/sdk/LICENSE.txt +23 -0
  183. data/bridge/sdk-core/sdk/src/activity_context.rs +230 -0
  184. data/bridge/sdk-core/sdk/src/app_data.rs +37 -0
  185. data/bridge/sdk-core/sdk/src/conversions.rs +8 -0
  186. data/bridge/sdk-core/sdk/src/interceptors.rs +17 -0
  187. data/bridge/sdk-core/sdk/src/lib.rs +792 -0
  188. data/bridge/sdk-core/sdk/src/payload_converter.rs +11 -0
  189. data/bridge/sdk-core/sdk/src/workflow_context/options.rs +295 -0
  190. data/bridge/sdk-core/sdk/src/workflow_context.rs +683 -0
  191. data/bridge/sdk-core/sdk/src/workflow_future.rs +503 -0
  192. data/bridge/sdk-core/sdk-core-protos/Cargo.toml +30 -0
  193. data/bridge/sdk-core/sdk-core-protos/LICENSE.txt +23 -0
  194. data/bridge/sdk-core/sdk-core-protos/build.rs +108 -0
  195. data/bridge/sdk-core/sdk-core-protos/src/constants.rs +7 -0
  196. data/bridge/sdk-core/sdk-core-protos/src/history_builder.rs +497 -0
  197. data/bridge/sdk-core/sdk-core-protos/src/history_info.rs +230 -0
  198. data/bridge/sdk-core/sdk-core-protos/src/lib.rs +1910 -0
  199. data/bridge/sdk-core/sdk-core-protos/src/task_token.rs +38 -0
  200. data/bridge/sdk-core/sdk-core-protos/src/utilities.rs +14 -0
  201. data/bridge/sdk-core/test-utils/Cargo.toml +35 -0
  202. data/bridge/sdk-core/test-utils/src/canned_histories.rs +1579 -0
  203. data/bridge/sdk-core/test-utils/src/histfetch.rs +28 -0
  204. data/bridge/sdk-core/test-utils/src/lib.rs +598 -0
  205. data/bridge/sdk-core/tests/integ_tests/client_tests.rs +36 -0
  206. data/bridge/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +128 -0
  207. data/bridge/sdk-core/tests/integ_tests/heartbeat_tests.rs +218 -0
  208. data/bridge/sdk-core/tests/integ_tests/polling_tests.rs +146 -0
  209. data/bridge/sdk-core/tests/integ_tests/queries_tests.rs +437 -0
  210. data/bridge/sdk-core/tests/integ_tests/visibility_tests.rs +93 -0
  211. data/bridge/sdk-core/tests/integ_tests/workflow_tests/activities.rs +878 -0
  212. data/bridge/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +61 -0
  213. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +59 -0
  214. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +58 -0
  215. data/bridge/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +50 -0
  216. data/bridge/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +60 -0
  217. data/bridge/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +54 -0
  218. data/bridge/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +634 -0
  219. data/bridge/sdk-core/tests/integ_tests/workflow_tests/patches.rs +113 -0
  220. data/bridge/sdk-core/tests/integ_tests/workflow_tests/replay.rs +137 -0
  221. data/bridge/sdk-core/tests/integ_tests/workflow_tests/resets.rs +93 -0
  222. data/bridge/sdk-core/tests/integ_tests/workflow_tests/signals.rs +167 -0
  223. data/bridge/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +99 -0
  224. data/bridge/sdk-core/tests/integ_tests/workflow_tests/timers.rs +131 -0
  225. data/bridge/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +75 -0
  226. data/bridge/sdk-core/tests/integ_tests/workflow_tests.rs +587 -0
  227. data/bridge/sdk-core/tests/load_tests.rs +191 -0
  228. data/bridge/sdk-core/tests/main.rs +111 -0
  229. data/bridge/sdk-core/tests/runner.rs +93 -0
  230. data/bridge/src/connection.rs +167 -0
  231. data/bridge/src/lib.rs +180 -0
  232. data/bridge/src/runtime.rs +47 -0
  233. data/bridge/src/worker.rs +73 -0
  234. data/ext/Rakefile +9 -0
  235. data/lib/bridge.so +0 -0
  236. data/lib/gen/dependencies/gogoproto/gogo_pb.rb +14 -0
  237. data/lib/gen/temporal/api/batch/v1/message_pb.rb +48 -0
  238. data/lib/gen/temporal/api/cluster/v1/message_pb.rb +67 -0
  239. data/lib/gen/temporal/api/command/v1/message_pb.rb +166 -0
  240. data/lib/gen/temporal/api/common/v1/message_pb.rb +69 -0
  241. data/lib/gen/temporal/api/enums/v1/batch_operation_pb.rb +32 -0
  242. data/lib/gen/temporal/api/enums/v1/cluster_pb.rb +26 -0
  243. data/lib/gen/temporal/api/enums/v1/command_type_pb.rb +37 -0
  244. data/lib/gen/temporal/api/enums/v1/common_pb.rb +41 -0
  245. data/lib/gen/temporal/api/enums/v1/event_type_pb.rb +67 -0
  246. data/lib/gen/temporal/api/enums/v1/failed_cause_pb.rb +71 -0
  247. data/lib/gen/temporal/api/enums/v1/namespace_pb.rb +37 -0
  248. data/lib/gen/temporal/api/enums/v1/query_pb.rb +31 -0
  249. data/lib/gen/temporal/api/enums/v1/reset_pb.rb +24 -0
  250. data/lib/gen/temporal/api/enums/v1/schedule_pb.rb +28 -0
  251. data/lib/gen/temporal/api/enums/v1/task_queue_pb.rb +30 -0
  252. data/lib/gen/temporal/api/enums/v1/update_pb.rb +28 -0
  253. data/lib/gen/temporal/api/enums/v1/workflow_pb.rb +89 -0
  254. data/lib/gen/temporal/api/errordetails/v1/message_pb.rb +84 -0
  255. data/lib/gen/temporal/api/failure/v1/message_pb.rb +83 -0
  256. data/lib/gen/temporal/api/filter/v1/message_pb.rb +40 -0
  257. data/lib/gen/temporal/api/history/v1/message_pb.rb +489 -0
  258. data/lib/gen/temporal/api/namespace/v1/message_pb.rb +63 -0
  259. data/lib/gen/temporal/api/operatorservice/v1/request_response_pb.rb +125 -0
  260. data/lib/gen/temporal/api/operatorservice/v1/service_pb.rb +20 -0
  261. data/lib/gen/temporal/api/query/v1/message_pb.rb +38 -0
  262. data/lib/gen/temporal/api/replication/v1/message_pb.rb +37 -0
  263. data/lib/gen/temporal/api/schedule/v1/message_pb.rb +128 -0
  264. data/lib/gen/temporal/api/taskqueue/v1/message_pb.rb +73 -0
  265. data/lib/gen/temporal/api/update/v1/message_pb.rb +26 -0
  266. data/lib/gen/temporal/api/version/v1/message_pb.rb +41 -0
  267. data/lib/gen/temporal/api/workflow/v1/message_pb.rb +110 -0
  268. data/lib/gen/temporal/api/workflowservice/v1/request_response_pb.rb +771 -0
  269. data/lib/gen/temporal/api/workflowservice/v1/service_pb.rb +20 -0
  270. data/lib/gen/temporal/sdk/core/activity_result/activity_result_pb.rb +58 -0
  271. data/lib/gen/temporal/sdk/core/activity_task/activity_task_pb.rb +57 -0
  272. data/lib/gen/temporal/sdk/core/bridge/bridge_pb.rb +222 -0
  273. data/lib/gen/temporal/sdk/core/child_workflow/child_workflow_pb.rb +57 -0
  274. data/lib/gen/temporal/sdk/core/common/common_pb.rb +22 -0
  275. data/lib/gen/temporal/sdk/core/core_interface_pb.rb +34 -0
  276. data/lib/gen/temporal/sdk/core/external_data/external_data_pb.rb +27 -0
  277. data/lib/gen/temporal/sdk/core/workflow_activation/workflow_activation_pb.rb +164 -0
  278. data/lib/gen/temporal/sdk/core/workflow_commands/workflow_commands_pb.rb +192 -0
  279. data/lib/gen/temporal/sdk/core/workflow_completion/workflow_completion_pb.rb +34 -0
  280. data/lib/temporal/bridge.rb +14 -0
  281. data/lib/temporal/client/implementation.rb +339 -0
  282. data/lib/temporal/client/workflow_handle.rb +243 -0
  283. data/lib/temporal/client.rb +144 -0
  284. data/lib/temporal/connection.rb +736 -0
  285. data/lib/temporal/data_converter.rb +150 -0
  286. data/lib/temporal/error/failure.rb +194 -0
  287. data/lib/temporal/error/workflow_failure.rb +17 -0
  288. data/lib/temporal/errors.rb +22 -0
  289. data/lib/temporal/failure_converter/base.rb +26 -0
  290. data/lib/temporal/failure_converter/basic.rb +313 -0
  291. data/lib/temporal/failure_converter.rb +8 -0
  292. data/lib/temporal/interceptor/chain.rb +27 -0
  293. data/lib/temporal/interceptor/client.rb +102 -0
  294. data/lib/temporal/payload_codec/base.rb +32 -0
  295. data/lib/temporal/payload_converter/base.rb +24 -0
  296. data/lib/temporal/payload_converter/bytes.rb +26 -0
  297. data/lib/temporal/payload_converter/composite.rb +47 -0
  298. data/lib/temporal/payload_converter/encoding_base.rb +35 -0
  299. data/lib/temporal/payload_converter/json.rb +25 -0
  300. data/lib/temporal/payload_converter/nil.rb +25 -0
  301. data/lib/temporal/payload_converter.rb +14 -0
  302. data/lib/temporal/retry_policy.rb +82 -0
  303. data/lib/temporal/retry_state.rb +35 -0
  304. data/lib/temporal/runtime.rb +22 -0
  305. data/lib/temporal/timeout_type.rb +29 -0
  306. data/lib/temporal/version.rb +1 -1
  307. data/lib/temporal/workflow/execution_info.rb +54 -0
  308. data/lib/temporal/workflow/execution_status.rb +36 -0
  309. data/lib/temporal/workflow/id_reuse_policy.rb +36 -0
  310. data/lib/temporal/workflow/query_reject_condition.rb +33 -0
  311. data/lib/temporal.rb +4 -0
  312. data/lib/temporalio.rb +3 -1
  313. data/lib/thermite_patch.rb +23 -0
  314. data/temporalio.gemspec +41 -0
  315. metadata +543 -9
  316. data/temporal.gemspec +0 -20
@@ -0,0 +1,128 @@
1
+ use std::time::{SystemTime, UNIX_EPOCH};
2
+ use temporal_client::{ClientOptionsBuilder, TestService, WorkflowService};
3
+ use temporal_sdk_core::ephemeral_server::{
4
+ EphemeralExe, EphemeralExeVersion, EphemeralServer, TemporaliteConfigBuilder,
5
+ TestServerConfigBuilder,
6
+ };
7
+ use temporal_sdk_core_protos::temporal::api::workflowservice::v1::DescribeNamespaceRequest;
8
+ use temporal_sdk_core_test_utils::{default_cached_download, NAMESPACE};
9
+ use url::Url;
10
+
11
+ #[tokio::test]
12
+ async fn temporalite_default() {
13
+ let config = TemporaliteConfigBuilder::default()
14
+ .exe(default_cached_download())
15
+ .build()
16
+ .unwrap();
17
+ let mut server = config.start_server().await.unwrap();
18
+ assert_ephemeral_server(&server).await;
19
+ server.shutdown().await.unwrap();
20
+ }
21
+
22
+ #[tokio::test]
23
+ async fn temporalite_fixed() {
24
+ let config = TemporaliteConfigBuilder::default()
25
+ .exe(fixed_cached_download("v0.1.1"))
26
+ .build()
27
+ .unwrap();
28
+ let mut server = config.start_server().await.unwrap();
29
+ assert_ephemeral_server(&server).await;
30
+ server.shutdown().await.unwrap();
31
+ }
32
+
33
+ #[tokio::test]
34
+ async fn temporalite_shutdown_port_reuse() {
35
+ // Start, test shutdown, do again immediately on same port to ensure we can
36
+ // reuse after shutdown
37
+ let config = TemporaliteConfigBuilder::default()
38
+ .exe(default_cached_download())
39
+ .port(Some(10123))
40
+ .build()
41
+ .unwrap();
42
+ let mut server = config.start_server().await.unwrap();
43
+ assert_ephemeral_server(&server).await;
44
+ server.shutdown().await.unwrap();
45
+ let mut server = config.start_server().await.unwrap();
46
+ assert_ephemeral_server(&server).await;
47
+ server.shutdown().await.unwrap();
48
+ }
49
+
50
+ #[tokio::test]
51
+ async fn test_server_default() {
52
+ let config = TestServerConfigBuilder::default()
53
+ .exe(default_cached_download())
54
+ .build()
55
+ .unwrap();
56
+ let mut server = config.start_server().await.unwrap();
57
+ assert_ephemeral_server(&server).await;
58
+ server.shutdown().await.unwrap();
59
+ }
60
+
61
+ #[tokio::test]
62
+ async fn test_server_fixed() {
63
+ let config = TestServerConfigBuilder::default()
64
+ .exe(fixed_cached_download("v1.16.0"))
65
+ .build()
66
+ .unwrap();
67
+ let mut server = config.start_server().await.unwrap();
68
+ assert_ephemeral_server(&server).await;
69
+ server.shutdown().await.unwrap();
70
+ }
71
+
72
+ #[tokio::test]
73
+ async fn test_server_shutdown_port_reuse() {
74
+ // Start, test shutdown, do again immediately on same port to ensure we can
75
+ // reuse after shutdown
76
+ let config = TestServerConfigBuilder::default()
77
+ .exe(default_cached_download())
78
+ .port(Some(10124))
79
+ .build()
80
+ .unwrap();
81
+ let mut server = config.start_server().await.unwrap();
82
+ assert_ephemeral_server(&server).await;
83
+ server.shutdown().await.unwrap();
84
+ let mut server = config.start_server().await.unwrap();
85
+ assert_ephemeral_server(&server).await;
86
+ server.shutdown().await.unwrap();
87
+ }
88
+
89
+ fn fixed_cached_download(version: &str) -> EphemeralExe {
90
+ EphemeralExe::CachedDownload {
91
+ version: EphemeralExeVersion::Fixed(version.to_string()),
92
+ dest_dir: None,
93
+ }
94
+ }
95
+
96
+ async fn assert_ephemeral_server(server: &EphemeralServer) {
97
+ // Connect and describe namespace
98
+ let mut client = ClientOptionsBuilder::default()
99
+ .identity("integ_tester".to_string())
100
+ .target_url(Url::try_from(&*format!("http://{}", server.target)).unwrap())
101
+ .client_name("temporal-core".to_string())
102
+ .client_version("0.1.0".to_string())
103
+ .build()
104
+ .unwrap()
105
+ .connect_no_namespace(None, None)
106
+ .await
107
+ .unwrap();
108
+ let resp = client
109
+ .describe_namespace(DescribeNamespaceRequest {
110
+ namespace: NAMESPACE.to_string(),
111
+ ..Default::default()
112
+ })
113
+ .await
114
+ .unwrap();
115
+ assert!(resp.into_inner().namespace_info.unwrap().name == "default");
116
+
117
+ // If it has test service, make sure we can use it too
118
+ if server.has_test_service {
119
+ let resp = client.get_current_time(()).await.unwrap();
120
+ // Make sure it's within 5 mins of now
121
+ let resp_seconds = resp.get_ref().time.as_ref().unwrap().seconds as u64;
122
+ let curr_seconds = SystemTime::now()
123
+ .duration_since(UNIX_EPOCH)
124
+ .unwrap()
125
+ .as_secs();
126
+ assert!(curr_seconds - 300 < resp_seconds && curr_seconds + 300 > resp_seconds);
127
+ }
128
+ }
@@ -0,0 +1,218 @@
1
+ use assert_matches::assert_matches;
2
+ use std::time::Duration;
3
+ use temporal_client::{WfClientExt, WorkflowOptions};
4
+ use temporal_sdk::{ActContext, ActivityOptions, WfContext};
5
+ use temporal_sdk_core_protos::{
6
+ coresdk::{
7
+ activity_result::{
8
+ self, activity_resolution as act_res, ActivityExecutionResult, ActivityResolution,
9
+ },
10
+ activity_task::activity_task,
11
+ workflow_activation::{workflow_activation_job, ResolveActivity, WorkflowActivationJob},
12
+ workflow_commands::{ActivityCancellationType, ScheduleActivity},
13
+ workflow_completion::WorkflowActivationCompletion,
14
+ ActivityHeartbeat, ActivityTaskCompletion, AsJsonPayloadExt, IntoCompletion,
15
+ },
16
+ temporal::api::common::v1::{Payload, RetryPolicy},
17
+ };
18
+ use temporal_sdk_core_test_utils::{
19
+ init_core_and_create_wf, schedule_activity_cmd, CoreWfStarter, WorkerTestHelpers,
20
+ };
21
+ use tokio::time::sleep;
22
+
23
+ #[tokio::test]
24
+ async fn activity_heartbeat() {
25
+ let mut starter = init_core_and_create_wf("activity_heartbeat").await;
26
+ let core = starter.get_worker().await;
27
+ let task_q = starter.get_task_queue();
28
+ let activity_id = "act-1";
29
+ let task = core.poll_workflow_activation().await.unwrap();
30
+ // Complete workflow task and schedule activity
31
+ core.complete_workflow_activation(
32
+ schedule_activity_cmd(
33
+ 0,
34
+ task_q,
35
+ activity_id,
36
+ ActivityCancellationType::TryCancel,
37
+ Duration::from_secs(60),
38
+ Duration::from_secs(1),
39
+ )
40
+ .into_completion(task.run_id),
41
+ )
42
+ .await
43
+ .unwrap();
44
+ // Poll activity and verify that it's been scheduled with correct parameters
45
+ let task = core.poll_activity_task().await.unwrap();
46
+ assert_matches!(
47
+ task.variant,
48
+ Some(activity_task::Variant::Start(start_activity)) => {
49
+ assert_eq!(start_activity.activity_type, "test_activity".to_string())
50
+ }
51
+ );
52
+ // Heartbeat timeout is set to 1 second, this loop is going to send heartbeat every 100ms.
53
+ // Activity shouldn't timeout since we are sending heartbeats regularly, however if we didn't
54
+ // send heartbeats activity would have timed out as it takes 2 sec to execute this loop.
55
+ for _ in 0u8..20 {
56
+ sleep(Duration::from_millis(100)).await;
57
+ core.record_activity_heartbeat(ActivityHeartbeat {
58
+ task_token: task.task_token.clone(),
59
+ details: vec![],
60
+ });
61
+ }
62
+
63
+ let response_payload = Payload {
64
+ data: b"hello ".to_vec(),
65
+ metadata: Default::default(),
66
+ };
67
+ // Complete activity successfully.
68
+ core.complete_activity_task(ActivityTaskCompletion {
69
+ task_token: task.task_token,
70
+ result: Some(ActivityExecutionResult::ok(response_payload.clone())),
71
+ })
72
+ .await
73
+ .unwrap();
74
+ // Poll workflow task and verify that activity has succeeded.
75
+ let task = core.poll_workflow_activation().await.unwrap();
76
+ assert_matches!(
77
+ task.jobs.as_slice(),
78
+ [
79
+ WorkflowActivationJob {
80
+ variant: Some(workflow_activation_job::Variant::ResolveActivity(
81
+ ResolveActivity {seq, result: Some(ActivityResolution {
82
+ status: Some(act_res::Status::Completed(activity_result::Success{result: Some(r)})),
83
+ ..})}
84
+ )),
85
+ },
86
+ ] => {
87
+ assert_eq!(*seq, 0);
88
+ assert_eq!(r, &response_payload);
89
+ }
90
+ );
91
+ core.complete_execution(&task.run_id).await;
92
+ }
93
+
94
+ #[tokio::test]
95
+ async fn many_act_fails_with_heartbeats() {
96
+ let mut starter = init_core_and_create_wf("many_act_fails_with_heartbeats").await;
97
+ let core = starter.get_worker().await;
98
+ let activity_id = "act-1";
99
+ let task = core.poll_workflow_activation().await.unwrap();
100
+ // Complete workflow task and schedule activity
101
+ core.complete_workflow_activation(WorkflowActivationCompletion::from_cmd(
102
+ task.run_id,
103
+ ScheduleActivity {
104
+ seq: 0,
105
+ activity_id: activity_id.to_string(),
106
+ activity_type: "test_act".to_string(),
107
+ task_queue: starter.get_task_queue().to_string(),
108
+ start_to_close_timeout: Some(prost_dur!(from_secs(30))),
109
+ retry_policy: Some(RetryPolicy {
110
+ initial_interval: Some(prost_dur!(from_millis(10))),
111
+ backoff_coefficient: 1.0,
112
+ maximum_attempts: 4,
113
+ ..Default::default()
114
+ }),
115
+ heartbeat_timeout: Some(prost_dur!(from_secs(1))),
116
+ ..Default::default()
117
+ }
118
+ .into(),
119
+ ))
120
+ .await
121
+ .unwrap();
122
+
123
+ // Multiple times, poll for the activity, heartbeat, and then immediately fail
124
+ // Poll activity and verify that it's been scheduled with correct parameters
125
+ for i in 0u8..=3 {
126
+ let task = core.poll_activity_task().await.unwrap();
127
+ let start_t = assert_matches!(task.variant, Some(activity_task::Variant::Start(s)) => s);
128
+
129
+ core.record_activity_heartbeat(ActivityHeartbeat {
130
+ task_token: task.task_token.clone(),
131
+ details: vec![[i].into()],
132
+ });
133
+
134
+ let compl = if i == 3 {
135
+ // Verify last hb was recorded
136
+ assert_eq!(start_t.heartbeat_details, [[2].into()]);
137
+ ActivityTaskCompletion {
138
+ task_token: task.task_token,
139
+ result: Some(ActivityExecutionResult::ok("passed".into())),
140
+ }
141
+ } else {
142
+ if i != 0 {
143
+ assert_eq!(start_t.heartbeat_details, [[i - 1].into()]);
144
+ }
145
+ ActivityTaskCompletion {
146
+ task_token: task.task_token,
147
+ result: Some(ActivityExecutionResult::fail(format!("Die on {i}").into())),
148
+ }
149
+ };
150
+ core.complete_activity_task(compl).await.unwrap();
151
+ }
152
+ let task = core.poll_workflow_activation().await.unwrap();
153
+
154
+ assert_matches!(
155
+ task.jobs.as_slice(),
156
+ [WorkflowActivationJob {
157
+ variant: Some(workflow_activation_job::Variant::ResolveActivity(
158
+ ResolveActivity {
159
+ result: Some(ActivityResolution {
160
+ status: Some(act_res::Status::Completed(activity_result::Success { .. })),
161
+ ..
162
+ }),
163
+ ..
164
+ }
165
+ )),
166
+ },]
167
+ );
168
+ core.complete_execution(&task.run_id).await;
169
+ core.shutdown().await;
170
+ }
171
+
172
+ #[tokio::test]
173
+ async fn activity_doesnt_heartbeat_hits_timeout_then_completes() {
174
+ let wf_name = "activity_doesnt_heartbeat_hits_timeout_then_completes";
175
+ let mut starter = CoreWfStarter::new(wf_name);
176
+ let mut worker = starter.worker().await;
177
+ let client = starter.get_client().await;
178
+ worker.register_activity(
179
+ "echo_activity",
180
+ |_ctx: ActContext, echo_me: String| async move {
181
+ sleep(Duration::from_secs(4)).await;
182
+ Ok(echo_me)
183
+ },
184
+ );
185
+ worker.register_wf(wf_name.to_owned(), |ctx: WfContext| async move {
186
+ let res = ctx
187
+ .activity(ActivityOptions {
188
+ activity_type: "echo_activity".to_string(),
189
+ input: "hi!".as_json_payload().expect("serializes fine"),
190
+ start_to_close_timeout: Some(Duration::from_secs(10)),
191
+ heartbeat_timeout: Some(Duration::from_secs(2)),
192
+ retry_policy: Some(RetryPolicy {
193
+ maximum_attempts: 1,
194
+ ..Default::default()
195
+ }),
196
+ ..Default::default()
197
+ })
198
+ .await;
199
+ assert!(res.timed_out());
200
+ Ok(().into())
201
+ });
202
+
203
+ let run_id = worker
204
+ .submit_wf(
205
+ wf_name.to_owned(),
206
+ wf_name.to_owned(),
207
+ vec![],
208
+ WorkflowOptions::default(),
209
+ )
210
+ .await
211
+ .unwrap();
212
+ worker.run_until_done().await.unwrap();
213
+ let handle = client.get_untyped_workflow_handle(wf_name, run_id);
214
+ handle
215
+ .get_workflow_result(Default::default())
216
+ .await
217
+ .unwrap();
218
+ }
@@ -0,0 +1,146 @@
1
+ use assert_matches::assert_matches;
2
+ use futures::future::join_all;
3
+ use std::time::Duration;
4
+ use temporal_client::WorkflowOptions;
5
+ use temporal_sdk::{WfContext, WorkflowResult};
6
+ use temporal_sdk_core_api::errors::PollWfError;
7
+ use temporal_sdk_core_protos::coresdk::{
8
+ activity_task::activity_task as act_task,
9
+ workflow_activation::{workflow_activation_job, FireTimer, WorkflowActivationJob},
10
+ workflow_commands::{ActivityCancellationType, RequestCancelActivity, StartTimer},
11
+ workflow_completion::WorkflowActivationCompletion,
12
+ IntoCompletion,
13
+ };
14
+ use temporal_sdk_core_test_utils::{
15
+ init_core_and_create_wf, schedule_activity_cmd, CoreWfStarter, WorkerTestHelpers,
16
+ };
17
+ use tokio::time::timeout;
18
+
19
+ #[tokio::test]
20
+ async fn out_of_order_completion_doesnt_hang() {
21
+ let mut starter = init_core_and_create_wf("out_of_order_completion_doesnt_hang").await;
22
+ let core = starter.get_worker().await;
23
+ let task_q = starter.get_task_queue();
24
+ let activity_id = "act-1";
25
+ let task = core.poll_workflow_activation().await.unwrap();
26
+ // Complete workflow task and schedule activity and a timer that fires immediately
27
+ core.complete_workflow_activation(
28
+ vec![
29
+ schedule_activity_cmd(
30
+ 0,
31
+ task_q,
32
+ activity_id,
33
+ ActivityCancellationType::TryCancel,
34
+ Duration::from_secs(60),
35
+ Duration::from_secs(60),
36
+ ),
37
+ StartTimer {
38
+ seq: 1,
39
+ start_to_fire_timeout: Some(prost_dur!(from_millis(50))),
40
+ }
41
+ .into(),
42
+ ]
43
+ .into_completion(task.run_id),
44
+ )
45
+ .await
46
+ .unwrap();
47
+ // Poll activity and verify that it's been scheduled with correct parameters, we don't expect to
48
+ // complete it in this test as activity is try-cancelled.
49
+ let activity_task = core.poll_activity_task().await.unwrap();
50
+ assert_matches!(
51
+ activity_task.variant,
52
+ Some(act_task::Variant::Start(start_activity)) => {
53
+ assert_eq!(start_activity.activity_type, "test_activity".to_string())
54
+ }
55
+ );
56
+ // Poll workflow task and verify that activity has failed.
57
+ let task = core.poll_workflow_activation().await.unwrap();
58
+ assert_matches!(
59
+ task.jobs.as_slice(),
60
+ [
61
+ WorkflowActivationJob {
62
+ variant: Some(workflow_activation_job::Variant::FireTimer(
63
+ FireTimer { seq: t_seq }
64
+ )),
65
+ },
66
+ ] => {
67
+ assert_eq!(*t_seq, 1);
68
+ }
69
+ );
70
+
71
+ // Start polling again *before* we complete the WFT
72
+ let cc = core.clone();
73
+ let jh = tokio::spawn(async move {
74
+ // We want to fail the test if this takes too long -- we should not hit long poll timeout
75
+ let task = timeout(Duration::from_secs(1), cc.poll_workflow_activation())
76
+ .await
77
+ .expect("Poll should come back right away")
78
+ .unwrap();
79
+ assert_matches!(
80
+ task.jobs.as_slice(),
81
+ [WorkflowActivationJob {
82
+ variant: Some(workflow_activation_job::Variant::ResolveActivity(_)),
83
+ }]
84
+ );
85
+ cc.complete_execution(&task.run_id).await;
86
+ });
87
+
88
+ tokio::time::sleep(Duration::from_millis(100)).await;
89
+ // Then complete the (last) WFT with a request to cancel the AT, which should produce a
90
+ // pending activation, unblocking the (already started) poll
91
+ core.complete_workflow_activation(WorkflowActivationCompletion::from_cmds(
92
+ task.run_id,
93
+ vec![RequestCancelActivity { seq: 0 }.into()],
94
+ ))
95
+ .await
96
+ .unwrap();
97
+
98
+ jh.await.unwrap();
99
+ }
100
+
101
+ pub async fn many_parallel_timers_longhist(ctx: WfContext) -> WorkflowResult<()> {
102
+ for _ in 0..20 {
103
+ let mut futs = vec![];
104
+ for _ in 0..1000 {
105
+ futs.push(ctx.timer(Duration::from_millis(100)));
106
+ }
107
+ join_all(futs).await;
108
+ }
109
+ Ok(().into())
110
+ }
111
+
112
+ // Ignored for now because I can't actually get this to produce pages. Need to generate some
113
+ // large payloads I think.
114
+ #[tokio::test]
115
+ #[ignore]
116
+ async fn can_paginate_long_history() {
117
+ let wf_name = "can_paginate_long_history";
118
+ let mut starter = CoreWfStarter::new(wf_name);
119
+ // Do not use sticky queues so we are forced to paginate once history gets long
120
+ starter.max_cached_workflows(0);
121
+
122
+ let mut worker = starter.worker().await;
123
+ worker.register_wf(wf_name.to_owned(), many_parallel_timers_longhist);
124
+ worker
125
+ .submit_wf(
126
+ wf_name.to_owned(),
127
+ wf_name.to_owned(),
128
+ vec![],
129
+ WorkflowOptions::default(),
130
+ )
131
+ .await
132
+ .unwrap();
133
+ worker.run_until_done().await.unwrap();
134
+ }
135
+
136
+ // TODO: Takes ages now, fix somehow
137
+ #[tokio::test]
138
+ async fn poll_of_nonexistent_namespace_is_fatal() {
139
+ let mut starter = CoreWfStarter::new("whatever_yo");
140
+ starter.worker_config.namespace = "I do not exist".to_string();
141
+ let worker = starter.get_worker().await;
142
+ assert_matches!(
143
+ worker.poll_workflow_activation().await,
144
+ Err(PollWfError::TonicError(_))
145
+ );
146
+ }