@temporalio/core-bridge 1.14.2-canary-release-testing.0 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. package/Cargo.lock +794 -650
  2. package/bridge-macros/src/derive_tryintojs.rs +40 -0
  3. package/lib/native.d.ts +24 -3
  4. package/package.json +4 -4
  5. package/releases/aarch64-apple-darwin/index.node +0 -0
  6. package/releases/aarch64-unknown-linux-gnu/index.node +0 -0
  7. package/releases/x86_64-apple-darwin/index.node +0 -0
  8. package/releases/x86_64-pc-windows-msvc/index.node +0 -0
  9. package/releases/x86_64-unknown-linux-gnu/index.node +0 -0
  10. package/sdk-core/.github/workflows/per-pr.yml +6 -6
  11. package/sdk-core/AGENTS.md +42 -31
  12. package/sdk-core/Cargo.toml +4 -1
  13. package/sdk-core/README.md +19 -13
  14. package/sdk-core/crates/client/Cargo.toml +4 -0
  15. package/sdk-core/crates/client/README.md +139 -0
  16. package/sdk-core/crates/client/src/async_activity_handle.rs +297 -0
  17. package/sdk-core/crates/client/src/callback_based.rs +7 -0
  18. package/sdk-core/crates/client/src/errors.rs +294 -0
  19. package/sdk-core/crates/client/src/{raw.rs → grpc.rs} +370 -159
  20. package/sdk-core/crates/client/src/lib.rs +920 -1326
  21. package/sdk-core/crates/client/src/metrics.rs +24 -33
  22. package/sdk-core/crates/client/src/options_structs.rs +457 -0
  23. package/sdk-core/crates/client/src/replaceable.rs +5 -4
  24. package/sdk-core/crates/client/src/request_extensions.rs +8 -9
  25. package/sdk-core/crates/client/src/retry.rs +99 -54
  26. package/sdk-core/crates/client/src/{worker/mod.rs → worker.rs} +104 -29
  27. package/sdk-core/crates/client/src/workflow_handle.rs +826 -0
  28. package/sdk-core/crates/common/Cargo.toml +62 -3
  29. package/sdk-core/crates/common/build.rs +742 -12
  30. package/sdk-core/crates/common/protos/api_upstream/.github/workflows/ci.yml +2 -0
  31. package/sdk-core/crates/common/protos/api_upstream/.github/workflows/create-release.yml +0 -5
  32. package/sdk-core/crates/common/protos/api_upstream/Makefile +2 -1
  33. package/sdk-core/crates/common/protos/api_upstream/README.md +8 -0
  34. package/sdk-core/crates/common/protos/api_upstream/cmd/check-path-conflicts/main.go +137 -0
  35. package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv2.json +3329 -2647
  36. package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv3.yaml +2734 -708
  37. package/sdk-core/crates/common/protos/api_upstream/temporal/api/activity/v1/message.proto +155 -3
  38. package/sdk-core/crates/common/protos/api_upstream/temporal/api/command/v1/message.proto +26 -0
  39. package/sdk-core/crates/common/protos/api_upstream/temporal/api/common/v1/message.proto +8 -1
  40. package/sdk-core/crates/common/protos/api_upstream/temporal/api/deployment/v1/message.proto +27 -1
  41. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/activity.proto +81 -0
  42. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/event_type.proto +4 -0
  43. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +4 -0
  44. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +15 -0
  45. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/workflow.proto +63 -15
  46. package/sdk-core/crates/common/protos/api_upstream/temporal/api/errordetails/v1/message.proto +8 -0
  47. package/sdk-core/crates/common/protos/api_upstream/temporal/api/failure/v1/message.proto +1 -0
  48. package/sdk-core/crates/common/protos/api_upstream/temporal/api/history/v1/message.proto +111 -17
  49. package/sdk-core/crates/common/protos/api_upstream/temporal/api/namespace/v1/message.proto +21 -0
  50. package/sdk-core/crates/common/protos/api_upstream/temporal/api/nexus/v1/message.proto +20 -1
  51. package/sdk-core/crates/common/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +4 -0
  52. package/sdk-core/crates/common/protos/api_upstream/temporal/api/schedule/v1/message.proto +2 -2
  53. package/sdk-core/crates/common/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +2 -0
  54. package/sdk-core/crates/common/protos/api_upstream/temporal/api/worker/v1/message.proto +4 -7
  55. package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflow/v1/message.proto +80 -22
  56. package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +347 -23
  57. package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +242 -43
  58. package/sdk-core/crates/common/protos/local/temporal/sdk/core/core_interface.proto +15 -0
  59. package/sdk-core/crates/common/protos/local/temporal/sdk/core/nexus/nexus.proto +9 -2
  60. package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +8 -0
  61. package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +22 -5
  62. package/sdk-core/crates/common/src/activity_definition.rs +20 -0
  63. package/sdk-core/crates/common/src/data_converters.rs +770 -0
  64. package/sdk-core/crates/common/src/envconfig.rs +5 -0
  65. package/sdk-core/crates/common/src/lib.rs +15 -211
  66. package/sdk-core/crates/common/src/payload_visitor.rs +648 -0
  67. package/sdk-core/crates/common/src/priority.rs +110 -0
  68. package/sdk-core/crates/common/src/protos/canned_histories.rs +19 -0
  69. package/sdk-core/crates/common/src/protos/history_builder.rs +45 -0
  70. package/sdk-core/crates/common/src/protos/history_info.rs +2 -0
  71. package/sdk-core/crates/common/src/protos/mod.rs +134 -27
  72. package/sdk-core/crates/common/src/protos/task_token.rs +3 -3
  73. package/sdk-core/crates/common/src/protos/utilities.rs +11 -0
  74. package/sdk-core/crates/{sdk-core → common}/src/telemetry/log_export.rs +11 -16
  75. package/sdk-core/crates/common/src/telemetry/metrics/core.rs +125 -0
  76. package/sdk-core/crates/common/src/telemetry/metrics.rs +272 -225
  77. package/sdk-core/crates/{sdk-core → common}/src/telemetry/otel.rs +8 -13
  78. package/sdk-core/crates/{sdk-core → common}/src/telemetry/prometheus_meter.rs +49 -50
  79. package/sdk-core/crates/{sdk-core → common}/src/telemetry/prometheus_server.rs +2 -3
  80. package/sdk-core/crates/common/src/telemetry.rs +278 -19
  81. package/sdk-core/crates/common/src/worker.rs +68 -636
  82. package/sdk-core/crates/common/src/workflow_definition.rs +60 -0
  83. package/sdk-core/crates/macros/Cargo.toml +5 -1
  84. package/sdk-core/crates/macros/src/activities_definitions.rs +585 -0
  85. package/sdk-core/crates/macros/src/fsm_impl.rs +507 -0
  86. package/sdk-core/crates/macros/src/lib.rs +138 -512
  87. package/sdk-core/crates/macros/src/macro_utils.rs +106 -0
  88. package/sdk-core/crates/macros/src/workflow_definitions.rs +1224 -0
  89. package/sdk-core/crates/sdk/Cargo.toml +19 -6
  90. package/sdk-core/crates/sdk/README.md +415 -0
  91. package/sdk-core/crates/sdk/src/activities.rs +417 -0
  92. package/sdk-core/crates/sdk/src/interceptors.rs +1 -1
  93. package/sdk-core/crates/sdk/src/lib.rs +759 -442
  94. package/sdk-core/crates/sdk/src/workflow_context/options.rs +64 -35
  95. package/sdk-core/crates/sdk/src/workflow_context.rs +1033 -289
  96. package/sdk-core/crates/sdk/src/workflow_future.rs +277 -213
  97. package/sdk-core/crates/sdk/src/workflows.rs +711 -0
  98. package/sdk-core/crates/sdk-core/Cargo.toml +59 -65
  99. package/sdk-core/crates/sdk-core/benches/workflow_replay_bench.rs +45 -54
  100. package/sdk-core/crates/sdk-core/machine_coverage/ActivityMachine_Coverage.puml +1 -1
  101. package/sdk-core/crates/sdk-core/src/abstractions.rs +6 -10
  102. package/sdk-core/crates/sdk-core/src/core_tests/activity_tasks.rs +6 -5
  103. package/sdk-core/crates/sdk-core/src/core_tests/mod.rs +22 -21
  104. package/sdk-core/crates/sdk-core/src/core_tests/queries.rs +21 -25
  105. package/sdk-core/crates/sdk-core/src/core_tests/replay_flag.rs +7 -10
  106. package/sdk-core/crates/sdk-core/src/core_tests/updates.rs +14 -17
  107. package/sdk-core/crates/sdk-core/src/core_tests/workers.rs +647 -27
  108. package/sdk-core/crates/sdk-core/src/core_tests/workflow_tasks.rs +46 -41
  109. package/sdk-core/crates/sdk-core/src/ephemeral_server/mod.rs +13 -16
  110. package/sdk-core/crates/sdk-core/src/histfetch.rs +20 -10
  111. package/sdk-core/crates/sdk-core/src/lib.rs +60 -123
  112. package/sdk-core/crates/sdk-core/src/pollers/mod.rs +4 -9
  113. package/sdk-core/crates/sdk-core/src/pollers/poll_buffer.rs +411 -32
  114. package/sdk-core/crates/sdk-core/src/protosext/mod.rs +2 -2
  115. package/sdk-core/crates/sdk-core/src/replay/mod.rs +14 -5
  116. package/sdk-core/crates/sdk-core/src/telemetry/metrics.rs +183 -198
  117. package/sdk-core/crates/sdk-core/src/telemetry/mod.rs +3 -281
  118. package/sdk-core/crates/sdk-core/src/test_help/integ_helpers.rs +35 -16
  119. package/sdk-core/crates/sdk-core/src/test_help/unit_helpers.rs +3 -6
  120. package/sdk-core/crates/sdk-core/src/worker/activities/activity_heartbeat_manager.rs +1 -0
  121. package/sdk-core/crates/sdk-core/src/worker/activities/local_activities.rs +11 -14
  122. package/sdk-core/crates/sdk-core/src/worker/activities.rs +16 -19
  123. package/sdk-core/crates/sdk-core/src/worker/client/mocks.rs +11 -5
  124. package/sdk-core/crates/sdk-core/src/worker/client.rs +104 -86
  125. package/sdk-core/crates/sdk-core/src/worker/heartbeat.rs +10 -14
  126. package/sdk-core/crates/sdk-core/src/worker/mod.rs +1175 -241
  127. package/sdk-core/crates/sdk-core/src/worker/nexus.rs +150 -23
  128. package/sdk-core/crates/sdk-core/src/worker/slot_provider.rs +2 -2
  129. package/sdk-core/crates/sdk-core/src/worker/tuner/fixed_size.rs +2 -2
  130. package/sdk-core/crates/sdk-core/src/worker/tuner/resource_based.rs +25 -27
  131. package/sdk-core/crates/sdk-core/src/worker/tuner.rs +64 -44
  132. package/sdk-core/crates/sdk-core/src/worker/workflow/driven_workflow.rs +9 -3
  133. package/sdk-core/crates/sdk-core/src/worker/workflow/machines/patch_state_machine.rs +5 -8
  134. package/sdk-core/crates/sdk-core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +21 -22
  135. package/sdk-core/crates/sdk-core/src/worker/workflow/machines/workflow_machines.rs +28 -4
  136. package/sdk-core/crates/sdk-core/src/worker/workflow/managed_run.rs +20 -41
  137. package/sdk-core/crates/sdk-core/src/worker/workflow/mod.rs +50 -9
  138. package/sdk-core/crates/sdk-core/src/worker/workflow/run_cache.rs +4 -7
  139. package/sdk-core/crates/sdk-core/src/worker/workflow/wft_extraction.rs +2 -4
  140. package/sdk-core/crates/sdk-core/src/worker/workflow/wft_poller.rs +8 -9
  141. package/sdk-core/crates/sdk-core/src/worker/workflow/workflow_stream.rs +1 -3
  142. package/sdk-core/crates/sdk-core/tests/activities_procmacro.rs +6 -0
  143. package/sdk-core/crates/sdk-core/tests/activities_trybuild/basic_pass.rs +54 -0
  144. package/sdk-core/crates/sdk-core/tests/activities_trybuild/invalid_self_type_fail.rs +18 -0
  145. package/sdk-core/crates/sdk-core/tests/activities_trybuild/invalid_self_type_fail.stderr +5 -0
  146. package/sdk-core/crates/sdk-core/tests/activities_trybuild/missing_context_fail.rs +14 -0
  147. package/sdk-core/crates/sdk-core/tests/activities_trybuild/missing_context_fail.stderr +5 -0
  148. package/sdk-core/crates/sdk-core/tests/activities_trybuild/multi_arg_pass.rs +48 -0
  149. package/sdk-core/crates/sdk-core/tests/activities_trybuild/no_input_pass.rs +14 -0
  150. package/sdk-core/crates/sdk-core/tests/activities_trybuild/no_return_type_pass.rs +19 -0
  151. package/sdk-core/crates/sdk-core/tests/cloud_tests.rs +14 -5
  152. package/sdk-core/crates/sdk-core/tests/common/activity_functions.rs +55 -0
  153. package/sdk-core/crates/sdk-core/tests/common/mod.rs +281 -236
  154. package/sdk-core/crates/sdk-core/tests/common/workflows.rs +41 -28
  155. package/sdk-core/crates/sdk-core/tests/global_metric_tests.rs +9 -14
  156. package/sdk-core/crates/sdk-core/tests/heavy_tests/fuzzy_workflow.rs +73 -66
  157. package/sdk-core/crates/sdk-core/tests/heavy_tests.rs +306 -268
  158. package/sdk-core/crates/sdk-core/tests/integ_tests/async_activity_client_tests.rs +230 -0
  159. package/sdk-core/crates/sdk-core/tests/integ_tests/client_tests.rs +94 -57
  160. package/sdk-core/crates/sdk-core/tests/integ_tests/data_converter_tests.rs +381 -0
  161. package/sdk-core/crates/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +37 -38
  162. package/sdk-core/crates/sdk-core/tests/integ_tests/heartbeat_tests.rs +49 -40
  163. package/sdk-core/crates/sdk-core/tests/integ_tests/metrics_tests.rs +447 -300
  164. package/sdk-core/crates/sdk-core/tests/integ_tests/pagination_tests.rs +50 -45
  165. package/sdk-core/crates/sdk-core/tests/integ_tests/polling_tests.rs +157 -157
  166. package/sdk-core/crates/sdk-core/tests/integ_tests/queries_tests.rs +103 -89
  167. package/sdk-core/crates/sdk-core/tests/integ_tests/update_tests.rs +609 -463
  168. package/sdk-core/crates/sdk-core/tests/integ_tests/visibility_tests.rs +80 -62
  169. package/sdk-core/crates/sdk-core/tests/integ_tests/worker_heartbeat_tests.rs +389 -265
  170. package/sdk-core/crates/sdk-core/tests/integ_tests/worker_tests.rs +250 -185
  171. package/sdk-core/crates/sdk-core/tests/integ_tests/worker_versioning_tests.rs +52 -49
  172. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_client_tests.rs +180 -0
  173. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/activities.rs +437 -327
  174. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +82 -58
  175. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +56 -30
  176. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +364 -251
  177. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/client_interactions.rs +552 -0
  178. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +110 -46
  179. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +243 -149
  180. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/eager.rs +98 -32
  181. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +1475 -1040
  182. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +73 -43
  183. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/nexus.rs +402 -245
  184. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/patches.rs +343 -207
  185. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/queries.rs +415 -0
  186. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/replay.rs +96 -36
  187. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/resets.rs +155 -140
  188. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/signals.rs +183 -113
  189. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +85 -44
  190. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/timers.rs +142 -48
  191. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +73 -56
  192. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests.rs +365 -242
  193. package/sdk-core/crates/sdk-core/tests/main.rs +22 -16
  194. package/sdk-core/crates/sdk-core/tests/manual_tests.rs +233 -187
  195. package/sdk-core/crates/sdk-core/tests/runner.rs +4 -6
  196. package/sdk-core/crates/sdk-core/tests/shared_tests/mod.rs +73 -27
  197. package/sdk-core/crates/sdk-core/tests/shared_tests/priority.rs +107 -84
  198. package/sdk-core/crates/sdk-core/tests/workflows_procmacro.rs +6 -0
  199. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/async_query_fail.rs +26 -0
  200. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/async_query_fail.stderr +5 -0
  201. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/basic_pass.rs +49 -0
  202. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/minimal_pass.rs +21 -0
  203. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/mut_query_fail.rs +26 -0
  204. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/mut_query_fail.stderr +5 -0
  205. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/sync_run_fail.rs +21 -0
  206. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/sync_run_fail.stderr +5 -0
  207. package/sdk-core/crates/sdk-core-c-bridge/Cargo.toml +8 -1
  208. package/sdk-core/crates/sdk-core-c-bridge/include/temporal-sdk-core-c-bridge.h +37 -26
  209. package/sdk-core/crates/sdk-core-c-bridge/src/client.rs +180 -87
  210. package/sdk-core/crates/sdk-core-c-bridge/src/lib.rs +89 -5
  211. package/sdk-core/crates/sdk-core-c-bridge/src/metric.rs +10 -16
  212. package/sdk-core/crates/sdk-core-c-bridge/src/runtime.rs +59 -67
  213. package/sdk-core/crates/sdk-core-c-bridge/src/testing.rs +10 -10
  214. package/sdk-core/crates/sdk-core-c-bridge/src/tests/context.rs +57 -22
  215. package/sdk-core/crates/sdk-core-c-bridge/src/tests/mod.rs +108 -12
  216. package/sdk-core/crates/sdk-core-c-bridge/src/tests/utils.rs +9 -52
  217. package/sdk-core/crates/sdk-core-c-bridge/src/worker.rs +74 -91
  218. package/sdk-core/rustfmt.toml +2 -1
  219. package/src/client.rs +206 -289
  220. package/src/helpers/try_into_js.rs +88 -2
  221. package/src/metrics.rs +277 -35
  222. package/src/runtime.rs +94 -45
  223. package/src/testing.rs +9 -16
  224. package/src/worker.rs +86 -68
  225. package/ts/native.ts +39 -3
  226. package/sdk-core/crates/client/src/workflow_handle/mod.rs +0 -212
  227. package/sdk-core/crates/common/src/errors.rs +0 -85
  228. package/sdk-core/crates/common/tests/worker_task_types_test.rs +0 -129
  229. package/sdk-core/crates/macros/LICENSE.txt +0 -21
  230. package/sdk-core/crates/sdk/src/activity_context.rs +0 -238
  231. package/sdk-core/crates/sdk/src/app_data.rs +0 -37
  232. package/sdk-core/crates/sdk-core/tests/integ_tests/activity_functions.rs +0 -5
  233. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +0 -61
@@ -1,9 +1,9 @@
1
1
  use crate::{
2
2
  common::{
3
- CoreWfStarter, fake_grpc_server::fake_server, get_integ_runtime_options,
4
- get_integ_server_options, get_integ_telem_options, mock_sdk_cfg,
3
+ CoreWfStarter, activity_functions::StdActivities, fake_grpc_server::fake_server,
4
+ get_integ_runtime_options, get_integ_server_options, get_integ_telem_options, mock_sdk_cfg,
5
5
  },
6
- shared_tests,
6
+ shared_tests::{self, is_oversize_grpc_event},
7
7
  };
8
8
  use assert_matches::assert_matches;
9
9
  use futures_util::FutureExt;
@@ -18,10 +18,9 @@ use std::{
18
18
  },
19
19
  time::Duration,
20
20
  };
21
- use temporalio_client::WorkflowOptions;
21
+ use temporalio_client::{Connection, WorkflowStartOptions};
22
22
  use temporalio_common::{
23
- Worker,
24
- errors::WorkerValidationError,
23
+ data_converters::{DataConverter, RawValue},
25
24
  protos::{
26
25
  DEFAULT_WORKFLOW_TYPE, TestHistoryBuilder, canned_histories,
27
26
  coresdk::{
@@ -35,13 +34,15 @@ use temporalio_common::{
35
34
  command::v1::command::Attributes,
36
35
  common::v1::WorkerVersionStamp,
37
36
  enums::v1::{
38
- EventType, WorkflowTaskFailedCause, WorkflowTaskFailedCause::GrpcMessageTooLarge,
37
+ EventType,
38
+ WorkflowTaskFailedCause::{self},
39
39
  },
40
40
  failure::v1::Failure as InnerFailure,
41
41
  history::v1::{
42
- ActivityTaskScheduledEventAttributes, history_event,
43
- history_event::Attributes::{
44
- self as EventAttributes, WorkflowTaskFailedEventAttributes,
42
+ ActivityTaskScheduledEventAttributes,
43
+ history_event::{
44
+ self,
45
+ Attributes::{self as EventAttributes},
45
46
  },
46
47
  },
47
48
  workflowservice::v1::{
@@ -50,18 +51,20 @@ use temporalio_common::{
50
51
  },
51
52
  },
52
53
  },
53
- worker::{
54
- ActivitySlotKind, LocalActivitySlotKind, PollerBehavior, SlotInfo, SlotInfoTrait,
55
- SlotMarkUsedContext, SlotReleaseContext, SlotReservationContext, SlotSupplier,
56
- SlotSupplierPermit, WorkerConfigBuilder, WorkerTaskTypes, WorkerVersioningStrategy,
57
- WorkflowSlotKind,
58
- },
54
+ worker::WorkerTaskTypes,
59
55
  };
56
+ use temporalio_macros::{activities, workflow, workflow_methods};
60
57
  use temporalio_sdk::{
61
- ActivityOptions, LocalActivityOptions, WfContext, interceptors::WorkerInterceptor,
58
+ ActivityOptions, LocalActivityOptions, WorkerOptions, WorkflowContext, WorkflowResult,
59
+ WorkflowTermination,
60
+ activities::{ActivityContext, ActivityError},
61
+ interceptors::WorkerInterceptor,
62
62
  };
63
63
  use temporalio_sdk_core::{
64
- CoreRuntime, ResourceBasedTuner, ResourceSlotOptions, TunerBuilder, init_worker,
64
+ ActivitySlotKind, CoreRuntime, LocalActivitySlotKind, PollError, PollerBehavior,
65
+ ResourceBasedTuner, ResourceSlotOptions, SlotInfo, SlotInfoTrait, SlotMarkUsedContext,
66
+ SlotReleaseContext, SlotReservationContext, SlotSupplier, SlotSupplierPermit, TunerBuilder,
67
+ WorkerConfig, WorkerValidationError, WorkerVersioningStrategy, WorkflowSlotKind, init_worker,
65
68
  test_help::{
66
69
  FakeWfResponses, MockPollCfg, ResponseType, build_mock_pollers, drain_pollers_and_shutdown,
67
70
  hist_to_poll_resp, mock_worker, mock_worker_client,
@@ -73,18 +76,16 @@ use uuid::Uuid;
73
76
 
74
77
  #[tokio::test]
75
78
  async fn worker_validation_fails_on_nonexistent_namespace() {
76
- let opts = get_integ_server_options();
79
+ let mut opts = get_integ_server_options();
77
80
  let runtime =
78
81
  CoreRuntime::new_assume_tokio(get_integ_runtime_options(get_integ_telem_options()))
79
82
  .unwrap();
80
- let retrying_client = opts
81
- .connect_no_namespace(runtime.telemetry().get_temporal_metric_meter())
82
- .await
83
- .unwrap();
83
+ opts.metrics_meter = runtime.telemetry().get_temporal_metric_meter();
84
+ let connection = Connection::connect(opts).await.unwrap();
84
85
 
85
86
  let worker = init_worker(
86
87
  &runtime,
87
- WorkerConfigBuilder::default()
88
+ WorkerConfig::builder()
88
89
  .namespace("i_dont_exist")
89
90
  .task_queue("Wheee!")
90
91
  .versioning_strategy(WorkerVersioningStrategy::None {
@@ -93,7 +94,7 @@ async fn worker_validation_fails_on_nonexistent_namespace() {
93
94
  .task_types(WorkerTaskTypes::all())
94
95
  .build()
95
96
  .unwrap(),
96
- retrying_client,
97
+ connection,
97
98
  )
98
99
  .unwrap();
99
100
 
@@ -110,12 +111,13 @@ async fn worker_handles_unknown_workflow_types_gracefully() {
110
111
  let mut starter = CoreWfStarter::new(wf_type);
111
112
  let mut worker = starter.worker().await;
112
113
 
114
+ let task_queue = starter.get_task_queue().to_owned();
115
+ let wf_id = format!("wce-{}", Uuid::new_v4());
113
116
  let run_id = worker
114
117
  .submit_wf(
115
- format!("wce-{}", Uuid::new_v4()),
116
118
  "unregistered".to_string(),
117
119
  vec![],
118
- WorkflowOptions::default(),
120
+ WorkflowStartOptions::new(task_queue, wf_id).build(),
119
121
  )
120
122
  .await
121
123
  .unwrap();
@@ -172,35 +174,41 @@ async fn worker_handles_unknown_workflow_types_gracefully() {
172
174
  });
173
175
  }
174
176
 
177
+ #[workflow]
178
+ #[derive(Default)]
179
+ struct ResourceBasedNonStickyWf;
180
+
181
+ #[workflow_methods]
182
+ impl ResourceBasedNonStickyWf {
183
+ #[run]
184
+ async fn run(_ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
185
+ Ok(())
186
+ }
187
+ }
188
+
175
189
  #[tokio::test]
176
190
  async fn resource_based_few_pollers_guarantees_non_sticky_poll() {
177
191
  let wf_name = "resource_based_few_pollers_guarantees_non_sticky_poll";
178
192
  let mut starter = CoreWfStarter::new(wf_name);
179
- starter
180
- .worker_config
181
- .clear_max_outstanding_opts()
182
- .task_types(WorkerTaskTypes::workflow_only())
183
- // 3 pollers so the minimum slots of 2 can both be handed out to a sticky poller
184
- .workflow_task_poller_behavior(PollerBehavior::SimpleMaximum(3_usize));
193
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
194
+ // 3 pollers so the minimum slots of 2 can both be handed out to a sticky poller
195
+ starter.sdk_config.workflow_task_poller_behavior = PollerBehavior::SimpleMaximum(3_usize);
185
196
  // Set the limits to zero so it's essentially unwilling to hand out slots
186
197
  let mut tuner = ResourceBasedTuner::new(0.0, 0.0);
187
198
  tuner.with_workflow_slots_options(ResourceSlotOptions::new(2, 10, Duration::from_millis(0)));
188
- starter.worker_config.tuner(Arc::new(tuner));
199
+ starter.sdk_config.tuner = Arc::new(tuner);
189
200
  let mut worker = starter.worker().await;
190
201
 
191
202
  // Workflow doesn't actually need to do anything. We just need to see that we don't get stuck
192
203
  // by assigning all slots to sticky pollers.
193
- worker.register_wf(
194
- wf_name.to_owned(),
195
- |_: WfContext| async move { Ok(().into()) },
196
- );
204
+ worker.register_workflow::<ResourceBasedNonStickyWf>();
205
+ let task_queue = starter.get_task_queue().to_owned();
197
206
  for i in 0..20 {
198
207
  worker
199
- .submit_wf(
200
- format!("{wf_name}_{i}"),
201
- wf_name.to_owned(),
202
- vec![],
203
- WorkflowOptions::default(),
208
+ .submit_workflow(
209
+ ResourceBasedNonStickyWf::run,
210
+ (),
211
+ WorkflowStartOptions::new(task_queue.clone(), format!("{wf_name}_{i}")).build(),
204
212
  )
205
213
  .await
206
214
  .unwrap();
@@ -216,33 +224,47 @@ async fn oversize_grpc_message() {
216
224
  let (telemopts, addr, _aborter) = prom_metrics(None);
217
225
  let runtime = CoreRuntime::new_assume_tokio(get_integ_runtime_options(telemopts)).unwrap();
218
226
  let mut starter = CoreWfStarter::new_with_runtime(wf_name, runtime);
219
- starter
220
- .worker_config
221
- .task_types(WorkerTaskTypes::workflow_only());
227
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
222
228
  let mut core = starter.worker().await;
223
229
 
224
- static OVERSIZE_GRPC_MESSAGE_RUN: AtomicBool = AtomicBool::new(false);
225
- core.register_wf(wf_name.to_owned(), |_ctx: WfContext| async move {
226
- if OVERSIZE_GRPC_MESSAGE_RUN.load(Relaxed) {
227
- Ok(vec![].into())
228
- } else {
229
- OVERSIZE_GRPC_MESSAGE_RUN.store(true, Relaxed);
230
- let result: Vec<u8> = vec![0; 5000000];
231
- Ok(result.into())
230
+ let has_run = Arc::new(AtomicBool::new(false));
231
+ let has_run_clone = has_run.clone();
232
+
233
+ #[workflow]
234
+ struct OversizeGrpcMessageWf {
235
+ has_run: Arc<AtomicBool>,
236
+ }
237
+
238
+ #[workflow_methods(factory_only)]
239
+ impl OversizeGrpcMessageWf {
240
+ #[run]
241
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<Vec<u8>> {
242
+ if ctx.state(|wf| wf.has_run.load(Relaxed)) {
243
+ Ok(vec![])
244
+ } else {
245
+ ctx.state(|wf| wf.has_run.store(true, Relaxed));
246
+ let result: Vec<u8> = vec![0; 5000000];
247
+ Ok(result)
248
+ }
232
249
  }
250
+ }
251
+
252
+ core.register_workflow_with_factory(move || OversizeGrpcMessageWf {
253
+ has_run: has_run_clone.clone(),
233
254
  });
234
- starter.start_with_worker(wf_name, &mut core).await;
255
+ starter
256
+ .start_with_worker(OversizeGrpcMessageWf::name(), &mut core)
257
+ .await;
235
258
  core.run_until_done().await.unwrap();
236
259
 
237
- assert!(starter.get_history().await.events.iter().any(|e| {
238
- e.event_type == EventType::WorkflowTaskFailed as i32
239
- && if let WorkflowTaskFailedEventAttributes(attr) = e.attributes.as_ref().unwrap() {
240
- attr.cause == GrpcMessageTooLarge as i32
241
- && attr.failure.as_ref().unwrap().message == "GRPC Message too large"
242
- } else {
243
- false
244
- }
245
- }));
260
+ assert!(
261
+ starter
262
+ .get_history()
263
+ .await
264
+ .events
265
+ .iter()
266
+ .any(is_oversize_grpc_event)
267
+ );
246
268
 
247
269
  // Verify the workflow task failure metric includes the GrpcMessageTooLarge reason
248
270
  let tq = starter.get_task_queue();
@@ -358,7 +380,10 @@ async fn activity_tasks_from_completion_reserve_slots() {
358
380
  cfg.max_outstanding_activities = Some(2);
359
381
  });
360
382
  let core = Arc::new(mock_worker(mock));
361
- let mut worker = crate::common::TestWorker::new(core.clone());
383
+ let mut worker = crate::common::TestWorker::new(temporalio_sdk::Worker::new_from_core(
384
+ core.clone(),
385
+ DataConverter::default(),
386
+ ));
362
387
 
363
388
  // First poll for activities twice, occupying both slots
364
389
  let at1 = core.poll_activity_task().await.unwrap();
@@ -366,33 +391,45 @@ async fn activity_tasks_from_completion_reserve_slots() {
366
391
  let workflow_complete_token = CancellationToken::new();
367
392
  let workflow_complete_token_clone = workflow_complete_token.clone();
368
393
 
369
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, move |ctx: WfContext| {
370
- let complete_token = workflow_complete_token.clone();
371
- async move {
372
- ctx.activity(ActivityOptions {
373
- activity_type: "act1".to_string(),
374
- ..Default::default()
375
- })
376
- .await;
377
- ctx.activity(ActivityOptions {
378
- activity_type: "act2".to_string(),
379
- ..Default::default()
380
- })
381
- .await;
382
- complete_token.cancel();
383
- Ok(().into())
394
+ struct FakeAct;
395
+ #[activities]
396
+ impl FakeAct {
397
+ #[activity(name = "act1")]
398
+ fn act1(_: ActivityContext) -> Result<RawValue, ActivityError> {
399
+ unreachable!("doesn't actually run")
400
+ }
401
+
402
+ #[activity(name = "act2")]
403
+ fn act2(_: ActivityContext) -> Result<RawValue, ActivityError> {
404
+ unreachable!("doesn't actually run")
384
405
  }
406
+ }
407
+
408
+ #[workflow]
409
+ struct ActivityTasksCompletionWf {
410
+ complete_token: CancellationToken,
411
+ }
412
+
413
+ #[workflow_methods(factory_only)]
414
+ impl ActivityTasksCompletionWf {
415
+ #[run(name = DEFAULT_WORKFLOW_TYPE)]
416
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
417
+ ctx.start_activity(FakeAct::act1, (), ActivityOptions::default())
418
+ .await
419
+ .map_err(|e| WorkflowTermination::from(anyhow::Error::from(e)))?;
420
+ ctx.start_activity(FakeAct::act2, (), ActivityOptions::default())
421
+ .await
422
+ .map_err(|e| WorkflowTermination::from(anyhow::Error::from(e)))?;
423
+ ctx.state(|wf| wf.complete_token.cancel());
424
+ Ok(())
425
+ }
426
+ }
427
+
428
+ let wf_token = workflow_complete_token.clone();
429
+ worker.register_workflow_with_factory(move || ActivityTasksCompletionWf {
430
+ complete_token: wf_token.clone(),
385
431
  });
386
432
 
387
- worker
388
- .submit_wf(
389
- wf_id.to_owned(),
390
- DEFAULT_WORKFLOW_TYPE,
391
- vec![],
392
- WorkflowOptions::default(),
393
- )
394
- .await
395
- .unwrap();
396
433
  let act_completer = async {
397
434
  barr.wait().await;
398
435
  core.complete_activity_task(ActivityTaskCompletion {
@@ -408,13 +445,13 @@ async fn activity_tasks_from_completion_reserve_slots() {
408
445
  .await
409
446
  .unwrap();
410
447
  barr.wait().await;
411
- // Wait for workflow to complete in order for all eager activities to be requested before shutting down.
412
- // After shutdown, no eager activities slots can be allocated.
448
+ // Wait for workflow to complete in order for all eager activities to be requested before
449
+ // shutting down. After shutdown, no eager activities slots can be allocated.
413
450
  workflow_complete_token_clone.cancelled().await;
414
451
  core.initiate_shutdown();
415
452
  // Even though this test requests eager activity tasks, none are returned in poll responses.
416
453
  let err = core.poll_activity_task().await.unwrap_err();
417
- assert_matches!(err, temporalio_common::errors::PollError::ShutDown);
454
+ assert_matches!(err, PollError::ShutDown);
418
455
  };
419
456
  // This wf poll should *not* set the flag that it wants tasks back since both slots are
420
457
  // occupied
@@ -439,23 +476,27 @@ async fn max_wft_respected() {
439
476
  cfg.max_cached_workflows = total_wfs as usize;
440
477
  cfg.max_outstanding_workflow_tasks = Some(1);
441
478
  });
442
- let active_count: &'static _ = Box::leak(Box::new(Semaphore::new(1)));
443
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, move |ctx: WfContext| async move {
444
- drop(
445
- active_count
446
- .try_acquire()
447
- .expect("No multiple concurrent workflow tasks!"),
448
- );
449
- ctx.timer(Duration::from_secs(1)).await;
450
- Ok(().into())
451
- });
452
-
453
- for wf_id in wf_ids {
454
- worker
455
- .submit_wf(wf_id, DEFAULT_WORKFLOW_TYPE, vec![], Default::default())
456
- .await
457
- .unwrap();
479
+ static ACTIVE_COUNT: Semaphore = Semaphore::const_new(1);
480
+
481
+ #[workflow]
482
+ #[derive(Default)]
483
+ struct MaxWftWf;
484
+
485
+ #[workflow_methods]
486
+ impl MaxWftWf {
487
+ #[run(name = DEFAULT_WORKFLOW_TYPE)]
488
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
489
+ drop(
490
+ ACTIVE_COUNT
491
+ .try_acquire()
492
+ .expect("No multiple concurrent workflow tasks!"),
493
+ );
494
+ ctx.timer(Duration::from_secs(1)).await;
495
+ Ok(())
496
+ }
458
497
  }
498
+
499
+ worker.register_workflow::<MaxWftWf>();
459
500
  worker.run_until_done().await.unwrap();
460
501
  }
461
502
 
@@ -528,23 +569,24 @@ async fn history_length_with_fail_and_timeout(
528
569
  wc.max_cached_workflows = 1;
529
570
  }
530
571
  });
531
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, |ctx: WfContext| async move {
532
- assert_eq!(ctx.history_length(), 3);
533
- ctx.timer(Duration::from_secs(1)).await;
534
- assert_eq!(ctx.history_length(), 14);
535
- ctx.timer(Duration::from_secs(1)).await;
536
- assert_eq!(ctx.history_length(), 19);
537
- Ok(().into())
538
- });
539
- worker
540
- .submit_wf(
541
- wfid.to_owned(),
542
- DEFAULT_WORKFLOW_TYPE.to_owned(),
543
- vec![],
544
- WorkflowOptions::default(),
545
- )
546
- .await
547
- .unwrap();
572
+ #[workflow]
573
+ #[derive(Default)]
574
+ struct HistoryLengthWf;
575
+
576
+ #[workflow_methods]
577
+ impl HistoryLengthWf {
578
+ #[run(name = DEFAULT_WORKFLOW_TYPE)]
579
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
580
+ assert_eq!(ctx.history_length(), 3);
581
+ ctx.timer(Duration::from_secs(1)).await;
582
+ assert_eq!(ctx.history_length(), 14);
583
+ ctx.timer(Duration::from_secs(1)).await;
584
+ assert_eq!(ctx.history_length(), 19);
585
+ Ok(())
586
+ }
587
+ }
588
+
589
+ worker.register_workflow::<HistoryLengthWf>();
548
590
  worker.run_until_done().await.unwrap();
549
591
  }
550
592
 
@@ -584,31 +626,37 @@ async fn sets_build_id_from_wft_complete() {
584
626
  },
585
627
  );
586
628
 
587
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, |ctx: WfContext| async move {
588
- // First task, it should be empty, since replaying and nothing in first WFT completed
589
- assert_eq!(ctx.current_deployment_version(), None);
590
- ctx.timer(Duration::from_secs(1)).await;
591
- assert_eq!(
592
- ctx.current_deployment_version().unwrap().build_id,
593
- "enchi-cat"
594
- );
595
- ctx.timer(Duration::from_secs(1)).await;
596
- // Not replaying at this point, so we should see the worker's build id
597
- assert_eq!(
598
- ctx.current_deployment_version().unwrap().build_id,
599
- "fierce-predator"
600
- );
601
- ctx.timer(Duration::from_secs(1)).await;
602
- assert_eq!(
603
- ctx.current_deployment_version().unwrap().build_id,
604
- "fierce-predator"
605
- );
606
- Ok(().into())
607
- });
608
- worker
609
- .submit_wf(wfid, DEFAULT_WORKFLOW_TYPE, vec![], Default::default())
610
- .await
611
- .unwrap();
629
+ #[workflow]
630
+ #[derive(Default)]
631
+ struct BuildIdWf;
632
+
633
+ #[workflow_methods]
634
+ impl BuildIdWf {
635
+ #[run(name = DEFAULT_WORKFLOW_TYPE)]
636
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
637
+ // First task, it should be empty, since replaying and nothing in first WFT completed
638
+ assert_eq!(ctx.current_deployment_version(), None);
639
+ ctx.timer(Duration::from_secs(1)).await;
640
+ assert_eq!(
641
+ ctx.current_deployment_version().unwrap().build_id,
642
+ "enchi-cat"
643
+ );
644
+ ctx.timer(Duration::from_secs(1)).await;
645
+ // Not replaying at this point, so we should see the worker's build id
646
+ assert_eq!(
647
+ ctx.current_deployment_version().unwrap().build_id,
648
+ "fierce-predator"
649
+ );
650
+ ctx.timer(Duration::from_secs(1)).await;
651
+ assert_eq!(
652
+ ctx.current_deployment_version().unwrap().build_id,
653
+ "fierce-predator"
654
+ );
655
+ Ok(())
656
+ }
657
+ }
658
+
659
+ worker.register_workflow::<BuildIdWf>();
612
660
  worker.run_until_done().await.unwrap();
613
661
  }
614
662
 
@@ -667,7 +715,7 @@ impl<SK> TrackingSlotSupplier<SK> {
667
715
  #[async_trait::async_trait]
668
716
  impl<SK> SlotSupplier for TrackingSlotSupplier<SK>
669
717
  where
670
- SK: temporalio_common::worker::SlotKind + Send + Sync,
718
+ SK: temporalio_sdk_core::SlotKind + Send + Sync,
671
719
  SK::Info: SlotInfoTrait,
672
720
  {
673
721
  type SlotKind = SK;
@@ -712,47 +760,56 @@ async fn test_custom_slot_supplier_simple() {
712
760
  ));
713
761
 
714
762
  let mut starter = CoreWfStarter::new("test_custom_slot_supplier_simple");
715
- starter.worker_config.clear_max_outstanding_opts();
763
+ starter.sdk_config.register_activities(StdActivities);
716
764
 
717
765
  let mut tb = TunerBuilder::default();
718
766
  tb.workflow_slot_supplier(wf_supplier.clone());
719
767
  tb.activity_slot_supplier(activity_supplier.clone());
720
768
  tb.local_activity_slot_supplier(local_activity_supplier.clone());
721
- starter.worker_config.tuner(Arc::new(tb.build()));
769
+ starter.sdk_config.tuner = Arc::new(tb.build());
722
770
 
723
771
  let mut worker = starter.worker().await;
724
772
 
725
- worker.register_activity(
726
- "SlotSupplierActivity",
727
- |_: temporalio_sdk::ActContext, _: ()| async move { Ok(()) },
728
- );
729
- worker.register_wf(
730
- "SlotSupplierWorkflow".to_owned(),
731
- |ctx: WfContext| async move {
773
+ #[workflow]
774
+ #[derive(Default)]
775
+ struct SlotSupplierWorkflow;
776
+
777
+ #[workflow_methods]
778
+ impl SlotSupplierWorkflow {
779
+ #[run]
780
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
732
781
  let _result = ctx
733
- .activity(ActivityOptions {
734
- activity_type: "SlotSupplierActivity".to_string(),
735
- start_to_close_timeout: Some(Duration::from_secs(10)),
736
- ..Default::default()
737
- })
782
+ .start_activity(
783
+ StdActivities::no_op,
784
+ (),
785
+ ActivityOptions {
786
+ start_to_close_timeout: Some(Duration::from_secs(10)),
787
+ ..Default::default()
788
+ },
789
+ )
738
790
  .await;
739
791
  let _result = ctx
740
- .local_activity(LocalActivityOptions {
741
- activity_type: "SlotSupplierActivity".to_string(),
742
- start_to_close_timeout: Some(Duration::from_secs(10)),
743
- ..Default::default()
744
- })
792
+ .start_local_activity(
793
+ StdActivities::no_op,
794
+ (),
795
+ LocalActivityOptions {
796
+ start_to_close_timeout: Some(Duration::from_secs(10)),
797
+ ..Default::default()
798
+ },
799
+ )
745
800
  .await;
746
- Ok(().into())
747
- },
748
- );
801
+ Ok(())
802
+ }
803
+ }
749
804
 
805
+ worker.register_workflow::<SlotSupplierWorkflow>();
806
+
807
+ let task_queue = starter.get_task_queue().to_owned();
750
808
  worker
751
- .submit_wf(
752
- "test-wf".to_owned(),
753
- "SlotSupplierWorkflow".to_owned(),
754
- vec![],
755
- Default::default(),
809
+ .submit_workflow(
810
+ SlotSupplierWorkflow::run,
811
+ (),
812
+ WorkflowStartOptions::new(task_queue, "test-wf".to_owned()).build(),
756
813
  )
757
814
  .await
758
815
  .unwrap();
@@ -823,7 +880,7 @@ async fn test_custom_slot_supplier_simple() {
823
880
  slot_type: "activity",
824
881
  activity_type: Some(act_type),
825
882
  ..
826
- } if act_type == "SlotSupplierActivity"))
883
+ } if act_type.contains("no_op")))
827
884
  );
828
885
  assert!(
829
886
  local_activity_events
@@ -832,7 +889,7 @@ async fn test_custom_slot_supplier_simple() {
832
889
  slot_type: "local_activity",
833
890
  activity_type: Some(act_type),
834
891
  ..
835
- } if act_type == "SlotSupplierActivity"))
892
+ } if act_type.contains("no_op")))
836
893
  );
837
894
  assert!(wf_events.iter().any(|e| matches!(
838
895
  e,
@@ -905,12 +962,13 @@ async fn shutdown_worker_not_retried() {
905
962
  .await;
906
963
 
907
964
  let mut opts = get_integ_server_options();
908
- let uri = format!("http://localhost:{}", fs.addr.port())
909
- .parse()
965
+ opts.target = format!("http://localhost:{}", fs.addr.port())
966
+ .parse::<url::Url>()
910
967
  .unwrap();
911
- opts.target_url = uri;
912
- opts.skip_get_system_info = true;
913
- let client = opts.connect("ns", None).await.unwrap();
968
+ opts.set_skip_get_system_info(true);
969
+ let connection = Connection::connect(opts).await.unwrap();
970
+ let client_opts = temporalio_client::ClientOptions::new("ns").build();
971
+ let client = temporalio_client::Client::new(connection, client_opts).unwrap();
914
972
 
915
973
  let wf_type = "shutdown_worker_not_retried";
916
974
  let mut starter = CoreWfStarter::new_with_overrides(wf_type, None, Some(client));
@@ -918,3 +976,10 @@ async fn shutdown_worker_not_retried() {
918
976
  drain_pollers_and_shutdown(&worker).await;
919
977
  assert_eq!(shutdown_call_count.load(Ordering::Relaxed), 1);
920
978
  }
979
+
980
+ #[test]
981
+ fn test_default_build_id() {
982
+ let o = WorkerOptions::new("task_queue").build();
983
+ assert!(!o.deployment_options.version.build_id.is_empty());
984
+ assert_ne!(o.deployment_options.version.build_id, "undetermined");
985
+ }