@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.
- package/Cargo.lock +794 -650
- package/bridge-macros/src/derive_tryintojs.rs +40 -0
- package/lib/native.d.ts +24 -3
- package/package.json +4 -4
- package/releases/aarch64-apple-darwin/index.node +0 -0
- package/releases/aarch64-unknown-linux-gnu/index.node +0 -0
- package/releases/x86_64-apple-darwin/index.node +0 -0
- package/releases/x86_64-pc-windows-msvc/index.node +0 -0
- package/releases/x86_64-unknown-linux-gnu/index.node +0 -0
- package/sdk-core/.github/workflows/per-pr.yml +6 -6
- package/sdk-core/AGENTS.md +42 -31
- package/sdk-core/Cargo.toml +4 -1
- package/sdk-core/README.md +19 -13
- package/sdk-core/crates/client/Cargo.toml +4 -0
- package/sdk-core/crates/client/README.md +139 -0
- package/sdk-core/crates/client/src/async_activity_handle.rs +297 -0
- package/sdk-core/crates/client/src/callback_based.rs +7 -0
- package/sdk-core/crates/client/src/errors.rs +294 -0
- package/sdk-core/crates/client/src/{raw.rs → grpc.rs} +370 -159
- package/sdk-core/crates/client/src/lib.rs +920 -1326
- package/sdk-core/crates/client/src/metrics.rs +24 -33
- package/sdk-core/crates/client/src/options_structs.rs +457 -0
- package/sdk-core/crates/client/src/replaceable.rs +5 -4
- package/sdk-core/crates/client/src/request_extensions.rs +8 -9
- package/sdk-core/crates/client/src/retry.rs +99 -54
- package/sdk-core/crates/client/src/{worker/mod.rs → worker.rs} +104 -29
- package/sdk-core/crates/client/src/workflow_handle.rs +826 -0
- package/sdk-core/crates/common/Cargo.toml +62 -3
- package/sdk-core/crates/common/build.rs +742 -12
- package/sdk-core/crates/common/protos/api_upstream/.github/workflows/ci.yml +2 -0
- package/sdk-core/crates/common/protos/api_upstream/.github/workflows/create-release.yml +0 -5
- package/sdk-core/crates/common/protos/api_upstream/Makefile +2 -1
- package/sdk-core/crates/common/protos/api_upstream/README.md +8 -0
- package/sdk-core/crates/common/protos/api_upstream/cmd/check-path-conflicts/main.go +137 -0
- package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv2.json +3329 -2647
- package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv3.yaml +2734 -708
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/activity/v1/message.proto +155 -3
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/command/v1/message.proto +26 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/common/v1/message.proto +8 -1
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/deployment/v1/message.proto +27 -1
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/activity.proto +81 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/event_type.proto +4 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +4 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +15 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/workflow.proto +63 -15
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/errordetails/v1/message.proto +8 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/failure/v1/message.proto +1 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/history/v1/message.proto +111 -17
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/namespace/v1/message.proto +21 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/nexus/v1/message.proto +20 -1
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +4 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/schedule/v1/message.proto +2 -2
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +2 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/worker/v1/message.proto +4 -7
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflow/v1/message.proto +80 -22
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +347 -23
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +242 -43
- package/sdk-core/crates/common/protos/local/temporal/sdk/core/core_interface.proto +15 -0
- package/sdk-core/crates/common/protos/local/temporal/sdk/core/nexus/nexus.proto +9 -2
- package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +8 -0
- package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +22 -5
- package/sdk-core/crates/common/src/activity_definition.rs +20 -0
- package/sdk-core/crates/common/src/data_converters.rs +770 -0
- package/sdk-core/crates/common/src/envconfig.rs +5 -0
- package/sdk-core/crates/common/src/lib.rs +15 -211
- package/sdk-core/crates/common/src/payload_visitor.rs +648 -0
- package/sdk-core/crates/common/src/priority.rs +110 -0
- package/sdk-core/crates/common/src/protos/canned_histories.rs +19 -0
- package/sdk-core/crates/common/src/protos/history_builder.rs +45 -0
- package/sdk-core/crates/common/src/protos/history_info.rs +2 -0
- package/sdk-core/crates/common/src/protos/mod.rs +134 -27
- package/sdk-core/crates/common/src/protos/task_token.rs +3 -3
- package/sdk-core/crates/common/src/protos/utilities.rs +11 -0
- package/sdk-core/crates/{sdk-core → common}/src/telemetry/log_export.rs +11 -16
- package/sdk-core/crates/common/src/telemetry/metrics/core.rs +125 -0
- package/sdk-core/crates/common/src/telemetry/metrics.rs +272 -225
- package/sdk-core/crates/{sdk-core → common}/src/telemetry/otel.rs +8 -13
- package/sdk-core/crates/{sdk-core → common}/src/telemetry/prometheus_meter.rs +49 -50
- package/sdk-core/crates/{sdk-core → common}/src/telemetry/prometheus_server.rs +2 -3
- package/sdk-core/crates/common/src/telemetry.rs +278 -19
- package/sdk-core/crates/common/src/worker.rs +68 -636
- package/sdk-core/crates/common/src/workflow_definition.rs +60 -0
- package/sdk-core/crates/macros/Cargo.toml +5 -1
- package/sdk-core/crates/macros/src/activities_definitions.rs +585 -0
- package/sdk-core/crates/macros/src/fsm_impl.rs +507 -0
- package/sdk-core/crates/macros/src/lib.rs +138 -512
- package/sdk-core/crates/macros/src/macro_utils.rs +106 -0
- package/sdk-core/crates/macros/src/workflow_definitions.rs +1224 -0
- package/sdk-core/crates/sdk/Cargo.toml +19 -6
- package/sdk-core/crates/sdk/README.md +415 -0
- package/sdk-core/crates/sdk/src/activities.rs +417 -0
- package/sdk-core/crates/sdk/src/interceptors.rs +1 -1
- package/sdk-core/crates/sdk/src/lib.rs +759 -442
- package/sdk-core/crates/sdk/src/workflow_context/options.rs +64 -35
- package/sdk-core/crates/sdk/src/workflow_context.rs +1033 -289
- package/sdk-core/crates/sdk/src/workflow_future.rs +277 -213
- package/sdk-core/crates/sdk/src/workflows.rs +711 -0
- package/sdk-core/crates/sdk-core/Cargo.toml +59 -65
- package/sdk-core/crates/sdk-core/benches/workflow_replay_bench.rs +45 -54
- package/sdk-core/crates/sdk-core/machine_coverage/ActivityMachine_Coverage.puml +1 -1
- package/sdk-core/crates/sdk-core/src/abstractions.rs +6 -10
- package/sdk-core/crates/sdk-core/src/core_tests/activity_tasks.rs +6 -5
- package/sdk-core/crates/sdk-core/src/core_tests/mod.rs +22 -21
- package/sdk-core/crates/sdk-core/src/core_tests/queries.rs +21 -25
- package/sdk-core/crates/sdk-core/src/core_tests/replay_flag.rs +7 -10
- package/sdk-core/crates/sdk-core/src/core_tests/updates.rs +14 -17
- package/sdk-core/crates/sdk-core/src/core_tests/workers.rs +647 -27
- package/sdk-core/crates/sdk-core/src/core_tests/workflow_tasks.rs +46 -41
- package/sdk-core/crates/sdk-core/src/ephemeral_server/mod.rs +13 -16
- package/sdk-core/crates/sdk-core/src/histfetch.rs +20 -10
- package/sdk-core/crates/sdk-core/src/lib.rs +60 -123
- package/sdk-core/crates/sdk-core/src/pollers/mod.rs +4 -9
- package/sdk-core/crates/sdk-core/src/pollers/poll_buffer.rs +411 -32
- package/sdk-core/crates/sdk-core/src/protosext/mod.rs +2 -2
- package/sdk-core/crates/sdk-core/src/replay/mod.rs +14 -5
- package/sdk-core/crates/sdk-core/src/telemetry/metrics.rs +183 -198
- package/sdk-core/crates/sdk-core/src/telemetry/mod.rs +3 -281
- package/sdk-core/crates/sdk-core/src/test_help/integ_helpers.rs +35 -16
- package/sdk-core/crates/sdk-core/src/test_help/unit_helpers.rs +3 -6
- package/sdk-core/crates/sdk-core/src/worker/activities/activity_heartbeat_manager.rs +1 -0
- package/sdk-core/crates/sdk-core/src/worker/activities/local_activities.rs +11 -14
- package/sdk-core/crates/sdk-core/src/worker/activities.rs +16 -19
- package/sdk-core/crates/sdk-core/src/worker/client/mocks.rs +11 -5
- package/sdk-core/crates/sdk-core/src/worker/client.rs +104 -86
- package/sdk-core/crates/sdk-core/src/worker/heartbeat.rs +10 -14
- package/sdk-core/crates/sdk-core/src/worker/mod.rs +1175 -241
- package/sdk-core/crates/sdk-core/src/worker/nexus.rs +150 -23
- package/sdk-core/crates/sdk-core/src/worker/slot_provider.rs +2 -2
- package/sdk-core/crates/sdk-core/src/worker/tuner/fixed_size.rs +2 -2
- package/sdk-core/crates/sdk-core/src/worker/tuner/resource_based.rs +25 -27
- package/sdk-core/crates/sdk-core/src/worker/tuner.rs +64 -44
- package/sdk-core/crates/sdk-core/src/worker/workflow/driven_workflow.rs +9 -3
- package/sdk-core/crates/sdk-core/src/worker/workflow/machines/patch_state_machine.rs +5 -8
- package/sdk-core/crates/sdk-core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +21 -22
- package/sdk-core/crates/sdk-core/src/worker/workflow/machines/workflow_machines.rs +28 -4
- package/sdk-core/crates/sdk-core/src/worker/workflow/managed_run.rs +20 -41
- package/sdk-core/crates/sdk-core/src/worker/workflow/mod.rs +50 -9
- package/sdk-core/crates/sdk-core/src/worker/workflow/run_cache.rs +4 -7
- package/sdk-core/crates/sdk-core/src/worker/workflow/wft_extraction.rs +2 -4
- package/sdk-core/crates/sdk-core/src/worker/workflow/wft_poller.rs +8 -9
- package/sdk-core/crates/sdk-core/src/worker/workflow/workflow_stream.rs +1 -3
- package/sdk-core/crates/sdk-core/tests/activities_procmacro.rs +6 -0
- package/sdk-core/crates/sdk-core/tests/activities_trybuild/basic_pass.rs +54 -0
- package/sdk-core/crates/sdk-core/tests/activities_trybuild/invalid_self_type_fail.rs +18 -0
- package/sdk-core/crates/sdk-core/tests/activities_trybuild/invalid_self_type_fail.stderr +5 -0
- package/sdk-core/crates/sdk-core/tests/activities_trybuild/missing_context_fail.rs +14 -0
- package/sdk-core/crates/sdk-core/tests/activities_trybuild/missing_context_fail.stderr +5 -0
- package/sdk-core/crates/sdk-core/tests/activities_trybuild/multi_arg_pass.rs +48 -0
- package/sdk-core/crates/sdk-core/tests/activities_trybuild/no_input_pass.rs +14 -0
- package/sdk-core/crates/sdk-core/tests/activities_trybuild/no_return_type_pass.rs +19 -0
- package/sdk-core/crates/sdk-core/tests/cloud_tests.rs +14 -5
- package/sdk-core/crates/sdk-core/tests/common/activity_functions.rs +55 -0
- package/sdk-core/crates/sdk-core/tests/common/mod.rs +281 -236
- package/sdk-core/crates/sdk-core/tests/common/workflows.rs +41 -28
- package/sdk-core/crates/sdk-core/tests/global_metric_tests.rs +9 -14
- package/sdk-core/crates/sdk-core/tests/heavy_tests/fuzzy_workflow.rs +73 -66
- package/sdk-core/crates/sdk-core/tests/heavy_tests.rs +306 -268
- package/sdk-core/crates/sdk-core/tests/integ_tests/async_activity_client_tests.rs +230 -0
- package/sdk-core/crates/sdk-core/tests/integ_tests/client_tests.rs +94 -57
- package/sdk-core/crates/sdk-core/tests/integ_tests/data_converter_tests.rs +381 -0
- package/sdk-core/crates/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +37 -38
- package/sdk-core/crates/sdk-core/tests/integ_tests/heartbeat_tests.rs +49 -40
- package/sdk-core/crates/sdk-core/tests/integ_tests/metrics_tests.rs +447 -300
- package/sdk-core/crates/sdk-core/tests/integ_tests/pagination_tests.rs +50 -45
- package/sdk-core/crates/sdk-core/tests/integ_tests/polling_tests.rs +157 -157
- package/sdk-core/crates/sdk-core/tests/integ_tests/queries_tests.rs +103 -89
- package/sdk-core/crates/sdk-core/tests/integ_tests/update_tests.rs +609 -463
- package/sdk-core/crates/sdk-core/tests/integ_tests/visibility_tests.rs +80 -62
- package/sdk-core/crates/sdk-core/tests/integ_tests/worker_heartbeat_tests.rs +389 -265
- package/sdk-core/crates/sdk-core/tests/integ_tests/worker_tests.rs +250 -185
- package/sdk-core/crates/sdk-core/tests/integ_tests/worker_versioning_tests.rs +52 -49
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_client_tests.rs +180 -0
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/activities.rs +437 -327
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +82 -58
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +56 -30
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +364 -251
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/client_interactions.rs +552 -0
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +110 -46
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +243 -149
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/eager.rs +98 -32
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +1475 -1040
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +73 -43
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/nexus.rs +402 -245
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/patches.rs +343 -207
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/queries.rs +415 -0
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/replay.rs +96 -36
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/resets.rs +155 -140
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/signals.rs +183 -113
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +85 -44
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/timers.rs +142 -48
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +73 -56
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests.rs +365 -242
- package/sdk-core/crates/sdk-core/tests/main.rs +22 -16
- package/sdk-core/crates/sdk-core/tests/manual_tests.rs +233 -187
- package/sdk-core/crates/sdk-core/tests/runner.rs +4 -6
- package/sdk-core/crates/sdk-core/tests/shared_tests/mod.rs +73 -27
- package/sdk-core/crates/sdk-core/tests/shared_tests/priority.rs +107 -84
- package/sdk-core/crates/sdk-core/tests/workflows_procmacro.rs +6 -0
- package/sdk-core/crates/sdk-core/tests/workflows_trybuild/async_query_fail.rs +26 -0
- package/sdk-core/crates/sdk-core/tests/workflows_trybuild/async_query_fail.stderr +5 -0
- package/sdk-core/crates/sdk-core/tests/workflows_trybuild/basic_pass.rs +49 -0
- package/sdk-core/crates/sdk-core/tests/workflows_trybuild/minimal_pass.rs +21 -0
- package/sdk-core/crates/sdk-core/tests/workflows_trybuild/mut_query_fail.rs +26 -0
- package/sdk-core/crates/sdk-core/tests/workflows_trybuild/mut_query_fail.stderr +5 -0
- package/sdk-core/crates/sdk-core/tests/workflows_trybuild/sync_run_fail.rs +21 -0
- package/sdk-core/crates/sdk-core/tests/workflows_trybuild/sync_run_fail.stderr +5 -0
- package/sdk-core/crates/sdk-core-c-bridge/Cargo.toml +8 -1
- package/sdk-core/crates/sdk-core-c-bridge/include/temporal-sdk-core-c-bridge.h +37 -26
- package/sdk-core/crates/sdk-core-c-bridge/src/client.rs +180 -87
- package/sdk-core/crates/sdk-core-c-bridge/src/lib.rs +89 -5
- package/sdk-core/crates/sdk-core-c-bridge/src/metric.rs +10 -16
- package/sdk-core/crates/sdk-core-c-bridge/src/runtime.rs +59 -67
- package/sdk-core/crates/sdk-core-c-bridge/src/testing.rs +10 -10
- package/sdk-core/crates/sdk-core-c-bridge/src/tests/context.rs +57 -22
- package/sdk-core/crates/sdk-core-c-bridge/src/tests/mod.rs +108 -12
- package/sdk-core/crates/sdk-core-c-bridge/src/tests/utils.rs +9 -52
- package/sdk-core/crates/sdk-core-c-bridge/src/worker.rs +74 -91
- package/sdk-core/rustfmt.toml +2 -1
- package/src/client.rs +206 -289
- package/src/helpers/try_into_js.rs +88 -2
- package/src/metrics.rs +277 -35
- package/src/runtime.rs +94 -45
- package/src/testing.rs +9 -16
- package/src/worker.rs +86 -68
- package/ts/native.ts +39 -3
- package/sdk-core/crates/client/src/workflow_handle/mod.rs +0 -212
- package/sdk-core/crates/common/src/errors.rs +0 -85
- package/sdk-core/crates/common/tests/worker_task_types_test.rs +0 -129
- package/sdk-core/crates/macros/LICENSE.txt +0 -21
- package/sdk-core/crates/sdk/src/activity_context.rs +0 -238
- package/sdk-core/crates/sdk/src/app_data.rs +0 -37
- package/sdk-core/crates/sdk-core/tests/integ_tests/activity_functions.rs +0 -5
- 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::
|
|
11
|
-
use temporalio_common::
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
ctx.
|
|
50
|
-
|
|
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.
|
|
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
|
-
|
|
84
|
+
#[workflow]
|
|
85
|
+
pub(crate) struct NoChangeThenChangeWf {
|
|
86
|
+
did_die: Arc<AtomicBool>,
|
|
87
|
+
}
|
|
73
88
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
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
|
-
|
|
126
|
+
#[workflow]
|
|
127
|
+
pub(crate) struct ReplayWithChangeMarkerWf {
|
|
128
|
+
did_die: Arc<AtomicBool>,
|
|
129
|
+
}
|
|
107
130
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
ctx.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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.
|
|
172
|
-
|
|
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
|
|
208
|
-
worker.
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
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
|
-
|
|
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
|
-
|
|
232
|
-
.
|
|
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
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
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
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
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
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
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
|
|
449
|
+
async fn v3(ctx: &mut WorkflowContext<PatchWf>) {
|
|
354
450
|
ctx.deprecate_patch(MY_PATCH_ID);
|
|
355
|
-
ctx
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
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
|
|
363
|
-
ctx
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
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
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
524
|
-
|
|
525
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
}
|