From 6e633a100d31f123b247073de9836272ff077d12 Mon Sep 17 00:00:00 2001 From: Oana Tanasoiu Date: Thu, 23 Apr 2020 11:36:43 +0300 Subject: [PATCH] (FACT-2517) Open3 wrapper for executing system calls --- .rubocop_todo.yml | 18 +--- lib/custom_facts/core/execution/base.rb | 24 +++-- lib/facts_utils/uptime_parser.rb | 9 +- lib/resolvers/aix/mountpoints.rb | 4 +- lib/resolvers/aix/networking_resolver.rb | 2 +- lib/resolvers/aix/os_level_resolver.rb | 2 +- lib/resolvers/aix/partitions.rb | 9 +- lib/resolvers/aix/utils/odm_query.rb | 3 +- lib/resolvers/augeas_resolver.rb | 2 +- lib/resolvers/eos_release_resolver.rb | 4 +- .../freebsd/freebsd_version_resolver.rb | 6 +- lib/resolvers/hostname_resolver.rb | 3 +- lib/resolvers/lpar_resolver.rb | 3 +- lib/resolvers/lsb_release_resolver.rb | 7 +- lib/resolvers/macosx/dmi_resolver.rb | 3 +- lib/resolvers/macosx/filesystems_resolver.rb | 3 +- lib/resolvers/macosx/ipaddress_resolver.rb | 7 +- .../macosx/load_averages_resolver.rb | 3 +- lib/resolvers/macosx/mountpoints_resolver.rb | 1 - lib/resolvers/macosx/processor_resolver.rb | 3 +- lib/resolvers/macosx/swap_memory_resolver.rb | 3 +- .../macosx/system_memory_resolver.rb | 5 +- .../macosx/system_profiler_resolver.rb | 4 +- lib/resolvers/networking_linux_resolver.rb | 6 +- lib/resolvers/os_level_resolver.rb | 5 +- lib/resolvers/partitions.rb | 7 +- lib/resolvers/redhat_release_resolver.rb | 1 + lib/resolvers/selinux_resolver.rb | 2 +- lib/resolvers/solaris/filesystems_resolver.rb | 2 +- lib/resolvers/solaris/ipaddress_resolver.rb | 5 +- lib/resolvers/solaris/processors.rb | 8 +- .../solaris/solaris_os_release_resolver.rb | 14 +-- lib/resolvers/solaris/solaris_zone_name.rb | 10 +- lib/resolvers/solaris/zfs_resolver.rb | 3 +- lib/resolvers/solaris/zone_resolver.rb | 12 +-- lib/resolvers/solaris/zpool_resolver.rb | 3 +- lib/resolvers/sw_vers_resolver.rb | 2 +- lib/resolvers/uname_resolver.rb | 4 +- lib/resolvers/wpar_resolver.rb | 6 +- .../core/execution/fact_manager_spec.rb | 3 +- spec/facter/facts_utils/uptime_parser_spec.rb | 47 +++++----- spec/facter/resolvers/aix/mountpoints_spec.rb | 8 +- .../resolvers/aix/networking_resolver_spec.rb | 7 +- spec/facter/resolvers/aix/partitions_spec.rb | 12 +-- spec/facter/resolvers/augeas_resolver_spec.rb | 13 ++- .../resolvers/eos_release_resolver_spec.rb | 14 ++- .../freebsd/freebsd_version_resolver_spec.rb | 24 ++--- .../resolvers/hostname_resolver_spec.rb | 25 +++-- spec/facter/resolvers/lpar_resolver_spec.rb | 10 +- .../resolvers/macosx/dmi_resolver_spec.rb | 23 +++-- .../macosx/filesystems_resolver_spec.rb | 10 +- .../macosx/ipaddress_resolver_spec.rb | 22 +++-- .../macosx/load_averages_resolver_spec.rb | 14 +-- .../macosx/processors_resolver_spec.rb | 37 ++++---- .../macosx/swap_memory_resolver_spec.rb | 25 +++-- .../macosx/system_memory_resolver_spec.rb | 28 +++--- .../networking_linux_resolver_spec.rb | 43 +++++---- .../resolvers/os_level_resolver_spec.rb | 13 ++- .../resolvers/redhat_release_resolver_spec.rb | 16 ++-- .../facter/resolvers/selinux_resolver_spec.rb | 84 +++++++---------- .../solaris/current_zone_resolver_spec.rb | 28 ------ .../solaris/filesystem_resolver_spec.rb | 12 ++- .../solaris/ipaddress_resolver_spec.rb | 23 +++-- .../resolvers/solaris/processors_spec.rb | 23 ++--- .../solaris/solaris_release_resolver_spec.rb | 50 +++------- .../solaris/solaris_zone_name_spec.rb | 29 ++++++ .../resolvers/solaris/zfs_resolver_spec.rb | 31 +++---- .../resolvers/solaris/zone_resolver_spec.rb | 48 ++++++---- .../resolvers/solaris/zpool_resolver_spec.rb | 29 +++--- .../resolvers/suse_relese_resolver_spec.rb | 16 ++-- .../facter/resolvers/sw_vers_resolver_spec.rb | 21 ++--- .../resolvers/system_profile_resolver_spec.rb | 93 ++++++------------- spec/facter/resolvers/uname_resolver_spec.rb | 33 +++---- .../resolvers/utils/aix/odm_query_spec.rb | 8 +- spec/facter/resolvers/wpar_resolver_spec.rb | 12 ++- 75 files changed, 539 insertions(+), 613 deletions(-) delete mode 100644 spec/facter/resolvers/solaris/current_zone_resolver_spec.rb create mode 100644 spec/facter/resolvers/solaris/solaris_zone_name_spec.rb diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index af1940bb2..3d337cbbc 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -1,6 +1,6 @@ # This configuration was generated by # `rubocop --auto-gen-config --exclude-limit 1000` -# on 2020-04-24 12:45:39 +0300 using RuboCop version 0.74.0. +# on 2020-05-06 13:07:31 +0300 using RuboCop version 0.74.0. # The point is for the user to remove these configuration records # one by one as the offenses are removed from the code base. # Note that changes in the inspected code, or installation of new @@ -28,7 +28,6 @@ RSpec/FilePath: - 'spec/custom_facts/util/normalization_spec.rb' - 'spec/custom_facts/util/parser_spec.rb' - 'spec/custom_facts/util/resolution_spec.rb' - - 'spec/facter/facts_utils/bytes_to_human_readable_spec.rb' - 'spec/facter/facts_utils/uptime_parser_spec.rb' - 'spec/facter/facts_utils/windows_release_finder_spec.rb' - 'spec/facter/model/fact_collection_spec.rb' @@ -50,8 +49,8 @@ RSpec/FilePath: - 'spec/facter/resolvers/processors_resolver_spec.rb' - 'spec/facter/resolvers/redhat_release_resolver_spec.rb' - 'spec/facter/resolvers/selinux_resolver_spec.rb' - - 'spec/facter/resolvers/solaris/current_zone_resolver_spec.rb' - 'spec/facter/resolvers/solaris/solaris_release_resolver_spec.rb' + - 'spec/facter/resolvers/solaris/solaris_zone_name_spec.rb' - 'spec/facter/resolvers/solaris/zone_resolver_spec.rb' - 'spec/facter/resolvers/solaris/zpool_resolver_spec.rb' - 'spec/facter/resolvers/suse_relese_resolver_spec.rb' @@ -85,13 +84,13 @@ RSpec/FilePath: - 'spec/framework/core/options/options_validator_spec.rb' - 'spec/framework/core/options_spec.rb' - 'spec/framework/core/session_cache_spec.rb' + - 'spec/framework/detector/os_hierarchy_spec.rb' - 'spec/framework/formatters/fact_formatter_spec.rb' - 'spec/framework/formatters/hocon_fact_formatter_spec.rb' - 'spec/framework/formatters/json_fact_formatter_spec.rb' - 'spec/framework/formatters/legacy_fact_formatter_spec.rb' - 'spec/framework/formatters/yaml_fact_formatter_spec.rb' - 'spec/framework/utils/utils_spec.rb' - - 'spec/framework/detector/os_hierarchy_spec.rb' # Offense count: 15 # Configuration parameters: AssignmentOnly. @@ -111,7 +110,7 @@ RSpec/LeakyConstantDeclaration: - 'spec/facter/resolvers/macosx/mountpoints_resolver_spec.rb' - 'spec/facter/resolvers/utils/windows/network_utils_spec.rb' -# Offense count: 118 +# Offense count: 114 # Configuration parameters: EnforcedStyle. # SupportedStyles: have_received, receive RSpec/MessageSpies: @@ -138,8 +137,6 @@ RSpec/MessageSpies: - 'spec/facter/facts/macosx/os/architecture_spec.rb' - 'spec/facter/facts/macosx/os/family_spec.rb' - 'spec/facter/facts/macosx/os/name_spec.rb' - - 'spec/facter/facts/sles/os/architecture_spec.rb' - - 'spec/facter/facts/sles/os/name_spec.rb' - 'spec/facter/facts/sles/os/release_spec.rb' - 'spec/facter/facts/solaris/os/architecture_spec.rb' - 'spec/facter/facts/solaris/os/name_spec.rb' @@ -192,7 +189,7 @@ RSpec/SubjectStub: - 'spec/custom_facts/util/fact_spec.rb' - 'spec/custom_facts/util/resolution_spec.rb' -# Offense count: 180 +# Offense count: 162 # Configuration parameters: IgnoreNameless, IgnoreSymbolicNames. RSpec/VerifiedDoubles: Exclude: @@ -231,11 +228,6 @@ RSpec/VerifiedDoubles: - 'spec/facter/resolvers/bsd/ffi_helper_spec.rb' - 'spec/facter/resolvers/macosx/mountpoints_resolver_spec.rb' - 'spec/facter/resolvers/mountpoints_resolver_spec.rb' - - 'spec/facter/resolvers/solaris/current_zone_resolver_spec.rb' - - 'spec/facter/resolvers/solaris/solaris_release_resolver_spec.rb' - - 'spec/facter/resolvers/solaris/zfs_resolver_spec.rb' - - 'spec/facter/resolvers/solaris/zone_resolver_spec.rb' - - 'spec/facter/resolvers/solaris/zpool_resolver_spec.rb' - 'spec/facter/resolvers/utils/windows/network_utils_spec.rb' - 'spec/facter/resolvers/utils/windows/win32ole_spec.rb' - 'spec/facter/resolvers/windows/dmi_bios_resolver_spec.rb' diff --git a/lib/custom_facts/core/execution/base.rb b/lib/custom_facts/core/execution/base.rb index 2c51aa17e..e32fec00f 100644 --- a/lib/custom_facts/core/execution/base.rb +++ b/lib/custom_facts/core/execution/base.rb @@ -4,6 +4,8 @@ module Facter module Core module Execution class Base + STDERR_MESSAGE = 'Command %s resulted with the following stderr message: %s' + def with_env(values) old = {} values.each do |var, value| @@ -34,12 +36,13 @@ def with_env(values) def execute(command, options = {}) on_fail = options.fetch(:on_fail, :raise) expand = options.fetch(:expand, true) + logger = options[:logger] # Set LC_ALL and LANG to force i18n to C for the duration of this exec; # this ensures that any code that parses the # output of the command can expect it to be in a consistent / predictable format / locale with_env 'LC_ALL' => 'C', 'LANG' => 'C' do - expanded_command = if !expand && builtin_command?(command) + expanded_command = if !expand && builtin_command?(command) || logger command else expand_command(command) @@ -54,18 +57,22 @@ def execute(command, options = {}) return on_fail end - execute_command(expanded_command, on_fail) + execute_command(expanded_command, on_fail, logger) end end private - def log_stderr_from_file(msg, command) + def log_stderr(msg, command, logger) return if !msg || msg.empty? - file_name = command.split('/').last - logger = Facter::Log.new(file_name) - logger.warn(msg.strip) + if logger + logger.debug(format(STDERR_MESSAGE, command, msg.strip)) + else + file_name = command.split('/').last + logger = Facter::Log.new(file_name) + logger.warn(format(STDERR_MESSAGE, command, msg.strip)) + end end def builtin_command?(command) @@ -73,11 +80,12 @@ def builtin_command?(command) output.chomp =~ /builtin/ ? true : false end - def execute_command(command, on_fail) + def execute_command(command, on_fail, logger = nil) begin out, stderr, _status_ = Open3.capture3(command.to_s) - log_stderr_from_file(stderr, command) + log_stderr(stderr, command, logger) rescue StandardError => e + return '' if logger return on_fail unless on_fail == :raise raise Facter::Core::Execution::ExecutionFailure.new, diff --git a/lib/facts_utils/uptime_parser.rb b/lib/facts_utils/uptime_parser.rb index c77c6f3b0..778feb056 100644 --- a/lib/facts_utils/uptime_parser.rb +++ b/lib/facts_utils/uptime_parser.rb @@ -8,6 +8,8 @@ class UptimeParser SECS_IN_AN_HOUR = 3_600 SECS_IN_A_MINUTE = 60 + @log = Facter::Log.new(self) + class << self def uptime_seconds_unix uptime_proc_uptime || uptime_sysctl || uptime_executable @@ -16,19 +18,20 @@ def uptime_seconds_unix private def uptime_proc_uptime - output, _stderr, _status = Open3.capture3("/bin/cat #{uptime_file} 2>/dev/null") + output = Facter::Core::Execution.execute("/bin/cat #{uptime_file}", logger: @log) output.chomp.split(' ').first.to_i unless output.empty? end def uptime_sysctl - output, _stderr, _status = Open3.capture3("sysctl -n #{uptime_sysctl_variable} 2>/dev/null") + output = Facter::Core::Execution.execute("sysctl -n #{uptime_sysctl_variable}", logger: @log) compute_uptime(Time.at(output.match(/\d+/)[0].to_i)) unless output.empty? end def uptime_executable - output, _stderr, _status = Open3.capture3(uptime_executable_cmd + ' 2>/dev/null') + output = Facter::Core::Execution.execute(uptime_executable_cmd, logger: @log) + return unless output up = 0 diff --git a/lib/resolvers/aix/mountpoints.rb b/lib/resolvers/aix/mountpoints.rb index 33bb338bd..80613036a 100644 --- a/lib/resolvers/aix/mountpoints.rb +++ b/lib/resolvers/aix/mountpoints.rb @@ -17,7 +17,7 @@ def post_resolve(fact_name) def read_mount(fact_name) @fact_list[:mountpoints] = {} - output, _status = Open3.capture2('mount 2>/dev/null') + output = Facter::Core::Execution.execute('mount', logger: log) output.split("\n").map do |line| next if line =~ /\snode\s|---|procfs|ahafs/ @@ -32,7 +32,7 @@ def read_mount(fact_name) end def retrieve_sizes_for_mounts - output, _status = Open3.capture2('df -P 2>/dev/null') + output = Facter::Core::Execution.execute('df -P', logger: log) output.split("\n").map do |line| next if line =~ /Filesystem|-\s+-\s+-/ diff --git a/lib/resolvers/aix/networking_resolver.rb b/lib/resolvers/aix/networking_resolver.rb index 9d1a6e68c..3f12b2735 100644 --- a/lib/resolvers/aix/networking_resolver.rb +++ b/lib/resolvers/aix/networking_resolver.rb @@ -15,7 +15,7 @@ def post_resolve(fact_name) end def read_netstat(fact_name) - output, _status = Open3.capture2('netstat -rn') + output = Facter::Core::Execution.execute('netstat -rn', logger: log) output = output.split("\n").select { |line| (line =~ /\s\s[0-9]+.[0-9]+.[0-9]+.[0-9]+|\s\s.*:[0-9a-f]+/) } get_primary_interface_info(output) diff --git a/lib/resolvers/aix/os_level_resolver.rb b/lib/resolvers/aix/os_level_resolver.rb index 21d3405cb..9fc5c5646 100644 --- a/lib/resolvers/aix/os_level_resolver.rb +++ b/lib/resolvers/aix/os_level_resolver.rb @@ -14,7 +14,7 @@ def post_resolve(fact_name) end def read_oslevel(fact_name) - output, _status = Open3.capture2('/usr/bin/oslevel -s 2>/dev/null') + output = Facter::Core::Execution.execute('/usr/bin/oslevel -s', logger: log) @fact_list[:build] = output @fact_list[:kernel] = 'AIX' diff --git a/lib/resolvers/aix/partitions.rb b/lib/resolvers/aix/partitions.rb index 791cf3e41..61c47107d 100644 --- a/lib/resolvers/aix/partitions.rb +++ b/lib/resolvers/aix/partitions.rb @@ -4,7 +4,6 @@ module Facter module Resolvers module Aix class Partitions < BaseResolver - @log = Facter::Log.new(self) @semaphore = Mutex.new @fact_list ||= {} class << self @@ -40,11 +39,9 @@ def query_cudv(fact_name) end def populate_from_lslv(name) - stdout, stderr, _status = Open3.capture3("lslv -L #{name}") - if stdout.empty? - @log.debug(stderr) - return - end + stdout = Facter::Core::Execution.execute("lslv -L #{name}", logger: log) + + return if stdout.empty? info_hash = extract_info(stdout) size_bytes = compute_size(info_hash) diff --git a/lib/resolvers/aix/utils/odm_query.rb b/lib/resolvers/aix/utils/odm_query.rb index 2eae8f565..6a35ccfc6 100644 --- a/lib/resolvers/aix/utils/odm_query.rb +++ b/lib/resolvers/aix/utils/odm_query.rb @@ -8,6 +8,7 @@ module Facter class ODMQuery REPOS = %w[CuAt CuDv PdAt PdDv].freeze + @log = Facter::Log.new(self) def initialize @query = '' @@ -29,7 +30,7 @@ def execute REPOS.each do |repo| break if result && !result.empty? - result, _stderr, _s = Open3.capture3("#{query} #{repo}") + result = Facter::Core::Execution.execute("#{query} #{repo}", logger: @log) end result end diff --git a/lib/resolvers/augeas_resolver.rb b/lib/resolvers/augeas_resolver.rb index b4f75d814..2e1ee7bc1 100644 --- a/lib/resolvers/augeas_resolver.rb +++ b/lib/resolvers/augeas_resolver.rb @@ -14,7 +14,7 @@ def post_resolve(fact_name) end def read_augeas_version(fact_name) - output, _status = Open3.capture2('augparse --version 2>&1') + output = Facter::Core::Execution.execute('augparse --version 2>&1', logger: log) @fact_list[:augeas_version] = Regexp.last_match(1) if output =~ /^augparse (\d+\.\d+\.\d+)/ @fact_list[fact_name] end diff --git a/lib/resolvers/eos_release_resolver.rb b/lib/resolvers/eos_release_resolver.rb index a677d63a9..e17bc1b6e 100644 --- a/lib/resolvers/eos_release_resolver.rb +++ b/lib/resolvers/eos_release_resolver.rb @@ -18,7 +18,9 @@ def post_resolve(fact_name) end def read_eos_release(fact_name) - output, _status = Open3.capture2('cat /etc/Eos-release') + output = Util::FileHelper.safe_read('/etc/Eos-release', nil) + return @fact_list[fact_name] = nil if output.nil? + output_strings = output.split(' ') @fact_list[:name] = output_strings[0] diff --git a/lib/resolvers/freebsd/freebsd_version_resolver.rb b/lib/resolvers/freebsd/freebsd_version_resolver.rb index a9e891bb7..69b3308f0 100644 --- a/lib/resolvers/freebsd/freebsd_version_resolver.rb +++ b/lib/resolvers/freebsd/freebsd_version_resolver.rb @@ -15,14 +15,12 @@ def post_resolve(fact_name) end def freebsd_version_system_call(fact_name) - output, _stderr, status = Open3.capture3('/bin/freebsd-version -kru') - return nil unless status.success? + output = Facter::Core::Execution.execute('/bin/freebsd-version -kru', logger: log) + return if output.empty? build_fact_list(output) @fact_list[fact_name] - rescue Errno::ENOENT - nil end def build_fact_list(output) diff --git a/lib/resolvers/hostname_resolver.rb b/lib/resolvers/hostname_resolver.rb index 768bcbd39..1940bd7e8 100644 --- a/lib/resolvers/hostname_resolver.rb +++ b/lib/resolvers/hostname_resolver.rb @@ -3,7 +3,6 @@ module Facter module Resolvers class Hostname < BaseResolver - @log = Facter::Log.new(self) @semaphore = Mutex.new @fact_list ||= {} class << self @@ -14,7 +13,7 @@ def post_resolve(fact_name) end def retrieve_hostname(fact_name) - output, _status = Open3.capture2('hostname') + output = Facter::Core::Execution.execute('hostname', logger: log) # get domain domain = read_domain(output) diff --git a/lib/resolvers/lpar_resolver.rb b/lib/resolvers/lpar_resolver.rb index 2a8b5b7b0..ae8a51333 100644 --- a/lib/resolvers/lpar_resolver.rb +++ b/lib/resolvers/lpar_resolver.rb @@ -14,8 +14,7 @@ def post_resolve(fact_name) end def read_lpar(fact_name) - lpar_cmd = '/usr/bin/lparstat -i' - output, _status = Open3.capture2(lpar_cmd) + output = Facter::Core::Execution.execute('/usr/bin/lparstat -i', logger: log) output.each_line do |line| populate_lpar_data(line.split(':').map(&:strip)) end diff --git a/lib/resolvers/lsb_release_resolver.rb b/lib/resolvers/lsb_release_resolver.rb index aaa3fb5bd..e259b377d 100644 --- a/lib/resolvers/lsb_release_resolver.rb +++ b/lib/resolvers/lsb_release_resolver.rb @@ -10,7 +10,6 @@ class LsbRelease < BaseResolver # :codename @semaphore = Mutex.new - @log = Facter::Log.new(self) @fact_list ||= {} class << self @@ -27,14 +26,12 @@ def retrieve_facts(fact_name) end def lsb_release_installed? - output, stderr, _status = Open3.capture3('which lsb_release') - @log.debug(stderr) unless stderr.empty? + output = Facter::Core::Execution.execute('which lsb_release', logger: log) @fact_list[:lsb_release_installed] = !output.empty? end def read_lsb_release_file - output, stderr, _status = Open3.capture3('lsb_release -a') - @log.debug(stderr) unless stderr.empty? + output = Facter::Core::Execution.execute('lsb_release -a', logger: log) build_fact_list(output) end diff --git a/lib/resolvers/macosx/dmi_resolver.rb b/lib/resolvers/macosx/dmi_resolver.rb index b1871ce40..d064242ef 100644 --- a/lib/resolvers/macosx/dmi_resolver.rb +++ b/lib/resolvers/macosx/dmi_resolver.rb @@ -4,7 +4,6 @@ module Facter module Resolvers module Macosx class DmiBios < BaseResolver - @log = Facter::Log.new(self) @semaphore = Mutex.new @fact_list ||= {} @@ -19,7 +18,7 @@ def post_resolve(fact_name) def read_facts # OSX only supports the product name - output, _status = Open3.capture2('sysctl -n hw.model') + output = Facter::Core::Execution.execute('sysctl -n hw.model', logger: log) @fact_list[:macosx_model] = output&.strip end end diff --git a/lib/resolvers/macosx/filesystems_resolver.rb b/lib/resolvers/macosx/filesystems_resolver.rb index 243b0cf38..638cbdbf4 100644 --- a/lib/resolvers/macosx/filesystems_resolver.rb +++ b/lib/resolvers/macosx/filesystems_resolver.rb @@ -7,7 +7,6 @@ class Filesystems < BaseResolver # :macosx_filesystems @semaphore = Mutex.new @fact_list ||= {} - @log = Facter::Log.new(self) class << self private @@ -17,7 +16,7 @@ def post_resolve(fact_name) end def read_filesystems(fact_name) - output, _status = Open3.capture2('mount') + output = Facter::Core::Execution.execute('mount', logger: log) filesystems = [] output.each_line do |line| filesystem = line.match(/\(([a-z]+)\,*/).to_s diff --git a/lib/resolvers/macosx/ipaddress_resolver.rb b/lib/resolvers/macosx/ipaddress_resolver.rb index 56bb890c6..6f793f4c1 100644 --- a/lib/resolvers/macosx/ipaddress_resolver.rb +++ b/lib/resolvers/macosx/ipaddress_resolver.rb @@ -4,7 +4,6 @@ module Facter module Resolvers module Macosx class Ipaddress < BaseResolver - @log = Facter::Log.new(self) @semaphore = Mutex.new @fact_list ||= {} class << self @@ -19,7 +18,7 @@ def read_ipaddress(fact_name) primary_interface = read_primary_interface unless primary_interface.nil? @fact_list[:primary] = primary_interface - output, _status = Open3.capture2("ipconfig getifaddr #{primary_interface}") + output = Facter::Core::Execution.execute("ipconfig getifaddr #{primary_interface}", logger: log) ip = output.strip end find_all_interfaces @@ -29,7 +28,7 @@ def read_ipaddress(fact_name) def read_primary_interface iface = nil - output, _status = Open3.capture2('route -n get default') + output = Facter::Core::Execution.execute('route -n get default', logger: log) output.split(/^\S/).each do |str| iface = Regexp.last_match(1) if str.strip =~ /interface: (\S+)/ end @@ -37,7 +36,7 @@ def read_primary_interface end def find_all_interfaces - output, _status = Open3.capture2('ifconfig -a 2>/dev/null') + output = Facter::Core::Execution.execute('ifconfig -a', logger: log) data_hash = Hash[*output.split(/^([A-Za-z0-9_]+): /)[1..-1]] diff --git a/lib/resolvers/macosx/load_averages_resolver.rb b/lib/resolvers/macosx/load_averages_resolver.rb index f6011798a..989c5e835 100644 --- a/lib/resolvers/macosx/load_averages_resolver.rb +++ b/lib/resolvers/macosx/load_averages_resolver.rb @@ -4,7 +4,6 @@ module Facter module Resolvers module Macosx class LoadAverages < BaseResolver - @log = Facter::Log.new(self) @semaphore = Mutex.new @fact_list ||= {} class << self @@ -15,7 +14,7 @@ def post_resolve(fact_name) end def read_load_averages_file(fact_name) - output, _status = Open3.capture2('sysctl -n vm.loadavg') + output = Facter::Core::Execution.execute('sysctl -n vm.loadavg', logger: log) @fact_list[:load_averages] = {}.tap { |h| _, h['1m'], h['5m'], h['15m'], = output.split.map(&:to_f) } @fact_list[fact_name] diff --git a/lib/resolvers/macosx/mountpoints_resolver.rb b/lib/resolvers/macosx/mountpoints_resolver.rb index 2af41c60b..a5ac68ad6 100644 --- a/lib/resolvers/macosx/mountpoints_resolver.rb +++ b/lib/resolvers/macosx/mountpoints_resolver.rb @@ -7,7 +7,6 @@ class Mountpoints < BaseResolver include Facter::FilesystemHelper @semaphore = Mutex.new @fact_list ||= {} - @log = Facter::Log.new(self) class << self private diff --git a/lib/resolvers/macosx/processor_resolver.rb b/lib/resolvers/macosx/processor_resolver.rb index e77471976..011d8ff68 100644 --- a/lib/resolvers/macosx/processor_resolver.rb +++ b/lib/resolvers/macosx/processor_resolver.rb @@ -4,7 +4,6 @@ module Facter module Resolvers module Macosx class Processors < BaseResolver - @log = Facter::Log.new(self) @semaphore = Mutex.new @fact_list = {} ITEMS = { logical_count: 'hw.logicalcpu_max', @@ -24,7 +23,7 @@ def post_resolve(fact_name) end def read_processor_data(fact_name) - output, _status = Open3.capture2("sysctl #{ITEMS.values.join(' ')}") + output = Facter::Core::Execution.execute("sysctl #{ITEMS.values.join(' ')}", logger: log) build_fact_list(output.split("\n")) @fact_list[fact_name] end diff --git a/lib/resolvers/macosx/swap_memory_resolver.rb b/lib/resolvers/macosx/swap_memory_resolver.rb index a46376c28..c9831b0e2 100644 --- a/lib/resolvers/macosx/swap_memory_resolver.rb +++ b/lib/resolvers/macosx/swap_memory_resolver.rb @@ -6,7 +6,6 @@ module Macosx class SwapMemory < BaseResolver @semaphore = Mutex.new @fact_list ||= {} - @log = Facter::Log.new(self) class << self private @@ -15,7 +14,7 @@ def post_resolve(fact_name) end def read_swap_memory(fact_name) # rubocop:disable Metrics/AbcSize - output = Open3.capture2('sysctl -n vm.swapusage').first + output = Facter::Core::Execution.execute('sysctl -n vm.swapusage', logger: log) data = output.match(/^total = ([\d.]+)M used = ([\d.]+)M free = ([\d.]+)M (\(encrypted\))$/) if data[1].to_f.positive? diff --git a/lib/resolvers/macosx/system_memory_resolver.rb b/lib/resolvers/macosx/system_memory_resolver.rb index 0468c3ab8..fd598e220 100644 --- a/lib/resolvers/macosx/system_memory_resolver.rb +++ b/lib/resolvers/macosx/system_memory_resolver.rb @@ -6,7 +6,6 @@ module Macosx class SystemMemory < BaseResolver @semaphore = Mutex.new @fact_list ||= {} - @log = Facter::Log.new(self) class << self private @@ -25,7 +24,7 @@ def calculate_system_memory(fact_name) end def read_available_memory_in_bytes - output, _status = Open3.capture2('vm_stat') + output = Facter::Core::Execution.execute('vm_stat', logger: log) page_size = output.match(/page size of (\d+) bytes/)[1].to_i pages_free = output.match(/Pages free:\s+(\d+)/)[1].to_i @@ -33,7 +32,7 @@ def read_available_memory_in_bytes end def read_total_memory_in_bytes - @fact_list[:total_bytes] = Open3.capture2('sysctl -n hw.memsize').first.to_i + @fact_list[:total_bytes] = Facter::Core::Execution.execute('sysctl -n hw.memsize', logger: log).to_i end def compute_capacity(used, total) diff --git a/lib/resolvers/macosx/system_profiler_resolver.rb b/lib/resolvers/macosx/system_profiler_resolver.rb index a47dc63aa..14aee0318 100644 --- a/lib/resolvers/macosx/system_profiler_resolver.rb +++ b/lib/resolvers/macosx/system_profiler_resolver.rb @@ -42,7 +42,9 @@ def retrieve_system_profiler(fact_name) @fact_list ||= {} log.debug 'Executing command: system_profiler SPSoftwareDataType SPHardwareDataType' - output, _status = Open3.capture2('system_profiler SPHardwareDataType SPSoftwareDataType') + output = Facter::Core::Execution.execute( + 'system_profiler SPHardwareDataType SPSoftwareDataType', logger: log + ) @fact_list = output.scan(/.*:[ ].*$/).map { |e| e.strip.match(/(.*?): (.*)/).captures }.to_h normalize_factlist diff --git a/lib/resolvers/networking_linux_resolver.rb b/lib/resolvers/networking_linux_resolver.rb index e8d6129c9..f9bc00556 100644 --- a/lib/resolvers/networking_linux_resolver.rb +++ b/lib/resolvers/networking_linux_resolver.rb @@ -25,13 +25,13 @@ def retrieve_network_info(fact_name) end def retrieve_macaddress - output, _status = Open3.capture2("ip link show #{@fact_list[:primary_interface]}") + output = Facter::Core::Execution.execute("ip link show #{@fact_list[:primary_interface]}", logger: log) macaddress = */ether ([^ ]*) /.match(output) @fact_list[:macaddress] = macaddress[1] end def retrieve_interface_info - output, _status = Open3.capture2('ip -o address') + output = Facter::Core::Execution.execute('ip -o address', logger: log) interfaces = {} output.each_line do |ip_line| @@ -74,7 +74,7 @@ def fill_io_v6_info!(ip_tokens, network_info) end def retrieve_default_interface_and_ip - output, _status = Open3.capture2('ip route get 1') + output = Facter::Core::Execution.execute('ip route get 1', logger: log) ip_route_tokens = output.each_line.first.strip.split(' ') default_interface = ip_route_tokens[4] diff --git a/lib/resolvers/os_level_resolver.rb b/lib/resolvers/os_level_resolver.rb index 764a91bf4..ed1348456 100644 --- a/lib/resolvers/os_level_resolver.rb +++ b/lib/resolvers/os_level_resolver.rb @@ -16,8 +16,9 @@ def post_resolve(fact_name) end def read_oslevel(fact_name) - output, _status = Open3.capture2('/usr/bin/oslevel -s 2>/dev/null') - @fact_list[:build] = output + output = Facter::Core::Execution.execute('/usr/bin/oslevel -s', logger: log) + + @fact_list[:build] = output unless output.empty? @fact_list[:kernel] = 'AIX' @fact_list[fact_name] diff --git a/lib/resolvers/partitions.rb b/lib/resolvers/partitions.rb index 735a91b99..e9b947312 100644 --- a/lib/resolvers/partitions.rb +++ b/lib/resolvers/partitions.rb @@ -87,12 +87,13 @@ def populate_from_blkid(partition_name) def blkid_command? return @blkid_exists unless @blkid_exists.nil? - stdout, _stderr, _status = Open3.capture3('which blkid') - @blkid_exists = stdout && !stdout.empty? + output = Facter::Core::Execution.execute('which blkid', logger: log) + + @blkid_exists = !output.empty? end def execute_and_extract_blkid_info - stdout, _stderr, _status = Open3.capture3('blkid') + stdout = Facter::Core::Execution.execute('blkid', logger: log) output_hash = Hash[*stdout.split(/^([^:]+):/)[1..-1]] output_hash.each { |key, value| output_hash[key] = Hash[*value.delete('"').chomp.split(/ ([^= ]+)=/)[1..-1]] } end diff --git a/lib/resolvers/redhat_release_resolver.rb b/lib/resolvers/redhat_release_resolver.rb index fb89906ae..1531ba332 100644 --- a/lib/resolvers/redhat_release_resolver.rb +++ b/lib/resolvers/redhat_release_resolver.rb @@ -9,6 +9,7 @@ class RedHatRelease < BaseResolver @semaphore = Mutex.new @fact_list ||= {} + @log = Facter::Log.new(self) class << self private diff --git a/lib/resolvers/selinux_resolver.rb b/lib/resolvers/selinux_resolver.rb index 10ff40215..180e31383 100644 --- a/lib/resolvers/selinux_resolver.rb +++ b/lib/resolvers/selinux_resolver.rb @@ -21,7 +21,7 @@ def retrieve_facts(fact_name) end def read_mounts_file - output, _s = Open3.capture2('cat /proc/self/mounts') + output = Facter::Core::Execution.execute('cat /proc/self/mounts', logger: log) @fact_list[:enabled] = false mountpoint = '' diff --git a/lib/resolvers/solaris/filesystems_resolver.rb b/lib/resolvers/solaris/filesystems_resolver.rb index dd8a5f300..4c8565d7e 100644 --- a/lib/resolvers/solaris/filesystems_resolver.rb +++ b/lib/resolvers/solaris/filesystems_resolver.rb @@ -17,7 +17,7 @@ def post_resolve(fact_name) def read_sysdef_file(fact_name) return unless File.executable?('/usr/sbin/sysdef') - file_content, _status = Open3.capture2('/usr/sbin/sysdef') + file_content = Facter::Core::Execution.execute('/usr/sbin/sysdef', logger: log) files = file_content.split("\n").map do |line| line.split('/').last if line =~ /^fs\.*/ end diff --git a/lib/resolvers/solaris/ipaddress_resolver.rb b/lib/resolvers/solaris/ipaddress_resolver.rb index fcf341f3f..ceeae2047 100644 --- a/lib/resolvers/solaris/ipaddress_resolver.rb +++ b/lib/resolvers/solaris/ipaddress_resolver.rb @@ -4,7 +4,6 @@ module Facter module Resolvers module Solaris class Ipaddress < BaseResolver - @log = Facter::Log.new(self) @semaphore = Mutex.new @fact_list ||= {} class << self @@ -18,7 +17,7 @@ def read_ipaddress(fact_name) ip = nil primary_interface = read_primary_interface unless primary_interface.nil? - output, _status = Open3.capture2("ifconfig #{primary_interface}") + output = Facter::Core::Execution.execute("ifconfig #{primary_interface}", logger: log) output.each_line do |str| if str.strip =~ /inet\s(\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}) .+/ @fact_list[:ip] = ip = Regexp.last_match(1) @@ -30,7 +29,7 @@ def read_ipaddress(fact_name) end def read_primary_interface - output, _status = Open3.capture2('route -n get default | grep interface') + output = Facter::Core::Execution.execute('route -n get default | grep interface', logger: log) output.strip =~ /interface:\s(\S+)/ ? Regexp.last_match(1) : nil end end diff --git a/lib/resolvers/solaris/processors.rb b/lib/resolvers/solaris/processors.rb index 152483fdd..de22e77fb 100644 --- a/lib/resolvers/solaris/processors.rb +++ b/lib/resolvers/solaris/processors.rb @@ -4,7 +4,6 @@ module Facter module Resolvers module Solaris class Processors < BaseResolver - @log = Facter::Log.new(self) @semaphore = Mutex.new @fact_list ||= {} class << self @@ -17,11 +16,8 @@ def post_resolve(fact_name) def collect_kstat_info(fact_name) return unless File.executable?('/usr/bin/kstat') - kstat_output, stderr, status = Open3.capture3('/usr/bin/kstat -m cpu_info') - unless status.to_i.zero? - @log.debug("Command /usr/bin/kstat failed with error message: #{stderr}") - return - end + kstat_output = Facter::Core::Execution.execute('/usr/bin/kstat -m cpu_info', logger: log) + return if kstat_output.empty? parse_output(kstat_output.chomp) @fact_list[fact_name] diff --git a/lib/resolvers/solaris/solaris_os_release_resolver.rb b/lib/resolvers/solaris/solaris_os_release_resolver.rb index dc1b05558..58e86ce71 100644 --- a/lib/resolvers/solaris/solaris_os_release_resolver.rb +++ b/lib/resolvers/solaris/solaris_os_release_resolver.rb @@ -3,7 +3,6 @@ module Facter module Resolvers class SolarisRelease < BaseResolver - @log = Facter::Log.new(self) @semaphore = Mutex.new @fact_list ||= {} @os_version_regex_patterns = ['Solaris \d+ \d+/\d+ s(\d+)[sx]?_u(\d+)wos_', @@ -16,8 +15,8 @@ def post_resolve(fact_name) end def build_release_facts(fact_name) - result = read_os_release_file - return unless result + result = Util::FileHelper.safe_read('/etc/release', nil) + return @fact_list[fact_name] = nil if result.nil? @os_version_regex_patterns.each do |os_version_regex| major, minor = search_for_os_version(/#{os_version_regex}/, result) @@ -37,15 +36,6 @@ def search_for_os_version(regex_pattern, text) minor = regex_pattern == /Solaris (\d+)/ ? '0' : minor return [major, minor] if major && minor end - - def read_os_release_file - output, status = Open3.capture2('cat /etc/release') - if !status.to_s.include?('exit 0') || output.empty? - @log.error('Could not build release fact because of missing or empty file /etc/release') - return - end - output - end end end end diff --git a/lib/resolvers/solaris/solaris_zone_name.rb b/lib/resolvers/solaris/solaris_zone_name.rb index aa6bf9eac..accfec9f4 100644 --- a/lib/resolvers/solaris/solaris_zone_name.rb +++ b/lib/resolvers/solaris/solaris_zone_name.rb @@ -3,7 +3,6 @@ module Facter module Resolvers class SolarisZoneName < BaseResolver - @log = Facter::Log.new(self) @semaphore = Mutex.new @fact_list ||= {} class << self @@ -14,15 +13,10 @@ def post_resolve(fact_name) end def build_current_zone_name_fact(fact_name) - return unless File.executable?('/bin/zonename') + zone_name_output = Facter::Core::Execution.execute('/bin/zonename', logger: log) - zone_name_output, status = Open3.capture2('/bin/zonename') - unless status.to_s.include?('exit 0') - @log.debug("Command #{command} returned status: #{status}") - return - end if zone_name_output.empty? - @log.debug("Command #{command} returned an empty result") + log.debug("Command #{command} returned an empty result") return end @fact_list[:current_zone_name] = zone_name_output.chomp diff --git a/lib/resolvers/solaris/zfs_resolver.rb b/lib/resolvers/solaris/zfs_resolver.rb index 54205da35..50a472a83 100644 --- a/lib/resolvers/solaris/zfs_resolver.rb +++ b/lib/resolvers/solaris/zfs_resolver.rb @@ -4,7 +4,6 @@ module Facter module Resolvers module Solaris class ZFS < BaseResolver - @log = Facter::Log.new(self) @semaphore = Mutex.new @fact_list ||= {} class << self @@ -20,7 +19,7 @@ def zfs_fact(fact_name) end def build_zfs_facts - output, _status = Open3.capture2('zfs upgrade -v') + output = Facter::Core::Execution.execute('zfs upgrade -v', logger: log) features_list = output.scan(/^\s+(\d+)/).flatten return if features_list.empty? diff --git a/lib/resolvers/solaris/zone_resolver.rb b/lib/resolvers/solaris/zone_resolver.rb index b01853b92..e89e7f4be 100644 --- a/lib/resolvers/solaris/zone_resolver.rb +++ b/lib/resolvers/solaris/zone_resolver.rb @@ -3,7 +3,6 @@ module Facter module Resolvers class SolarisZone < BaseResolver - @log = Facter::Log.new(self) @semaphore = Mutex.new @fact_list ||= {} class << self @@ -14,16 +13,11 @@ def post_resolve(fact_name) end def build_zone_fact(fact_name) - return unless File.executable?('/usr/sbin/zoneadm') - command = '/usr/sbin/zoneadm list -cp' - zone_adm_output, status = Open3.capture2(command) - unless status.to_s.include?('exit 0') - @log.debug("Command #{command} returned status: #{status}") - return - end + zone_adm_output = Facter::Core::Execution.execute(command, logger: log) + if zone_adm_output.empty? - @log.debug("Command #{command} returned an empty result") + log.debug("Command #{command} returned an empty result") return end @fact_list[:zone] = create_zone_facts(zone_adm_output) diff --git a/lib/resolvers/solaris/zpool_resolver.rb b/lib/resolvers/solaris/zpool_resolver.rb index 9a2c8c36e..cdcaa4f03 100644 --- a/lib/resolvers/solaris/zpool_resolver.rb +++ b/lib/resolvers/solaris/zpool_resolver.rb @@ -4,7 +4,6 @@ module Facter module Resolvers module Solaris class ZPool < BaseResolver - @log = Facter::Log.new(self) @semaphore = Mutex.new @fact_list ||= {} class << self @@ -20,7 +19,7 @@ def zpool_fact(fact_name) end def build_zpool_facts - output, _status = Open3.capture2('zpool upgrade -v') + output = Facter::Core::Execution.execute('zpool upgrade -v', logger: log) features_list = output.scan(/^\s+(\d+)/).flatten features_flags = output.scan(/^([a-z0-9_]+)[[:blank:]]*(\(read-only compatible\))?$/).map(&:first) diff --git a/lib/resolvers/sw_vers_resolver.rb b/lib/resolvers/sw_vers_resolver.rb index 55a9cfaf6..7a226263f 100644 --- a/lib/resolvers/sw_vers_resolver.rb +++ b/lib/resolvers/sw_vers_resolver.rb @@ -18,7 +18,7 @@ def post_resolve(fact_name) end def software_version_system_call(fact_name) - output, _status = Open3.capture2('sw_vers') + output = Facter::Core::Execution.execute('sw_vers', logger: log) release_info = output.delete("\t").split("\n").map { |e| e.split(':') } result = Hash[*release_info.flatten] result.each { |k, v| @fact_list[k.downcase.to_sym] = v } diff --git a/lib/resolvers/uname_resolver.rb b/lib/resolvers/uname_resolver.rb index 59dc7e35b..263d0a1f5 100644 --- a/lib/resolvers/uname_resolver.rb +++ b/lib/resolvers/uname_resolver.rb @@ -14,12 +14,12 @@ def post_resolve(fact_name) end def uname_system_call(fact_name) - output, _status = Open3.capture2('uname -m && + output = Facter::Core::Execution.execute('uname -m && uname -n && uname -p && uname -r && uname -s && - uname -v') + uname -v', logger: log) build_fact_list(output) diff --git a/lib/resolvers/wpar_resolver.rb b/lib/resolvers/wpar_resolver.rb index 675270b46..16dbc3135 100644 --- a/lib/resolvers/wpar_resolver.rb +++ b/lib/resolvers/wpar_resolver.rb @@ -14,9 +14,9 @@ def post_resolve(fact_name) end def read_wpar(fact_name) - lpar_cmd = '/usr/bin/lparstat -W 2>/dev/null' - output, status = Open3.capture2(lpar_cmd) - return nil unless status.success? + output = Facter::Core::Execution.execute('/usr/bin/lparstat -W', logger: log) + + return if output.empty? output.each_line do |line| populate_wpar_data(line.split(':').map(&:strip)) diff --git a/spec/custom_facts/core/execution/fact_manager_spec.rb b/spec/custom_facts/core/execution/fact_manager_spec.rb index f8ba18830..4231b61a5 100644 --- a/spec/custom_facts/core/execution/fact_manager_spec.rb +++ b/spec/custom_facts/core/execution/fact_manager_spec.rb @@ -142,7 +142,8 @@ def handy_method it 'loggs warning messages on stderr' do executor.execute(command) - expect(logger).to have_received(:warn).with('some error') + expect(logger).to have_received(:warn).with('Command /bin/foo resulted with '\ + 'the following stderr message: some error') end end diff --git a/spec/facter/facts_utils/uptime_parser_spec.rb b/spec/facter/facts_utils/uptime_parser_spec.rb index 5e1d6bcc9..8847b65b8 100644 --- a/spec/facter/facts_utils/uptime_parser_spec.rb +++ b/spec/facter/facts_utils/uptime_parser_spec.rb @@ -2,17 +2,22 @@ describe Facter::UptimeParser do describe '.uptime_seconds_unix' do - let(:uptime_proc_file_cmd) { '/bin/cat /proc/uptime 2>/dev/null' } - let(:kern_boottime_cmd) { 'sysctl -n kern.boottime 2>/dev/null' } - let(:uptime_cmd) { 'uptime 2>/dev/null' } + let(:uptime_proc_file_cmd) { '/bin/cat /proc/uptime' } + let(:kern_boottime_cmd) { 'sysctl -n kern.boottime' } + let(:uptime_cmd) { 'uptime' } + let(:log_spy) { instance_spy(Facter::Log) } + + before do + Facter::UptimeParser.instance_variable_set(:@log, log_spy) + end context 'when a /proc/uptime file exists' do let(:proc_uptime_value) { '2672.69 20109.75' } it 'returns the correct result' do - allow(Open3) - .to receive(:capture3) - .with(uptime_proc_file_cmd) + allow(Facter::Core::Execution) + .to receive(:execute) + .with(uptime_proc_file_cmd, logger: log_spy) .and_return(proc_uptime_value) expect(Facter::UptimeParser.uptime_seconds_unix).to eq(2672) @@ -29,14 +34,14 @@ allow(Time).to receive(:at).with(60) { Time.parse('2019-10-10 10:59:00 +0100') } allow(Time).to receive(:now) { time_now } - allow(Open3) - .to receive(:capture3) - .with(uptime_proc_file_cmd) + allow(Facter::Core::Execution) + .to receive(:execute) + .with(uptime_proc_file_cmd, logger: log_spy) .and_return('') - allow(Open3) - .to receive(:capture3) - .with(kern_boottime_cmd) + allow(Facter::Core::Execution) + .to receive(:execute) + .with(kern_boottime_cmd, logger: log_spy) .and_return(kern_boottime_value) expect(Facter::UptimeParser.uptime_seconds_unix).to eq(60) @@ -45,22 +50,22 @@ context 'when the uptime executable is available only' do before do - allow(Open3) - .to receive(:capture3) - .with(uptime_proc_file_cmd) + allow(Facter::Core::Execution) + .to receive(:execute) + .with(uptime_proc_file_cmd, logger: log_spy) .and_return('') - allow(Open3) - .to receive(:capture3) - .with(kern_boottime_cmd) + allow(Facter::Core::Execution) + .to receive(:execute) + .with(kern_boottime_cmd, logger: log_spy) .and_return('') end shared_examples 'uptime executable regex expectation' do |cmd_output, result| it 'returns the correct result' do - allow(Open3) - .to receive(:capture3) - .with(uptime_cmd) + allow(Facter::Core::Execution) + .to receive(:execute) + .with(uptime_cmd, logger: log_spy) .and_return(cmd_output) expect(Facter::UptimeParser.uptime_seconds_unix).to eq(result) diff --git a/spec/facter/resolvers/aix/mountpoints_spec.rb b/spec/facter/resolvers/aix/mountpoints_spec.rb index d02546faf..0ec9e0d00 100644 --- a/spec/facter/resolvers/aix/mountpoints_spec.rb +++ b/spec/facter/resolvers/aix/mountpoints_spec.rb @@ -10,10 +10,14 @@ filesystem: 'jfs2', options: ['rw', 'log=/dev/hd8'], size: '5.00 GiB', size_bytes: 5_368_709_120, used: '2.16 GiB', used_bytes: 2_319_687_680 } } end + let(:log_spy) { instance_spy(Facter::Log) } before do - allow(Open3).to receive(:capture2).with('mount 2>/dev/null').and_return(load_fixture('mount').read) - allow(Open3).to receive(:capture2).with('df -P 2>/dev/null').and_return(load_fixture('df').read) + Facter::Resolvers::Aix::Mountpoints.instance_variable_set(:@log, log_spy) + allow(Facter::Core::Execution).to receive(:execute).with('mount', logger: log_spy) + .and_return(load_fixture('mount').read) + allow(Facter::Core::Execution).to receive(:execute).with('df -P', logger: log_spy) + .and_return(load_fixture('df').read) end it 'returns mountpoints' do diff --git a/spec/facter/resolvers/aix/networking_resolver_spec.rb b/spec/facter/resolvers/aix/networking_resolver_spec.rb index 95c514e72..b9500ecdd 100644 --- a/spec/facter/resolvers/aix/networking_resolver_spec.rb +++ b/spec/facter/resolvers/aix/networking_resolver_spec.rb @@ -1,9 +1,12 @@ # frozen_string_literal: true describe Facter::Resolvers::Aix::Networking do + let(:log_spy) { instance_spy(Facter::Log) } + before do - allow(Open3).to receive(:capture2) - .with('netstat -rn') + Facter::Resolvers::Aix::Networking.instance_variable_set(:@log, log_spy) + allow(Facter::Core::Execution).to receive(:execute) + .with('netstat -rn', logger: log_spy) .and_return(load_fixture('netstat_rn').read) end diff --git a/spec/facter/resolvers/aix/partitions_spec.rb b/spec/facter/resolvers/aix/partitions_spec.rb index d4d48fda0..c8d7f68ac 100644 --- a/spec/facter/resolvers/aix/partitions_spec.rb +++ b/spec/facter/resolvers/aix/partitions_spec.rb @@ -37,18 +37,14 @@ end before do - allow(Open3).to receive(:capture3).with('lslv -L hd5').and_return(load_fixture('lslv_output').read) - allow(Open3).to receive(:capture3).with('lslv -L hd6').and_return(['', 'Error: something happened!', 1]) + allow(Facter::Core::Execution).to receive(:execute).with('lslv -L hd5', logger: logger_spy) + .and_return(load_fixture('lslv_output').read) + allow(Facter::Core::Execution).to receive(:execute).with('lslv -L hd6', logger: logger_spy) + .and_return('') end it 'returns partitions informations' do expect(resolver.resolve(:partitions)).to eql(partitions) end - - it 'logs stderr output in case lslv commands fails' do - resolver.resolve(:partitions) - - expect(logger_spy).to have_received(:debug).with('Error: something happened!') - end end end diff --git a/spec/facter/resolvers/augeas_resolver_spec.rb b/spec/facter/resolvers/augeas_resolver_spec.rb index 4b235a056..feefda504 100644 --- a/spec/facter/resolvers/augeas_resolver_spec.rb +++ b/spec/facter/resolvers/augeas_resolver_spec.rb @@ -1,15 +1,18 @@ # frozen_string_literal: true describe Facter::Resolvers::Augeas do + subject(:augeas) { Facter::Resolvers::Augeas } + + let(:log_spy) { instance_spy(Facter::Log) } + before do - allow(Open3).to receive(:capture2) - .with('augparse --version 2>&1') + augeas.instance_variable_set(:@log, log_spy) + allow(Facter::Core::Execution).to receive(:execute) + .with('augparse --version 2>&1', logger: log_spy) .and_return('augparse 1.12.0 ') end it 'returns build' do - result = Facter::Resolvers::Augeas.resolve(:augeas_version) - - expect(result).to eq('1.12.0') + expect(augeas.resolve(:augeas_version)).to eq('1.12.0') end end diff --git a/spec/facter/resolvers/eos_release_resolver_spec.rb b/spec/facter/resolvers/eos_release_resolver_spec.rb index e4062fb8e..8c52afd38 100644 --- a/spec/facter/resolvers/eos_release_resolver_spec.rb +++ b/spec/facter/resolvers/eos_release_resolver_spec.rb @@ -1,21 +1,19 @@ # frozen_string_literal: true describe Facter::Resolvers::EosRelease do + subject(:eos_release) { Facter::Resolvers::EosRelease } + before do - allow(Open3).to receive(:capture2) - .with('cat /etc/Eos-release') + allow(Facter::Util::FileHelper).to receive(:safe_read) + .with('/etc/Eos-release', nil) .and_return('name version') end it 'returns name' do - result = Facter::Resolvers::EosRelease.resolve(:name) - - expect(result).to eq('name') + expect(eos_release.resolve(:name)).to eq('name') end it 'returns version' do - result = Facter::Resolvers::EosRelease.resolve(:version) - - expect(result).to eq('version') + expect(eos_release.resolve(:version)).to eq('version') end end diff --git a/spec/facter/resolvers/freebsd/freebsd_version_resolver_spec.rb b/spec/facter/resolvers/freebsd/freebsd_version_resolver_spec.rb index 326fecac3..b7a716f69 100644 --- a/spec/facter/resolvers/freebsd/freebsd_version_resolver_spec.rb +++ b/spec/facter/resolvers/freebsd/freebsd_version_resolver_spec.rb @@ -1,31 +1,25 @@ # frozen_string_literal: true describe Facter::Resolvers::Freebsd::FreebsdVersion do + subject(:freebsd_version) { Facter::Resolvers::Freebsd::FreebsdVersion } + before do - status = instance_double('Process::Status') - allow(status).to receive(:success?).and_return(true) - allow(Open3).to receive(:capture3) - .with('/bin/freebsd-version -kru') - .and_return(['13.0-CURRENT + allow(Facter::Core::Execution).to receive(:execute) + .with('/bin/freebsd-version -kru', logger: freebsd_version.log) + .and_return('13.0-CURRENT 12.1-RELEASE-p3 - 12.0-STABLE', nil, status]) + 12.0-STABLE') end it 'returns installed kernel' do - result = Facter::Resolvers::Freebsd::FreebsdVersion.resolve(:installed_kernel) - - expect(result).to eq('13.0-CURRENT') + expect(freebsd_version.resolve(:installed_kernel)).to eq('13.0-CURRENT') end it 'returns running kernel' do - result = Facter::Resolvers::Freebsd::FreebsdVersion.resolve(:running_kernel) - - expect(result).to eq('12.1-RELEASE-p3') + expect(freebsd_version.resolve(:running_kernel)).to eq('12.1-RELEASE-p3') end it 'returns installed userland' do - result = Facter::Resolvers::Freebsd::FreebsdVersion.resolve(:installed_userland) - - expect(result).to eq('12.0-STABLE') + expect(freebsd_version.resolve(:installed_userland)).to eq('12.0-STABLE') end end diff --git a/spec/facter/resolvers/hostname_resolver_spec.rb b/spec/facter/resolvers/hostname_resolver_spec.rb index bd6276d16..0bed80c97 100644 --- a/spec/facter/resolvers/hostname_resolver_spec.rb +++ b/spec/facter/resolvers/hostname_resolver_spec.rb @@ -1,16 +1,21 @@ # frozen_string_literal: true describe Facter::Resolvers::Hostname do + subject(:hostname_resolver) { Facter::Resolvers::Hostname } + + let(:log_spy) { instance_spy(Facter::Log) } + describe '#resolve' do before do - allow(Open3).to receive(:capture2).with('hostname').and_return(host) + hostname_resolver.instance_variable_set(:@log, log_spy) + allow(Facter::Core::Execution).to receive(:execute).with('hostname', logger: log_spy).and_return(host) allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/etc/resolv.conf') .and_return("nameserver 10.10.0.10\nnameserver 10.10.1.10\nsearch baz\ndomain baz\n") end after do - Facter::Resolvers::Hostname.invalidate_cache + hostname_resolver.invalidate_cache end context 'when hostname returns fqdn' do @@ -20,15 +25,15 @@ let(:fqdn) { "#{hostname}.#{domain}" } it 'detects hostname' do - expect(Facter::Resolvers::Hostname.resolve(:hostname)).to eql(hostname) + expect(hostname_resolver.resolve(:hostname)).to eql(hostname) end it 'returns networking Domain' do - expect(Facter::Resolvers::Hostname.resolve(:domain)).to eq(domain) + expect(hostname_resolver.resolve(:domain)).to eq(domain) end it 'returns fqdn' do - expect(Facter::Resolvers::Hostname.resolve(:fqdn)).to eq(fqdn) + expect(hostname_resolver.resolve(:fqdn)).to eq(fqdn) end end @@ -39,15 +44,15 @@ let(:fqdn) { "#{hostname}.#{domain}" } it 'detects hostname' do - expect(Facter::Resolvers::Hostname.resolve(:hostname)).to eql(hostname) + expect(hostname_resolver.resolve(:hostname)).to eql(hostname) end it 'returns networking Domain' do - expect(Facter::Resolvers::Hostname.resolve(:domain)).to eq(domain) + expect(hostname_resolver.resolve(:domain)).to eq(domain) end it 'returns fqdn' do - expect(Facter::Resolvers::Hostname.resolve(:fqdn)).to eq(fqdn) + expect(hostname_resolver.resolve(:fqdn)).to eq(fqdn) end end @@ -55,7 +60,7 @@ let(:host) { nil } it 'detects that hostname is nil' do - expect(Facter::Resolvers::Hostname.resolve(:hostname)).to be(nil) + expect(hostname_resolver.resolve(:hostname)).to be(nil) end end @@ -67,7 +72,7 @@ end it 'detects that domain is nil' do - expect(Facter::Resolvers::Hostname.resolve(:domain)).to be(nil) + expect(hostname_resolver.resolve(:domain)).to be(nil) end end end diff --git a/spec/facter/resolvers/lpar_resolver_spec.rb b/spec/facter/resolvers/lpar_resolver_spec.rb index 820f2160c..5c4464be6 100644 --- a/spec/facter/resolvers/lpar_resolver_spec.rb +++ b/spec/facter/resolvers/lpar_resolver_spec.rb @@ -3,11 +3,13 @@ describe Facter::Resolvers::Lpar do subject(:lpar_resolver) { Facter::Resolvers::Lpar } + let(:log_spy) { instance_spy(Facter::Log) } + before do - lparstat_i = load_fixture('lparstat_i').read - allow(Open3).to receive(:capture2) - .with('/usr/bin/lparstat -i') - .and_return(lparstat_i) + lpar_resolver.instance_variable_set(:@log, log_spy) + allow(Facter::Core::Execution).to receive(:execute) + .with('/usr/bin/lparstat -i', logger: log_spy) + .and_return(load_fixture('lparstat_i').read) lpar_resolver.invalidate_cache end diff --git a/spec/facter/resolvers/macosx/dmi_resolver_spec.rb b/spec/facter/resolvers/macosx/dmi_resolver_spec.rb index 8bf483987..8bba1ace1 100644 --- a/spec/facter/resolvers/macosx/dmi_resolver_spec.rb +++ b/spec/facter/resolvers/macosx/dmi_resolver_spec.rb @@ -1,14 +1,21 @@ # frozen_string_literal: true describe Facter::Resolvers::Macosx::DmiBios do - describe '#resolve' do - context 'when it detects model' do - let(:macosx_model) { 'MacBookPro11,4' } - - it 'detects model' do - allow(Open3).to receive(:capture2).with('sysctl -n hw.model').and_return(macosx_model) - expect(Facter::Resolvers::Macosx::DmiBios.resolve(:macosx_model)).to eql(macosx_model) - end + subject(:dmi_resolver) { Facter::Resolvers::Macosx::DmiBios } + + let(:log_spy) { instance_spy(Facter::Log) } + let(:macosx_model) { 'MacBookPro11,4' } + + before do + dmi_resolver.instance_variable_set(:@log, log_spy) + allow(Facter::Core::Execution).to receive(:execute) + .with('sysctl -n hw.model', logger: log_spy) + .and_return(macosx_model) + end + + context 'when it detects model' do + it 'detects model' do + expect(Facter::Resolvers::Macosx::DmiBios.resolve(:macosx_model)).to eql(macosx_model) end end end diff --git a/spec/facter/resolvers/macosx/filesystems_resolver_spec.rb b/spec/facter/resolvers/macosx/filesystems_resolver_spec.rb index ec9f4cd1a..25903a7ca 100644 --- a/spec/facter/resolvers/macosx/filesystems_resolver_spec.rb +++ b/spec/facter/resolvers/macosx/filesystems_resolver_spec.rb @@ -1,15 +1,21 @@ # frozen_string_literal: true describe Facter::Resolvers::Macosx::Filesystems do + subject(:filesystems_resolver) { Facter::Resolvers::Macosx::Filesystems } + + let(:log_spy) { instance_spy(Facter::Log) } + before do - allow(Open3).to receive(:capture2).with('mount').and_return(load_fixture('macosx_filesystems')) + filesystems_resolver.instance_variable_set(:@log, log_spy) + allow(Facter::Core::Execution).to receive(:execute).with('mount', logger: log_spy) + .and_return(load_fixture('macosx_filesystems')) end describe '#call_the_resolver' do let(:filesystems) { 'apfs,autofs,devfs' } it 'returns systems' do - expect(Facter::Resolvers::Macosx::Filesystems.resolve(:macosx_filesystems)).to eq(filesystems) + expect(filesystems_resolver.resolve(:macosx_filesystems)).to eq(filesystems) end end end diff --git a/spec/facter/resolvers/macosx/ipaddress_resolver_spec.rb b/spec/facter/resolvers/macosx/ipaddress_resolver_spec.rb index 9c20c5b28..cf0d89b14 100644 --- a/spec/facter/resolvers/macosx/ipaddress_resolver_spec.rb +++ b/spec/facter/resolvers/macosx/ipaddress_resolver_spec.rb @@ -1,15 +1,21 @@ # frozen_string_literal: true describe Facter::Resolvers::Macosx::Ipaddress do + subject(:ipaddress) { Facter::Resolvers::Macosx::Ipaddress } + + let(:log_spy) { instance_spy(Facter::Log) } + describe '#resolve' do before do - allow(Open3).to receive(:capture2).with('route -n get default').and_return(route) - allow(Open3).to receive(:capture2).with('ipconfig getifaddr en0').and_return(ip) - allow(Open3).to receive(:capture2).with('ifconfig -a 2>/dev/null').and_return(interfaces) + ipaddress.instance_variable_set(:@log, log_spy) + allow(Facter::Core::Execution).to receive(:execute).with('route -n get default', logger: log_spy) + .and_return(route) + allow(Facter::Core::Execution).to receive(:execute).with('ipconfig getifaddr en0', logger: log_spy).and_return(ip) + allow(Facter::Core::Execution).to receive(:execute).with('ifconfig -a', logger: log_spy).and_return(interfaces) end after do - Facter::Resolvers::Macosx::Ipaddress.invalidate_cache + ipaddress.invalidate_cache end let(:interfaces) { load_fixture('ifconfig_mac').read } @@ -21,15 +27,15 @@ let(:ip) { '10.0.0.1' } it 'detects ipadress' do - expect(Facter::Resolvers::Macosx::Ipaddress.resolve(:ip)).to eql(ip) + expect(ipaddress.resolve(:ip)).to eql(ip) end it 'detects interfaces' do - expect(Facter::Resolvers::Macosx::Ipaddress.resolve(:interfaces)).to eql(interfaces_reuslt) + expect(ipaddress.resolve(:interfaces)).to eql(interfaces_reuslt) end it 'detects macaddress' do - expect(Facter::Resolvers::Macosx::Ipaddress.resolve(:macaddress)).to eql(macaddress) + expect(ipaddress.resolve(:macaddress)).to eql(macaddress) end end @@ -38,7 +44,7 @@ let(:ip) {} it 'detects that ip is nil' do - expect(Facter::Resolvers::Macosx::Ipaddress.resolve(:ip)).to be(nil) + expect(ipaddress.resolve(:ip)).to be(nil) end end end diff --git a/spec/facter/resolvers/macosx/load_averages_resolver_spec.rb b/spec/facter/resolvers/macosx/load_averages_resolver_spec.rb index 00d022784..ea8a35a7f 100644 --- a/spec/facter/resolvers/macosx/load_averages_resolver_spec.rb +++ b/spec/facter/resolvers/macosx/load_averages_resolver_spec.rb @@ -1,17 +1,19 @@ # frozen_string_literal: true describe Facter::Resolvers::Macosx::LoadAverages do - let(:load_averages) { { '1m' => 0.00, '5m' => 0.03, '15m' => 0.03 } } + subject(:load_averages) { Facter::Resolvers::Macosx::LoadAverages } + + let(:log_spy) { instance_spy(Facter::Log) } + let(:expected_result) { { '1m' => 0.00, '5m' => 0.03, '15m' => 0.03 } } before do - allow(Open3).to receive(:capture2) - .with('sysctl -n vm.loadavg') + load_averages.instance_variable_set(:@log, log_spy) + allow(Facter::Core::Execution).to receive(:execute) + .with('sysctl -n vm.loadavg', logger: log_spy) .and_return('{ 0.00 0.03 0.03 }') end it 'returns load average' do - result = Facter::Resolvers::Macosx::LoadAverages.resolve(:load_averages) - - expect(result).to eq(load_averages) + expect(load_averages.resolve(:load_averages)).to eq(expected_result) end end diff --git a/spec/facter/resolvers/macosx/processors_resolver_spec.rb b/spec/facter/resolvers/macosx/processors_resolver_spec.rb index 09c7f42fb..761f3a98d 100644 --- a/spec/facter/resolvers/macosx/processors_resolver_spec.rb +++ b/spec/facter/resolvers/macosx/processors_resolver_spec.rb @@ -1,6 +1,9 @@ # frozen_string_literal: true describe Facter::Resolvers::Macosx::Processors do + subject(:processors_resolver) { Facter::Resolvers::Macosx::Processors } + + let(:log_spy) { instance_spy(Facter::Log) } let(:logicalcount) { 4 } let(:models) do ['Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz', 'Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz', @@ -9,38 +12,34 @@ let(:physical_processors) { 1 } let(:speed_expected) { 2_300_000_000 } - output = ['hw.logicalcpu_max: 4', - 'hw.physicalcpu_max: 1', - 'machdep.cpu.brand_string: Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz', - 'hw.cpufrequency_max: 2300000000'].join("\n") + let(:output) do + ['hw.logicalcpu_max: 4', + 'hw.physicalcpu_max: 1', + 'machdep.cpu.brand_string: Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz', + 'hw.cpufrequency_max: 2300000000'].join("\n") + end + before do - allow(Open3) - .to receive(:capture2) - .with('sysctl hw.logicalcpu_max hw.physicalcpu_max machdep.cpu.brand_string hw.cpufrequency_max') + processors_resolver.instance_variable_set(:@log, log_spy) + allow(Facter::Core::Execution) + .to receive(:execute) + .with('sysctl hw.logicalcpu_max hw.physicalcpu_max machdep.cpu.brand_string hw.cpufrequency_max', logger: log_spy) .and_return(output) end it 'returns number of processors' do - result = Facter::Resolvers::Macosx::Processors.resolve(:logicalcount) - - expect(result).to eq(logicalcount) + expect(processors_resolver.resolve(:logicalcount)).to eq(logicalcount) end it 'returns number of physical processors' do - result = Facter::Resolvers::Macosx::Processors.resolve(:physicalcount) - - expect(result).to eq(physical_processors) + expect(processors_resolver.resolve(:physicalcount)).to eq(physical_processors) end it 'returns list of models' do - result = Facter::Resolvers::Macosx::Processors.resolve(:models) - - expect(result).to eq(models) + expect(processors_resolver.resolve(:models)).to eq(models) end it 'returns speed of processors' do - result = Facter::Resolvers::Macosx::Processors.resolve(:speed) - - expect(result).to eq(speed_expected) + expect(processors_resolver.resolve(:speed)).to eq(speed_expected) end end diff --git a/spec/facter/resolvers/macosx/swap_memory_resolver_spec.rb b/spec/facter/resolvers/macosx/swap_memory_resolver_spec.rb index 4dd67b07c..fd007004d 100644 --- a/spec/facter/resolvers/macosx/swap_memory_resolver_spec.rb +++ b/spec/facter/resolvers/macosx/swap_memory_resolver_spec.rb @@ -1,6 +1,9 @@ # frozen_string_literal: true describe Facter::Resolvers::Macosx::SwapMemory do + subject(:swap_memory) { Facter::Resolvers::Macosx::SwapMemory } + + let(:log_spy) { instance_spy(Facter::Log) } let(:available_bytes) { 1_729_363_968 } let(:total_bytes) { 3_221_225_472 } let(:used_bytes) { 1_491_861_504 } @@ -8,33 +11,29 @@ let(:encrypted) { true } before do - allow(Open3).to receive(:capture2) - .with('sysctl -n vm.swapusage') - .and_return(['total = 3072.00M used = 1422.75M free = 1649.25M (encrypted)', '']) + swap_memory.instance_variable_set(:@log, log_spy) + allow(Facter::Core::Execution).to receive(:execute) + .with('sysctl -n vm.swapusage', logger: log_spy) + .and_return('total = 3072.00M used = 1422.75M free = 1649.25M (encrypted)') end it 'returns available swap memory in bytes' do - result = Facter::Resolvers::Macosx::SwapMemory.resolve(:available_bytes) - expect(result).to eq(available_bytes) + expect(swap_memory.resolve(:available_bytes)).to eq(available_bytes) end it 'returns total swap memory in bytes' do - result = Facter::Resolvers::Macosx::SwapMemory.resolve(:total_bytes) - expect(result).to eq(total_bytes) + expect(swap_memory.resolve(:total_bytes)).to eq(total_bytes) end it 'returns used swap memory in bytes' do - result = Facter::Resolvers::Macosx::SwapMemory.resolve(:used_bytes) - expect(result).to eq(used_bytes) + expect(swap_memory.resolve(:used_bytes)).to eq(used_bytes) end it 'returns capacity of swap memory' do - result = Facter::Resolvers::Macosx::SwapMemory.resolve(:capacity) - expect(result).to eq(capacity) + expect(swap_memory.resolve(:capacity)).to eq(capacity) end it 'returns true because swap memory is encrypted' do - result = Facter::Resolvers::Macosx::SwapMemory.resolve(:encrypted) - expect(result).to eq(encrypted) + expect(swap_memory.resolve(:encrypted)).to eq(encrypted) end end diff --git a/spec/facter/resolvers/macosx/system_memory_resolver_spec.rb b/spec/facter/resolvers/macosx/system_memory_resolver_spec.rb index db6a70452..76948ebec 100644 --- a/spec/facter/resolvers/macosx/system_memory_resolver_spec.rb +++ b/spec/facter/resolvers/macosx/system_memory_resolver_spec.rb @@ -1,38 +1,38 @@ # frozen_string_literal: true describe Facter::Resolvers::Macosx::SystemMemory do + subject(:system_memory) { Facter::Resolvers::Macosx::SystemMemory } + + let(:log_spy) { instance_spy(Facter::Log) } let(:available_bytes) { 5_590_519_808 } let(:total_bytes) { 34_359_738_368 } let(:used_bytes) { 28_769_218_560 } let(:capacity) { '83.73%' } before do - allow(Open3).to receive(:capture2) - .with('sysctl -n hw.memsize') - .and_return(['34359738368', '']) + system_memory.instance_variable_set(:@log, log_spy) + allow(Facter::Core::Execution).to receive(:execute) + .with('sysctl -n hw.memsize', logger: log_spy) + .and_return('34359738368') - allow(Open3).to receive(:capture2) - .with('vm_stat') - .and_return([load_fixture('vm_stat').read, '']) + allow(Facter::Core::Execution).to receive(:execute) + .with('vm_stat', logger: log_spy) + .and_return(load_fixture('vm_stat').read) end it 'returns available system memory in bytes' do - result = Facter::Resolvers::Macosx::SystemMemory.resolve(:available_bytes) - expect(result).to eq(available_bytes) + expect(system_memory.resolve(:available_bytes)).to eq(available_bytes) end it 'returns total system memory in bytes' do - result = Facter::Resolvers::Macosx::SystemMemory.resolve(:total_bytes) - expect(result).to eq(total_bytes) + expect(system_memory.resolve(:total_bytes)).to eq(total_bytes) end it 'returns used system memory in bytes' do - result = Facter::Resolvers::Macosx::SystemMemory.resolve(:used_bytes) - expect(result).to eq(used_bytes) + expect(system_memory.resolve(:used_bytes)).to eq(used_bytes) end it 'returns memory capacity' do - result = Facter::Resolvers::Macosx::SystemMemory.resolve(:capacity) - expect(result).to eq(capacity) + expect(system_memory.resolve(:capacity)).to eq(capacity) end end diff --git a/spec/facter/resolvers/networking_linux_resolver_spec.rb b/spec/facter/resolvers/networking_linux_resolver_spec.rb index 770271867..b85a9faf0 100644 --- a/spec/facter/resolvers/networking_linux_resolver_spec.rb +++ b/spec/facter/resolvers/networking_linux_resolver_spec.rb @@ -1,19 +1,26 @@ # frozen_string_literal: true describe Facter::Resolvers::NetworkingLinux do + subject(:networking_linux) { Facter::Resolvers::NetworkingLinux } + + let(:log_spy) { instance_spy(Facter::Log) } + describe '#resolve' do before do - allow(Open3).to receive(:capture2) - .with('ip -o address') + networking_linux.instance_variable_set(:@log, log_spy) + allow(Facter::Core::Execution).to receive(:execute) + .with('ip -o address', logger: log_spy) .and_return(load_fixture('ip_o_address_linux').read) - allow(Open3).to receive(:capture2) - .with('ip route get 1') + allow(Facter::Core::Execution).to receive(:execute) + .with('ip route get 1', logger: log_spy) .and_return(load_fixture('ip_route_get_1_linux').read) - allow(Open3).to receive(:capture2) - .with('ip link show ens160') + allow(Facter::Core::Execution).to receive(:execute) + .with('ip link show ens160', logger: log_spy) .and_return(load_fixture('ip_address_linux').read) + end - Facter::Resolvers::NetworkingLinux.invalidate_cache + after do + networking_linux.invalidate_cache end let(:result) do @@ -42,33 +49,35 @@ let(:macaddress) { '00:50:56:9a:ec:fb' } it 'returns the default ip' do - expect(Facter::Resolvers::NetworkingLinux.resolve(:ip)).to eq('10.16.122.163') + expect(networking_linux.resolve(:ip)).to eq('10.16.122.163') end it 'returns all the interfaces' do - expect(Facter::Resolvers::NetworkingLinux.resolve(:interfaces)).to eq(result) + expect(networking_linux.resolve(:interfaces)).to eq(result) end it 'return macaddress' do - expect(Facter::Resolvers::NetworkingLinux.resolve(:macaddress)).to eq(macaddress) + expect(networking_linux.resolve(:macaddress)).to eq(macaddress) end context 'when caching' do it 'returns from cache' do - Facter::Resolvers::NetworkingLinux.resolve(:ip) - Facter::Resolvers::NetworkingLinux.resolve(:ip) + networking_linux.resolve(:ip) + networking_linux.resolve(:ip) - expect(Open3).to have_received(:capture2).with('ip route get 1').once + expect(Facter::Core::Execution).to have_received(:execute) + .with('ip route get 1', logger: log_spy).once end end context 'when invalidate caching' do it 'resolved again the fact' do - Facter::Resolvers::NetworkingLinux.resolve(:ip) - Facter::Resolvers::NetworkingLinux.invalidate_cache - Facter::Resolvers::NetworkingLinux.resolve(:ip) + networking_linux.resolve(:ip) + networking_linux.invalidate_cache + networking_linux.resolve(:ip) - expect(Open3).to have_received(:capture2).with('ip route get 1').twice + expect(Facter::Core::Execution).to have_received(:execute) + .with('ip route get 1', logger: log_spy).twice end end end diff --git a/spec/facter/resolvers/os_level_resolver_spec.rb b/spec/facter/resolvers/os_level_resolver_spec.rb index 50bf79202..2423aff85 100644 --- a/spec/facter/resolvers/os_level_resolver_spec.rb +++ b/spec/facter/resolvers/os_level_resolver_spec.rb @@ -1,15 +1,18 @@ # frozen_string_literal: true describe Facter::Resolvers::OsLevel do + subject(:os_level) { Facter::Resolvers::OsLevel } + + let(:log_spy) { instance_spy(Facter::Log) } + before do - allow(Open3).to receive(:capture2) - .with('/usr/bin/oslevel -s 2>/dev/null') + os_level.instance_variable_set(:@log, log_spy) + allow(Facter::Core::Execution).to receive(:execute) + .with('/usr/bin/oslevel -s', logger: log_spy) .and_return('build') end it 'returns build' do - result = Facter::Resolvers::OsLevel.resolve(:build) - - expect(result).to eq('build') + expect(os_level.resolve(:build)).to eq('build') end end diff --git a/spec/facter/resolvers/redhat_release_resolver_spec.rb b/spec/facter/resolvers/redhat_release_resolver_spec.rb index 279683c4e..866cf02b0 100644 --- a/spec/facter/resolvers/redhat_release_resolver_spec.rb +++ b/spec/facter/resolvers/redhat_release_resolver_spec.rb @@ -1,6 +1,10 @@ # frozen_string_literal: true describe Facter::Resolvers::RedHatRelease do + subject(:redhat_release) { Facter::Resolvers::RedHatRelease } + + let(:log_spy) { instance_spy(Facter::Log) } + before do allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/etc/redhat-release', nil) @@ -8,20 +12,14 @@ end it 'returns os NAME' do - result = Facter::Resolvers::RedHatRelease.resolve(:name) - - expect(result).to eq('RedHat') + expect(redhat_release.resolve(:name)).to eq('RedHat') end it 'returns os VERSION_ID' do - result = Facter::Resolvers::RedHatRelease.resolve(:version) - - expect(result).to eq('5.10') + expect(redhat_release.resolve(:version)).to eq('5.10') end it 'returns os VERSION_CODENAME' do - result = Facter::Resolvers::RedHatRelease.resolve(:codename) - - expect(result).to eq('Tikanga') + expect(redhat_release.resolve(:codename)).to eq('Tikanga') end end diff --git a/spec/facter/resolvers/selinux_resolver_spec.rb b/spec/facter/resolvers/selinux_resolver_spec.rb index 685e688f3..031650826 100644 --- a/spec/facter/resolvers/selinux_resolver_spec.rb +++ b/spec/facter/resolvers/selinux_resolver_spec.rb @@ -1,55 +1,53 @@ # frozen_string_literal: true describe Facter::Resolvers::SELinux do + subject(:selinux_resolver) { Facter::Resolvers::SELinux } + + let(:log_spy) { instance_spy(Facter::Log) } + after do - Facter::Resolvers::SELinux.invalidate_cache + selinux_resolver.invalidate_cache + end + + before do + selinux_resolver.instance_variable_set(:@log, log_spy) + allow(Facter::Core::Execution).to receive(:execute) + .with('cat /proc/self/mounts', logger: log_spy) + .and_return(load_fixture(file).read) end context 'when selinux is disabled' do - before do - allow(Open3).to receive(:capture2) - .with('cat /proc/self/mounts') - .and_return(load_fixture('proc_self_mounts').read) - end + let(:file) { 'proc_self_mounts' } it 'returns false when selinux is not enabled' do - result = Facter::Resolvers::SELinux.resolve(:enabled) - - expect(result).to be(false) + expect(selinux_resolver.resolve(:enabled)).to be(false) end it 'returns nil for config_mode' do - result = Facter::Resolvers::SELinux.resolve(:config_mode) - - expect(result).to be(nil) + expect(selinux_resolver.resolve(:config_mode)).to be(nil) end end context 'when selinux is enabled but selinux/config file does not exists' do + let(:file) { 'proc_self_mounts_selinux' } + before do - allow(Open3).to receive(:capture2) - .with('cat /proc/self/mounts') - .and_return(load_fixture('proc_self_mounts_selinux').read) allow(Facter::Util::FileHelper).to receive(:safe_readlines).with('/etc/selinux/config').and_return([]) end it 'returns true when selinux is enabled' do - result = Facter::Resolvers::SELinux.resolve(:enabled) - - expect(result).to be(true) + expect(selinux_resolver.resolve(:enabled)).to be(true) end it 'returns nil for config_mode' do - result = Facter::Resolvers::SELinux.resolve(:config_mode) - - expect(result).to be(nil) + expect(selinux_resolver.resolve(:config_mode)).to be(nil) end end context 'when selinux is enabled and selinux/config file exists' do + let(:file) { 'proc_self_mounts_selinux' } + before do - allow(Open3).to receive(:capture2) - .with('cat /proc/self/mounts').and_return(load_fixture('proc_self_mounts_selinux').read) allow(Facter::Util::FileHelper).to receive(:safe_readlines) .with('/etc/selinux/config').and_return(load_fixture('selinux_config').readlines) allow(Facter::Util::FileHelper).to receive(:safe_read) @@ -59,46 +57,34 @@ end it 'returns enabled true' do - result = Facter::Resolvers::SELinux.resolve(:enabled) - - expect(result).to be(true) + expect(selinux_resolver.resolve(:enabled)).to be(true) end it 'returns config_mode enabled' do - result = Facter::Resolvers::SELinux.resolve(:config_mode) - - expect(result).to eql('enabled') + expect(selinux_resolver.resolve(:config_mode)).to eql('enabled') end it 'returns config_policy targeted' do - result = Facter::Resolvers::SELinux.resolve(:config_policy) - - expect(result).to eql('targeted') + expect(selinux_resolver.resolve(:config_policy)).to eql('targeted') end it 'returns policy_version 31' do - result = Facter::Resolvers::SELinux.resolve(:policy_version) - - expect(result).to eql('31') + expect(selinux_resolver.resolve(:policy_version)).to eql('31') end it 'returns enforced true' do - result = Facter::Resolvers::SELinux.resolve(:enforced) - - expect(result).to be(true) + expect(selinux_resolver.resolve(:enforced)).to be(true) end it 'returns current_mode enforcing' do - result = Facter::Resolvers::SELinux.resolve(:current_mode) - - expect(result).to eql('enforcing') + expect(selinux_resolver.resolve(:current_mode)).to eql('enforcing') end end context 'when selinux is enabled but enforce and policyvers files are not readable' do + let(:file) { 'proc_self_mounts_selinux' } + before do - allow(Open3).to receive(:capture2) - .with('cat /proc/self/mounts').and_return(load_fixture('proc_self_mounts_selinux').read) allow(Facter::Util::FileHelper).to receive(:safe_readlines) .with('/etc/selinux/config').and_return(load_fixture('selinux_config').read.split("\n")) allow(Facter::Util::FileHelper).to receive(:safe_read) @@ -108,21 +94,15 @@ end it 'returns no policy_version' do - result = Facter::Resolvers::SELinux.resolve(:policy_version) - - expect(result).to be(nil) + expect(selinux_resolver.resolve(:policy_version)).to be(nil) end it 'returns enforced false' do - result = Facter::Resolvers::SELinux.resolve(:enforced) - - expect(result).to be(false) + expect(selinux_resolver.resolve(:enforced)).to be(false) end it 'returns current_mode enforcing on permissive' do - result = Facter::Resolvers::SELinux.resolve(:current_mode) - - expect(result).to eql('permissive') + expect(selinux_resolver.resolve(:current_mode)).to eql('permissive') end end end diff --git a/spec/facter/resolvers/solaris/current_zone_resolver_spec.rb b/spec/facter/resolvers/solaris/current_zone_resolver_spec.rb deleted file mode 100644 index 6302f596f..000000000 --- a/spec/facter/resolvers/solaris/current_zone_resolver_spec.rb +++ /dev/null @@ -1,28 +0,0 @@ -# frozen_string_literal: true - -describe Facter::Resolvers::SolarisZone do - before do - status = double(Process::Status, to_s: st) - allow(File).to receive(:executable?) - .with('/bin/zonename') - .and_return(true) - allow(Open3).to receive(:capture2) - .with('/bin/zonename') - .and_return([zone_name_output, status]) - end - - after do - Facter::Resolvers::SolarisZone.invalidate_cache - end - - context 'when can resolve zone facts' do - let(:zone_name_output) { 'global' } - let(:st) { 'exit 0' } - - it 'returns zone fact' do - fact = 'global' - result = Facter::Resolvers::SolarisZoneName.resolve(:current_zone_name) - expect(result).to eq(fact) - end - end -end diff --git a/spec/facter/resolvers/solaris/filesystem_resolver_spec.rb b/spec/facter/resolvers/solaris/filesystem_resolver_spec.rb index 229d63f46..5af6315d8 100644 --- a/spec/facter/resolvers/solaris/filesystem_resolver_spec.rb +++ b/spec/facter/resolvers/solaris/filesystem_resolver_spec.rb @@ -1,18 +1,20 @@ # frozen_string_literal: true describe Facter::Resolvers::Solaris::Filesystem do + subject(:filesystems_resolver) { Facter::Resolvers::Solaris::Filesystem } + let(:filesystems) { 'hsfs,nfs,pcfs,udfs,ufs' } + let(:log_spy) { instance_spy(Facter::Log) } before do + filesystems_resolver.instance_variable_set(:@log, log_spy) allow(File).to receive(:executable?).with('/usr/sbin/sysdef').and_return(true) - allow(Open3).to receive(:capture2) - .with('/usr/sbin/sysdef') + allow(Facter::Core::Execution).to receive(:execute) + .with('/usr/sbin/sysdef', logger: log_spy) .and_return(load_fixture('solaris_filesystems').read) end it 'returns filesystems' do - result = Facter::Resolvers::Solaris::Filesystem.resolve(:file_systems) - - expect(result).to eq(filesystems) + expect(filesystems_resolver.resolve(:file_systems)).to eq(filesystems) end end diff --git a/spec/facter/resolvers/solaris/ipaddress_resolver_spec.rb b/spec/facter/resolvers/solaris/ipaddress_resolver_spec.rb index 8881066ed..b23facdc8 100644 --- a/spec/facter/resolvers/solaris/ipaddress_resolver_spec.rb +++ b/spec/facter/resolvers/solaris/ipaddress_resolver_spec.rb @@ -1,19 +1,31 @@ # frozen_string_literal: true describe Facter::Resolvers::Solaris::Ipaddress do + subject(:ipaddress) { Facter::Resolvers::Solaris::Ipaddress } + + let(:log) { instance_spy(Facter::Log) } + describe '#resolve' do after do - Facter::Resolvers::Solaris::Ipaddress.invalidate_cache + ipaddress.invalidate_cache + end + + before do + ipaddress.instance_variable_set(:@log, log) + allow(Facter::Core::Execution).to receive(:execute).with('route -n get default | grep interface', + logger: log).and_return(route) end context 'when returns ip' do let(:route) { ' interface: net0' } let(:ifconfig) { load_fixture('solaris_ifconfig').read } + before do + allow(Facter::Core::Execution).to receive(:execute).with('ifconfig net0', logger: log).and_return(ifconfig) + end + it 'detects ipadress' do - allow(Open3).to receive(:capture2).with('route -n get default | grep interface').and_return(route) - allow(Open3).to receive(:capture2).with('ifconfig net0').and_return(ifconfig) - expect(Facter::Resolvers::Solaris::Ipaddress.resolve(:ip)).to eql('10.16.115.67') + expect(ipaddress.resolve(:ip)).to eql('10.16.115.67') end end @@ -21,8 +33,7 @@ let(:route) { 'invalid output' } it 'detects that ip is nil' do - allow(Open3).to receive(:capture2).with('route -n get default | grep interface').and_return(route) - expect(Facter::Resolvers::Solaris::Ipaddress.resolve(:ip)).to be(nil) + expect(ipaddress.resolve(:ip)).to be(nil) end end end diff --git a/spec/facter/resolvers/solaris/processors_spec.rb b/spec/facter/resolvers/solaris/processors_spec.rb index 98997fe7d..274d7d94c 100644 --- a/spec/facter/resolvers/solaris/processors_spec.rb +++ b/spec/facter/resolvers/solaris/processors_spec.rb @@ -3,16 +3,12 @@ describe Facter::Resolvers::Solaris::Processors do subject(:resolver) { Facter::Resolvers::Solaris::Processors } - let(:log_spy) { instance_spy(Facter::Log) } - before do allow(File).to receive(:executable?).with('/usr/bin/kstat').and_return(status) - allow(Open3) - .to receive(:capture3) - .with('/usr/bin/kstat -m cpu_info') + allow(Facter::Core::Execution) + .to receive(:execute) + .with('/usr/bin/kstat -m cpu_info', logger: resolver.log) .and_return(output) - - resolver.instance_variable_set(:@log, log_spy) end after do @@ -26,7 +22,7 @@ end let(:physical_processors) { 2 } let(:speed_expected) { 1_995_246_617 } - let(:output) { [load_fixture('kstat_cpu').read, '', 0] } + let(:output) { load_fixture('kstat_cpu').read } let(:status) { true } it 'returns number of processors' do @@ -47,7 +43,7 @@ end context 'when kstat is not present' do - let(:output) {} + let(:output) { '' } let(:status) { false } it 'returns nil' do @@ -56,18 +52,11 @@ end context 'when kstat is present but fails' do - let(:output) { ['', 'kstat failed!', 1] } + let(:output) { '' } let(:status) { true } it 'returns nil' do expect(resolver.resolve(:models)).to be_nil end - - it 'logs error message' do - resolver.resolve(:models) - - expect(log_spy).to have_received(:debug).with('Command /usr/bin/kstat failed '\ - 'with error message: kstat failed!') - end end end diff --git a/spec/facter/resolvers/solaris/solaris_release_resolver_spec.rb b/spec/facter/resolvers/solaris/solaris_release_resolver_spec.rb index 9cb91f4a8..6920a23e5 100644 --- a/spec/facter/resolvers/solaris/solaris_release_resolver_spec.rb +++ b/spec/facter/resolvers/solaris/solaris_release_resolver_spec.rb @@ -1,83 +1,55 @@ # frozen_string_literal: true describe Facter::Resolvers::SolarisRelease do - let(:logger) { instance_spy(Facter::Log) } + subject(:solaris_release) { Facter::Resolvers::SolarisRelease } before do - status = double(Process::Status, to_s: st) - allow(Open3).to receive(:capture2) - .with('cat /etc/release') - .and_return([output, status]) - Facter::Resolvers::SolarisRelease.instance_variable_set(:@log, logger) + allow(Facter::Util::FileHelper).to receive(:safe_read) + .with('/etc/release', nil) + .and_return(output) end after do - Facter::Resolvers::SolarisRelease.invalidate_cache + solaris_release.invalidate_cache end context 'when can resolve os release facts' do let(:output) { load_fixture('os_release_solaris').read } - let(:st) { 'exit 0' } it 'returns os FULL' do - result = Facter::Resolvers::SolarisRelease.resolve(:full) - - expect(result).to eq('10_u11') + expect(solaris_release.resolve(:full)).to eq('10_u11') end it 'returns os MINOR' do - result = Facter::Resolvers::SolarisRelease.resolve(:minor) - - expect(result).to eq('11') + expect(solaris_release.resolve(:minor)).to eq('11') end it 'returns os MAJOR' do - result = Facter::Resolvers::SolarisRelease.resolve(:major) - expect(result).to eq('10') + expect(solaris_release.resolve(:major)).to eq('10') end end context 'when os release ends with no minor version' do let(:output) { 'Oracle Solaris 11 X86' } - let(:st) { 'exit 0' } it 'returns append 0 to minor version if no minor version is in file but regex pattern matches' do - result = Facter::Resolvers::SolarisRelease.resolve(:full) - expect(result).to eq('11.0') + expect(solaris_release.resolve(:full)).to eq('11.0') end end context 'when trying to read os release file has exit status == 0 but file is empty' do let(:output) { '' } - let(:st) { 'exit 0' } it 'returns result nil if file is empty' do - allow(logger).to receive(:error) - .with('Could not build release fact because of missing or empty file /etc/release') - result = Facter::Resolvers::SolarisRelease.resolve(:full) - expect(result).to eq(nil) - end - end - - context 'when trying to read os release file has exit status != 0' do - let(:output) { '' } - let(:st) { 'exit 1' } - - it 'returns result nil if exit status != 0' do - allow(logger).to receive(:error) - .with('Could not build release fact because of missing or empty file /etc/release') - result = Facter::Resolvers::SolarisRelease.resolve(:full) - expect(result).to eq(nil) + expect(solaris_release.resolve(:full)).to eq(nil) end end context 'when the result from the os file release has no valid data' do let(:output) { 'test test' } - let(:st) { 'exit 0' } it 'returns nil in case the file returns invalid data' do - result = Facter::Resolvers::SolarisRelease.resolve(:full) - expect(result).to eq(nil) + expect(solaris_release.resolve(:full)).to eq(nil) end end end diff --git a/spec/facter/resolvers/solaris/solaris_zone_name_spec.rb b/spec/facter/resolvers/solaris/solaris_zone_name_spec.rb new file mode 100644 index 000000000..5ed40a966 --- /dev/null +++ b/spec/facter/resolvers/solaris/solaris_zone_name_spec.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +describe Facter::Resolvers::SolarisZoneName do + subject(:solaris_zone) { Facter::Resolvers::SolarisZoneName } + + let(:zone_name_output) { 'global' } + let(:log_spy) { instance_spy(Facter::Log) } + + before do + solaris_zone.instance_variable_set(:@log, log_spy) + allow(File).to receive(:executable?) + .with('/bin/zonename') + .and_return(true) + allow(Facter::Core::Execution).to receive(:execute) + .with('/bin/zonename', logger: log_spy) + .ordered + .and_return(zone_name_output) + end + + after do + solaris_zone.invalidate_cache + end + + context 'when can resolve zone facts' do + it 'returns zone fact' do + expect(solaris_zone.resolve(:current_zone_name)).to eq(zone_name_output) + end + end +end diff --git a/spec/facter/resolvers/solaris/zfs_resolver_spec.rb b/spec/facter/resolvers/solaris/zfs_resolver_spec.rb index 28e950cae..9690ef346 100644 --- a/spec/facter/resolvers/solaris/zfs_resolver_spec.rb +++ b/spec/facter/resolvers/solaris/zfs_resolver_spec.rb @@ -1,44 +1,43 @@ # frozen_string_literal: true describe Facter::Resolvers::Solaris::ZFS do + subject(:zfs_resolver) { Facter::Resolvers::Solaris::ZFS } + + let(:log_spy) { instance_spy(Facter::Log) } + before do - status = double(Process::Status, to_s: st) - allow(Open3).to receive(:capture2) - .with('zfs upgrade -v') - .and_return([output, status]) + zfs_resolver.instance_variable_set(:@log, log_spy) + allow(Facter::Core::Execution).to receive(:execute) + .with('zfs upgrade -v', logger: log_spy) + .ordered + .and_return(output) end after do - Facter::Resolvers::Solaris::ZFS.invalidate_cache + zfs_resolver.invalidate_cache end - let(:st) { 'exit 0' } - context 'when zfs command is found' do let(:output) { load_fixture('zfs').read } it 'returns zfs version fact' do - result = Facter::Resolvers::Solaris::ZFS.resolve(:zfs_version) - expect(result).to eq('6') + expect(zfs_resolver.resolve(:zfs_version)).to eq('6') end it 'returns zfs featurenumbers fact' do - result = Facter::Resolvers::Solaris::ZFS.resolve(:zfs_featurenumbers) - expect(result).to eq('1,2,3,4,5,6') + expect(zfs_resolver.resolve(:zfs_featurenumbers)).to eq('1,2,3,4,5,6') end end context 'when zfs command is not found' do - let(:output) { 'zfs command not found' } + let(:output) { '' } it 'returns nil for zfs version fact' do - result = Facter::Resolvers::Solaris::ZFS.resolve(:zfs_version) - expect(result).to eq(nil) + expect(zfs_resolver.resolve(:zfs_version)).to eq(nil) end it 'returns nil for zfs featurenumbers fact' do - result = Facter::Resolvers::Solaris::ZFS.resolve(:zfs_featurenumbers) - expect(result).to eq(nil) + expect(zfs_resolver.resolve(:zfs_featurenumbers)).to eq(nil) end end end diff --git a/spec/facter/resolvers/solaris/zone_resolver_spec.rb b/spec/facter/resolvers/solaris/zone_resolver_spec.rb index 3dd82206d..7e092cc35 100644 --- a/spec/facter/resolvers/solaris/zone_resolver_spec.rb +++ b/spec/facter/resolvers/solaris/zone_resolver_spec.rb @@ -1,34 +1,46 @@ # frozen_string_literal: true describe Facter::Resolvers::SolarisZone do + subject(:solaris_zone) { Facter::Resolvers::SolarisZone } + + let(:log_spy) { instance_spy(Facter::Log) } + before do - status = double(Process::Status, to_s: st) - allow(File).to receive(:executable?) - .with('/usr/sbin/zoneadm') - .and_return(true) - allow(Open3).to receive(:capture2) - .with('/usr/sbin/zoneadm list -cp') - .and_return([output, status]) + solaris_zone.instance_variable_set(:@log, log_spy) + allow(Facter::Core::Execution).to receive(:execute) + .with('/usr/sbin/zoneadm list -cp', logger: log_spy) + .ordered + .and_return(output) end after do - Facter::Resolvers::SolarisZone.invalidate_cache + solaris_zone.invalidate_cache end context 'when it can resolve zone facts' do let(:output) { '0:global:running:/::solaris:shared:-:none:' } - let(:st) { 'exit 0' } + let(:zone) do + [{ brand: 'solaris', + id: '0', + iptype: 'shared', + name: 'global', + uuid: '', + status: 'running', + path: '/' }] + end it 'returns zone fact' do - hash_fact = [{ brand: 'solaris', - id: '0', - iptype: 'shared', - name: 'global', - uuid: '', - status: 'running', - path: '/' }] - result = Facter::Resolvers::SolarisZone.resolve(:zone) - expect(result).to eq(hash_fact) + expect(solaris_zone.resolve(:zone)).to eq(zone) + end + end + + context 'when it can not resolve zone facts' do + let(:output) { '' } + + it 'prints debug message' do + solaris_zone.resolve(:zone) + expect(log_spy).to have_received(:debug) + .with('Command /usr/sbin/zoneadm list -cp returned an empty result') end end end diff --git a/spec/facter/resolvers/solaris/zpool_resolver_spec.rb b/spec/facter/resolvers/solaris/zpool_resolver_spec.rb index dc2c39f6a..15f66b940 100644 --- a/spec/facter/resolvers/solaris/zpool_resolver_spec.rb +++ b/spec/facter/resolvers/solaris/zpool_resolver_spec.rb @@ -1,31 +1,32 @@ # frozen_string_literal: true describe Facter::Resolvers::Solaris::ZPool do + subject(:zpool_resolver) { Facter::Resolvers::Solaris::ZPool } + + let(:log_spy) { instance_spy(Facter::Log) } + before do - status = double(Process::Status, to_s: st) - allow(Open3).to receive(:capture2) - .with('zpool upgrade -v') - .and_return([output, status]) + zpool_resolver.instance_variable_set(:@log, log_spy) + allow(Facter::Core::Execution).to receive(:execute) + .with('zpool upgrade -v', logger: log_spy) + .ordered + .and_return(output) end after do Facter::Resolvers::Solaris::ZPool.invalidate_cache end - let(:st) { 'exit 0' } - context 'when zpool command is found' do let(:output) { load_fixture('zpool').read } it 'return zpool version fact' do - result = Facter::Resolvers::Solaris::ZPool.resolve(:zpool_version) - expect(result).to eq('34') + expect(zpool_resolver.resolve(:zpool_version)).to eq('34') end it 'return zpool featurenumbers fact' do - result = Facter::Resolvers::Solaris::ZPool.resolve(:zpool_featurenumbers) - expect(result).to eq('1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,' \ - '24,25,26,27,28,29,30,31,32,33,34') + expect(zpool_resolver.resolve(:zpool_featurenumbers)).to eq('1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,'\ + '18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34') end context 'when zpool has featureflags' do @@ -52,13 +53,11 @@ let(:output) { 'zpool command not found' } it 'returns nil for zpool version fact' do - result = Facter::Resolvers::Solaris::ZPool.resolve(:zpool_version) - expect(result).to eq(nil) + expect(zpool_resolver.resolve(:zpool_version)).to eq(nil) end it 'returns nil for zpool featureversion fact' do - result = Facter::Resolvers::Solaris::ZPool.resolve(:zpool_featurenumbers) - expect(result).to eq(nil) + expect(zpool_resolver.resolve(:zpool_featurenumbers)).to eq(nil) end end end diff --git a/spec/facter/resolvers/suse_relese_resolver_spec.rb b/spec/facter/resolvers/suse_relese_resolver_spec.rb index dfe6a3eae..45a01b6ae 100644 --- a/spec/facter/resolvers/suse_relese_resolver_spec.rb +++ b/spec/facter/resolvers/suse_relese_resolver_spec.rb @@ -1,6 +1,10 @@ # frozen_string_literal: true describe Facter::Resolvers::SuseRelease do + subject(:suse_release) { Facter::Resolvers::SuseRelease } + + let(:log_spy) { instance_spy(Facter::Log) } + before do allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/etc/SuSE-release', nil) @@ -9,20 +13,14 @@ end it 'returns os NAME' do - result = Facter::Resolvers::SuseRelease.resolve(:name) - - expect(result).to eq('openSUSE') + expect(suse_release.resolve(:name)).to eq('openSUSE') end it 'returns os VERSION_ID' do - result = Facter::Resolvers::SuseRelease.resolve(:version) - - expect(result).to eq('11.1') + expect(suse_release.resolve(:version)).to eq('11.1') end it 'returns the identifier' do - result = Facter::Resolvers::SuseRelease.resolve(:identifier) - - expect(result).to eq('opensuse') + expect(suse_release.resolve(:identifier)).to eq('opensuse') end end diff --git a/spec/facter/resolvers/sw_vers_resolver_spec.rb b/spec/facter/resolvers/sw_vers_resolver_spec.rb index 2e0601da1..6b9671f04 100644 --- a/spec/facter/resolvers/sw_vers_resolver_spec.rb +++ b/spec/facter/resolvers/sw_vers_resolver_spec.rb @@ -1,27 +1,26 @@ # frozen_string_literal: true describe Facter::Resolvers::SwVers do + subject(:sw_vers) { Facter::Resolvers::SwVers } + + let(:log_spy) { instance_spy(Facter::Log) } + before do - allow(Open3).to receive(:capture2) - .with('sw_vers') + sw_vers.instance_variable_set(:@log, log_spy) + allow(Facter::Core::Execution).to receive(:execute) + .with('sw_vers', logger: log_spy) .and_return("ProductName:\tMac OS X\nProductVersion:\t10.14.1\nBuildVersion:\t18B75\n") end it 'returns os ProductName' do - result = Facter::Resolvers::SwVers.resolve(:productname) - - expect(result).to eq('Mac OS X') + expect(sw_vers.resolve(:productname)).to eq('Mac OS X') end it 'returns os ProductVersion' do - result = Facter::Resolvers::SwVers.resolve(:productversion) - - expect(result).to eq('10.14.1') + expect(sw_vers.resolve(:productversion)).to eq('10.14.1') end it 'returns os BuildVersion' do - result = Facter::Resolvers::SwVers.resolve(:buildversion) - - expect(result).to eq('18B75') + expect(sw_vers.resolve(:buildversion)).to eq('18B75') end end diff --git a/spec/facter/resolvers/system_profile_resolver_spec.rb b/spec/facter/resolvers/system_profile_resolver_spec.rb index 433310ec3..06923feee 100644 --- a/spec/facter/resolvers/system_profile_resolver_spec.rb +++ b/spec/facter/resolvers/system_profile_resolver_spec.rb @@ -1,135 +1,98 @@ # frozen_string_literal: true describe Facter::Resolvers::SystemProfiler do + subject(:system_profiler) { Facter::Resolvers::SystemProfiler } + + let(:log_spy) { instance_spy(Facter::Log) } + before do - allow(Open3).to receive(:capture2) - .with('system_profiler SPHardwareDataType SPSoftwareDataType') + system_profiler.instance_variable_set(:@log, log_spy) + allow(Facter::Core::Execution).to receive(:execute) + .with('system_profiler SPHardwareDataType SPSoftwareDataType', logger: log_spy) .and_return(load_fixture('system_profiler').read) end it 'returns boot_mode' do - result = Facter::Resolvers::SystemProfiler.resolve(:boot_mode) - - expect(result).to eq('Normal') + expect(system_profiler.resolve(:boot_mode)).to eq('Normal') end it 'returns boot_rom_version' do - result = Facter::Resolvers::SystemProfiler.resolve(:boot_rom_version) - - expect(result).to eq('1037.60.58.0.0 (iBridge: 17.16.12551.0.0,0)') + expect(system_profiler.resolve(:boot_rom_version)).to eq('1037.60.58.0.0 (iBridge: 17.16.12551.0.0,0)') end it 'returns boot_volume' do - result = Facter::Resolvers::SystemProfiler.resolve(:boot_volume) - - expect(result).to eq('Macintosh HD') + expect(system_profiler.resolve(:boot_volume)).to eq('Macintosh HD') end it 'returns computer_name' do - result = Facter::Resolvers::SystemProfiler.resolve(:computer_name) - - expect(result).to eq('Test1’s MacBook Pro') + expect(system_profiler.resolve(:computer_name)).to eq('Test1’s MacBook Pro') end it 'returns cores' do - result = Facter::Resolvers::SystemProfiler.resolve(:total_number_of_cores) - - expect(result).to eq('4') + expect(system_profiler.resolve(:total_number_of_cores)).to eq('4') end it 'returns hardware_uuid' do - result = Facter::Resolvers::SystemProfiler.resolve(:hardware_uuid) - - expect(result).to eq('12345678-1111-2222-AAAA-AABBCCDDEEFF') + expect(system_profiler.resolve(:hardware_uuid)).to eq('12345678-1111-2222-AAAA-AABBCCDDEEFF') end it 'returns kernel_version' do - result = Facter::Resolvers::SystemProfiler.resolve(:kernel_version) - - expect(result).to eq('Darwin 19.2.0') + expect(system_profiler.resolve(:kernel_version)).to eq('Darwin 19.2.0') end it 'returns l2_cache_per_core' do - result = Facter::Resolvers::SystemProfiler.resolve(:l2_cache_per_core) - - expect(result).to eq('256 KB') + expect(system_profiler.resolve(:l2_cache_per_core)).to eq('256 KB') end it 'returns l3_cache' do - result = Facter::Resolvers::SystemProfiler.resolve(:l3_cache) - - expect(result).to eq('6 MB') + expect(system_profiler.resolve(:l3_cache)).to eq('6 MB') end it 'returns memory' do - result = Facter::Resolvers::SystemProfiler.resolve(:memory) - - expect(result).to eq('16 GB') + expect(system_profiler.resolve(:memory)).to eq('16 GB') end it 'returns model_identifier' do - result = Facter::Resolvers::SystemProfiler.resolve(:model_identifier) - - expect(result).to eq('MacBookPro11,4') + expect(system_profiler.resolve(:model_identifier)).to eq('MacBookPro11,4') end it 'returns model_name' do - result = Facter::Resolvers::SystemProfiler.resolve(:model_name) - - expect(result).to eq('MacBook Pro') + expect(system_profiler.resolve(:model_name)).to eq('MacBook Pro') end it 'returns processor_name' do - result = Facter::Resolvers::SystemProfiler.resolve(:processor_name) - - expect(result).to eq('Intel Core i7') + expect(system_profiler.resolve(:processor_name)).to eq('Intel Core i7') end it 'returns processor_speed' do - result = Facter::Resolvers::SystemProfiler.resolve(:processor_speed) - - expect(result).to eq('2.8 GHz') + expect(system_profiler.resolve(:processor_speed)).to eq('2.8 GHz') end it 'returns number_of_processors' do - result = Facter::Resolvers::SystemProfiler.resolve(:number_of_processors) - - expect(result).to eq('1') + expect(system_profiler.resolve(:number_of_processors)).to eq('1') end it 'returns secure_virtual_memory' do - result = Facter::Resolvers::SystemProfiler.resolve(:secure_virtual_memory) - - expect(result).to eq('Enabled') + expect(system_profiler.resolve(:secure_virtual_memory)).to eq('Enabled') end it 'returns serial_number' do - result = Facter::Resolvers::SystemProfiler.resolve(:serial_number_system) - - expect(result).to eq('123456789AAA') + expect(system_profiler.resolve(:serial_number_system)).to eq('123456789AAA') end it 'returns smc_version' do - result = Facter::Resolvers::SystemProfiler.resolve(:smc_version_system) - - expect(result).to eq('2.29f24') + expect(system_profiler.resolve(:smc_version_system)).to eq('2.29f24') end it 'returns system_version' do - result = Facter::Resolvers::SystemProfiler.resolve(:system_version) - - expect(result).to eq('macOS 10.15.2 (19C57)') + expect(system_profiler.resolve(:system_version)).to eq('macOS 10.15.2 (19C57)') end it 'returns time_since_boot' do - result = Facter::Resolvers::SystemProfiler.resolve(:time_since_boot) - - expect(result).to eq('3:28') + expect(system_profiler.resolve(:time_since_boot)).to eq('3:28') end it 'returns username' do - result = Facter::Resolvers::SystemProfiler.resolve(:user_name) - - expect(result).to eq('Test1 Test2 (test1.test2)') + expect(system_profiler.resolve(:user_name)).to eq('Test1 Test2 (test1.test2)') end end diff --git a/spec/facter/resolvers/uname_resolver_spec.rb b/spec/facter/resolvers/uname_resolver_spec.rb index 3a3e3fbe1..c239c9755 100644 --- a/spec/facter/resolvers/uname_resolver_spec.rb +++ b/spec/facter/resolvers/uname_resolver_spec.rb @@ -1,14 +1,19 @@ # frozen_string_literal: true describe Facter::Resolvers::Uname do + subject(:uname_resolver) { Facter::Resolvers::Uname } + + let(:log_spy) { Facter::Log } + before do - allow(Open3).to receive(:capture2) + uname_resolver.instance_variable_set(:@log, log_spy) + allow(Facter::Core::Execution).to receive(:execute) .with('uname -m && uname -n && uname -p && uname -r && uname -s && - uname -v') + uname -v', logger: log_spy) .and_return('x86_64 wifi.tsr.corp.puppet.net i386 @@ -18,38 +23,26 @@ end it 'returns machine' do - result = Facter::Resolvers::Uname.resolve(:machine) - - expect(result).to eq('x86_64') + expect(uname_resolver.resolve(:machine)).to eq('x86_64') end it 'returns nodename' do - result = Facter::Resolvers::Uname.resolve(:nodename) - - expect(result).to eq('wifi.tsr.corp.puppet.net') + expect(uname_resolver.resolve(:nodename)).to eq('wifi.tsr.corp.puppet.net') end it 'returns processor' do - result = Facter::Resolvers::Uname.resolve(:processor) - - expect(result).to eq('i386') + expect(uname_resolver.resolve(:processor)).to eq('i386') end it 'returns kernelrelease' do - result = Facter::Resolvers::Uname.resolve(:kernelrelease) - - expect(result).to eq('18.2.0') + expect(uname_resolver.resolve(:kernelrelease)).to eq('18.2.0') end it 'returns kernelname' do - result = Facter::Resolvers::Uname.resolve(:kernelname) - - expect(result).to eq('Darwin') + expect(uname_resolver.resolve(:kernelname)).to eq('Darwin') end it 'returns kernelversion' do - result = Facter::Resolvers::Uname.resolve(:kernelversion) - - expect(result).to include('root:xnu-4903.221.2~2/RELEASE_X86_64') + expect(uname_resolver.resolve(:kernelversion)).to include('root:xnu-4903.221.2~2/RELEASE_X86_64') end end diff --git a/spec/facter/resolvers/utils/aix/odm_query_spec.rb b/spec/facter/resolvers/utils/aix/odm_query_spec.rb index 8a113ad80..e8aab8c34 100644 --- a/spec/facter/resolvers/utils/aix/odm_query_spec.rb +++ b/spec/facter/resolvers/utils/aix/odm_query_spec.rb @@ -2,23 +2,25 @@ describe Facter::ODMQuery do let(:odm_query) { Facter::ODMQuery.new } + let(:log_spy) { instance_spy(Facter::Log) } before do + odm_query.instance_variable_set(:@log, log_spy) stub_const('Facter::ODMQuery::REPOS', ['CuAt']) end it 'creates a query' do odm_query.equals('name', '12345') - expect(Open3).to receive(:capture3).with("odmget -q \"name='12345'\" CuAt") + expect(Facter::Core::Execution).to receive(:execute).with("odmget -q \"name='12345'\" CuAt", logger: log_spy) odm_query.execute end it 'can chain conditions' do odm_query.equals('field1', 'value').like('field2', 'value*') - expect(Open3).to receive(:capture3) - .with("odmget -q \"field1='value' AND field2 like 'value*'\" CuAt") + expect(Facter::Core::Execution).to receive(:execute) + .with("odmget -q \"field1='value' AND field2 like 'value*'\" CuAt", logger: log_spy) odm_query.execute end end diff --git a/spec/facter/resolvers/wpar_resolver_spec.rb b/spec/facter/resolvers/wpar_resolver_spec.rb index e5371ad30..3cc801d12 100644 --- a/spec/facter/resolvers/wpar_resolver_spec.rb +++ b/spec/facter/resolvers/wpar_resolver_spec.rb @@ -1,9 +1,12 @@ # frozen_string_literal: true describe Facter::Resolvers::Wpar do + let(:log_spy) { instance_spy(Facter::Log) } + before do - allow(Open3).to receive(:capture2) - .with('/usr/bin/lparstat -W 2>/dev/null') + Facter::Resolvers::Wpar.instance_variable_set(:@log, log_spy) + allow(Facter::Core::Execution).to receive(:execute) + .with('/usr/bin/lparstat -W', logger: log_spy) .and_return(open3_result) end @@ -12,8 +15,7 @@ end describe '#oslevel 6.1+' do - let(:lparstat_w) { load_fixture('lparstat_w').read } - let(:open3_result) { [lparstat_w, OpenStruct.new(success?: true)] } + let(:open3_result) { load_fixture('lparstat_w').read } it 'returns wpar_key' do expect(Facter::Resolvers::Wpar.resolve(:wpar_key)).to eq(13) @@ -25,7 +27,7 @@ end describe '#oslevel 6.0' do - let(:open3_result) { ['', OpenStruct.new(success?: false)] } + let(:open3_result) { '' } it 'does not return wpar_key' do expect(Facter::Resolvers::Wpar.resolve(:wpar_key)).to be_nil