diff --git a/lib/facter/custom_facts/util/confine.rb b/lib/facter/custom_facts/util/confine.rb index d4bd144efb..4c2feec823 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).nil? || !@block.call(fact.value).nil? 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..3df539cf79 100755 --- a/spec/custom_facts/util/confine_spec.rb +++ b/spec/custom_facts/util/confine_spec.rb @@ -126,6 +126,12 @@ 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 '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 }