Skip to content

Commit 9c51235

Browse files
vpellanmarcotc
andauthored
Separate set_value_from_env_or_default in two methods and always set default option value (#4627)
Co-authored-by: Marco Costa <[email protected]>
1 parent 57b5fcd commit 9c51235

File tree

5 files changed

+55
-36
lines changed

5 files changed

+55
-36
lines changed

lib/datadog/appsec/configuration/settings.rb

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -259,11 +259,13 @@ def self.add_settings!(base)
259259
APPSEC_VALID_TRACK_USER_EVENTS_ENABLED_VALUES.include?(env_value.strip.downcase)
260260
end
261261
end
262-
o.after_set do
263-
Core.log_deprecation(key: :appsec_track_user_events_enabled) do
264-
'The appsec.track_user_events.enabled setting has been deprecated for removal. ' \
265-
'Please remove it from your Datadog.configure block and use ' \
266-
'appsec.auto_user_instrumentation.mode instead.'
262+
o.after_set do |_, _, precedence|
263+
unless precedence == Datadog::Core::Configuration::Option::Precedence::DEFAULT
264+
Core.log_deprecation(key: :appsec_track_user_events_enabled) do
265+
'The appsec.track_user_events.enabled setting is deprecated. ' \
266+
'Please remove it from your Datadog.configure block and use ' \
267+
'appsec.auto_user_instrumentation.mode instead.'
268+
end
267269
end
268270
end
269271
end
@@ -287,11 +289,13 @@ def self.add_settings!(base)
287289
SAFE_TRACK_USER_EVENTS_MODE
288290
end
289291
end
290-
o.after_set do
291-
Core.log_deprecation(key: :appsec_track_user_events_mode) do
292-
'The appsec.track_user_events.mode setting has been deprecated for removal. ' \
293-
'Please remove it from your Datadog.configure block and use ' \
294-
'appsec.auto_user_instrumentation.mode instead.'
292+
o.after_set do |_, _, precedence|
293+
unless precedence == Datadog::Core::Configuration::Option::Precedence::DEFAULT
294+
Core.log_deprecation(key: :appsec_track_user_events_mode) do
295+
'The appsec.track_user_events.mode setting is deprecated. ' \
296+
'Please remove it from your Datadog.configure block and use ' \
297+
'appsec.auto_user_instrumentation.mode instead.'
298+
end
295299
end
296300
end
297301
end

lib/datadog/core/configuration/option.rb

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -120,11 +120,15 @@ def unset(precedence)
120120
end
121121

122122
def get
123-
if @is_set
124-
@value
125-
else
126-
set_value_from_env_or_default
123+
unless @is_set
124+
# Ensures that both the default value and the environment value are set.
125+
# This approach handles scenarios where an environment value is unset
126+
# by falling back to the default value consistently.
127+
set_default_value
128+
set_env_value
127129
end
130+
131+
@value
128132
end
129133

130134
def reset
@@ -258,7 +262,8 @@ def validate(type, value)
258262
when NilClass
259263
true # No validation is performed when option is typeless
260264
else
261-
raise ArgumentError, "The option #{@definition.name} is using an unsupported type option `#{@definition.type}`"
265+
raise InvalidDefinitionError,
266+
"The option #{@definition.name} is using an unsupported type option `#{@definition.type}`"
262267
end
263268
end
264269

@@ -271,7 +276,7 @@ def internal_set(value, precedence, resolved_env)
271276
@resolved_env = resolved_env
272277
# Store original value to ensure we can always safely call `#internal_set`
273278
# when restoring a value from `@value_per_precedence`, and we are only running `definition.setter`
274-
# on the original value, not on a valud that has already been processed by `definition.setter`.
279+
# on the original value, not on a value that has already been processed by `definition.setter`.
275280
@value_per_precedence[precedence] = value
276281
context_exec(v, old_value, precedence, &definition.after_set) if definition.after_set
277282
end
@@ -285,9 +290,12 @@ def context_eval(&block)
285290
@context.instance_eval(&block)
286291
end
287292

288-
def set_value_from_env_or_default
293+
def set_default_value
294+
set(default_value, precedence: Precedence::DEFAULT)
295+
end
296+
297+
def set_env_value
289298
value = nil
290-
precedence = nil
291299
resolved_env = nil
292300

293301
if definition.env
@@ -296,24 +304,20 @@ def set_value_from_env_or_default
296304

297305
resolved_env = env
298306
value = coerce_env_variable(ENV[env])
299-
precedence = Precedence::ENVIRONMENT
300307
break
301308
end
302309
end
303310

304311
if value.nil? && definition.deprecated_env && ENV[definition.deprecated_env]
305312
resolved_env = definition.deprecated_env
306313
value = coerce_env_variable(ENV[definition.deprecated_env])
307-
precedence = Precedence::ENVIRONMENT
308314

309315
Datadog::Core.log_deprecation do
310316
"#{definition.deprecated_env} environment variable is deprecated, use #{definition.env} instead."
311317
end
312318
end
313319

314-
option_value = value.nil? ? default_value : value
315-
316-
set(option_value, precedence: precedence || Precedence::DEFAULT, resolved_env: resolved_env)
320+
set(value, precedence: Precedence::ENVIRONMENT, resolved_env: resolved_env) unless value.nil?
317321
rescue ArgumentError
318322
raise ArgumentError,
319323
"Expected environment variable #{resolved_env} to be a #{@definition.type}, " \

sig/datadog/core/configuration/option.rbs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ module Datadog
5151

5252
def context_eval: () { () -> untyped } -> untyped
5353

54-
def set_value_from_env_or_default: () -> untyped
54+
def set_default_value: () -> void
55+
56+
def set_env_value: () -> void
5557
end
5658
end
5759
end

spec/datadog/appsec/configuration/settings_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,7 @@ def patcher
486486

487487
it 'writes the deprication message' do
488488
expect(Datadog::Core).to receive(:log_deprecation) do |_, &block|
489-
expect(block.call).to match(/setting has been deprecated for removal/)
489+
expect(block.call).to match(/setting is deprecated/)
490490
end
491491
expect(enabled).to eq(true)
492492
end
@@ -580,7 +580,7 @@ def patcher
580580

581581
it 'writes the deprication message' do
582582
expect(Datadog::Core).to receive(:log_deprecation) do |_, &block|
583-
expect(block.call).to match(/setting has been deprecated for removal/)
583+
expect(block.call).to match(/setting is deprecated/)
584584
end
585585

586586
set_appsec_track_user_events_mode

spec/datadog/core/configuration/option_spec.rb

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,9 @@
3636
# to make sure specs pass when comparing result ex. expect(result).to be value
3737
# we ensure that frozen_or_dup returns the same instance
3838
before do
39-
allow(Datadog::Core::Utils::SafeDup).to receive(:frozen_or_dup) do |args, _block|
40-
args
39+
# |args, _block| is not working with arrays
40+
allow(Datadog::Core::Utils::SafeDup).to receive(:frozen_or_dup) do |*args, &_block|
41+
args.first
4142
end
4243
end
4344

@@ -316,11 +317,11 @@
316317
end
317318

318319
context 'when type is defined' do
319-
context 'type is invalid value' do
320+
context 'type is invalid' do
320321
let(:type) { :nullable_string }
321322
let(:value) { 'Hello' }
322323
it 'raise exception' do
323-
expect { set }.to raise_exception(ArgumentError)
324+
expect { set }.to raise_exception(Datadog::Core::Configuration::Option::InvalidDefinitionError)
324325
end
325326
end
326327

@@ -689,9 +690,11 @@
689690
subject(:get) { option.get }
690691

691692
shared_examples_for 'env coercion' do
693+
# As we now always set default value, we also need to change default to corresponding type
692694
context 'when type is defined' do
693695
context ':hash' do
694696
let(:type) { :hash }
697+
let(:default) { {} }
695698

696699
context 'value with commas' do
697700
let(:env_value) { 'key1:value1,key2:value2' }
@@ -712,6 +715,7 @@
712715

713716
context ':int' do
714717
let(:type) { :int }
718+
let(:default) { 0 }
715719
let(:env_value) { '1234' }
716720

717721
it 'coerce value' do
@@ -742,6 +746,7 @@
742746

743747
context ':float' do
744748
let(:type) { :float }
749+
let(:default) { 0.0 }
745750
let(:env_value) { '12.34' }
746751

747752
it 'coerce value' do
@@ -758,7 +763,7 @@
758763

759764
context ':array' do
760765
let(:type) { :array }
761-
766+
let(:default) { [] }
762767
context 'value with commas' do
763768
let(:env_value) { '12,34' }
764769

@@ -778,7 +783,7 @@
778783

779784
context ':bool' do
780785
let(:type) { :bool }
781-
786+
let(:default) { false }
782787
context 'with value 1' do
783788
let(:env_value) { '1' }
784789

@@ -806,6 +811,7 @@
806811

807812
context 'invalid type' do
808813
let(:type) { :invalid_type }
814+
let(:default) { '0' }
809815
let(:env_value) { '1' }
810816

811817
it 'raise exception' do
@@ -823,10 +829,7 @@
823829
end
824830

825831
it 'passes the env variable value to the env_parser' do
826-
expect(context).to receive(:instance_exec) do |*args, &block|
827-
expect(args.first).to eq(env_value)
828-
expect(block).to eq env_parser
829-
end
832+
expect(context).to receive(:instance_exec).with(env_value, &env_parser)
830833

831834
get
832835
end
@@ -865,6 +868,12 @@
865868
expect(option.send(:precedence_set)).to eq described_class::Precedence::ENVIRONMENT
866869
end
867870

871+
it 'falls back to default when unsetting env' do
872+
option.get
873+
option.unset(described_class::Precedence::ENVIRONMENT)
874+
expect(option.get).to eq default
875+
end
876+
868877
it_behaves_like 'env coercion'
869878
it_behaves_like 'with env_parser'
870879
end

0 commit comments

Comments
 (0)