@temporalio/core-bridge 1.13.0 → 1.13.2

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 (181) hide show
  1. package/Cargo.lock +239 -382
  2. package/Cargo.toml +11 -11
  3. package/lib/native.d.ts +10 -3
  4. package/package.json +3 -3
  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/.cargo/config.toml +71 -11
  11. package/sdk-core/.clippy.toml +1 -0
  12. package/sdk-core/.github/workflows/heavy.yml +2 -0
  13. package/sdk-core/.github/workflows/per-pr.yml +50 -18
  14. package/sdk-core/ARCHITECTURE.md +44 -48
  15. package/sdk-core/Cargo.toml +26 -7
  16. package/sdk-core/README.md +4 -0
  17. package/sdk-core/arch_docs/diagrams/TimerMachine_Coverage.puml +14 -0
  18. package/sdk-core/arch_docs/diagrams/initial_event_history.png +0 -0
  19. package/sdk-core/arch_docs/sdks_intro.md +299 -0
  20. package/sdk-core/client/Cargo.toml +8 -7
  21. package/sdk-core/client/src/callback_based.rs +1 -2
  22. package/sdk-core/client/src/lib.rs +485 -299
  23. package/sdk-core/client/src/metrics.rs +32 -8
  24. package/sdk-core/client/src/proxy.rs +124 -5
  25. package/sdk-core/client/src/raw.rs +598 -307
  26. package/sdk-core/client/src/replaceable.rs +253 -0
  27. package/sdk-core/client/src/retry.rs +9 -6
  28. package/sdk-core/client/src/worker_registry/mod.rs +19 -3
  29. package/sdk-core/client/src/workflow_handle/mod.rs +20 -17
  30. package/sdk-core/core/Cargo.toml +100 -31
  31. package/sdk-core/core/src/core_tests/activity_tasks.rs +55 -225
  32. package/sdk-core/core/src/core_tests/mod.rs +2 -8
  33. package/sdk-core/core/src/core_tests/queries.rs +3 -5
  34. package/sdk-core/core/src/core_tests/replay_flag.rs +3 -62
  35. package/sdk-core/core/src/core_tests/updates.rs +4 -5
  36. package/sdk-core/core/src/core_tests/workers.rs +4 -3
  37. package/sdk-core/core/src/core_tests/workflow_cancels.rs +10 -7
  38. package/sdk-core/core/src/core_tests/workflow_tasks.rs +28 -291
  39. package/sdk-core/core/src/ephemeral_server/mod.rs +15 -3
  40. package/sdk-core/core/src/internal_flags.rs +11 -1
  41. package/sdk-core/core/src/lib.rs +50 -36
  42. package/sdk-core/core/src/pollers/mod.rs +5 -5
  43. package/sdk-core/core/src/pollers/poll_buffer.rs +2 -2
  44. package/sdk-core/core/src/protosext/mod.rs +13 -5
  45. package/sdk-core/core/src/protosext/protocol_messages.rs +4 -11
  46. package/sdk-core/core/src/retry_logic.rs +256 -108
  47. package/sdk-core/core/src/telemetry/metrics.rs +1 -0
  48. package/sdk-core/core/src/telemetry/mod.rs +8 -2
  49. package/sdk-core/core/src/telemetry/prometheus_meter.rs +2 -2
  50. package/sdk-core/core/src/test_help/integ_helpers.rs +971 -0
  51. package/sdk-core/core/src/test_help/mod.rs +10 -1100
  52. package/sdk-core/core/src/test_help/unit_helpers.rs +218 -0
  53. package/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +42 -6
  54. package/sdk-core/core/src/worker/activities/local_activities.rs +19 -19
  55. package/sdk-core/core/src/worker/activities.rs +10 -3
  56. package/sdk-core/core/src/worker/client/mocks.rs +3 -3
  57. package/sdk-core/core/src/worker/client.rs +130 -93
  58. package/sdk-core/core/src/worker/heartbeat.rs +12 -13
  59. package/sdk-core/core/src/worker/mod.rs +31 -21
  60. package/sdk-core/core/src/worker/nexus.rs +14 -3
  61. package/sdk-core/core/src/worker/slot_provider.rs +9 -0
  62. package/sdk-core/core/src/worker/tuner.rs +159 -0
  63. package/sdk-core/core/src/worker/workflow/history_update.rs +3 -265
  64. package/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +1 -54
  65. package/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +0 -82
  66. package/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +0 -67
  67. package/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +1 -192
  68. package/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +0 -43
  69. package/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +6 -554
  70. package/sdk-core/core/src/worker/workflow/machines/modify_workflow_properties_state_machine.rs +0 -71
  71. package/sdk-core/core/src/worker/workflow/machines/nexus_operation_state_machine.rs +102 -3
  72. package/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +10 -539
  73. package/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +0 -139
  74. package/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +1 -119
  75. package/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +6 -63
  76. package/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +9 -4
  77. package/sdk-core/core/src/worker/workflow/mod.rs +5 -1
  78. package/sdk-core/core/src/worker/workflow/workflow_stream.rs +8 -3
  79. package/sdk-core/core-api/Cargo.toml +4 -4
  80. package/sdk-core/core-api/src/envconfig.rs +153 -54
  81. package/sdk-core/core-api/src/lib.rs +68 -0
  82. package/sdk-core/core-api/src/telemetry/metrics.rs +2 -1
  83. package/sdk-core/core-api/src/telemetry.rs +13 -0
  84. package/sdk-core/core-c-bridge/Cargo.toml +13 -8
  85. package/sdk-core/core-c-bridge/include/temporal-sdk-core-c-bridge.h +184 -22
  86. package/sdk-core/core-c-bridge/src/client.rs +462 -184
  87. package/sdk-core/core-c-bridge/src/envconfig.rs +314 -0
  88. package/sdk-core/core-c-bridge/src/lib.rs +1 -0
  89. package/sdk-core/core-c-bridge/src/random.rs +4 -4
  90. package/sdk-core/core-c-bridge/src/runtime.rs +22 -23
  91. package/sdk-core/core-c-bridge/src/testing.rs +1 -4
  92. package/sdk-core/core-c-bridge/src/tests/context.rs +31 -31
  93. package/sdk-core/core-c-bridge/src/tests/mod.rs +32 -28
  94. package/sdk-core/core-c-bridge/src/tests/utils.rs +7 -7
  95. package/sdk-core/core-c-bridge/src/worker.rs +319 -66
  96. package/sdk-core/fsm/rustfsm_procmacro/src/lib.rs +6 -1
  97. package/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.stderr +5 -5
  98. package/sdk-core/sdk/Cargo.toml +8 -2
  99. package/sdk-core/sdk/src/activity_context.rs +1 -1
  100. package/sdk-core/sdk/src/app_data.rs +1 -1
  101. package/sdk-core/sdk/src/interceptors.rs +1 -4
  102. package/sdk-core/sdk/src/lib.rs +1 -5
  103. package/sdk-core/sdk/src/workflow_context/options.rs +10 -1
  104. package/sdk-core/sdk/src/workflow_future.rs +1 -1
  105. package/sdk-core/sdk-core-protos/Cargo.toml +6 -6
  106. package/sdk-core/sdk-core-protos/build.rs +10 -23
  107. package/sdk-core/sdk-core-protos/protos/api_upstream/.github/workflows/create-release.yml +9 -1
  108. package/sdk-core/sdk-core-protos/protos/api_upstream/openapi/openapiv2.json +254 -5
  109. package/sdk-core/sdk-core-protos/protos/api_upstream/openapi/openapiv3.yaml +234 -5
  110. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/common/v1/message.proto +1 -1
  111. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/deployment/v1/message.proto +6 -0
  112. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/namespace/v1/message.proto +6 -2
  113. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +60 -2
  114. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +30 -6
  115. package/sdk-core/sdk-core-protos/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +2 -0
  116. package/sdk-core/{test-utils → sdk-core-protos}/src/canned_histories.rs +5 -5
  117. package/sdk-core/sdk-core-protos/src/history_builder.rs +2 -2
  118. package/sdk-core/sdk-core-protos/src/lib.rs +25 -9
  119. package/sdk-core/sdk-core-protos/src/test_utils.rs +89 -0
  120. package/sdk-core/sdk-core-protos/src/utilities.rs +14 -5
  121. package/sdk-core/tests/c_bridge_smoke_test.c +10 -0
  122. package/sdk-core/tests/cloud_tests.rs +10 -8
  123. package/sdk-core/tests/common/http_proxy.rs +134 -0
  124. package/sdk-core/{test-utils/src/lib.rs → tests/common/mod.rs} +214 -281
  125. package/sdk-core/{test-utils/src → tests/common}/workflows.rs +4 -3
  126. package/sdk-core/tests/fuzzy_workflow.rs +1 -1
  127. package/sdk-core/tests/global_metric_tests.rs +8 -7
  128. package/sdk-core/tests/heavy_tests.rs +7 -3
  129. package/sdk-core/tests/integ_tests/client_tests.rs +111 -24
  130. package/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +14 -9
  131. package/sdk-core/tests/integ_tests/heartbeat_tests.rs +4 -4
  132. package/sdk-core/tests/integ_tests/metrics_tests.rs +114 -14
  133. package/sdk-core/tests/integ_tests/pagination_tests.rs +273 -0
  134. package/sdk-core/tests/integ_tests/polling_tests.rs +311 -93
  135. package/sdk-core/tests/integ_tests/queries_tests.rs +4 -4
  136. package/sdk-core/tests/integ_tests/update_tests.rs +13 -7
  137. package/sdk-core/tests/integ_tests/visibility_tests.rs +26 -9
  138. package/sdk-core/tests/integ_tests/worker_tests.rs +668 -13
  139. package/sdk-core/tests/integ_tests/worker_versioning_tests.rs +40 -24
  140. package/sdk-core/tests/integ_tests/workflow_tests/activities.rs +244 -11
  141. package/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +1 -1
  142. package/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +78 -2
  143. package/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +61 -2
  144. package/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +465 -7
  145. package/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +41 -2
  146. package/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +315 -3
  147. package/sdk-core/tests/integ_tests/workflow_tests/eager.rs +1 -1
  148. package/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +1990 -14
  149. package/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +65 -2
  150. package/sdk-core/tests/integ_tests/workflow_tests/nexus.rs +123 -23
  151. package/sdk-core/tests/integ_tests/workflow_tests/patches.rs +525 -3
  152. package/sdk-core/tests/integ_tests/workflow_tests/replay.rs +65 -16
  153. package/sdk-core/tests/integ_tests/workflow_tests/resets.rs +32 -23
  154. package/sdk-core/tests/integ_tests/workflow_tests/signals.rs +126 -5
  155. package/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +1 -2
  156. package/sdk-core/tests/integ_tests/workflow_tests/timers.rs +124 -8
  157. package/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +62 -2
  158. package/sdk-core/tests/integ_tests/workflow_tests.rs +67 -8
  159. package/sdk-core/tests/main.rs +26 -17
  160. package/sdk-core/tests/manual_tests.rs +5 -1
  161. package/sdk-core/tests/runner.rs +22 -40
  162. package/sdk-core/tests/shared_tests/mod.rs +1 -1
  163. package/sdk-core/tests/shared_tests/priority.rs +1 -1
  164. package/sdk-core/{core/benches/workflow_replay.rs → tests/workflow_replay_bench.rs} +10 -5
  165. package/src/client.rs +97 -20
  166. package/src/helpers/callbacks.rs +4 -4
  167. package/src/helpers/errors.rs +7 -1
  168. package/src/helpers/handles.rs +1 -0
  169. package/src/helpers/try_from_js.rs +4 -3
  170. package/src/lib.rs +3 -2
  171. package/src/metrics.rs +3 -0
  172. package/src/runtime.rs +5 -2
  173. package/src/worker.rs +9 -12
  174. package/ts/native.ts +13 -3
  175. package/sdk-core/arch_docs/diagrams/workflow_internals.svg +0 -1
  176. package/sdk-core/core/src/core_tests/child_workflows.rs +0 -281
  177. package/sdk-core/core/src/core_tests/determinism.rs +0 -318
  178. package/sdk-core/core/src/core_tests/local_activities.rs +0 -1442
  179. package/sdk-core/test-utils/Cargo.toml +0 -38
  180. package/sdk-core/test-utils/src/histfetch.rs +0 -28
  181. package/sdk-core/test-utils/src/interceptors.rs +0 -46
@@ -1,10 +1,10 @@
1
1
  use crate::{
2
2
  ActivityHeartbeat, Worker, advance_fut, job_assert, prost_dur,
3
3
  test_help::{
4
- MockPollCfg, MockWorkerInputs, MocksHolder, QueueResponse, ResponseType, TEST_Q, WorkerExt,
5
- WorkflowCachingPolicy, build_fake_worker, build_mock_pollers, canned_histories,
6
- gen_assert_and_reply, mock_manual_poller, mock_poller, mock_poller_from_resps,
7
- mock_sdk_cfg, mock_worker, poll_and_reply, single_hist_mock_sg, test_worker_cfg,
4
+ MockPollCfg, MockWorkerInputs, MocksHolder, QueueResponse, TEST_Q, WorkerExt,
5
+ WorkflowCachingPolicy, build_fake_worker, build_mock_pollers, fanout_tasks,
6
+ gen_assert_and_reply, mock_manual_poller, mock_poller, mock_worker, poll_and_reply,
7
+ single_hist_mock_sg, test_worker_cfg,
8
8
  },
9
9
  worker::client::mocks::{mock_manual_worker_client, mock_worker_client},
10
10
  };
@@ -19,17 +19,13 @@ use std::{
19
19
  Arc,
20
20
  atomic::{AtomicBool, AtomicUsize, Ordering},
21
21
  },
22
- time::Duration,
22
+ time::{Duration, Instant},
23
23
  };
24
- use temporal_client::WorkflowOptions;
25
- use temporal_sdk::{ActivityOptions, WfContext};
26
24
  use temporal_sdk_core_api::{
27
- Worker as WorkerTrait,
28
- errors::{CompleteActivityError, PollError},
29
- worker::PollerBehavior,
25
+ Worker as WorkerTrait, errors::CompleteActivityError, worker::PollerBehavior,
30
26
  };
31
27
  use temporal_sdk_core_protos::{
32
- DEFAULT_ACTIVITY_TYPE, DEFAULT_WORKFLOW_TYPE, TestHistoryBuilder,
28
+ TestHistoryBuilder, canned_histories,
33
29
  coresdk::{
34
30
  ActivityTaskCompletion,
35
31
  activity_result::{
@@ -46,20 +42,16 @@ use temporal_sdk_core_protos::{
46
42
  },
47
43
  temporal::api::{
48
44
  command::v1::{ScheduleActivityTaskCommandAttributes, command::Attributes},
49
- enums::v1::{CommandType, EventType},
50
- history::v1::{
51
- ActivityTaskScheduledEventAttributes, history_event::Attributes as EventAttributes,
52
- },
53
- sdk::v1::UserMetadata,
45
+ enums::v1::EventType,
54
46
  workflowservice::v1::{
55
47
  PollActivityTaskQueueResponse, RecordActivityTaskHeartbeatResponse,
56
48
  RespondActivityTaskCanceledResponse, RespondActivityTaskCompletedResponse,
57
49
  RespondActivityTaskFailedResponse, RespondWorkflowTaskCompletedResponse,
58
50
  },
59
51
  },
52
+ test_utils::start_timer_cmd,
60
53
  };
61
- use temporal_sdk_core_test_utils::{TestWorker, fanout_tasks, start_timer_cmd};
62
- use tokio::{join, sync::Barrier, time::sleep};
54
+ use tokio::{join, time::sleep};
63
55
  use tokio_util::sync::CancellationToken;
64
56
 
65
57
  fn three_tasks() -> VecDeque<PollActivityTaskQueueResponse> {
@@ -642,6 +634,47 @@ async fn max_tq_acts_set_passed_to_poll_properly() {
642
634
  worker.poll_activity_task().await.unwrap();
643
635
  }
644
636
 
637
+ #[tokio::test]
638
+ async fn max_worker_acts_per_second_respected() {
639
+ let mut mock_client = mock_worker_client();
640
+ mock_client
641
+ .expect_poll_activity_task()
642
+ .returning(move |_, _| {
643
+ Ok(PollActivityTaskQueueResponse {
644
+ task_token: vec![1],
645
+ activity_id: "some-id".to_string(),
646
+ ..Default::default()
647
+ })
648
+ });
649
+ mock_client
650
+ .expect_complete_activity_task()
651
+ .returning(|_, _| Ok(RespondActivityTaskCompletedResponse::default()));
652
+
653
+ let cfg = test_worker_cfg()
654
+ .activity_task_poller_behavior(PollerBehavior::SimpleMaximum(1_usize))
655
+ .max_outstanding_activities(10_usize)
656
+ .max_worker_activities_per_second(1.0)
657
+ .build()
658
+ .unwrap();
659
+ let worker = Worker::new_test(cfg, mock_client);
660
+ let start = Instant::now();
661
+ let mut received = 0;
662
+ while start.elapsed().as_millis() < 900 {
663
+ let at = worker.poll_activity_task().await.unwrap();
664
+ received += 1;
665
+ worker
666
+ .complete_activity_task(ActivityTaskCompletion {
667
+ task_token: at.task_token,
668
+ result: Some(ActivityExecutionResult::ok("hi".into())),
669
+ })
670
+ .await
671
+ .unwrap();
672
+ }
673
+ // Two will be allowed because of the initial request. Without ratelimit in effect, this number
674
+ // would be comically high due to the mocks responding very fast.
675
+ assert_eq!(received, 2);
676
+ }
677
+
645
678
  #[rstest::rstest]
646
679
  #[tokio::test]
647
680
  async fn no_eager_activities_requested_when_worker_options_disable_it(
@@ -781,9 +814,11 @@ async fn activity_tasks_from_completion_are_delivered() {
781
814
  mock.expect_complete_activity_task()
782
815
  .times(3)
783
816
  .returning(|_, _| Ok(RespondActivityTaskCompletedResponse::default()));
784
- let mut mock = single_hist_mock_sg(wfid, t, [1], mock, true);
785
817
  let act_tasks: Vec<QueueResponse<PollActivityTaskQueueResponse>> = vec![];
786
- mock.set_act_poller(mock_poller_from_resps(act_tasks));
818
+ let mut mh = MockPollCfg::from_resp_batches(wfid, t, [1], mock);
819
+ mh.enforce_correct_number_of_polls = true;
820
+ mh.activity_responses = Some(act_tasks);
821
+ let mut mock = build_mock_pollers(mh);
787
822
  mock.worker_cfg(|wc| wc.max_cached_workflows = 2);
788
823
  let core = mock_worker(mock);
789
824
 
@@ -848,160 +883,6 @@ async fn activity_tasks_from_completion_are_delivered() {
848
883
  assert_eq!(num_eager_requested.load(Ordering::Relaxed), 3);
849
884
  }
850
885
 
851
- #[tokio::test]
852
- async fn activity_tasks_from_completion_reserve_slots() {
853
- let wf_id = "fake_wf_id";
854
- let mut t = TestHistoryBuilder::default();
855
- t.add_by_type(EventType::WorkflowExecutionStarted);
856
- t.add_full_wf_task();
857
- let schedid = t.add(EventAttributes::ActivityTaskScheduledEventAttributes(
858
- ActivityTaskScheduledEventAttributes {
859
- activity_id: "1".to_string(),
860
- activity_type: Some("act1".into()),
861
- ..Default::default()
862
- },
863
- ));
864
- let startid = t.add_activity_task_started(schedid);
865
- t.add_activity_task_completed(schedid, startid, b"hi".into());
866
- t.add_full_wf_task();
867
- let schedid = t.add(EventAttributes::ActivityTaskScheduledEventAttributes(
868
- ActivityTaskScheduledEventAttributes {
869
- activity_id: "2".to_string(),
870
- activity_type: Some("act2".into()),
871
- ..Default::default()
872
- },
873
- ));
874
- let startid = t.add_activity_task_started(schedid);
875
- t.add_activity_task_completed(schedid, startid, b"hi".into());
876
- t.add_full_wf_task();
877
- t.add_workflow_execution_completed();
878
-
879
- let mut mock = mock_worker_client();
880
- // Set up two tasks to be returned via normal activity polling
881
- let act_tasks = VecDeque::from(vec![
882
- PollActivityTaskQueueResponse {
883
- task_token: vec![1],
884
- activity_id: "act1".to_string(),
885
- ..Default::default()
886
- }
887
- .into(),
888
- PollActivityTaskQueueResponse {
889
- task_token: vec![2],
890
- activity_id: "act2".to_string(),
891
- ..Default::default()
892
- }
893
- .into(),
894
- ]);
895
- mock.expect_complete_activity_task()
896
- .times(2)
897
- .returning(|_, _| Ok(RespondActivityTaskCompletedResponse::default()));
898
- let barr: &'static Barrier = Box::leak(Box::new(Barrier::new(2)));
899
- let mut mh = MockPollCfg::from_resp_batches(
900
- wf_id,
901
- t,
902
- [
903
- ResponseType::ToTaskNum(1),
904
- // We don't want the second task to be delivered until *after* the activity tasks
905
- // have been completed, so that the second activity schedule will have slots available
906
- ResponseType::UntilResolved(
907
- async {
908
- barr.wait().await;
909
- barr.wait().await;
910
- }
911
- .boxed(),
912
- 2,
913
- ),
914
- ResponseType::AllHistory,
915
- ],
916
- mock,
917
- );
918
- mh.completion_mock_fn = Some(Box::new(|wftc| {
919
- // Make sure when we see the completion with the schedule act command that it does
920
- // not have the eager execution flag set the first time, and does the second.
921
- if let Some(Attributes::ScheduleActivityTaskCommandAttributes(attrs)) = wftc
922
- .commands
923
- .first()
924
- .and_then(|cmd| cmd.attributes.as_ref())
925
- {
926
- if attrs.activity_id == "1" {
927
- assert!(!attrs.request_eager_execution);
928
- } else {
929
- assert!(attrs.request_eager_execution);
930
- }
931
- }
932
- Ok(Default::default())
933
- }));
934
- let mut mock = build_mock_pollers(mh);
935
- mock.worker_cfg(|cfg| {
936
- cfg.max_cached_workflows = 2;
937
- cfg.max_outstanding_activities = Some(2);
938
- });
939
- mock.set_act_poller(mock_poller_from_resps(act_tasks));
940
- let core = Arc::new(mock_worker(mock));
941
- let mut worker = TestWorker::new(core.clone(), TEST_Q.to_string());
942
-
943
- // First poll for activities twice, occupying both slots
944
- let at1 = core.poll_activity_task().await.unwrap();
945
- let at2 = core.poll_activity_task().await.unwrap();
946
- let workflow_complete_token = CancellationToken::new();
947
- let workflow_complete_token_clone = workflow_complete_token.clone();
948
-
949
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, move |ctx: WfContext| {
950
- let complete_token = workflow_complete_token.clone();
951
- async move {
952
- ctx.activity(ActivityOptions {
953
- activity_type: "act1".to_string(),
954
- ..Default::default()
955
- })
956
- .await;
957
- ctx.activity(ActivityOptions {
958
- activity_type: "act2".to_string(),
959
- ..Default::default()
960
- })
961
- .await;
962
- complete_token.cancel();
963
- Ok(().into())
964
- }
965
- });
966
-
967
- worker
968
- .submit_wf(
969
- wf_id.to_owned(),
970
- DEFAULT_WORKFLOW_TYPE,
971
- vec![],
972
- WorkflowOptions::default(),
973
- )
974
- .await
975
- .unwrap();
976
- let act_completer = async {
977
- barr.wait().await;
978
- core.complete_activity_task(ActivityTaskCompletion {
979
- task_token: at1.task_token,
980
- result: Some(ActivityExecutionResult::ok("hi".into())),
981
- })
982
- .await
983
- .unwrap();
984
- core.complete_activity_task(ActivityTaskCompletion {
985
- task_token: at2.task_token,
986
- result: Some(ActivityExecutionResult::ok("hi".into())),
987
- })
988
- .await
989
- .unwrap();
990
- barr.wait().await;
991
- // Wait for workflow to complete in order for all eager activities to be requested before shutting down.
992
- // After shutdown, no eager activities slots can be allocated.
993
- workflow_complete_token_clone.cancelled().await;
994
- core.initiate_shutdown();
995
- // Even though this test requests eager activity tasks, none are returned in poll responses.
996
- let err = core.poll_activity_task().await.unwrap_err();
997
- assert_matches!(err, PollError::ShutDown);
998
- };
999
- // This wf poll should *not* set the flag that it wants tasks back since both slots are
1000
- // occupied
1001
- let run_fut = async { worker.run_until_done().await.unwrap() };
1002
- join!(run_fut, act_completer);
1003
- }
1004
-
1005
886
  #[tokio::test]
1006
887
  async fn retryable_net_error_exhaustion_is_nonfatal() {
1007
888
  let mut mock_client = mock_worker_client();
@@ -1198,57 +1079,6 @@ async fn activities_must_be_flushed_to_server_on_shutdown(#[values(true, false)]
1198
1079
  join!(shutdown_task, complete_task);
1199
1080
  }
1200
1081
 
1201
- #[tokio::test]
1202
- async fn pass_activity_summary_to_metadata() {
1203
- let t = canned_histories::single_activity("1");
1204
- let mut mock_cfg = MockPollCfg::from_hist_builder(t);
1205
- let wf_id = mock_cfg.hists[0].wf_id.clone();
1206
- let wf_type = DEFAULT_WORKFLOW_TYPE;
1207
- let expected_user_metadata = Some(UserMetadata {
1208
- summary: Some(b"activity summary".into()),
1209
- details: None,
1210
- });
1211
- mock_cfg.completion_asserts_from_expectations(|mut asserts| {
1212
- asserts
1213
- .then(move |wft| {
1214
- assert_eq!(wft.commands.len(), 1);
1215
- assert_eq!(
1216
- wft.commands[0].command_type(),
1217
- CommandType::ScheduleActivityTask
1218
- );
1219
- assert_eq!(wft.commands[0].user_metadata, expected_user_metadata)
1220
- })
1221
- .then(move |wft| {
1222
- assert_eq!(wft.commands.len(), 1);
1223
- assert_eq!(
1224
- wft.commands[0].command_type(),
1225
- CommandType::CompleteWorkflowExecution
1226
- );
1227
- });
1228
- });
1229
-
1230
- let mut worker = mock_sdk_cfg(mock_cfg, |_| {});
1231
- worker.register_wf(wf_type, |ctx: WfContext| async move {
1232
- ctx.activity(ActivityOptions {
1233
- activity_type: DEFAULT_ACTIVITY_TYPE.to_string(),
1234
- summary: Some("activity summary".to_string()),
1235
- ..Default::default()
1236
- })
1237
- .await;
1238
- Ok(().into())
1239
- });
1240
- worker
1241
- .submit_wf(
1242
- wf_id.to_owned(),
1243
- wf_type.to_owned(),
1244
- vec![],
1245
- WorkflowOptions::default(),
1246
- )
1247
- .await
1248
- .unwrap();
1249
- worker.run_until_done().await.unwrap();
1250
- }
1251
-
1252
1082
  #[tokio::test]
1253
1083
  async fn heartbeat_response_can_be_paused() {
1254
1084
  let mut mock_client = mock_worker_client();
@@ -1,7 +1,4 @@
1
1
  mod activity_tasks;
2
- mod child_workflows;
3
- mod determinism;
4
- mod local_activities;
5
2
  mod queries;
6
3
  mod replay_flag;
7
4
  mod updates;
@@ -13,8 +10,7 @@ use crate::{
13
10
  Worker,
14
11
  errors::PollError,
15
12
  test_help::{
16
- MockPollCfg, build_mock_pollers, canned_histories, mock_worker, single_hist_mock_sg,
17
- test_worker_cfg,
13
+ MockPollCfg, build_mock_pollers, mock_worker, single_hist_mock_sg, test_worker_cfg,
18
14
  },
19
15
  worker::client::mocks::{mock_manual_worker_client, mock_worker_client},
20
16
  };
@@ -22,7 +18,7 @@ use futures_util::FutureExt;
22
18
  use std::{sync::LazyLock, time::Duration};
23
19
  use temporal_sdk_core_api::{Worker as WorkerTrait, worker::PollerBehavior};
24
20
  use temporal_sdk_core_protos::{
25
- TestHistoryBuilder,
21
+ TestHistoryBuilder, canned_histories,
26
22
  coresdk::{
27
23
  workflow_activation::{WorkflowActivationJob, workflow_activation_job},
28
24
  workflow_completion::WorkflowActivationCompletion,
@@ -113,8 +109,6 @@ async fn shutdown_interrupts_both_polls() {
113
109
 
114
110
  #[tokio::test]
115
111
  async fn ignores_workflow_options_updated_event() {
116
- temporal_sdk_core_test_utils::init_integ_telem();
117
-
118
112
  let mut t = TestHistoryBuilder::default();
119
113
  t.add_by_type(EventType::WorkflowExecutionStarted);
120
114
  t.add(WorkflowExecutionOptionsUpdatedEventAttributes::default());
@@ -1,6 +1,6 @@
1
1
  use crate::{
2
2
  test_help::{
3
- MockPollCfg, MocksHolder, ResponseType, WorkerExt, build_mock_pollers, canned_histories,
3
+ MockPollCfg, MocksHolder, ResponseType, WorkerExt, WorkerTestHelpers, build_mock_pollers,
4
4
  hist_to_poll_resp, mock_worker, single_hist_mock_sg,
5
5
  },
6
6
  worker::{
@@ -15,7 +15,7 @@ use std::{
15
15
  };
16
16
  use temporal_sdk_core_api::{Worker as WorkerTrait, worker::WorkerVersioningStrategy};
17
17
  use temporal_sdk_core_protos::{
18
- TestHistoryBuilder,
18
+ TestHistoryBuilder, canned_histories,
19
19
  coresdk::{
20
20
  workflow_activation::{
21
21
  WorkflowActivationJob, remove_from_cache::EvictionReason, workflow_activation_job,
@@ -36,9 +36,7 @@ use temporal_sdk_core_protos::{
36
36
  GetWorkflowExecutionHistoryResponse, RespondWorkflowTaskCompletedResponse,
37
37
  },
38
38
  },
39
- };
40
- use temporal_sdk_core_test_utils::{
41
- WorkerTestHelpers, query_ok, schedule_activity_cmd, start_timer_cmd,
39
+ test_utils::{query_ok, schedule_activity_cmd, start_timer_cmd},
42
40
  };
43
41
 
44
42
  #[rstest::rstest]
@@ -1,77 +1,18 @@
1
1
  use crate::{
2
- test_help::{
3
- MockPollCfg, ResponseType, build_fake_sdk, build_mock_pollers, canned_histories,
4
- hist_to_poll_resp, mock_worker,
5
- },
2
+ test_help::{MockPollCfg, ResponseType, build_mock_pollers, hist_to_poll_resp, mock_worker},
6
3
  worker::{LEGACY_QUERY_ID, client::mocks::mock_worker_client},
7
4
  };
8
- use rstest::{fixture, rstest};
9
5
  use std::{collections::VecDeque, time::Duration};
10
- use temporal_sdk::{WfContext, Worker, WorkflowFunction};
11
6
  use temporal_sdk_core_api::Worker as CoreWorker;
12
7
  use temporal_sdk_core_protos::{
13
- DEFAULT_WORKFLOW_TYPE, TestHistoryBuilder,
8
+ TestHistoryBuilder, canned_histories,
14
9
  coresdk::{
15
10
  workflow_activation::{WorkflowActivationJob, workflow_activation_job},
16
11
  workflow_completion::WorkflowActivationCompletion,
17
12
  },
18
13
  temporal::api::{enums::v1::EventType, query::v1::WorkflowQuery},
14
+ test_utils::{query_ok, start_timer_cmd},
19
15
  };
20
- use temporal_sdk_core_test_utils::{
21
- interceptors::ActivationAssertionsInterceptor, query_ok, start_timer_cmd,
22
- };
23
-
24
- fn timers_wf(num_timers: u32) -> WorkflowFunction {
25
- WorkflowFunction::new(move |command_sink: WfContext| async move {
26
- for _ in 1..=num_timers {
27
- command_sink.timer(Duration::from_secs(1)).await;
28
- }
29
- Ok(().into())
30
- })
31
- }
32
-
33
- #[fixture(num_timers = 1)]
34
- fn fire_happy_hist(num_timers: u32) -> Worker {
35
- let func = timers_wf(num_timers);
36
- // Add 1 b/c history takes # wf tasks, not timers
37
- let t = canned_histories::long_sequential_timers(num_timers as usize);
38
- let mut worker = build_fake_sdk(MockPollCfg::from_resps(t, [ResponseType::AllHistory]));
39
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, func);
40
- worker
41
- }
42
-
43
- #[rstest]
44
- #[case::one_timer(fire_happy_hist(1), 1)]
45
- #[case::five_timers(fire_happy_hist(5), 5)]
46
- #[tokio::test]
47
- async fn replay_flag_is_correct(#[case] mut worker: Worker, #[case] num_timers: usize) {
48
- // Verify replay flag is correct by constructing a workflow manager that already has a complete
49
- // history fed into it. It should always be replaying, because history is complete.
50
-
51
- let mut aai = ActivationAssertionsInterceptor::default();
52
-
53
- for _ in 1..=num_timers + 1 {
54
- aai.then(|a| assert!(a.is_replaying));
55
- }
56
-
57
- worker.set_worker_interceptor(aai);
58
- worker.run().await.unwrap();
59
- }
60
-
61
- #[tokio::test(flavor = "multi_thread")]
62
- async fn replay_flag_is_correct_partial_history() {
63
- let func = timers_wf(1);
64
- // Add 1 b/c history takes # wf tasks, not timers
65
- let t = canned_histories::long_sequential_timers(2);
66
- let mut worker = build_fake_sdk(MockPollCfg::from_resps(t, [1]));
67
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, func);
68
-
69
- let mut aai = ActivationAssertionsInterceptor::default();
70
- aai.then(|a| assert!(!a.is_replaying));
71
-
72
- worker.set_worker_interceptor(aai);
73
- worker.run().await.unwrap();
74
- }
75
16
 
76
17
  #[tokio::test]
77
18
  async fn replay_flag_correct_with_query() {
@@ -1,8 +1,8 @@
1
1
  use crate::{
2
2
  prost_dur,
3
3
  test_help::{
4
- MockPollCfg, PollWFTRespExt, ResponseType, build_mock_pollers, hist_to_poll_resp,
5
- mock_worker,
4
+ MockPollCfg, PollWFTRespExt, ResponseType, WorkerTestHelpers, build_mock_pollers,
5
+ hist_to_poll_resp, mock_worker,
6
6
  },
7
7
  worker::client::mocks::mock_worker_client,
8
8
  };
@@ -24,7 +24,6 @@ use temporal_sdk_core_protos::{
24
24
  workflowservice::v1::RespondWorkflowTaskCompletedResponse,
25
25
  },
26
26
  };
27
- use temporal_sdk_core_test_utils::WorkerTestHelpers;
28
27
 
29
28
  #[tokio::test]
30
29
  async fn replay_with_empty_first_task() {
@@ -115,10 +114,10 @@ async fn initial_request_sent_back(#[values(false, true)] reject: bool) {
115
114
  .returning(move |mut resp| {
116
115
  let msg = resp.messages.pop().unwrap();
117
116
  let orig_req = if reject {
118
- let acceptance = msg.body.unwrap().unpack_as(Rejection::default()).unwrap();
117
+ let acceptance = msg.body.unwrap().to_msg::<Rejection>().unwrap();
119
118
  acceptance.rejected_request.unwrap()
120
119
  } else {
121
- let acceptance = msg.body.unwrap().unpack_as(Acceptance::default()).unwrap();
120
+ let acceptance = msg.body.unwrap().to_msg::<Acceptance>().unwrap();
122
121
  acceptance.accepted_request.unwrap()
123
122
  };
124
123
  assert_eq!(orig_req, upd_req_body);
@@ -1,8 +1,8 @@
1
1
  use crate::{
2
2
  PollError, prost_dur,
3
3
  test_help::{
4
- MockPollCfg, MockWorkerInputs, MocksHolder, ResponseType, WorkerExt, build_fake_worker,
5
- build_mock_pollers, canned_histories, mock_worker, test_worker_cfg,
4
+ MockPollCfg, MockWorkerInputs, MocksHolder, ResponseType, WorkerExt, WorkerTestHelpers,
5
+ build_fake_worker, build_mock_pollers, mock_worker, test_worker_cfg,
6
6
  },
7
7
  worker::{
8
8
  self,
@@ -16,6 +16,7 @@ use futures_util::{stream, stream::StreamExt};
16
16
  use std::{cell::RefCell, time::Duration};
17
17
  use temporal_sdk_core_api::{Worker, worker::PollerBehavior};
18
18
  use temporal_sdk_core_protos::{
19
+ canned_histories,
19
20
  coresdk::{
20
21
  workflow_activation::workflow_activation_job,
21
22
  workflow_commands::{CompleteWorkflowExecution, StartTimer, workflow_command},
@@ -24,8 +25,8 @@ use temporal_sdk_core_protos::{
24
25
  temporal::api::workflowservice::v1::{
25
26
  PollWorkflowTaskQueueResponse, RespondWorkflowTaskCompletedResponse, ShutdownWorkerResponse,
26
27
  },
28
+ test_utils::start_timer_cmd,
27
29
  };
28
- use temporal_sdk_core_test_utils::{WorkerTestHelpers, start_timer_cmd};
29
30
  use tokio::sync::{Barrier, watch};
30
31
 
31
32
  #[tokio::test]
@@ -1,19 +1,22 @@
1
1
  use crate::{
2
2
  job_assert,
3
3
  test_help::{
4
- ResponseType, WorkflowCachingPolicy::NonSticky, build_fake_worker, canned_histories,
5
- gen_assert_and_reply, poll_and_reply,
4
+ ResponseType, WorkflowCachingPolicy::NonSticky, build_fake_worker, gen_assert_and_reply,
5
+ poll_and_reply,
6
6
  },
7
7
  };
8
8
  use rstest::rstest;
9
9
  use std::time::Duration;
10
- use temporal_sdk_core_protos::coresdk::{
11
- workflow_activation::{WorkflowActivationJob, workflow_activation_job},
12
- workflow_commands::{
13
- CancelWorkflowExecution, CompleteWorkflowExecution, FailWorkflowExecution,
10
+ use temporal_sdk_core_protos::{
11
+ canned_histories,
12
+ coresdk::{
13
+ workflow_activation::{WorkflowActivationJob, workflow_activation_job},
14
+ workflow_commands::{
15
+ CancelWorkflowExecution, CompleteWorkflowExecution, FailWorkflowExecution,
16
+ },
14
17
  },
18
+ test_utils::start_timer_cmd,
15
19
  };
16
- use temporal_sdk_core_test_utils::start_timer_cmd;
17
20
 
18
21
  enum CompletionType {
19
22
  Complete,