Jira (FACT-2847) Facter 4 breaks rspec on fact test

3 views
Skip to first unread message

Martin Alfke (Jira)

unread,
Oct 27, 2020, 1:44:03 PM10/27/20
to puppe...@googlegroups.com
Martin Alfke updated an issue
 
Facter / Bug FACT-2847
Facter 4 breaks rspec on fact test
Change By: Martin Alfke
Acceptance Criteria: rspec tests should not fail when using facter 4.
Summary: Facter 4 breakt breaks rspec on fact test
When developing a fact and add rspec tests, Facter 4 breaks the test.

Example code
(we assume that you have switched to mock_with : rspec in .sync.yml)

1. Fact
{code:java}

cat lib/facter/puppet_agent_fact.rb
Facter.add('puppet_agent_fact') do

  confine :os do |os|
   os['release']['major'] == '7'
  end

  confine :os do |os|
   os['name'] == 'CentOS'
  end
  setcode do
    result = Facter::Core::Execution.execute('rpm -q --queryformat \'[%{NAME} %{VERSION}-%{RELEASE}\n]\' puppet-agent')
    name = result.split[0]
    name
  end
end
{code}
2. spec Test
{code:java}

cat spec/unit/facter/puppet_agent_fact_spec.rb
require 'spec_helper'
require 'facter/puppet_agent_fact'

describe 'Puppet Agent Fact' do
  describe 'puppet_agent_fact', type: :fact do
    before(:each) { Facter.clear }
    after(:each) {
      Facter.clear
      allow(Facter.fact(:os)).to receive(:value).and_return(
        {
          'name' => "CentOS",
          'release' => {
            'major' => "7",
          }
        }
      )
    }
    subject { Facter.fact(:puppet_agent_fact).value }
    context 'when running' do
      it 'returns puppet-agent' do
        allow(Facter::Core::Execution).to receive(:execute).with('rpm -q --queryformat \'[%{NAME} %{VERSION}-%{RELEASE}\n]\' puppet-agent').and_return('puppet-agent 5.5.21-1.el7')
        expect(Facter.fact(:puppet_agent_fact).value).to eq('puppet-agent')
      end
    end
  end
end
{code}
3. pdk output (using PDK with Puppet 5):
{code:java}

pdk test unit --tests spec/unit/facter/puppet_agent_fact_spec.rb --puppet-version 5
pdk (INFO): Using Ruby 2.4.10
pdk (INFO): Using Puppet 5.5.21
[✔] Preparing to run the unit tests.
/opt/puppetlabs/pdk/private/ruby/2.4.10/bin/ruby -I/opt/puppetlabs/pdk/share/cache/ruby/2.4.0/gems/rspec-core-3.9.2/lib:/opt/puppetlabs/pdk/share/cache/ruby/2.4.0/gems/rspec-support-3.9.3/lib /opt/puppetlabs/pdk/share/cache/ruby/2.4.0/gems/rspec-core-3.9.2/exe/rspec spec/unit/facter/puppet_agent_fact_spec.rb --format progress
Run options: exclude {:bolt=>true}
.Finished in 0.21512 seconds (files took 1.56 seconds to load)
1 example, 0 failures

{code}
4. pdk output (using PDK with Puppet 6):
{code:java}

pdk test unit --tests spec/unit/facter/puppet_agent_fact_spec.rb
pdk (INFO): Using Ruby 2.5.8
pdk (INFO): Using Puppet 6.19.0
[✔] Preparing to run the unit tests.
/opt/puppetlabs/pdk/private/ruby/2.5.8/bin/ruby -I/home/student9/.pdk/cache/ruby/2.5.0/gems/rspec-core-3.9.3/lib:/home/student9/.pdk/cache/ruby/2.5.0/gems/rspec-support-3.9.4/lib /home/student9/.pdk/cache/ruby/2.5.0/gems/rspec-core-3.9.3/exe/rspec spec/unit/facter/puppet_agent_fact_spec.rb --format progress
Run options: exclude {:bolt=>true}
FFailures:  1) Puppet Agent Fact puppet_agent_fact when running returns puppet-agent
     Got 2 failures:     1.1) Failure/Error: expect(Facter.fact(:puppet_agent_fact).value).to eq('puppet-agent')            Facter::Core::Execution received :execute with unexpected arguments
              expected: ("rpm -q --queryformat '[%{NAME} %{VERSION}-%{RELEASE}\\n]' puppet-agent")
                   got: ("which lsb_release", {:logger=>#<Facter::Log:0x0000000003747a18 @class_name="Facter::Resolvers::LsbRelease">})
            Diff:
            @@ -1,3 +1,5 @@
            -["rpm -q --queryformat '[%{NAME} %{VERSION}-%{RELEASE}\\n]' puppet-agent"]
            +["which lsb_release",
            + {:logger=>
            +   #<Facter::Log:0x0000000003747a18 @class_name="Facter::Resolvers::LsbRelease">}]             Please stub a default value first if message might be received with other args as well.
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/resolvers/lsb_release_resolver.rb:28:in `lsb_release_installed?'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/resolvers/lsb_release_resolver.rb:22:in `retrieve_facts'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/resolvers/lsb_release_resolver.rb:18:in `block in post_resolve'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/resolvers/lsb_release_resolver.rb:18:in `fetch'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/resolvers/lsb_release_resolver.rb:18:in `post_resolve'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/resolvers/base_resolver.rb:20:in `resolve'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/facts/rhel/os/distro/codename.rb:12:in `call_the_resolver'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/framework/core/fact/internal/core_fact.rb:14:in `create'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/framework/core/fact/internal/internal_fact_manager.rb:40:in `block (2 levels) in resolve'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/framework/benchmarking/timer.rb:18:in `measure'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/framework/core/fact/internal/internal_fact_manager.rb:40:in `block in resolve'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/framework/core/fact/internal/internal_fact_manager.rb:36:in `each'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/framework/core/fact/internal/internal_fact_manager.rb:36:in `resolve'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/framework/core/fact/internal/internal_fact_manager.rb:10:in `resolve_facts'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/framework/core/fact_manager.rb:25:in `resolve_facts'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter.rb:468:in `resolve_fact'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter.rb:211:in `fact'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter.rb:55:in `[]'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/custom_facts/util/confine.rb:49:in `true?'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/custom_facts/core/suitable.rb:106:in `each'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/custom_facts/core/suitable.rb:106:in `all?'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/custom_facts/core/suitable.rb:106:in `suitable?'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/custom_facts/util/fact.rb:172:in `each'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/custom_facts/util/fact.rb:172:in `find_all'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/custom_facts/util/fact.rb:172:in `find_suitable_resolutions'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/custom_facts/util/fact.rb:120:in `block in value'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/custom_facts/util/fact.rb:165:in `searching'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/custom_facts/util/fact.rb:119:in `value'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/framework/core/fact/external/external_fact_manager.rb:21:in `block in external_facts'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/framework/core/fact/external/external_fact_manager.rb:19:in `each'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/framework/core/fact/external/external_fact_manager.rb:19:in `external_facts'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/framework/core/fact/external/external_fact_manager.rb:7:in `resolve_facts'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/framework/core/fact_manager.rb:26:in `resolve_facts'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter.rb:468:in `resolve_fact'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter.rb:211:in `fact'
          # ./spec/unit/facter/puppet_agent_fact_spec.rb:23:in `block (4 levels) in <top (required)>'     1.2) Failure/Error:
            allow(Facter.fact(:os)).to receive(:value).and_return(
              {
                'name' => "CentOS",
                'release' => {
                  'major' => "7",
                }
              }
            )            Facter::Core::Execution received :execute with unexpected arguments
              expected: ("rpm -q --queryformat '[%{NAME} %{VERSION}-%{RELEASE}\\n]' puppet-agent")
                   got: ("which lsb_release", {:logger=>#<Facter::Log:0x0000000003747a18 @class_name="Facter::Resolvers::LsbRelease">})
            Diff:
            @@ -1,3 +1,5 @@
            -["rpm -q --queryformat '[%{NAME} %{VERSION}-%{RELEASE}\\n]' puppet-agent"]
            +["which lsb_release",
            + {:logger=>
            +   #<Facter::Log:0x0000000003747a18 @class_name="Facter::Resolvers::LsbRelease">}]             Please stub a default value first if message might be received with other args as well.
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/resolvers/lsb_release_resolver.rb:28:in `lsb_release_installed?'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/resolvers/lsb_release_resolver.rb:22:in `retrieve_facts'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/resolvers/lsb_release_resolver.rb:18:in `block in post_resolve'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/resolvers/lsb_release_resolver.rb:18:in `fetch'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/resolvers/lsb_release_resolver.rb:18:in `post_resolve'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/resolvers/base_resolver.rb:20:in `resolve'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/facts/rhel/os/distro/codename.rb:12:in `call_the_resolver'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/framework/core/fact/internal/core_fact.rb:14:in `create'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/framework/core/fact/internal/internal_fact_manager.rb:40:in `block (2 levels) in resolve'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/framework/benchmarking/timer.rb:18:in `measure'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/framework/core/fact/internal/internal_fact_manager.rb:40:in `block in resolve'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/framework/core/fact/internal/internal_fact_manager.rb:36:in `each'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/framework/core/fact/internal/internal_fact_manager.rb:36:in `resolve'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/framework/core/fact/internal/internal_fact_manager.rb:10:in `resolve_facts'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter/framework/core/fact_manager.rb:25:in `resolve_facts'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter.rb:468:in `resolve_fact'
          # /home/student9/.pdk/cache/ruby/2.5.0/gems/facter-4.0.44/lib/facter.rb:211:in `fact'
          # ./spec/unit/facter/puppet_agent_fact_spec.rb:9:in `block (3 levels) in <top (required)>'Finished in 0.13592 seconds (files took 2.62 seconds to load)
1 example, 1 failureFailed examples:rspec ./spec/unit/facter/puppet_agent_fact_spec.rb:21 # Puppet Agent Fact puppet_agent_fact when running returns puppet-agent/opt/puppetlabs/pdk/private/ruby/2.5.8/bin/ruby -I/home/student9/.pdk/cache/ruby/2.5.0/gems/rspec-core-3.9.3/lib:/home/student9/.pdk/cache/ruby/2.5.0/gems/rspec-support-3.9.4/lib /home/student9/.pdk/cache/ruby/2.5.0/gems/rspec-core-3.9.3/exe/rspec spec/unit/facter/puppet_agent_fact_spec.rb --format progress failed
{code}
Add Comment Add Comment
 
This message was sent by Atlassian Jira (v8.5.2#805002-sha1:a66f935)
Atlassian logo

Josh Cooper (Jira)

unread,
Oct 27, 2020, 2:01:02 PM10/27/20
to puppe...@googlegroups.com
Josh Cooper updated an issue
Change By: Josh Cooper
Team: Night's Watch

Sebastian Miclea (Jira)

unread,
Oct 28, 2020, 5:51:03 AM10/28/20
to puppe...@googlegroups.com
Sebastian Miclea assigned an issue to Sebastian Miclea
Change By: Sebastian Miclea
Assignee: Sebastian Miclea

Oana Tanasoiu (Jira)

unread,
Oct 28, 2020, 10:45:03 AM10/28/20
to puppe...@googlegroups.com
Oana Tanasoiu updated an issue
Change By: Oana Tanasoiu
Sub-team: ghost

Oana Tanasoiu (Jira)

unread,
Oct 28, 2020, 10:46:03 AM10/28/20
to puppe...@googlegroups.com
Oana Tanasoiu updated an issue
Change By: Oana Tanasoiu
Sprint: ghost-4.11

Oana Tanasoiu (Jira)

unread,
Oct 28, 2020, 11:05:03 AM10/28/20
to puppe...@googlegroups.com
Oana Tanasoiu updated an issue
Change By: Oana Tanasoiu
Story Points: 2

Sebastian Miclea (Jira)

unread,
Oct 29, 2020, 9:10:03 AM10/29/20
to puppe...@googlegroups.com
Sebastian Miclea commented on Bug FACT-2847
 
Re: Facter 4 breaks rspec on fact test

Hi Martin Alfke

I had a look over your fact and noticed that the stub for Facter.fact('os') is defined in the after block and it's not getting stubbed before running the test. Moving it to the before block should fix it.

The error occurs because Facter4 uses Facter::Core::Execution to detect the os in order to be able to confine the custom fact. 
It passed on previous versions of Facter because 2.x used RbConfig to detect the current os and Facter3 used CMake.

Let me know if this works out.

Martin Alfke (Jira)

unread,
Oct 29, 2020, 9:25:04 AM10/29/20
to puppe...@googlegroups.com
Martin Alfke commented on Bug FACT-2847

Hi Sebastian Miclea ,

moving the stub to the before(:each) does not solve the issue.

 

cat spec/unit/facter/puppet_agent_fact_spec.rb
require 'spec_helper'
require 'facter/puppet_agent_fact'describe 'Puppet Agent Fact' do
  describe 'puppet_agent_fact', type: :fact do
    before(:each) {
      Facter.clear
      allow(Facter.fact(:os)).to receive(:value).and_return(
        {
          'name' => "CentOS",
          'release' => {
            'major' => "7",
          }
        }
      )
    }
    after(:each) { Facter.clear }
    subject { Facter.fact(:puppet_agent_fact).value }    context 'when running' do
      it 'returns puppet-agent' do
        allow(Facter::Core::Execution).to receive(:execute).with('rpm -q --queryformat \'[%{NAME} %{VERSION}-%{RELEASE}\n]\' puppet-agent').and_return('puppet-agent 5.5.21-1.el7')
        expect(Facter.fact(:puppet_agent_fact).value).to eq('puppet-agent')
      end
    end
  end
end
pdk test unit --tests spec/unit/facter/puppet_agent_fact_spec.rb
pdk (INFO): Using Ruby 2.5.8
pdk (INFO): Using Puppet 6.18.0
[✔] Preparing to run the unit tests.
/opt/puppetlabs/pdk/private/ruby/2.5.8/bin/ruby -I/Users/mea/.pdk/cache/ruby/2.5.0/gems/rspec-core-3.9.3/lib:/opt/puppetlabs/pdk/share/cache/ruby/2.5.0/gems/rspec-support-3.9.3/lib /Users/mea/.pdk/cache/ruby/2.5.0/gems/rspec-core-3.9.3/exe/rspec spec/unit/facter/puppet_agent_fact_spec.rb --format progress
Run options: exclude {:bolt=>true}
FFailures:  1) Puppet Agent Fact puppet_agent_fact when running returns puppet-agent
     Failure/Error: expect(Facter.fact(:puppet_agent_fact).value).to eq('puppet-agent')       Facter::Core::Execution received :execute with unexpected arguments
         expected: ("rpm -q --queryformat '[%{NAME} %{VERSION}-%{RELEASE}\\n]' puppet-agent")
              got: ("uname -m &&\n            uname -n &&\n            uname -p &&\n            uname -r &&\n            uname -s &&\n            uname -v", {:logger=>#<Facter::Log:0x00007fa2e76c49b8 @class_name="Facter::Resolvers::Uname">})
       Diff:
       @@ -1,3 +1,5 @@
       -["rpm -q --queryformat '[%{NAME} %{VERSION}-%{RELEASE}\\n]' puppet-agent"]
       +["uname -m &&\n            uname -n &&\n            uname -p &&\n            uname -r &&\n            uname -s &&\n            uname -v",
       + {:logger=>
       +   #<Facter::Log:0x00007fa2e76c49b8 @class_name="Facter::Resolvers::Uname">}]        Please stub a default value first if message might be received with other args as well.
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/resolvers/uname_resolver.rb:16:in `uname_system_call'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/resolvers/uname_resolver.rb:12:in `block in post_resolve'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/resolvers/uname_resolver.rb:12:in `fetch'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/resolvers/uname_resolver.rb:12:in `post_resolve'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/resolvers/base_resolver.rb:20:in `resolve'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/facts/macosx/os/release.rb:11:in `call_the_resolver'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/framework/core/fact/internal/core_fact.rb:14:in `create'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/framework/core/fact/internal/internal_fact_manager.rb:40:in `block (2 levels) in resolve'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/framework/benchmarking/timer.rb:16:in `measure'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/framework/core/fact/internal/internal_fact_manager.rb:40:in `block in resolve'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/framework/core/fact/internal/internal_fact_manager.rb:36:in `each'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/framework/core/fact/internal/internal_fact_manager.rb:36:in `resolve'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/framework/core/fact/internal/internal_fact_manager.rb:10:in `resolve_facts'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/framework/core/fact_manager.rb:25:in `resolve_facts'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter.rb:428:in `resolve_fact'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter.rb:194:in `fact'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter.rb:53:in `[]'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/custom_facts/util/confine.rb:49:in `true?'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/custom_facts/core/suitable.rb:106:in `each'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/custom_facts/core/suitable.rb:106:in `all?'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/custom_facts/core/suitable.rb:106:in `suitable?'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/custom_facts/util/fact.rb:172:in `each'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/custom_facts/util/fact.rb:172:in `find_all'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/custom_facts/util/fact.rb:172:in `find_suitable_resolutions'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/custom_facts/util/fact.rb:120:in `block in value'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/custom_facts/util/fact.rb:165:in `searching'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/custom_facts/util/fact.rb:119:in `value'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/framework/core/fact/external/external_fact_manager.rb:21:in `block in external_facts'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/framework/core/fact/external/external_fact_manager.rb:19:in `each'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/framework/core/fact/external/external_fact_manager.rb:19:in `external_facts'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/framework/core/fact/external/external_fact_manager.rb:7:in `resolve_facts'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter/framework/core/fact_manager.rb:26:in `resolve_facts'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter.rb:428:in `resolve_fact'
     # /Users/mea/.pdk/cache/ruby/2.5.0/gems/facter-4.0.42/lib/facter.rb:194:in `fact'
     # ./spec/unit/facter/puppet_agent_fact_spec.rb:23:in `block (4 levels) in <top (required)>'Finished in 0.44851 seconds (files took 3.07 seconds to load)
1 example, 1 failureFailed examples:rspec ./spec/unit/facter/puppet_agent_fact_spec.rb:21 # Puppet Agent Fact puppet_agent_fact when running returns puppet-agent/opt/puppetlabs/pdk/private/ruby/2.5.8/bin/ruby -I/Users/mea/.pdk/cache/ruby/2.5.0/gems/rspec-core-3.9.3/lib:/opt/puppetlabs/pdk/share/cache/ruby/2.5.0/gems/rspec-support-3.9.3/lib /Users/mea/.pdk/cache/ruby/2.5.0/gems/rspec-core-3.9.3/exe/rspec spec/unit/facter/puppet_agent_fact_spec.rb --format progress failed

Sebastian Miclea (Jira)

unread,
Oct 30, 2020, 6:47:03 AM10/30/20
to puppe...@googlegroups.com

Hi Martin Alfke,

It looks to me that there is something else in your test framework that makes makes some extra calls to Facter::Core::Execution.
I could not manage to reproduce the second error on my machine, but managed to have the test passing with a generic stub to Facter::Core::Execution.
Try adding allow(Facter::Core::Execution).to receive(:execute) to your before block. If you have multiple tests failing, I would suggest adding it to spec_helper so it won't create any syscalls while running tests.

Let me know if this works out for you.

Martin Alfke (Jira)

unread,
Oct 30, 2020, 10:11:03 AM10/30/20
to puppe...@googlegroups.com
Martin Alfke commented on Bug FACT-2847

The whole code base is in a public github repo: https://github.com/tuxmea/workshop-demo-module/tree/ruby_workshop

There are several facts which use Facter::Core::Execution.execute.

Sebastian Miclea (Jira)

unread,
Nov 2, 2020, 9:59:03 AM11/2/20
to puppe...@googlegroups.com

Hi Martin Alfke,

We had an other more in depth look at this case and understood what happens.
My first suggestion for the fix (moving the Facter.fact(:os) the before block) is still correct and will be required in order to have this test working.
We found out that the second failure you had, with uname being called, was caused by a bug in how values were reset.
The good news is that that was already fixed in 4.0.43.
Running the tests using the latest Facter should have this test passing.

Let us know if you encounter any other issues.

Martin Alfke (Jira)

unread,
Nov 2, 2020, 2:16:03 PM11/2/20
to puppe...@googlegroups.com
Martin Alfke commented on Bug FACT-2847

Hi Sebastian Miclea ,

moving fact stubbing in the before block totally makes sense.

I can confirm working tests when using the following entries in .sync.yml file:

 

---
spec/spec_helper.rb:
  mock_with: ':rspec'
Gemfile:
  optional:
    ':development':
      - gem: facter
        version: '> 4.0.43'

Don't forget to run pdk update!

 

Test shows the following result:

 

pdk test unit --tests spec/unit/facter/puppet_agent_fact_spec.rb
pdk (INFO): Using Ruby 2.5.8
pdk (INFO): Using Puppet 6.19.0
[✔] Preparing to run the unit tests.
/opt/puppetlabs/pdk/private/ruby/2.5.8/bin/ruby -I/Users/mea/.pdk/cache/ruby/2.5.0/gems/rspec-core-3.9.3/lib:/Users/mea/.pdk/cache/ruby/2.5.0/gems/rspec-support-3.9.4/lib /Users/mea/.pdk/cache/ruby/2.5.0/gems/rspec-core-3.9.3/exe/rspec spec/unit/facter/puppet_agent_fact_spec.rb --format progress
Run options: exclude {:bolt=>true}
.Finished in 0.31465 seconds (files took 5.34 seconds to load)
1 example, 0 failures

 

 

Sebastian Miclea (Jira)

unread,
Nov 3, 2020, 10:04:03 AM11/3/20
to puppe...@googlegroups.com

Martin Alfke, yes unfortunately Facter 4 cannot run with Puppet5.
Puppet5 has the Facter dependency locked to > 2.0.1, < 4

Martin Alfke (Jira)

unread,
Nov 4, 2020, 5:06:03 AM11/4/20
to puppe...@googlegroups.com
Martin Alfke commented on Bug FACT-2847

Solution for .sync.yml:

---
spec/spec_helper.rb:
  mock_with: ':rspec'
Gemfile:
  optional:
    ':development':
      - gem: facter
        version: '> 4.0.43'
        platforms: mri_25

This uses facter 4 on puppet 6 only.

Bogdan Irimie (Jira)

unread,
Nov 4, 2020, 9:11:04 AM11/4/20
to puppe...@googlegroups.com
Bogdan Irimie updated an issue
 
Change By: Bogdan Irimie
Sprint: ghost-4.11 , PR - Triage 2

Sebastian Miclea (Jira)

unread,
Nov 6, 2020, 2:46:03 AM11/6/20
to puppe...@googlegroups.com
Sebastian Miclea commented on Bug FACT-2847
 
Re: Facter 4 breaks rspec on fact test

If should also work fine for Puppet5 if you remove the constraint from .sync.yml. Puppet 6 should use the newest Facter gem and, Puppet 5 should download according to the constraint (>2.0.1, <4)

Bogdan Irimie (Jira)

unread,
Nov 18, 2020, 8:50:02 AM11/18/20
to puppe...@googlegroups.com
Bogdan Irimie updated an issue
Change By: Bogdan Irimie
Sprint: ghost-4.11, ghost-11.11 , ready for triage 2

Bogdan Irimie (Jira)

unread,
Nov 25, 2020, 9:04:03 AM11/25/20
to puppe...@googlegroups.com
Bogdan Irimie updated an issue
Change By: Bogdan Irimie
Sprint: ghost-4.11, ghost-11.11, ghost 25.11 , ready for triage 2

Bogdan Irimie (Jira)

unread,
Dec 2, 2020, 2:40:04 AM12/2/20
to puppe...@googlegroups.com
Bogdan Irimie updated an issue
Change By: Bogdan Irimie
Sprint: ghost-4.11, ghost-11.11, ghost 25.11, ghost-2.12 , ready for triage 2
Reply all
Reply to author
Forward
0 new messages