@temporalio/core-bridge 0.19.2 → 0.20.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 (125) hide show
  1. package/Cargo.lock +90 -157
  2. package/Cargo.toml +1 -0
  3. package/index.d.ts +11 -27
  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/.buildkite/docker/Dockerfile +1 -1
  11. package/sdk-core/.buildkite/docker/docker-compose.yaml +1 -1
  12. package/sdk-core/.cargo/config.toml +1 -0
  13. package/sdk-core/CODEOWNERS +1 -1
  14. package/sdk-core/bridge-ffi/include/sdk-core-bridge.h +119 -86
  15. package/sdk-core/bridge-ffi/src/lib.rs +311 -315
  16. package/sdk-core/bridge-ffi/src/wrappers.rs +108 -113
  17. package/sdk-core/client/Cargo.toml +13 -9
  18. package/sdk-core/client/LICENSE.txt +23 -0
  19. package/sdk-core/client/src/lib.rs +286 -174
  20. package/sdk-core/client/src/metrics.rs +86 -12
  21. package/sdk-core/client/src/raw.rs +566 -0
  22. package/sdk-core/client/src/retry.rs +137 -99
  23. package/sdk-core/core/Cargo.toml +15 -10
  24. package/sdk-core/core/LICENSE.txt +23 -0
  25. package/sdk-core/core/benches/workflow_replay.rs +79 -0
  26. package/sdk-core/core/src/abstractions.rs +38 -0
  27. package/sdk-core/core/src/core_tests/activity_tasks.rs +108 -182
  28. package/sdk-core/core/src/core_tests/child_workflows.rs +16 -11
  29. package/sdk-core/core/src/core_tests/determinism.rs +24 -12
  30. package/sdk-core/core/src/core_tests/local_activities.rs +53 -27
  31. package/sdk-core/core/src/core_tests/mod.rs +30 -43
  32. package/sdk-core/core/src/core_tests/queries.rs +82 -81
  33. package/sdk-core/core/src/core_tests/workers.rs +111 -296
  34. package/sdk-core/core/src/core_tests/workflow_cancels.rs +4 -4
  35. package/sdk-core/core/src/core_tests/workflow_tasks.rs +257 -242
  36. package/sdk-core/core/src/lib.rs +73 -318
  37. package/sdk-core/core/src/pollers/mod.rs +4 -6
  38. package/sdk-core/core/src/pollers/poll_buffer.rs +20 -14
  39. package/sdk-core/core/src/protosext/mod.rs +7 -10
  40. package/sdk-core/core/src/replay/mod.rs +11 -150
  41. package/sdk-core/core/src/telemetry/metrics.rs +35 -2
  42. package/sdk-core/core/src/telemetry/mod.rs +49 -16
  43. package/sdk-core/core/src/telemetry/prometheus_server.rs +14 -35
  44. package/sdk-core/core/src/test_help/mod.rs +104 -170
  45. package/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +57 -34
  46. package/sdk-core/core/src/worker/activities/local_activities.rs +95 -23
  47. package/sdk-core/core/src/worker/activities.rs +23 -16
  48. package/sdk-core/core/src/worker/client/mocks.rs +86 -0
  49. package/sdk-core/core/src/worker/client.rs +209 -0
  50. package/sdk-core/core/src/worker/mod.rs +207 -108
  51. package/sdk-core/core/src/workflow/driven_workflow.rs +21 -6
  52. package/sdk-core/core/src/workflow/history_update.rs +107 -24
  53. package/sdk-core/core/src/workflow/machines/activity_state_machine.rs +2 -3
  54. package/sdk-core/core/src/workflow/machines/child_workflow_state_machine.rs +2 -3
  55. package/sdk-core/core/src/workflow/machines/mod.rs +20 -17
  56. package/sdk-core/core/src/workflow/machines/signal_external_state_machine.rs +56 -19
  57. package/sdk-core/core/src/workflow/machines/transition_coverage.rs +5 -0
  58. package/sdk-core/core/src/workflow/machines/upsert_search_attributes_state_machine.rs +230 -22
  59. package/sdk-core/core/src/workflow/machines/workflow_machines.rs +81 -115
  60. package/sdk-core/core/src/workflow/machines/workflow_task_state_machine.rs +4 -4
  61. package/sdk-core/core/src/workflow/mod.rs +13 -1
  62. package/sdk-core/core/src/workflow/workflow_tasks/concurrency_manager.rs +70 -11
  63. package/sdk-core/core/src/workflow/workflow_tasks/mod.rs +65 -41
  64. package/sdk-core/core-api/Cargo.toml +9 -1
  65. package/sdk-core/core-api/LICENSE.txt +23 -0
  66. package/sdk-core/core-api/src/errors.rs +7 -38
  67. package/sdk-core/core-api/src/lib.rs +44 -52
  68. package/sdk-core/core-api/src/worker.rs +10 -2
  69. package/sdk-core/etc/deps.svg +127 -96
  70. package/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +11 -7
  71. package/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +10 -0
  72. package/sdk-core/protos/api_upstream/temporal/api/enums/v1/namespace.proto +6 -1
  73. package/sdk-core/protos/api_upstream/temporal/api/enums/v1/workflow.proto +6 -0
  74. package/sdk-core/protos/api_upstream/temporal/api/errordetails/v1/message.proto +6 -0
  75. package/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +2 -1
  76. package/sdk-core/protos/api_upstream/temporal/api/replication/v1/message.proto +3 -0
  77. package/sdk-core/protos/api_upstream/temporal/api/workflow/v1/message.proto +12 -0
  78. package/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +25 -0
  79. package/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +4 -0
  80. package/sdk-core/protos/local/temporal/sdk/core/bridge/bridge.proto +19 -35
  81. package/sdk-core/protos/local/temporal/sdk/core/core_interface.proto +2 -6
  82. package/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +53 -11
  83. package/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +14 -7
  84. package/sdk-core/protos/local/temporal/sdk/core/workflow_completion/workflow_completion.proto +3 -5
  85. package/sdk-core/sdk/Cargo.toml +16 -2
  86. package/sdk-core/sdk/LICENSE.txt +23 -0
  87. package/sdk-core/sdk/src/interceptors.rs +11 -0
  88. package/sdk-core/sdk/src/lib.rs +139 -151
  89. package/sdk-core/sdk/src/workflow_context/options.rs +86 -1
  90. package/sdk-core/sdk/src/workflow_context.rs +36 -17
  91. package/sdk-core/sdk/src/workflow_future.rs +19 -25
  92. package/sdk-core/sdk-core-protos/Cargo.toml +1 -1
  93. package/sdk-core/sdk-core-protos/build.rs +1 -0
  94. package/sdk-core/sdk-core-protos/src/history_info.rs +17 -4
  95. package/sdk-core/sdk-core-protos/src/lib.rs +251 -47
  96. package/sdk-core/test-utils/Cargo.toml +3 -1
  97. package/sdk-core/test-utils/src/canned_histories.rs +27 -0
  98. package/sdk-core/test-utils/src/histfetch.rs +3 -3
  99. package/sdk-core/test-utils/src/lib.rs +223 -68
  100. package/sdk-core/tests/integ_tests/client_tests.rs +27 -4
  101. package/sdk-core/tests/integ_tests/heartbeat_tests.rs +93 -14
  102. package/sdk-core/tests/integ_tests/polling_tests.rs +18 -12
  103. package/sdk-core/tests/integ_tests/queries_tests.rs +50 -53
  104. package/sdk-core/tests/integ_tests/workflow_tests/activities.rs +117 -103
  105. package/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +8 -1
  106. package/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +10 -5
  107. package/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +7 -1
  108. package/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +32 -9
  109. package/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +7 -1
  110. package/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +76 -15
  111. package/sdk-core/tests/integ_tests/workflow_tests/patches.rs +19 -3
  112. package/sdk-core/tests/integ_tests/workflow_tests/replay.rs +39 -42
  113. package/sdk-core/tests/integ_tests/workflow_tests/resets.rs +84 -0
  114. package/sdk-core/tests/integ_tests/workflow_tests/signals.rs +30 -8
  115. package/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +21 -6
  116. package/sdk-core/tests/integ_tests/workflow_tests/timers.rs +26 -16
  117. package/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +66 -0
  118. package/sdk-core/tests/integ_tests/workflow_tests.rs +78 -74
  119. package/sdk-core/tests/load_tests.rs +9 -6
  120. package/sdk-core/tests/main.rs +43 -10
  121. package/src/conversions.rs +7 -12
  122. package/src/lib.rs +322 -357
  123. package/sdk-core/client/src/mocks.rs +0 -167
  124. package/sdk-core/core/src/worker/dispatcher.rs +0 -171
  125. package/sdk-core/protos/local/temporal/sdk/core/bridge/service.proto +0 -61
@@ -1,18 +1,18 @@
1
1
  use crate::{
2
2
  replay::DEFAULT_WORKFLOW_TYPE,
3
3
  test_help::{
4
- build_mock_pollers, canned_histories, mock_core, MockPollCfg, ResponseType, TEST_Q,
4
+ build_mock_pollers, canned_histories, mock_worker, MockPollCfg, ResponseType, TEST_Q,
5
5
  },
6
+ worker::client::mocks::mock_workflow_client,
6
7
  workflow::managed_wf::ManagedWFFunc,
7
8
  };
8
9
  use std::sync::Arc;
9
- use temporal_client::mocks::mock_gateway;
10
- use temporal_sdk::{
11
- ChildWorkflowOptions, TestRustWorker, WfContext, WorkflowFunction, WorkflowResult,
12
- };
10
+ use temporal_client::WorkflowOptions;
11
+ use temporal_sdk::{ChildWorkflowOptions, Signal, WfContext, WorkflowFunction, WorkflowResult};
13
12
  use temporal_sdk_core_protos::coresdk::child_workflow::{
14
13
  child_workflow_result, ChildWorkflowCancellationType,
15
14
  };
15
+ use temporal_sdk_core_test_utils::TestWorker;
16
16
  use tokio::join;
17
17
 
18
18
  const SIGNAME: &str = "SIGNAME";
@@ -25,11 +25,11 @@ async fn signal_child_workflow(#[case] serial: bool) {
25
25
  let wf_id = "fakeid";
26
26
  let wf_type = DEFAULT_WORKFLOW_TYPE;
27
27
  let t = canned_histories::single_child_workflow_signaled("child-id-1", SIGNAME);
28
- let mock = mock_gateway();
28
+ let mock = mock_workflow_client();
29
29
  let mh = MockPollCfg::from_resp_batches(wf_id, t, [ResponseType::AllHistory], mock);
30
30
  let mock = build_mock_pollers(mh);
31
- let core = mock_core(mock);
32
- let mut worker = TestRustWorker::new(Arc::new(core), TEST_Q.to_string(), None);
31
+ let core = mock_worker(mock);
32
+ let mut worker = TestWorker::new(Arc::new(core), TEST_Q.to_string());
33
33
 
34
34
  let wf = move |ctx: WfContext| async move {
35
35
  let child = ctx.child_workflow(ChildWorkflowOptions {
@@ -44,11 +44,11 @@ async fn signal_child_workflow(#[case] serial: bool) {
44
44
  .into_started()
45
45
  .expect("Child should get started");
46
46
  let (sigres, res) = if serial {
47
- let sigres = start_res.signal(&ctx, SIGNAME, b"Hi!").await;
47
+ let sigres = start_res.signal(&ctx, Signal::new(SIGNAME, [b"Hi!"])).await;
48
48
  let res = start_res.result().await;
49
49
  (sigres, res)
50
50
  } else {
51
- let sigfut = start_res.signal(&ctx, SIGNAME, b"Hi!");
51
+ let sigfut = start_res.signal(&ctx, Signal::new(SIGNAME, [b"Hi!"]));
52
52
  let resfut = start_res.result();
53
53
  join!(sigfut, resfut)
54
54
  };
@@ -59,7 +59,12 @@ async fn signal_child_workflow(#[case] serial: bool) {
59
59
 
60
60
  worker.register_wf(wf_type.to_owned(), wf);
61
61
  worker
62
- .submit_wf(wf_id.to_owned(), wf_type.to_owned(), vec![])
62
+ .submit_wf(
63
+ wf_id.to_owned(),
64
+ wf_type.to_owned(),
65
+ vec![],
66
+ WorkflowOptions::default(),
67
+ )
63
68
  .await
64
69
  .unwrap();
65
70
  worker.run_until_done().await.unwrap();
@@ -1,8 +1,9 @@
1
1
  use crate::{
2
2
  replay::DEFAULT_WORKFLOW_TYPE,
3
3
  test_help::{
4
- build_mock_pollers, canned_histories, mock_core, MockPollCfg, ResponseType, TEST_Q,
4
+ build_mock_pollers, canned_histories, mock_worker, MockPollCfg, ResponseType, TEST_Q,
5
5
  },
6
+ worker::client::mocks::mock_workflow_client,
6
7
  };
7
8
  use std::{
8
9
  sync::{
@@ -11,9 +12,10 @@ use std::{
11
12
  },
12
13
  time::Duration,
13
14
  };
14
- use temporal_client::mocks::mock_gateway;
15
- use temporal_sdk::{TestRustWorker, WfContext, WorkflowResult};
15
+ use temporal_client::WorkflowOptions;
16
+ use temporal_sdk::{WfContext, WorkflowResult};
16
17
  use temporal_sdk_core_protos::temporal::api::enums::v1::WorkflowTaskFailedCause;
18
+ use temporal_sdk_core_test_utils::TestWorker;
17
19
 
18
20
  static DID_FAIL: AtomicBool = AtomicBool::new(false);
19
21
  pub async fn timer_wf_fails_once(ctx: WfContext) -> WorkflowResult<()> {
@@ -34,7 +36,7 @@ async fn test_wf_task_rejected_properly() {
34
36
  let wf_id = "fakeid";
35
37
  let wf_type = DEFAULT_WORKFLOW_TYPE;
36
38
  let t = canned_histories::workflow_fails_with_failure_after_timer("1");
37
- let mock = mock_gateway();
39
+ let mock = mock_workflow_client();
38
40
  let mut mh = MockPollCfg::from_resp_batches(wf_id, t, [1, 2, 2], mock);
39
41
  // We should see one wft failure which has unspecified cause, since panics don't have a defined
40
42
  // type.
@@ -42,12 +44,17 @@ async fn test_wf_task_rejected_properly() {
42
44
  mh.expect_fail_wft_matcher =
43
45
  Box::new(|_, cause, _| matches!(cause, WorkflowTaskFailedCause::Unspecified));
44
46
  let mock = build_mock_pollers(mh);
45
- let core = mock_core(mock);
46
- let mut worker = TestRustWorker::new(Arc::new(core), TEST_Q.to_string(), None);
47
+ let core = mock_worker(mock);
48
+ let mut worker = TestWorker::new(Arc::new(core), TEST_Q.to_string());
47
49
 
48
50
  worker.register_wf(wf_type.to_owned(), timer_wf_fails_once);
49
51
  worker
50
- .submit_wf(wf_id.to_owned(), wf_type.to_owned(), vec![])
52
+ .submit_wf(
53
+ wf_id.to_owned(),
54
+ wf_type.to_owned(),
55
+ vec![],
56
+ WorkflowOptions::default(),
57
+ )
51
58
  .await
52
59
  .unwrap();
53
60
  worker.run_until_done().await.unwrap();
@@ -63,7 +70,7 @@ async fn test_wf_task_rejected_properly_due_to_nondeterminism(#[case] use_cache:
63
70
  let wf_id = "fakeid";
64
71
  let wf_type = DEFAULT_WORKFLOW_TYPE;
65
72
  let t = canned_histories::single_timer_wf_completes("1");
66
- let mock = mock_gateway();
73
+ let mock = mock_workflow_client();
67
74
  let mut mh = MockPollCfg::from_resp_batches(
68
75
  wf_id,
69
76
  t,
@@ -77,12 +84,12 @@ async fn test_wf_task_rejected_properly_due_to_nondeterminism(#[case] use_cache:
77
84
  Box::new(|_, cause, _| matches!(cause, WorkflowTaskFailedCause::NonDeterministicError));
78
85
  let mut mock = build_mock_pollers(mh);
79
86
  if use_cache {
80
- mock.worker_cfg(TEST_Q, |cfg| {
87
+ mock.worker_cfg(|cfg| {
81
88
  cfg.max_cached_workflows = 2;
82
89
  });
83
90
  }
84
- let core = mock_core(mock);
85
- let mut worker = TestRustWorker::new(Arc::new(core), TEST_Q.to_string(), None);
91
+ let core = mock_worker(mock);
92
+ let mut worker = TestWorker::new(Arc::new(core), TEST_Q.to_string());
86
93
 
87
94
  let started_count: &'static _ = Box::leak(Box::new(AtomicUsize::new(0)));
88
95
  worker.register_wf(wf_type.to_owned(), move |ctx: WfContext| async move {
@@ -96,7 +103,12 @@ async fn test_wf_task_rejected_properly_due_to_nondeterminism(#[case] use_cache:
96
103
  });
97
104
 
98
105
  worker
99
- .submit_wf(wf_id.to_owned(), wf_type.to_owned(), vec![])
106
+ .submit_wf(
107
+ wf_id.to_owned(),
108
+ wf_type.to_owned(),
109
+ vec![],
110
+ WorkflowOptions::default(),
111
+ )
100
112
  .await
101
113
  .unwrap();
102
114
  worker.run_until_done().await.unwrap();
@@ -1,7 +1,7 @@
1
1
  use crate::{
2
2
  replay::{default_wes_attribs, TestHistoryBuilder, DEFAULT_WORKFLOW_TYPE},
3
- test_help::{build_mock_pollers, mock_core, MockPollCfg, ResponseType, TEST_Q},
4
- Core,
3
+ test_help::{build_mock_pollers, mock_worker, MockPollCfg, ResponseType, TEST_Q},
4
+ worker::client::mocks::mock_workflow_client,
5
5
  };
6
6
  use anyhow::anyhow;
7
7
  use futures::future::join_all;
@@ -12,12 +12,13 @@ use std::{
12
12
  },
13
13
  time::Duration,
14
14
  };
15
- use temporal_client::mocks::mock_gateway;
16
- use temporal_sdk::{LocalActivityOptions, TestRustWorker, WfContext, WorkflowResult};
15
+ use temporal_client::WorkflowOptions;
16
+ use temporal_sdk::{LocalActivityOptions, WfContext, WorkflowResult};
17
17
  use temporal_sdk_core_protos::{
18
18
  coresdk::{common::RetryPolicy, AsJsonPayloadExt},
19
19
  temporal::api::{enums::v1::EventType, failure::v1::Failure},
20
20
  };
21
+ use temporal_sdk_core_test_utils::TestWorker;
21
22
  use tokio::sync::Barrier;
22
23
 
23
24
  async fn echo(e: String) -> anyhow::Result<String> {
@@ -44,7 +45,7 @@ async fn local_act_two_wfts_before_marker(#[case] replay: bool, #[case] cached:
44
45
  t.add_workflow_execution_completed();
45
46
 
46
47
  let wf_id = "fakeid";
47
- let mock = mock_gateway();
48
+ let mock = mock_workflow_client();
48
49
  let resps = if replay {
49
50
  vec![ResponseType::AllHistory]
50
51
  } else {
@@ -53,10 +54,10 @@ async fn local_act_two_wfts_before_marker(#[case] replay: bool, #[case] cached:
53
54
  let mh = MockPollCfg::from_resp_batches(wf_id, t, resps, mock);
54
55
  let mut mock = build_mock_pollers(mh);
55
56
  if cached {
56
- mock.worker_cfg(TEST_Q, |cfg| cfg.max_cached_workflows = 1);
57
+ mock.worker_cfg(|cfg| cfg.max_cached_workflows = 1);
57
58
  }
58
- let core = mock_core(mock);
59
- let mut worker = TestRustWorker::new(Arc::new(core), TEST_Q.to_string(), None);
59
+ let core = mock_worker(mock);
60
+ let mut worker = TestWorker::new(Arc::new(core), TEST_Q.to_string());
60
61
 
61
62
  worker.register_wf(
62
63
  DEFAULT_WORKFLOW_TYPE.to_owned(),
@@ -73,7 +74,12 @@ async fn local_act_two_wfts_before_marker(#[case] replay: bool, #[case] cached:
73
74
  );
74
75
  worker.register_activity("echo", echo);
75
76
  worker
76
- .submit_wf(wf_id.to_owned(), DEFAULT_WORKFLOW_TYPE.to_owned(), vec![])
77
+ .submit_wf(
78
+ wf_id.to_owned(),
79
+ DEFAULT_WORKFLOW_TYPE.to_owned(),
80
+ vec![],
81
+ WorkflowOptions::default(),
82
+ )
77
83
  .await
78
84
  .unwrap();
79
85
  worker.run_until_done().await.unwrap();
@@ -111,16 +117,21 @@ async fn local_act_many_concurrent() {
111
117
  t.add_workflow_execution_completed();
112
118
 
113
119
  let wf_id = "fakeid";
114
- let mock = mock_gateway();
120
+ let mock = mock_workflow_client();
115
121
  let mh = MockPollCfg::from_resp_batches(wf_id, t, [1, 2, 3], mock);
116
122
  let mock = build_mock_pollers(mh);
117
- let core = mock_core(mock);
118
- let mut worker = TestRustWorker::new(Arc::new(core), TEST_Q.to_string(), None);
123
+ let core = mock_worker(mock);
124
+ let mut worker = TestWorker::new(Arc::new(core), TEST_Q.to_string());
119
125
 
120
126
  worker.register_wf(DEFAULT_WORKFLOW_TYPE.to_owned(), local_act_fanout_wf);
121
127
  worker.register_activity("echo", |str: String| async move { Ok(str) });
122
128
  worker
123
- .submit_wf(wf_id.to_owned(), DEFAULT_WORKFLOW_TYPE.to_owned(), vec![])
129
+ .submit_wf(
130
+ wf_id.to_owned(),
131
+ DEFAULT_WORKFLOW_TYPE.to_owned(),
132
+ vec![],
133
+ WorkflowOptions::default(),
134
+ )
124
135
  .await
125
136
  .unwrap();
126
137
  worker.run_until_done().await.unwrap();
@@ -151,15 +162,15 @@ async fn local_act_heartbeat(#[case] shutdown_middle: bool) {
151
162
  t.add_workflow_task_scheduled_and_started();
152
163
 
153
164
  let wf_id = "fakeid";
154
- let mock = mock_gateway();
165
+ let mock = mock_workflow_client();
155
166
  // Allow returning incomplete history more than once, as the wft timeout can be timing sensitive
156
167
  // and might poll an extra time
157
168
  let mut mh = MockPollCfg::from_resp_batches(wf_id, t, [1, 2, 2, 2, 2], mock);
158
169
  mh.enforce_correct_number_of_polls = false;
159
170
  let mut mock = build_mock_pollers(mh);
160
- mock.worker_cfg(TEST_Q, |wc| wc.max_cached_workflows = 1);
161
- let core = Arc::new(mock_core(mock));
162
- let mut worker = TestRustWorker::new(core.clone(), TEST_Q.to_string(), None);
171
+ mock.worker_cfg(|wc| wc.max_cached_workflows = 1);
172
+ let core = Arc::new(mock_worker(mock));
173
+ let mut worker = TestWorker::new(core.clone(), TEST_Q.to_string());
163
174
  let shutdown_barr: &'static Barrier = Box::leak(Box::new(Barrier::new(2)));
164
175
 
165
176
  worker.register_wf(
@@ -183,7 +194,12 @@ async fn local_act_heartbeat(#[case] shutdown_middle: bool) {
183
194
  Ok(str)
184
195
  });
185
196
  worker
186
- .submit_wf(wf_id.to_owned(), DEFAULT_WORKFLOW_TYPE.to_owned(), vec![])
197
+ .submit_wf(
198
+ wf_id.to_owned(),
199
+ DEFAULT_WORKFLOW_TYPE.to_owned(),
200
+ vec![],
201
+ WorkflowOptions::default(),
202
+ )
187
203
  .await
188
204
  .unwrap();
189
205
  let (_, runres) = tokio::join!(
@@ -208,11 +224,11 @@ async fn local_act_fail_and_retry(#[case] eventually_pass: bool) {
208
224
  t.add_workflow_task_scheduled_and_started();
209
225
 
210
226
  let wf_id = "fakeid";
211
- let mock = mock_gateway();
227
+ let mock = mock_workflow_client();
212
228
  let mh = MockPollCfg::from_resp_batches(wf_id, t, [1], mock);
213
229
  let mock = build_mock_pollers(mh);
214
- let core = mock_core(mock);
215
- let mut worker = TestRustWorker::new(Arc::new(core), TEST_Q.to_string(), None);
230
+ let core = mock_worker(mock);
231
+ let mut worker = TestWorker::new(Arc::new(core), TEST_Q.to_string());
216
232
 
217
233
  worker.register_wf(
218
234
  DEFAULT_WORKFLOW_TYPE.to_owned(),
@@ -249,7 +265,12 @@ async fn local_act_fail_and_retry(#[case] eventually_pass: bool) {
249
265
  }
250
266
  });
251
267
  worker
252
- .submit_wf(wf_id.to_owned(), DEFAULT_WORKFLOW_TYPE.to_owned(), vec![])
268
+ .submit_wf(
269
+ wf_id.to_owned(),
270
+ DEFAULT_WORKFLOW_TYPE.to_owned(),
271
+ vec![],
272
+ WorkflowOptions::default(),
273
+ )
253
274
  .await
254
275
  .unwrap();
255
276
  worker.run_until_done().await.unwrap();
@@ -281,7 +302,7 @@ async fn local_act_retry_long_backoff_uses_timer() {
281
302
  t.add_workflow_execution_completed();
282
303
 
283
304
  let wf_id = "fakeid";
284
- let mock = mock_gateway();
305
+ let mock = mock_workflow_client();
285
306
  let mh = MockPollCfg::from_resp_batches(
286
307
  wf_id,
287
308
  t,
@@ -289,9 +310,9 @@ async fn local_act_retry_long_backoff_uses_timer() {
289
310
  mock,
290
311
  );
291
312
  let mut mock = build_mock_pollers(mh);
292
- mock.worker_cfg(TEST_Q, |w| w.max_cached_workflows = 1);
293
- let core = mock_core(mock);
294
- let mut worker = TestRustWorker::new(Arc::new(core), TEST_Q.to_string(), None);
313
+ mock.worker_cfg(|w| w.max_cached_workflows = 1);
314
+ let core = mock_worker(mock);
315
+ let mut worker = TestWorker::new(Arc::new(core), TEST_Q.to_string());
295
316
 
296
317
  worker.register_wf(
297
318
  DEFAULT_WORKFLOW_TYPE.to_owned(),
@@ -321,7 +342,12 @@ async fn local_act_retry_long_backoff_uses_timer() {
321
342
  Result::<(), _>::Err(anyhow!("Oh no I failed!"))
322
343
  });
323
344
  worker
324
- .submit_wf(wf_id.to_owned(), DEFAULT_WORKFLOW_TYPE.to_owned(), vec![])
345
+ .submit_wf(
346
+ wf_id.to_owned(),
347
+ DEFAULT_WORKFLOW_TYPE.to_owned(),
348
+ vec![],
349
+ WorkflowOptions::default(),
350
+ )
325
351
  .await
326
352
  .unwrap();
327
353
  worker.run_until_done().await.unwrap();
@@ -10,32 +10,37 @@ mod workflow_tasks;
10
10
 
11
11
  use crate::{
12
12
  errors::{PollActivityError, PollWfError},
13
- test_help::{build_fake_core, canned_histories, hist_to_poll_resp, ResponseType, TEST_Q},
14
- Core, CoreInitOptionsBuilder, CoreSDK, WorkerConfigBuilder,
13
+ test_help::{build_mock_pollers, canned_histories, mock_worker, test_worker_cfg, MockPollCfg},
14
+ worker::client::mocks::{mock_manual_workflow_client, mock_workflow_client},
15
+ Worker,
15
16
  };
16
17
  use futures::FutureExt;
17
18
  use std::time::Duration;
18
- use temporal_client::mocks::{fake_sg_opts, mock_manual_gateway};
19
- use temporal_sdk_core_protos::{
20
- coresdk::workflow_completion::WorkflowActivationCompletion,
21
- temporal::api::workflowservice::v1::PollActivityTaskQueueResponse,
22
- };
19
+ use temporal_sdk_core_api::Worker as WorkerTrait;
20
+ use temporal_sdk_core_protos::coresdk::workflow_completion::WorkflowActivationCompletion;
23
21
  use tokio::{sync::Barrier, time::sleep};
24
22
 
25
23
  #[tokio::test]
26
24
  async fn after_shutdown_server_is_not_polled() {
27
25
  let t = canned_histories::single_timer("fake_timer");
28
- let core = build_fake_core("fake_wf_id", t, &[1]);
29
- let res = core.poll_workflow_activation(TEST_Q).await.unwrap();
26
+ let mh = MockPollCfg::from_resp_batches("fake_wf_id", t, [1], mock_workflow_client());
27
+ let mut mock = build_mock_pollers(mh);
28
+ // Just so we don't have to deal w/ cache overflow
29
+ mock.worker_cfg(|cfg| cfg.max_cached_workflows = 1);
30
+ let worker = mock_worker(mock);
31
+
32
+ let res = worker.poll_workflow_activation().await.unwrap();
30
33
  assert_eq!(res.jobs.len(), 1);
31
- core.complete_workflow_activation(WorkflowActivationCompletion::empty(TEST_Q, res.run_id))
34
+ worker
35
+ .complete_workflow_activation(WorkflowActivationCompletion::empty(res.run_id))
32
36
  .await
33
37
  .unwrap();
34
- core.shutdown().await;
38
+ worker.shutdown().await;
35
39
  assert_matches!(
36
- core.poll_workflow_activation(TEST_Q).await.unwrap_err(),
40
+ worker.poll_workflow_activation().await.unwrap_err(),
37
41
  PollWfError::ShutDown
38
42
  );
43
+ worker.finalize_shutdown().await;
39
44
  }
40
45
 
41
46
  // Better than cloning a billion arcs...
@@ -44,70 +49,52 @@ lazy_static::lazy_static! {
44
49
  }
45
50
  #[tokio::test]
46
51
  async fn shutdown_interrupts_both_polls() {
47
- let mut mock_gateway = mock_manual_gateway();
48
- mock_gateway
52
+ let mut mock_client = mock_manual_workflow_client();
53
+ mock_client
49
54
  .expect_poll_activity_task()
50
55
  .times(1)
51
- .returning(move |_| {
56
+ .returning(move |_, _| {
52
57
  async move {
53
58
  BARR.wait().await;
54
59
  sleep(Duration::from_secs(1)).await;
55
- Ok(PollActivityTaskQueueResponse {
56
- task_token: vec![1],
57
- heartbeat_timeout: Some(Duration::from_secs(1).into()),
58
- ..Default::default()
59
- })
60
+ Ok(Default::default())
60
61
  }
61
62
  .boxed()
62
63
  });
63
- mock_gateway
64
+ mock_client
64
65
  .expect_poll_workflow_task()
65
66
  .times(1)
66
67
  .returning(move |_, _| {
67
68
  async move {
68
69
  BARR.wait().await;
69
70
  sleep(Duration::from_secs(1)).await;
70
- let t = canned_histories::single_timer("hi");
71
- Ok(hist_to_poll_resp(
72
- &t,
73
- "wf".to_string(),
74
- ResponseType::AllHistory,
75
- TEST_Q.to_string(),
76
- ))
71
+ Ok(Default::default())
77
72
  }
78
73
  .boxed()
79
74
  });
80
75
 
81
- let core = CoreSDK::new(
82
- mock_gateway,
83
- CoreInitOptionsBuilder::default()
84
- .gateway_opts(fake_sg_opts())
85
- .build()
86
- .unwrap(),
87
- );
88
- core.register_worker(
89
- WorkerConfigBuilder::default()
90
- .task_queue(TEST_Q)
76
+ let worker = Worker::new_test(
77
+ test_worker_cfg()
91
78
  // Need only 1 concurrent pollers for mock expectations to work here
92
79
  .max_concurrent_wft_polls(1_usize)
93
80
  .max_concurrent_at_polls(1_usize)
94
81
  .build()
95
82
  .unwrap(),
96
- )
97
- .unwrap();
83
+ mock_client,
84
+ );
98
85
  tokio::join! {
99
86
  async {
100
- assert_matches!(core.poll_activity_task(TEST_Q).await.unwrap_err(),
87
+ assert_matches!(worker.poll_activity_task().await.unwrap_err(),
101
88
  PollActivityError::ShutDown);
102
89
  },
103
90
  async {
104
- assert_matches!(core.poll_workflow_activation(TEST_Q).await.unwrap_err(),
91
+ assert_matches!(worker.poll_workflow_activation().await.unwrap_err(),
105
92
  PollWfError::ShutDown);
106
93
  },
107
94
  async {
108
95
  // Give polling a bit to get stuck, then shutdown
109
96
  BARR.wait().await;
110
- core.shutdown().await;
97
+ worker.shutdown().await;
111
98
  }
112
99
  };
113
100
  }