diff --git a/lib/resolvers/utils/filesystem_helper.rb b/lib/resolvers/utils/filesystem_helper.rb index f52f514d4..b5911f203 100644 --- a/lib/resolvers/utils/filesystem_helper.rb +++ b/lib/resolvers/utils/filesystem_helper.rb @@ -5,24 +5,36 @@ module FilesystemHelper MOUNT_KEYS = %i[device filesystem path options available available_bytes size size_bytes used used_bytes capacity].freeze + class << self + def read_mountpoints + require 'sys/filesystem' + force_utf(Sys::Filesystem.mounts) + end - def self.read_mountpoints - require 'sys/filesystem' - Sys::Filesystem.mounts - end + def read_mountpoint_stats(path) + require 'sys/filesystem' + Sys::Filesystem.stat(path) + end - def self.read_mountpoint_stats(path) - require 'sys/filesystem' - Sys::Filesystem.stat(path) - end + def compute_capacity(used, total) + if used == total + '100%' + elsif used.positive? + "#{format('%.2f', 100.0 * used.to_f / total.to_f)}%" + else + '0%' + end + end + + private - def self.compute_capacity(used, total) - if used == total - '100%' - elsif used.positive? - "#{format('%.2f', 100.0 * used.to_f / total.to_f)}%" - else - '0%' + def force_utf(mounts) + mounts.each do |mount| + mount.name.force_encoding('UTF-8') + mount.mount_type.force_encoding('UTF-8') + mount.mount_point.force_encoding('UTF-8') + mount.options.force_encoding('UTF-8') + end end end end diff --git a/spec/facter/resolvers/mountpoints_resolver_spec.rb b/spec/facter/resolvers/mountpoints_resolver_spec.rb index f5cb103a6..1568965a9 100644 --- a/spec/facter/resolvers/mountpoints_resolver_spec.rb +++ b/spec/facter/resolvers/mountpoints_resolver_spec.rb @@ -37,8 +37,9 @@ allow(Facter::Util::FileHelper).to receive(:safe_read) .with('/proc/cmdline') .and_return(load_fixture('cmdline_root_device').read) - allow(Sys::Filesystem).to receive(:mounts).and_return([mount]) - allow(Sys::Filesystem).to receive(:stat).with(mount.mount_point).and_return(stat) + + allow(Facter::FilesystemHelper).to receive(:read_mountpoints).and_return([mount]) + allow(Facter::FilesystemHelper).to receive(:read_mountpoint_stats).with(mount.mount_point).and_return(stat) # mock sys/filesystem methods allow(stat).to receive(:bytes_total).and_return(stat.blocks * stat.fragment_size) @@ -55,7 +56,8 @@ end it 'drops automounts and non-tmpfs mounts under /proc or /sys' do - allow(Sys::Filesystem).to receive(:mounts).and_return(ignored_mounts) + allow(Facter::FilesystemHelper).to receive(:read_mountpoints).and_return(ignored_mounts) + result = Facter::Resolvers::Linux::Mountpoints.resolve(:mountpoints) expect(result).to be_empty end diff --git a/spec/facter/resolvers/utils/macosx/filesystem_helper_spec.rb b/spec/facter/resolvers/utils/macosx/filesystem_helper_spec.rb index 91e73a7f3..2e32bcab3 100644 --- a/spec/facter/resolvers/utils/macosx/filesystem_helper_spec.rb +++ b/spec/facter/resolvers/utils/macosx/filesystem_helper_spec.rb @@ -17,4 +17,35 @@ expect(capacity).to eq('4.21%') end end + + describe '#read_mountpoints' do + before do + mount = OpenStruct.new + mount.name = +'test_name'.encode('ASCII-8BIT') + mount.mount_type = +'test_type'.encode('ASCII-8BIT') + mount.mount_point = +'test_mount_point'.encode('ASCII-8BIT') + mount.options = +'test_options'.encode('ASCII-8BIT') + + mounts = [mount] + allow(Sys::Filesystem).to receive(:mounts).and_return(mounts) + end + + let(:mount_points) { Facter::FilesystemHelper.read_mountpoints } + + it 'converts name from ASCII-8BIT to UTF-8' do + expect(mount_points.first.name.encoding.name). to eq('UTF-8') + end + + it 'converts mount_type from ASCII-8BIT to UTF-8' do + expect(mount_points.first.mount_type.encoding.name). to eq('UTF-8') + end + + it 'converts mount_point from ASCII-8BIT to UTF-8' do + expect(mount_points.first.mount_point.encoding.name). to eq('UTF-8') + end + + it 'converts options from ASCII-8BIT to UTF-8' do + expect(mount_points.first.options.encoding.name). to eq('UTF-8') + end + end end