diff --git a/lib/facter/custom_facts/util/confine.rb b/lib/facter/custom_facts/util/confine.rb index d4bd144efb..f2f0fe454a 100644 --- a/lib/facter/custom_facts/util/confine.rb +++ b/lib/facter/custom_facts/util/confine.rb @@ -35,7 +35,7 @@ def to_s end # Evaluate the fact, returning true or false. - # if we have a block paramter then we only evaluate that instead + # if we have a block parameter then we only evaluate that instead def true? if @block && !@fact begin @@ -54,9 +54,11 @@ def true? return false if value.nil? + # We call the block with both the downcased and raw fact value for + # backwards-compatibility. if @block begin - return !!@block.call(value) + return !!@block.call(value) || !!@block.call(fact.value) # rubocop:disable Style/DoubleNegation rescue StandardError => e log.debug "Confine raised #{e.class} #{e}" return false diff --git a/spec/custom_facts/util/confine_spec.rb b/spec/custom_facts/util/confine_spec.rb index 0b1bdf628e..24021eab88 100755 --- a/spec/custom_facts/util/confine_spec.rb +++ b/spec/custom_facts/util/confine_spec.rb @@ -126,6 +126,20 @@ def confined(fact_value, *confines) expect(confine.true?).to be true end + it 'accepts and evaluate a block argument against the fact while respecting case' do + allow(fact).to receive(:value).and_return 'Foo' + confine = LegacyFacter::Util::Confine.new(:yay) { |f| f == 'Foo' } + expect(confine.true?).to be true + end + + it 'accepts and evaluate multiple block arguments' do + allow(fact).to receive(:value).and_return 'bar' + first_confine = LegacyFacter::Util::Confine.new(:yay) { |f| f == 'foo' } + second_confine = LegacyFacter::Util::Confine.new(:yay) { |f| f == 'bar' } + expect(first_confine.true?).to be false + expect(second_confine.true?).to be true + end + it 'returns false if the block raises a StandardError when checking a fact' do allow(fact).to receive(:value).and_return 'foo' confine = LegacyFacter::Util::Confine.new(:yay) { |_f| raise StandardError }