temporalio 0.0.1

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 (317) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +3 -0
  3. data/LICENSE +20 -0
  4. data/README.md +130 -0
  5. data/bridge/Cargo.lock +2865 -0
  6. data/bridge/Cargo.toml +26 -0
  7. data/bridge/sdk-core/ARCHITECTURE.md +76 -0
  8. data/bridge/sdk-core/Cargo.lock +2606 -0
  9. data/bridge/sdk-core/Cargo.toml +2 -0
  10. data/bridge/sdk-core/LICENSE.txt +23 -0
  11. data/bridge/sdk-core/README.md +107 -0
  12. data/bridge/sdk-core/arch_docs/diagrams/README.md +10 -0
  13. data/bridge/sdk-core/arch_docs/diagrams/sticky_queues.puml +40 -0
  14. data/bridge/sdk-core/arch_docs/diagrams/workflow_internals.svg +1 -0
  15. data/bridge/sdk-core/arch_docs/sticky_queues.md +51 -0
  16. data/bridge/sdk-core/bridge-ffi/Cargo.toml +24 -0
  17. data/bridge/sdk-core/bridge-ffi/LICENSE.txt +23 -0
  18. data/bridge/sdk-core/bridge-ffi/build.rs +25 -0
  19. data/bridge/sdk-core/bridge-ffi/include/sdk-core-bridge.h +249 -0
  20. data/bridge/sdk-core/bridge-ffi/src/lib.rs +825 -0
  21. data/bridge/sdk-core/bridge-ffi/src/wrappers.rs +211 -0
  22. data/bridge/sdk-core/client/Cargo.toml +40 -0
  23. data/bridge/sdk-core/client/LICENSE.txt +23 -0
  24. data/bridge/sdk-core/client/src/lib.rs +1294 -0
  25. data/bridge/sdk-core/client/src/metrics.rs +165 -0
  26. data/bridge/sdk-core/client/src/raw.rs +931 -0
  27. data/bridge/sdk-core/client/src/retry.rs +674 -0
  28. data/bridge/sdk-core/client/src/workflow_handle/mod.rs +185 -0
  29. data/bridge/sdk-core/core/Cargo.toml +116 -0
  30. data/bridge/sdk-core/core/LICENSE.txt +23 -0
  31. data/bridge/sdk-core/core/benches/workflow_replay.rs +73 -0
  32. data/bridge/sdk-core/core/src/abstractions.rs +166 -0
  33. data/bridge/sdk-core/core/src/core_tests/activity_tasks.rs +911 -0
  34. data/bridge/sdk-core/core/src/core_tests/child_workflows.rs +221 -0
  35. data/bridge/sdk-core/core/src/core_tests/determinism.rs +107 -0
  36. data/bridge/sdk-core/core/src/core_tests/local_activities.rs +515 -0
  37. data/bridge/sdk-core/core/src/core_tests/mod.rs +100 -0
  38. data/bridge/sdk-core/core/src/core_tests/queries.rs +736 -0
  39. data/bridge/sdk-core/core/src/core_tests/replay_flag.rs +65 -0
  40. data/bridge/sdk-core/core/src/core_tests/workers.rs +259 -0
  41. data/bridge/sdk-core/core/src/core_tests/workflow_cancels.rs +124 -0
  42. data/bridge/sdk-core/core/src/core_tests/workflow_tasks.rs +2070 -0
  43. data/bridge/sdk-core/core/src/ephemeral_server/mod.rs +515 -0
  44. data/bridge/sdk-core/core/src/lib.rs +175 -0
  45. data/bridge/sdk-core/core/src/log_export.rs +62 -0
  46. data/bridge/sdk-core/core/src/pollers/mod.rs +54 -0
  47. data/bridge/sdk-core/core/src/pollers/poll_buffer.rs +297 -0
  48. data/bridge/sdk-core/core/src/protosext/mod.rs +428 -0
  49. data/bridge/sdk-core/core/src/replay/mod.rs +71 -0
  50. data/bridge/sdk-core/core/src/retry_logic.rs +202 -0
  51. data/bridge/sdk-core/core/src/telemetry/metrics.rs +383 -0
  52. data/bridge/sdk-core/core/src/telemetry/mod.rs +412 -0
  53. data/bridge/sdk-core/core/src/telemetry/prometheus_server.rs +77 -0
  54. data/bridge/sdk-core/core/src/test_help/mod.rs +875 -0
  55. data/bridge/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +580 -0
  56. data/bridge/sdk-core/core/src/worker/activities/local_activities.rs +1042 -0
  57. data/bridge/sdk-core/core/src/worker/activities.rs +464 -0
  58. data/bridge/sdk-core/core/src/worker/client/mocks.rs +87 -0
  59. data/bridge/sdk-core/core/src/worker/client.rs +347 -0
  60. data/bridge/sdk-core/core/src/worker/mod.rs +566 -0
  61. data/bridge/sdk-core/core/src/worker/workflow/bridge.rs +37 -0
  62. data/bridge/sdk-core/core/src/worker/workflow/driven_workflow.rs +110 -0
  63. data/bridge/sdk-core/core/src/worker/workflow/history_update.rs +458 -0
  64. data/bridge/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +911 -0
  65. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +298 -0
  66. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +171 -0
  67. data/bridge/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +860 -0
  68. data/bridge/sdk-core/core/src/worker/workflow/machines/complete_workflow_state_machine.rs +140 -0
  69. data/bridge/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +161 -0
  70. data/bridge/sdk-core/core/src/worker/workflow/machines/fail_workflow_state_machine.rs +133 -0
  71. data/bridge/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +1448 -0
  72. data/bridge/sdk-core/core/src/worker/workflow/machines/mod.rs +342 -0
  73. data/bridge/sdk-core/core/src/worker/workflow/machines/mutable_side_effect_state_machine.rs +127 -0
  74. data/bridge/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +712 -0
  75. data/bridge/sdk-core/core/src/worker/workflow/machines/side_effect_state_machine.rs +71 -0
  76. data/bridge/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +443 -0
  77. data/bridge/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +439 -0
  78. data/bridge/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +169 -0
  79. data/bridge/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +246 -0
  80. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines/local_acts.rs +96 -0
  81. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +1184 -0
  82. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_task_state_machine.rs +277 -0
  83. data/bridge/sdk-core/core/src/worker/workflow/managed_run/managed_wf_test.rs +198 -0
  84. data/bridge/sdk-core/core/src/worker/workflow/managed_run.rs +647 -0
  85. data/bridge/sdk-core/core/src/worker/workflow/mod.rs +1143 -0
  86. data/bridge/sdk-core/core/src/worker/workflow/run_cache.rs +145 -0
  87. data/bridge/sdk-core/core/src/worker/workflow/wft_poller.rs +88 -0
  88. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream.rs +940 -0
  89. data/bridge/sdk-core/core-api/Cargo.toml +31 -0
  90. data/bridge/sdk-core/core-api/LICENSE.txt +23 -0
  91. data/bridge/sdk-core/core-api/src/errors.rs +95 -0
  92. data/bridge/sdk-core/core-api/src/lib.rs +151 -0
  93. data/bridge/sdk-core/core-api/src/worker.rs +135 -0
  94. data/bridge/sdk-core/etc/deps.svg +187 -0
  95. data/bridge/sdk-core/etc/dynamic-config.yaml +2 -0
  96. data/bridge/sdk-core/etc/otel-collector-config.yaml +36 -0
  97. data/bridge/sdk-core/etc/prometheus.yaml +6 -0
  98. data/bridge/sdk-core/fsm/Cargo.toml +18 -0
  99. data/bridge/sdk-core/fsm/LICENSE.txt +23 -0
  100. data/bridge/sdk-core/fsm/README.md +3 -0
  101. data/bridge/sdk-core/fsm/rustfsm_procmacro/Cargo.toml +27 -0
  102. data/bridge/sdk-core/fsm/rustfsm_procmacro/LICENSE.txt +23 -0
  103. data/bridge/sdk-core/fsm/rustfsm_procmacro/src/lib.rs +647 -0
  104. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/progress.rs +8 -0
  105. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.rs +18 -0
  106. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.stderr +12 -0
  107. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dynamic_dest_pass.rs +41 -0
  108. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/forgot_name_fail.rs +14 -0
  109. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/forgot_name_fail.stderr +11 -0
  110. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/handler_arg_pass.rs +32 -0
  111. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/handler_pass.rs +31 -0
  112. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/medium_complex_pass.rs +46 -0
  113. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.rs +29 -0
  114. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr +12 -0
  115. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/simple_pass.rs +32 -0
  116. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/struct_event_variant_fail.rs +18 -0
  117. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/struct_event_variant_fail.stderr +5 -0
  118. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_more_item_event_variant_fail.rs +11 -0
  119. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_more_item_event_variant_fail.stderr +5 -0
  120. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_zero_item_event_variant_fail.rs +11 -0
  121. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_zero_item_event_variant_fail.stderr +5 -0
  122. data/bridge/sdk-core/fsm/rustfsm_trait/Cargo.toml +14 -0
  123. data/bridge/sdk-core/fsm/rustfsm_trait/LICENSE.txt +23 -0
  124. data/bridge/sdk-core/fsm/rustfsm_trait/src/lib.rs +249 -0
  125. data/bridge/sdk-core/fsm/src/lib.rs +2 -0
  126. data/bridge/sdk-core/histories/fail_wf_task.bin +0 -0
  127. data/bridge/sdk-core/histories/timer_workflow_history.bin +0 -0
  128. data/bridge/sdk-core/integ-with-otel.sh +7 -0
  129. data/bridge/sdk-core/protos/api_upstream/README.md +9 -0
  130. data/bridge/sdk-core/protos/api_upstream/api-linter.yaml +40 -0
  131. data/bridge/sdk-core/protos/api_upstream/buf.yaml +12 -0
  132. data/bridge/sdk-core/protos/api_upstream/dependencies/gogoproto/gogo.proto +141 -0
  133. data/bridge/sdk-core/protos/api_upstream/temporal/api/batch/v1/message.proto +86 -0
  134. data/bridge/sdk-core/protos/api_upstream/temporal/api/cluster/v1/message.proto +83 -0
  135. data/bridge/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +259 -0
  136. data/bridge/sdk-core/protos/api_upstream/temporal/api/common/v1/message.proto +112 -0
  137. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/batch_operation.proto +46 -0
  138. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/cluster.proto +40 -0
  139. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/command_type.proto +57 -0
  140. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/common.proto +55 -0
  141. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/event_type.proto +168 -0
  142. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +97 -0
  143. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/namespace.proto +51 -0
  144. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/query.proto +50 -0
  145. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/reset.proto +41 -0
  146. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/schedule.proto +60 -0
  147. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +59 -0
  148. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/update.proto +51 -0
  149. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/workflow.proto +122 -0
  150. data/bridge/sdk-core/protos/api_upstream/temporal/api/errordetails/v1/message.proto +108 -0
  151. data/bridge/sdk-core/protos/api_upstream/temporal/api/failure/v1/message.proto +114 -0
  152. data/bridge/sdk-core/protos/api_upstream/temporal/api/filter/v1/message.proto +56 -0
  153. data/bridge/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +751 -0
  154. data/bridge/sdk-core/protos/api_upstream/temporal/api/namespace/v1/message.proto +97 -0
  155. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +161 -0
  156. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +99 -0
  157. data/bridge/sdk-core/protos/api_upstream/temporal/api/query/v1/message.proto +61 -0
  158. data/bridge/sdk-core/protos/api_upstream/temporal/api/replication/v1/message.proto +55 -0
  159. data/bridge/sdk-core/protos/api_upstream/temporal/api/schedule/v1/message.proto +300 -0
  160. data/bridge/sdk-core/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +108 -0
  161. data/bridge/sdk-core/protos/api_upstream/temporal/api/update/v1/message.proto +46 -0
  162. data/bridge/sdk-core/protos/api_upstream/temporal/api/version/v1/message.proto +59 -0
  163. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflow/v1/message.proto +145 -0
  164. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +1124 -0
  165. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +401 -0
  166. data/bridge/sdk-core/protos/grpc/health/v1/health.proto +63 -0
  167. data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_result/activity_result.proto +78 -0
  168. data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_task/activity_task.proto +79 -0
  169. data/bridge/sdk-core/protos/local/temporal/sdk/core/bridge/bridge.proto +210 -0
  170. data/bridge/sdk-core/protos/local/temporal/sdk/core/child_workflow/child_workflow.proto +77 -0
  171. data/bridge/sdk-core/protos/local/temporal/sdk/core/common/common.proto +15 -0
  172. data/bridge/sdk-core/protos/local/temporal/sdk/core/core_interface.proto +30 -0
  173. data/bridge/sdk-core/protos/local/temporal/sdk/core/external_data/external_data.proto +30 -0
  174. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +261 -0
  175. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +297 -0
  176. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_completion/workflow_completion.proto +29 -0
  177. data/bridge/sdk-core/protos/testsrv_upstream/api-linter.yaml +38 -0
  178. data/bridge/sdk-core/protos/testsrv_upstream/buf.yaml +13 -0
  179. data/bridge/sdk-core/protos/testsrv_upstream/dependencies/gogoproto/gogo.proto +141 -0
  180. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/request_response.proto +63 -0
  181. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/service.proto +90 -0
  182. data/bridge/sdk-core/rustfmt.toml +1 -0
  183. data/bridge/sdk-core/sdk/Cargo.toml +47 -0
  184. data/bridge/sdk-core/sdk/LICENSE.txt +23 -0
  185. data/bridge/sdk-core/sdk/src/activity_context.rs +230 -0
  186. data/bridge/sdk-core/sdk/src/app_data.rs +37 -0
  187. data/bridge/sdk-core/sdk/src/conversions.rs +8 -0
  188. data/bridge/sdk-core/sdk/src/interceptors.rs +17 -0
  189. data/bridge/sdk-core/sdk/src/lib.rs +792 -0
  190. data/bridge/sdk-core/sdk/src/payload_converter.rs +11 -0
  191. data/bridge/sdk-core/sdk/src/workflow_context/options.rs +295 -0
  192. data/bridge/sdk-core/sdk/src/workflow_context.rs +683 -0
  193. data/bridge/sdk-core/sdk/src/workflow_future.rs +503 -0
  194. data/bridge/sdk-core/sdk-core-protos/Cargo.toml +30 -0
  195. data/bridge/sdk-core/sdk-core-protos/LICENSE.txt +23 -0
  196. data/bridge/sdk-core/sdk-core-protos/build.rs +108 -0
  197. data/bridge/sdk-core/sdk-core-protos/src/constants.rs +7 -0
  198. data/bridge/sdk-core/sdk-core-protos/src/history_builder.rs +497 -0
  199. data/bridge/sdk-core/sdk-core-protos/src/history_info.rs +230 -0
  200. data/bridge/sdk-core/sdk-core-protos/src/lib.rs +1910 -0
  201. data/bridge/sdk-core/sdk-core-protos/src/task_token.rs +38 -0
  202. data/bridge/sdk-core/sdk-core-protos/src/utilities.rs +14 -0
  203. data/bridge/sdk-core/test-utils/Cargo.toml +35 -0
  204. data/bridge/sdk-core/test-utils/src/canned_histories.rs +1579 -0
  205. data/bridge/sdk-core/test-utils/src/histfetch.rs +28 -0
  206. data/bridge/sdk-core/test-utils/src/lib.rs +598 -0
  207. data/bridge/sdk-core/tests/integ_tests/client_tests.rs +36 -0
  208. data/bridge/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +128 -0
  209. data/bridge/sdk-core/tests/integ_tests/heartbeat_tests.rs +218 -0
  210. data/bridge/sdk-core/tests/integ_tests/polling_tests.rs +146 -0
  211. data/bridge/sdk-core/tests/integ_tests/queries_tests.rs +437 -0
  212. data/bridge/sdk-core/tests/integ_tests/visibility_tests.rs +93 -0
  213. data/bridge/sdk-core/tests/integ_tests/workflow_tests/activities.rs +878 -0
  214. data/bridge/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +61 -0
  215. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +59 -0
  216. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +58 -0
  217. data/bridge/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +50 -0
  218. data/bridge/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +60 -0
  219. data/bridge/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +54 -0
  220. data/bridge/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +634 -0
  221. data/bridge/sdk-core/tests/integ_tests/workflow_tests/patches.rs +113 -0
  222. data/bridge/sdk-core/tests/integ_tests/workflow_tests/replay.rs +137 -0
  223. data/bridge/sdk-core/tests/integ_tests/workflow_tests/resets.rs +93 -0
  224. data/bridge/sdk-core/tests/integ_tests/workflow_tests/signals.rs +167 -0
  225. data/bridge/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +99 -0
  226. data/bridge/sdk-core/tests/integ_tests/workflow_tests/timers.rs +131 -0
  227. data/bridge/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +75 -0
  228. data/bridge/sdk-core/tests/integ_tests/workflow_tests.rs +587 -0
  229. data/bridge/sdk-core/tests/load_tests.rs +191 -0
  230. data/bridge/sdk-core/tests/main.rs +111 -0
  231. data/bridge/sdk-core/tests/runner.rs +93 -0
  232. data/bridge/src/connection.rs +167 -0
  233. data/bridge/src/lib.rs +180 -0
  234. data/bridge/src/runtime.rs +47 -0
  235. data/bridge/src/worker.rs +73 -0
  236. data/ext/Rakefile +9 -0
  237. data/lib/bridge.so +0 -0
  238. data/lib/gen/dependencies/gogoproto/gogo_pb.rb +14 -0
  239. data/lib/gen/temporal/api/batch/v1/message_pb.rb +48 -0
  240. data/lib/gen/temporal/api/cluster/v1/message_pb.rb +67 -0
  241. data/lib/gen/temporal/api/command/v1/message_pb.rb +166 -0
  242. data/lib/gen/temporal/api/common/v1/message_pb.rb +69 -0
  243. data/lib/gen/temporal/api/enums/v1/batch_operation_pb.rb +32 -0
  244. data/lib/gen/temporal/api/enums/v1/cluster_pb.rb +26 -0
  245. data/lib/gen/temporal/api/enums/v1/command_type_pb.rb +37 -0
  246. data/lib/gen/temporal/api/enums/v1/common_pb.rb +41 -0
  247. data/lib/gen/temporal/api/enums/v1/event_type_pb.rb +67 -0
  248. data/lib/gen/temporal/api/enums/v1/failed_cause_pb.rb +71 -0
  249. data/lib/gen/temporal/api/enums/v1/namespace_pb.rb +37 -0
  250. data/lib/gen/temporal/api/enums/v1/query_pb.rb +31 -0
  251. data/lib/gen/temporal/api/enums/v1/reset_pb.rb +24 -0
  252. data/lib/gen/temporal/api/enums/v1/schedule_pb.rb +28 -0
  253. data/lib/gen/temporal/api/enums/v1/task_queue_pb.rb +30 -0
  254. data/lib/gen/temporal/api/enums/v1/update_pb.rb +28 -0
  255. data/lib/gen/temporal/api/enums/v1/workflow_pb.rb +89 -0
  256. data/lib/gen/temporal/api/errordetails/v1/message_pb.rb +84 -0
  257. data/lib/gen/temporal/api/failure/v1/message_pb.rb +83 -0
  258. data/lib/gen/temporal/api/filter/v1/message_pb.rb +40 -0
  259. data/lib/gen/temporal/api/history/v1/message_pb.rb +489 -0
  260. data/lib/gen/temporal/api/namespace/v1/message_pb.rb +63 -0
  261. data/lib/gen/temporal/api/operatorservice/v1/request_response_pb.rb +125 -0
  262. data/lib/gen/temporal/api/operatorservice/v1/service_pb.rb +20 -0
  263. data/lib/gen/temporal/api/query/v1/message_pb.rb +38 -0
  264. data/lib/gen/temporal/api/replication/v1/message_pb.rb +37 -0
  265. data/lib/gen/temporal/api/schedule/v1/message_pb.rb +128 -0
  266. data/lib/gen/temporal/api/taskqueue/v1/message_pb.rb +73 -0
  267. data/lib/gen/temporal/api/update/v1/message_pb.rb +26 -0
  268. data/lib/gen/temporal/api/version/v1/message_pb.rb +41 -0
  269. data/lib/gen/temporal/api/workflow/v1/message_pb.rb +110 -0
  270. data/lib/gen/temporal/api/workflowservice/v1/request_response_pb.rb +771 -0
  271. data/lib/gen/temporal/api/workflowservice/v1/service_pb.rb +20 -0
  272. data/lib/gen/temporal/sdk/core/activity_result/activity_result_pb.rb +58 -0
  273. data/lib/gen/temporal/sdk/core/activity_task/activity_task_pb.rb +57 -0
  274. data/lib/gen/temporal/sdk/core/bridge/bridge_pb.rb +222 -0
  275. data/lib/gen/temporal/sdk/core/child_workflow/child_workflow_pb.rb +57 -0
  276. data/lib/gen/temporal/sdk/core/common/common_pb.rb +22 -0
  277. data/lib/gen/temporal/sdk/core/core_interface_pb.rb +34 -0
  278. data/lib/gen/temporal/sdk/core/external_data/external_data_pb.rb +27 -0
  279. data/lib/gen/temporal/sdk/core/workflow_activation/workflow_activation_pb.rb +164 -0
  280. data/lib/gen/temporal/sdk/core/workflow_commands/workflow_commands_pb.rb +192 -0
  281. data/lib/gen/temporal/sdk/core/workflow_completion/workflow_completion_pb.rb +34 -0
  282. data/lib/temporal/bridge.rb +14 -0
  283. data/lib/temporal/client/implementation.rb +339 -0
  284. data/lib/temporal/client/workflow_handle.rb +243 -0
  285. data/lib/temporal/client.rb +144 -0
  286. data/lib/temporal/connection.rb +736 -0
  287. data/lib/temporal/data_converter.rb +150 -0
  288. data/lib/temporal/error/failure.rb +194 -0
  289. data/lib/temporal/error/workflow_failure.rb +17 -0
  290. data/lib/temporal/errors.rb +22 -0
  291. data/lib/temporal/failure_converter/base.rb +26 -0
  292. data/lib/temporal/failure_converter/basic.rb +313 -0
  293. data/lib/temporal/failure_converter.rb +8 -0
  294. data/lib/temporal/interceptor/chain.rb +27 -0
  295. data/lib/temporal/interceptor/client.rb +102 -0
  296. data/lib/temporal/payload_codec/base.rb +32 -0
  297. data/lib/temporal/payload_converter/base.rb +24 -0
  298. data/lib/temporal/payload_converter/bytes.rb +26 -0
  299. data/lib/temporal/payload_converter/composite.rb +47 -0
  300. data/lib/temporal/payload_converter/encoding_base.rb +35 -0
  301. data/lib/temporal/payload_converter/json.rb +25 -0
  302. data/lib/temporal/payload_converter/nil.rb +25 -0
  303. data/lib/temporal/payload_converter.rb +14 -0
  304. data/lib/temporal/retry_policy.rb +82 -0
  305. data/lib/temporal/retry_state.rb +35 -0
  306. data/lib/temporal/runtime.rb +22 -0
  307. data/lib/temporal/timeout_type.rb +29 -0
  308. data/lib/temporal/version.rb +3 -0
  309. data/lib/temporal/workflow/execution_info.rb +54 -0
  310. data/lib/temporal/workflow/execution_status.rb +36 -0
  311. data/lib/temporal/workflow/id_reuse_policy.rb +36 -0
  312. data/lib/temporal/workflow/query_reject_condition.rb +33 -0
  313. data/lib/temporal.rb +8 -0
  314. data/lib/temporalio.rb +3 -0
  315. data/lib/thermite_patch.rb +23 -0
  316. data/temporalio.gemspec +41 -0
  317. metadata +583 -0
@@ -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
+ }