@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
@@ -7,61 +7,73 @@ use std::{
7
7
  },
8
8
  time::Duration,
9
9
  };
10
- use temporalio_client::WorkflowClientTrait;
11
- use temporalio_common::protos::{
12
- DEFAULT_WORKFLOW_TYPE, TestHistoryBuilder, VERSION_SEARCH_ATTR_KEY,
13
- constants::PATCH_MARKER_NAME,
14
- coresdk::{
15
- AsJsonPayloadExt, FromJsonPayloadExt,
16
- common::decode_change_marker_details,
17
- workflow_activation::{NotifyHasPatch, WorkflowActivationJob, workflow_activation_job},
18
- },
19
- temporal::api::{
20
- command::v1::{
21
- RecordMarkerCommandAttributes, ScheduleActivityTaskCommandAttributes,
22
- UpsertWorkflowSearchAttributesCommandAttributes, command::Attributes,
10
+ use temporalio_client::{WorkflowSignalOptions, WorkflowStartOptions};
11
+ use temporalio_common::{
12
+ data_converters::RawValue,
13
+ protos::{
14
+ DEFAULT_WORKFLOW_TYPE, TestHistoryBuilder, VERSION_SEARCH_ATTR_KEY,
15
+ constants::PATCH_MARKER_NAME,
16
+ coresdk::{
17
+ AsJsonPayloadExt, FromJsonPayloadExt,
18
+ common::decode_change_marker_details,
19
+ workflow_activation::{NotifyHasPatch, WorkflowActivationJob, workflow_activation_job},
23
20
  },
24
- common::v1::ActivityType,
25
- enums::v1::{CommandType, EventType, IndexedValueType},
26
- history::v1::{
27
- ActivityTaskCompletedEventAttributes, ActivityTaskScheduledEventAttributes,
28
- ActivityTaskStartedEventAttributes, TimerFiredEventAttributes,
21
+ temporal::api::{
22
+ command::v1::{
23
+ RecordMarkerCommandAttributes, ScheduleActivityTaskCommandAttributes,
24
+ UpsertWorkflowSearchAttributesCommandAttributes, command::Attributes,
25
+ },
26
+ common::v1::ActivityType,
27
+ enums::v1::{CommandType, EventType},
28
+ history::v1::{
29
+ ActivityTaskCompletedEventAttributes, ActivityTaskScheduledEventAttributes,
30
+ ActivityTaskStartedEventAttributes, TimerFiredEventAttributes,
31
+ },
29
32
  },
30
33
  },
31
34
  };
32
35
 
33
36
  use temporalio_common::worker::WorkerTaskTypes;
34
- use temporalio_sdk::{ActivityOptions, WfContext, WorkflowResult};
37
+ use temporalio_macros::{activities, workflow, workflow_methods};
38
+ use temporalio_sdk::{
39
+ ActivityOptions, SyncWorkflowContext, WorkflowContext, WorkflowResult,
40
+ activities::{ActivityContext, ActivityError},
41
+ };
35
42
  use temporalio_sdk_core::test_help::{CoreInternalFlags, MockPollCfg, ResponseType};
36
43
  use tokio::{join, sync::Notify};
37
- use tokio_stream::StreamExt;
38
44
 
39
45
  const MY_PATCH_ID: &str = "integ_test_change_name";
40
46
 
41
- pub(crate) async fn changes_wf(ctx: WfContext) -> WorkflowResult<()> {
42
- if ctx.patched(MY_PATCH_ID) {
43
- ctx.timer(Duration::from_millis(100)).await;
44
- } else {
45
- ctx.timer(Duration::from_millis(200)).await;
46
- }
47
- ctx.timer(Duration::from_millis(200)).await;
48
- if ctx.patched(MY_PATCH_ID) {
49
- ctx.timer(Duration::from_millis(100)).await;
50
- } else {
47
+ #[workflow]
48
+ #[derive(Default)]
49
+ pub(crate) struct ChangesWf;
50
+
51
+ #[workflow_methods]
52
+ impl ChangesWf {
53
+ #[run(name = "writes_change_markers")]
54
+ pub(crate) async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
55
+ if ctx.patched(MY_PATCH_ID) {
56
+ ctx.timer(Duration::from_millis(100)).await;
57
+ } else {
58
+ ctx.timer(Duration::from_millis(200)).await;
59
+ }
51
60
  ctx.timer(Duration::from_millis(200)).await;
61
+ if ctx.patched(MY_PATCH_ID) {
62
+ ctx.timer(Duration::from_millis(100)).await;
63
+ } else {
64
+ ctx.timer(Duration::from_millis(200)).await;
65
+ }
66
+ Ok(())
52
67
  }
53
- Ok(().into())
54
68
  }
55
69
 
56
70
  #[tokio::test]
57
71
  async fn writes_change_markers() {
58
72
  let wf_name = "writes_change_markers";
59
73
  let mut starter = CoreWfStarter::new(wf_name);
60
- starter
61
- .worker_config
62
- .task_types(WorkerTaskTypes::workflow_only());
74
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
63
75
  let mut worker = starter.worker().await;
64
- worker.register_wf(wf_name.to_owned(), changes_wf);
76
+ worker.register_workflow::<ChangesWf>();
65
77
 
66
78
  starter.start_with_worker(wf_name, &mut worker).await;
67
79
  worker.run_until_done().await.unwrap();
@@ -69,61 +81,77 @@ async fn writes_change_markers() {
69
81
 
70
82
  /// This one simulates a run as if the worker had the "old" code, then it fails at the end as
71
83
  /// a cheapo way of being re-run, at which point it runs with change checks and the "new" code.
72
- static DID_DIE: AtomicBool = AtomicBool::new(false);
84
+ #[workflow]
85
+ pub(crate) struct NoChangeThenChangeWf {
86
+ did_die: Arc<AtomicBool>,
87
+ }
73
88
 
74
- pub(crate) async fn no_change_then_change_wf(ctx: WfContext) -> WorkflowResult<()> {
75
- if DID_DIE.load(Ordering::Acquire) {
76
- assert!(!ctx.patched(MY_PATCH_ID));
77
- }
78
- ctx.timer(Duration::from_millis(200)).await;
79
- ctx.timer(Duration::from_millis(200)).await;
80
- if DID_DIE.load(Ordering::Acquire) {
81
- assert!(!ctx.patched(MY_PATCH_ID));
82
- }
83
- ctx.timer(Duration::from_millis(200)).await;
89
+ #[workflow_methods(factory_only)]
90
+ impl NoChangeThenChangeWf {
91
+ #[run(name = "can_add_change_markers")]
92
+ pub(crate) async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
93
+ if ctx.state(|wf| wf.did_die.load(Ordering::Acquire)) {
94
+ assert!(!ctx.patched(MY_PATCH_ID));
95
+ }
96
+ ctx.timer(Duration::from_millis(200)).await;
97
+ ctx.timer(Duration::from_millis(200)).await;
98
+ if ctx.state(|wf| wf.did_die.load(Ordering::Acquire)) {
99
+ assert!(!ctx.patched(MY_PATCH_ID));
100
+ }
101
+ ctx.timer(Duration::from_millis(200)).await;
84
102
 
85
- if !DID_DIE.load(Ordering::Acquire) {
86
- DID_DIE.store(true, Ordering::Release);
87
- ctx.force_task_fail(anyhow::anyhow!("i'm ded"));
103
+ if !ctx.state(|wf| wf.did_die.load(Ordering::Acquire)) {
104
+ ctx.state(|wf| wf.did_die.store(true, Ordering::Release));
105
+ ctx.force_task_fail(anyhow::anyhow!("i'm ded"));
106
+ }
107
+ Ok(())
88
108
  }
89
- Ok(().into())
90
109
  }
91
110
 
92
111
  #[tokio::test]
93
112
  async fn can_add_change_markers() {
94
113
  let wf_name = "can_add_change_markers";
95
114
  let mut starter = CoreWfStarter::new(wf_name);
96
- starter
97
- .worker_config
98
- .task_types(WorkerTaskTypes::workflow_only());
115
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
99
116
  let mut worker = starter.worker().await;
100
- worker.register_wf(wf_name.to_owned(), no_change_then_change_wf);
117
+ let did_die = Arc::new(AtomicBool::new(false));
118
+ worker.register_workflow_with_factory(move || NoChangeThenChangeWf {
119
+ did_die: did_die.clone(),
120
+ });
101
121
 
102
122
  starter.start_with_worker(wf_name, &mut worker).await;
103
123
  worker.run_until_done().await.unwrap();
104
124
  }
105
125
 
106
- static DID_DIE_2: AtomicBool = AtomicBool::new(false);
126
+ #[workflow]
127
+ pub(crate) struct ReplayWithChangeMarkerWf {
128
+ did_die: Arc<AtomicBool>,
129
+ }
107
130
 
108
- pub(crate) async fn replay_with_change_marker_wf(ctx: WfContext) -> WorkflowResult<()> {
109
- assert!(ctx.patched(MY_PATCH_ID));
110
- ctx.timer(Duration::from_millis(200)).await;
111
- if !DID_DIE_2.load(Ordering::Acquire) {
112
- DID_DIE_2.store(true, Ordering::Release);
113
- ctx.force_task_fail(anyhow::anyhow!("i'm ded"));
131
+ #[workflow_methods(factory_only)]
132
+ impl ReplayWithChangeMarkerWf {
133
+ #[run(name = "replaying_with_patch_marker")]
134
+ pub(crate) async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
135
+ assert!(ctx.patched(MY_PATCH_ID));
136
+ ctx.timer(Duration::from_millis(200)).await;
137
+ if !ctx.state(|wf| wf.did_die.load(Ordering::Acquire)) {
138
+ ctx.state(|wf| wf.did_die.store(true, Ordering::Release));
139
+ ctx.force_task_fail(anyhow::anyhow!("i'm ded"));
140
+ }
141
+ Ok(())
114
142
  }
115
- Ok(().into())
116
143
  }
117
144
 
118
145
  #[tokio::test]
119
146
  async fn replaying_with_patch_marker() {
120
147
  let wf_name = "replaying_with_patch_marker";
121
148
  let mut starter = CoreWfStarter::new(wf_name);
122
- starter
123
- .worker_config
124
- .task_types(WorkerTaskTypes::workflow_only());
149
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
125
150
  let mut worker = starter.worker().await;
126
- worker.register_wf(wf_name.to_owned(), replay_with_change_marker_wf);
151
+ let did_die = Arc::new(AtomicBool::new(false));
152
+ worker.register_workflow_with_factory(move || ReplayWithChangeMarkerWf {
153
+ did_die: did_die.clone(),
154
+ });
127
155
 
128
156
  starter.start_with_worker(wf_name, &mut worker).await;
129
157
  worker.run_until_done().await.unwrap();
@@ -132,104 +160,148 @@ async fn replaying_with_patch_marker() {
132
160
  /// Test that the internal patching mechanism works on the second workflow task when replaying.
133
161
  /// Used as regression test for a bug that detected that we did not look ahead far enough to find
134
162
  /// the next workflow task completion, which the flags are attached to.
163
+ #[workflow]
164
+ struct TimerPatchedTimerWf {
165
+ fail_once: Arc<AtomicBool>,
166
+ }
167
+
168
+ #[workflow_methods(factory_only)]
169
+ impl TimerPatchedTimerWf {
170
+ #[run(name = "timer_patched_timer")]
171
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
172
+ ctx.timer(Duration::from_millis(1)).await;
173
+ if ctx.state(|wf| wf.fail_once.load(Ordering::Acquire)) {
174
+ ctx.state(|wf| wf.fail_once.store(false, Ordering::Release));
175
+ panic!("Enchi is hungry!");
176
+ }
177
+ assert!(ctx.patched(MY_PATCH_ID));
178
+ ctx.timer(Duration::from_millis(1)).await;
179
+ Ok(())
180
+ }
181
+ }
182
+
135
183
  #[tokio::test]
136
184
  async fn patched_on_second_workflow_task_is_deterministic() {
137
185
  let wf_name = "timer_patched_timer";
138
186
  let mut starter = CoreWfStarter::new(wf_name);
139
187
  // Disable caching to force replay from beginning
140
- starter
141
- .worker_config
142
- .max_cached_workflows(0_usize)
143
- .task_types(WorkerTaskTypes::workflow_only());
188
+ starter.sdk_config.max_cached_workflows = 0_usize;
189
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
144
190
  let mut worker = starter.worker().await;
145
- // Include a task failure as well to make sure that works
146
- static FAIL_ONCE: AtomicBool = AtomicBool::new(true);
147
- worker.register_wf(wf_name.to_owned(), |ctx: WfContext| async move {
148
- ctx.timer(Duration::from_millis(1)).await;
149
- if FAIL_ONCE.load(Ordering::Acquire) {
150
- FAIL_ONCE.store(false, Ordering::Release);
151
- panic!("Enchi is hungry!");
152
- }
153
- assert!(ctx.patched(MY_PATCH_ID));
154
- ctx.timer(Duration::from_millis(1)).await;
155
- Ok(().into())
191
+ let fail_once = Arc::new(AtomicBool::new(true));
192
+ worker.register_workflow_with_factory(move || TimerPatchedTimerWf {
193
+ fail_once: fail_once.clone(),
156
194
  });
157
195
 
158
196
  starter.start_with_worker(wf_name, &mut worker).await;
159
197
  worker.run_until_done().await.unwrap();
160
198
  }
161
199
 
200
+ #[workflow]
201
+ struct RemoveDeprecatedPatchNearOtherPatchWf {
202
+ did_die: Arc<AtomicBool>,
203
+ }
204
+
205
+ #[workflow_methods(factory_only)]
206
+ impl RemoveDeprecatedPatchNearOtherPatchWf {
207
+ #[run(name = "can_add_change_markers")]
208
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
209
+ ctx.timer(Duration::from_millis(200)).await;
210
+ if !ctx.state(|wf| wf.did_die.load(Ordering::Acquire)) {
211
+ assert!(ctx.deprecate_patch("getting-deprecated"));
212
+ assert!(ctx.patched("staying"));
213
+ } else {
214
+ assert!(ctx.patched("staying"));
215
+ }
216
+ ctx.timer(Duration::from_millis(200)).await;
217
+
218
+ if !ctx.state(|wf| wf.did_die.load(Ordering::Acquire)) {
219
+ ctx.state(|wf| wf.did_die.store(true, Ordering::Release));
220
+ ctx.force_task_fail(anyhow::anyhow!("i'm ded"));
221
+ }
222
+ Ok(())
223
+ }
224
+ }
225
+
162
226
  #[tokio::test]
163
227
  async fn can_remove_deprecated_patch_near_other_patch() {
164
228
  let wf_name = "can_add_change_markers";
165
229
  let mut starter = CoreWfStarter::new(wf_name);
166
- starter
167
- .worker_config
168
- .task_types(WorkerTaskTypes::workflow_only());
230
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
169
231
  let mut worker = starter.worker().await;
170
232
  let did_die = Arc::new(AtomicBool::new(false));
171
- worker.register_wf(wf_name.to_owned(), move |ctx: WfContext| {
172
- let did_die = did_die.clone();
173
- async move {
174
- ctx.timer(Duration::from_millis(200)).await;
175
- if !did_die.load(Ordering::Acquire) {
176
- assert!(ctx.deprecate_patch("getting-deprecated"));
177
- assert!(ctx.patched("staying"));
178
- } else {
179
- assert!(ctx.patched("staying"));
180
- }
181
- ctx.timer(Duration::from_millis(200)).await;
182
-
183
- if !did_die.load(Ordering::Acquire) {
184
- did_die.store(true, Ordering::Release);
185
- ctx.force_task_fail(anyhow::anyhow!("i'm ded"));
186
- }
187
- Ok(().into())
188
- }
233
+ worker.register_workflow_with_factory(move || RemoveDeprecatedPatchNearOtherPatchWf {
234
+ did_die: did_die.clone(),
189
235
  });
190
236
 
191
237
  starter.start_with_worker(wf_name, &mut worker).await;
192
238
  worker.run_until_done().await.unwrap();
193
239
  }
194
240
 
241
+ #[workflow]
242
+ struct DeprecatedPatchRemovalWf {
243
+ did_die: Arc<AtomicBool>,
244
+ notify: Arc<Notify>,
245
+ signal_received: bool,
246
+ }
247
+
248
+ #[workflow_methods(factory_only)]
249
+ impl DeprecatedPatchRemovalWf {
250
+ #[run(name = "deprecated_patch_removal")]
251
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
252
+ if !ctx.state(|wf| wf.did_die.load(Ordering::Acquire)) {
253
+ assert!(ctx.deprecate_patch("getting-deprecated"));
254
+ }
255
+ ctx.state(|wf| wf.notify.notify_one());
256
+ ctx.wait_condition(|s| s.signal_received).await;
257
+
258
+ ctx.timer(Duration::from_millis(1)).await;
259
+
260
+ if !ctx.state(|wf| wf.did_die.load(Ordering::Acquire)) {
261
+ ctx.state(|wf| wf.did_die.store(true, Ordering::Release));
262
+ ctx.force_task_fail(anyhow::anyhow!("i'm ded"));
263
+ }
264
+ Ok(())
265
+ }
266
+
267
+ #[signal]
268
+ fn handle_sig(&mut self, _ctx: &mut SyncWorkflowContext<Self>) {
269
+ self.signal_received = true;
270
+ }
271
+ }
272
+
195
273
  #[tokio::test]
196
274
  async fn deprecated_patch_removal() {
197
275
  let wf_name = "deprecated_patch_removal";
198
276
  let mut starter = CoreWfStarter::new(wf_name);
199
- starter
200
- .worker_config
201
- .task_types(WorkerTaskTypes::workflow_only());
277
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
202
278
  let mut worker = starter.worker().await;
203
- let client = starter.get_client().await;
204
279
  let wf_id = starter.get_task_queue().to_string();
205
280
  let did_die = Arc::new(AtomicBool::new(false));
206
281
  let send_sig = Arc::new(Notify::new());
207
- let send_sig_c = send_sig.clone();
208
- worker.register_wf(wf_name, move |ctx: WfContext| {
209
- let did_die = did_die.clone();
210
- let send_sig_c = send_sig_c.clone();
211
- async move {
212
- if !did_die.load(Ordering::Acquire) {
213
- assert!(ctx.deprecate_patch("getting-deprecated"));
214
- }
215
- send_sig_c.notify_one();
216
- ctx.make_signal_channel("sig").next().await;
217
-
218
- ctx.timer(Duration::from_millis(1)).await;
219
-
220
- if !did_die.load(Ordering::Acquire) {
221
- did_die.store(true, Ordering::Release);
222
- ctx.force_task_fail(anyhow::anyhow!("i'm ded"));
223
- }
224
- Ok(().into())
225
- }
282
+ let send_sig_clone = send_sig.clone();
283
+ worker.register_workflow_with_factory(move || DeprecatedPatchRemovalWf {
284
+ did_die: did_die.clone(),
285
+ notify: send_sig_clone.clone(),
286
+ signal_received: false,
226
287
  });
227
288
 
228
- starter.start_with_worker(wf_name, &mut worker).await;
289
+ let handle = worker
290
+ .submit_workflow(
291
+ DeprecatedPatchRemovalWf::run,
292
+ (),
293
+ WorkflowStartOptions::new(wf_id.clone(), wf_id).build(),
294
+ )
295
+ .await
296
+ .unwrap();
229
297
  let sig_fut = async {
230
298
  send_sig.notified().await;
231
- client
232
- .signal_workflow_execution(wf_id, "".to_string(), "sig".to_string(), None, None)
299
+ handle
300
+ .signal(
301
+ DeprecatedPatchRemovalWf::handle_sig,
302
+ (),
303
+ WorkflowSignalOptions::default(),
304
+ )
233
305
  .await
234
306
  .unwrap()
235
307
  };
@@ -324,47 +396,81 @@ fn patch_marker_single_activity(
324
396
  t
325
397
  }
326
398
 
327
- async fn v1(ctx: &mut WfContext) {
328
- ctx.activity(ActivityOptions {
329
- activity_id: Some("no_change".to_owned()),
330
- ..Default::default()
331
- })
332
- .await;
399
+ struct FakeAct;
400
+ #[activities]
401
+ impl FakeAct {
402
+ #[activity(name = "")]
403
+ fn nameless(_: ActivityContext) -> Result<RawValue, ActivityError> {
404
+ unimplemented!()
405
+ }
333
406
  }
334
407
 
335
- async fn v2(ctx: &mut WfContext) -> bool {
336
- if ctx.patched(MY_PATCH_ID) {
337
- ctx.activity(ActivityOptions {
338
- activity_id: Some("had_change".to_owned()),
339
- ..Default::default()
340
- })
408
+ async fn v1(ctx: &mut WorkflowContext<PatchWf>) {
409
+ let _ = ctx
410
+ .start_activity(
411
+ FakeAct::nameless,
412
+ (),
413
+ ActivityOptions {
414
+ activity_id: Some("no_change".to_owned()),
415
+ ..Default::default()
416
+ },
417
+ )
341
418
  .await;
419
+ }
420
+
421
+ async fn v2(ctx: &mut WorkflowContext<PatchWf>) -> bool {
422
+ if ctx.patched(MY_PATCH_ID) {
423
+ let _ = ctx
424
+ .start_activity(
425
+ FakeAct::nameless,
426
+ (),
427
+ ActivityOptions {
428
+ activity_id: Some("had_change".to_owned()),
429
+ ..Default::default()
430
+ },
431
+ )
432
+ .await;
342
433
  true
343
434
  } else {
344
- ctx.activity(ActivityOptions {
345
- activity_id: Some("no_change".to_owned()),
346
- ..Default::default()
347
- })
348
- .await;
435
+ let _ = ctx
436
+ .start_activity(
437
+ FakeAct::nameless,
438
+ (),
439
+ ActivityOptions {
440
+ activity_id: Some("no_change".to_owned()),
441
+ ..Default::default()
442
+ },
443
+ )
444
+ .await;
349
445
  false
350
446
  }
351
447
  }
352
448
 
353
- async fn v3(ctx: &mut WfContext) {
449
+ async fn v3(ctx: &mut WorkflowContext<PatchWf>) {
354
450
  ctx.deprecate_patch(MY_PATCH_ID);
355
- ctx.activity(ActivityOptions {
356
- activity_id: Some("had_change".to_owned()),
357
- ..Default::default()
358
- })
359
- .await;
451
+ let _ = ctx
452
+ .start_activity(
453
+ FakeAct::nameless,
454
+ (),
455
+ ActivityOptions {
456
+ activity_id: Some("had_change".to_owned()),
457
+ ..Default::default()
458
+ },
459
+ )
460
+ .await;
360
461
  }
361
462
 
362
- async fn v4(ctx: &mut WfContext) {
363
- ctx.activity(ActivityOptions {
364
- activity_id: Some("had_change".to_owned()),
365
- ..Default::default()
366
- })
367
- .await;
463
+ async fn v4(ctx: &mut WorkflowContext<PatchWf>) {
464
+ let _ = ctx
465
+ .start_activity(
466
+ FakeAct::nameless,
467
+ (),
468
+ ActivityOptions {
469
+ activity_id: Some("had_change".to_owned()),
470
+ ..Default::default()
471
+ },
472
+ )
473
+ .await;
368
474
  }
369
475
 
370
476
  fn patch_setup(replaying: bool, marker_type: MarkerType, workflow_version: usize) -> MockPollCfg {
@@ -376,27 +482,32 @@ fn patch_setup(replaying: bool, marker_type: MarkerType, workflow_version: usize
376
482
  }
377
483
  }
378
484
 
379
- macro_rules! patch_wf {
380
- ($workflow_version:ident) => {
381
- move |mut ctx: WfContext| async move {
382
- match $workflow_version {
383
- 1 => {
384
- v1(&mut ctx).await;
385
- }
386
- 2 => {
387
- v2(&mut ctx).await;
388
- }
389
- 3 => {
390
- v3(&mut ctx).await;
391
- }
392
- 4 => {
393
- v4(&mut ctx).await;
394
- }
395
- _ => panic!("Invalid workflow version for test setup"),
485
+ #[workflow]
486
+ struct PatchWf {
487
+ version: usize,
488
+ }
489
+
490
+ #[workflow_methods(factory_only)]
491
+ impl PatchWf {
492
+ #[run(name = DEFAULT_WORKFLOW_TYPE)]
493
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
494
+ match ctx.state(|wf| wf.version) {
495
+ 1 => {
496
+ v1(ctx).await;
497
+ }
498
+ 2 => {
499
+ v2(ctx).await;
500
+ }
501
+ 3 => {
502
+ v3(ctx).await;
503
+ }
504
+ 4 => {
505
+ v4(ctx).await;
396
506
  }
397
- Ok(().into())
507
+ _ => panic!("Invalid workflow version for test setup"),
398
508
  }
399
- };
509
+ Ok(())
510
+ }
400
511
  }
401
512
 
402
513
  #[rstest]
@@ -448,7 +559,9 @@ async fn v1_and_v4_changes(
448
559
 
449
560
  let mut worker = build_fake_sdk(mock_cfg);
450
561
  worker.set_worker_interceptor(aai);
451
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, patch_wf!(wf_version));
562
+ worker.register_workflow_with_factory(move || PatchWf {
563
+ version: wf_version,
564
+ });
452
565
  worker.run().await.unwrap();
453
566
  }
454
567
 
@@ -520,13 +633,9 @@ async fn v2_and_v3_changes(
520
633
  );
521
634
  if expected_num_cmds == 3 {
522
635
  let mut as_payload = [MY_PATCH_ID].as_json_payload().unwrap();
523
- as_payload.metadata.insert(
524
- "type".to_string(),
525
- IndexedValueType::KeywordList
526
- .as_str_name()
527
- .as_bytes()
528
- .to_vec(),
529
- );
636
+ as_payload
637
+ .metadata
638
+ .insert("type".to_string(), "KeywordList".as_bytes().to_vec());
530
639
  assert_matches!(
531
640
  commands.pop_front().unwrap().attributes.as_ref().unwrap(),
532
641
  Attributes::UpsertWorkflowSearchAttributesCommandAttributes(
@@ -557,10 +666,39 @@ async fn v2_and_v3_changes(
557
666
 
558
667
  let mut worker = build_fake_sdk(mock_cfg);
559
668
  worker.set_worker_interceptor(aai);
560
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, patch_wf!(wf_version));
669
+ worker.register_workflow_with_factory(move || PatchWf {
670
+ version: wf_version,
671
+ });
561
672
  worker.run().await.unwrap();
562
673
  }
563
674
 
675
+ #[workflow]
676
+ #[derive(Default)]
677
+ struct SameChangeMultipleSpotsWf;
678
+
679
+ #[workflow_methods]
680
+ impl SameChangeMultipleSpotsWf {
681
+ #[run(name = DEFAULT_WORKFLOW_TYPE)]
682
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
683
+ if ctx.patched(MY_PATCH_ID) {
684
+ let _ = ctx
685
+ .start_activity(FakeAct::nameless, (), ActivityOptions::default())
686
+ .await;
687
+ } else {
688
+ ctx.timer(ONE_SECOND).await;
689
+ }
690
+ ctx.timer(ONE_SECOND).await;
691
+ if ctx.patched(MY_PATCH_ID) {
692
+ let _ = ctx
693
+ .start_activity(FakeAct::nameless, (), ActivityOptions::default())
694
+ .await;
695
+ } else {
696
+ ctx.timer(ONE_SECOND).await;
697
+ }
698
+ Ok(())
699
+ }
700
+ }
701
+
564
702
  #[rstest]
565
703
  #[case::has_change_replay(true, true)]
566
704
  #[case::no_change_replay(false, true)]
@@ -650,26 +788,30 @@ async fn same_change_multiple_spots(#[case] have_marker_in_hist: bool, #[case] r
650
788
  MockPollCfg::from_hist_builder(t)
651
789
  };
652
790
 
653
- // Errors would appear as nondeterminism problems, so just run it.
654
791
  let mut worker = build_fake_sdk(mock_cfg);
655
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, move |ctx: WfContext| async move {
656
- if ctx.patched(MY_PATCH_ID) {
657
- ctx.activity(ActivityOptions::default()).await;
658
- } else {
659
- ctx.timer(ONE_SECOND).await;
660
- }
661
- ctx.timer(ONE_SECOND).await;
662
- if ctx.patched(MY_PATCH_ID) {
663
- ctx.activity(ActivityOptions::default()).await;
664
- } else {
665
- ctx.timer(ONE_SECOND).await;
666
- }
667
- Ok(().into())
668
- });
792
+ worker.register_workflow::<SameChangeMultipleSpotsWf>();
669
793
  worker.run().await.unwrap();
670
794
  }
671
795
 
672
796
  const SIZE_OVERFLOW_PATCH_AMOUNT: usize = 180;
797
+
798
+ #[workflow]
799
+ struct ManyPatchesWf {
800
+ num_patches: usize,
801
+ }
802
+
803
+ #[workflow_methods(factory_only)]
804
+ impl ManyPatchesWf {
805
+ #[run(name = DEFAULT_WORKFLOW_TYPE)]
806
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
807
+ for i in 1..=ctx.state(|wf| wf.num_patches) {
808
+ let _dontcare = ctx.patched(&format!("patch-{i}"));
809
+ ctx.timer(ONE_SECOND).await;
810
+ }
811
+ Ok(())
812
+ }
813
+ }
814
+
673
815
  #[rstest]
674
816
  #[case::happy_path(50)]
675
817
  // We start exceeding the 2k size limit at 180 patches with this format
@@ -729,12 +871,6 @@ async fn many_patches_combine_in_search_attrib_update(#[case] num_patches: usize
729
871
  });
730
872
 
731
873
  let mut worker = build_fake_sdk(mock_cfg);
732
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, move |ctx: WfContext| async move {
733
- for i in 1..=num_patches {
734
- let _dontcare = ctx.patched(&format!("patch-{i}"));
735
- ctx.timer(ONE_SECOND).await;
736
- }
737
- Ok(().into())
738
- });
874
+ worker.register_workflow_with_factory(move || ManyPatchesWf { num_patches });
739
875
  worker.run().await.unwrap();
740
876
  }