Skip to content

Commit 9c633d6

Browse files
committed
Add default setting tests
1 parent 9feb136 commit 9c633d6

File tree

5 files changed

+107
-3
lines changed

5 files changed

+107
-3
lines changed

temporalio/lib/temporalio/internal/worker/workflow_worker.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ module Internal
1313
module Worker
1414
# Worker for handling workflow activations. Most activation work is delegated to the workflow executor.
1515
class WorkflowWorker
16-
def self.workflow_definitions(workflows)
16+
def self.workflow_definitions(workflows, should_enforce_versioning_behavior: false)
1717
workflows.each_with_object({}) do |workflow, hash|
1818
# Load definition
1919
defn = begin
@@ -29,6 +29,12 @@ def self.workflow_definitions(workflows)
2929
# Confirm name not in use
3030
raise ArgumentError, "Multiple workflows named #{defn.name || '<dynamic>'}" if hash.key?(defn.name)
3131

32+
# Enforce versioning behavior is set when versioning is on
33+
if should_enforce_versioning_behavior &&
34+
defn.versioning_behavior == VersioningBehavior::UNSPECIFIED && defn.dynamic_options_method.nil?
35+
raise ArgumentError, "Workflow #{defn.name} must specify a versioning behavior"
36+
end
37+
3238
hash[defn.name] = defn
3339
end
3440
end

temporalio/lib/temporalio/worker.rb

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,8 +429,15 @@ def initialize(
429429
debug_mode:
430430
).freeze
431431

432+
should_enforce_versioning_behavior =
433+
!deployment_options.nil? &&
434+
deployment_options.use_worker_versioning &&
435+
deployment_options.default_versioning_behavior == VersioningBehavior::UNSPECIFIED
432436
# Preload workflow definitions and some workflow settings for the bridge
433-
workflow_definitions = Internal::Worker::WorkflowWorker.workflow_definitions(workflows)
437+
workflow_definitions = Internal::Worker::WorkflowWorker.workflow_definitions(
438+
workflows,
439+
should_enforce_versioning_behavior:
440+
)
434441
nondeterminism_as_workflow_fail, nondeterminism_as_workflow_fail_for_types =
435442
Internal::Worker::WorkflowWorker.bridge_workflow_failure_exception_type_options(
436443
workflow_failure_exception_types:, workflow_definitions:

temporalio/lib/temporalio/workflow/definition.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ def self._build_workflow_definition
431431
signals:,
432432
queries:,
433433
updates:,
434-
versioning_behavior: @versioning_behavior,
434+
versioning_behavior: @versioning_behavior || VersioningBehavior::UNSPECIFIED,
435435
dynamic_options_method: @dynamic_options_method
436436
)
437437
end

temporalio/test/worker_workflow_test.rb

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2634,6 +2634,87 @@ def _test_worker_deployment_dynamic_workflow(workflow_class, expected_versioning
26342634
end
26352635
end
26362636

2637+
class NoVersioningAnnotationWorkflow < Temporalio::Workflow::Definition
2638+
def execute
2639+
'whee'
2640+
end
2641+
end
2642+
2643+
class NoVersioningAnnotationDynamicWorkflow < Temporalio::Workflow::Definition
2644+
workflow_dynamic
2645+
2646+
def execute(*_raw_args)
2647+
'whee'
2648+
end
2649+
end
2650+
2651+
def test_workflows_must_have_versioning_behavior_when_feature_turned_on
2652+
error = assert_raises(ArgumentError) do
2653+
Temporalio::Worker.new(
2654+
client: env.client,
2655+
task_queue: 'whatever',
2656+
workflows: [NoVersioningAnnotationWorkflow],
2657+
deployment_options: Temporalio::Worker::DeploymentOptions.new(
2658+
version: Temporalio::WorkerDeploymentVersion.new('whatever', '1.0'),
2659+
use_worker_versioning: true
2660+
)
2661+
)
2662+
end
2663+
assert_includes error.message, 'must specify a versioning behavior'
2664+
2665+
print "?huh"
2666+
error = assert_raises(ArgumentError) do
2667+
Temporalio::Worker.new(
2668+
client: env.client,
2669+
task_queue: 'whatever',
2670+
workflows: [NoVersioningAnnotationDynamicWorkflow],
2671+
deployment_options: Temporalio::Worker::DeploymentOptions.new(
2672+
version: Temporalio::WorkerDeploymentVersion.new('whatever', '1.0'),
2673+
use_worker_versioning: true
2674+
)
2675+
)
2676+
end
2677+
assert_includes error.message, 'must specify a versioning behavior'
2678+
end
2679+
2680+
def test_workflows_can_use_default_versioning_behavior
2681+
deployment_name = "deployment-default-versioning-#{SecureRandom.uuid}"
2682+
worker_v1 = Temporalio::WorkerDeploymentVersion.new(deployment_name, '1.0')
2683+
2684+
worker = Temporalio::Worker.new(
2685+
client: env.client,
2686+
task_queue: "tq-#{SecureRandom.uuid}",
2687+
workflows: [NoVersioningAnnotationWorkflow],
2688+
deployment_options: Temporalio::Worker::DeploymentOptions.new(
2689+
version: worker_v1,
2690+
use_worker_versioning: true,
2691+
default_versioning_behavior: Temporalio::VersioningBehavior::PINNED
2692+
)
2693+
)
2694+
2695+
worker.run do
2696+
describe_resp = wait_until_worker_deployment_visible(env.client, worker_v1)
2697+
set_current_deployment_version(env.client, describe_resp.conflict_token, worker_v1)
2698+
2699+
handle = env.client.start_workflow(
2700+
NoVersioningAnnotationWorkflow,
2701+
id: "default-versioning-behavior-#{SecureRandom.uuid}",
2702+
task_queue: worker.task_queue
2703+
)
2704+
handle.result
2705+
2706+
events = handle.fetch_history.events
2707+
has_expected_behavior = events.any? do |event|
2708+
event.workflow_task_completed_event_attributes &&
2709+
event.workflow_task_completed_event_attributes.versioning_behavior ==
2710+
Temporalio::Api::Enums::V1::VersioningBehavior.lookup(
2711+
Temporalio::Api::Enums::V1::VersioningBehavior::VERSIONING_BEHAVIOR_PINNED.to_i
2712+
)
2713+
end
2714+
assert has_expected_behavior, 'Expected versioning behavior PINNED not found in history'
2715+
end
2716+
end
2717+
26372718
def wait_until_worker_deployment_visible(client, version)
26382719
assert_eventually do
26392720
res = client.workflow_service.describe_worker_deployment(

temporalio/test/workflow/definition_test.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ def my_base_signal3; end
6363

6464
class ValidWorkflowAdvanced1 < ValidWorkflowAdvancedBase
6565
workflow_name 'custom-workflow-name'
66+
workflow_versioning_behavior Temporalio::VersioningBehavior::PINNED
6667
workflow_raw_args
6768

6869
workflow_init
@@ -99,6 +100,13 @@ def my_new_signal; end
99100

100101
workflow_update name: 'custom-update-name'
101102
def another_update; end
103+
104+
workflow_dynamic_options
105+
def myopts
106+
Temporalio::Workflow::DefinitionOptions.new(
107+
versioning_behavior: Temporalio::VersioningBehavior::AUTO_UPGRADE
108+
)
109+
end
102110
end
103111

104112
def test_valid_advanced
@@ -122,6 +130,7 @@ def test_valid_advanced
122130
defn.updates['custom-update-name'].unfinished_policy
123131
assert_equal :another_update_validator, defn.updates['custom-update-name'].validator_to_invoke
124132
assert_equal 'custom-update-name', ValidWorkflowAdvanced1.another_update.name
133+
assert_equal Temporalio::VersioningBehavior::PINNED, defn.versioning_behavior
125134

126135
defn = Temporalio::Workflow::Definition::Info.from_class(ValidWorkflowAdvanced2)
127136

@@ -136,6 +145,7 @@ def test_valid_advanced
136145
assert_equal :my_renamed_signal, defn.signals['custom-signal-name-2'].to_invoke
137146
assert_equal :my_base_signal3, defn.signals['my_base_signal3'].to_invoke
138147
assert_equal :my_new_signal, defn.signals['my_new_signal'].to_invoke
148+
assert defn.dynamic_options_method
139149
end
140150

141151
def assert_invalid_workflow_code(message_contains, code_to_eval)

0 commit comments

Comments
 (0)