mirror of
https://github.com/inspec/inspec
synced 2024-11-23 21:23:29 +00:00
9580732814
If a profile has a data files directory that looks like this: ``` files/platforms/one/data.json files/platforms/two/data.json files/platforms/three/data.json ``` ... the source reader will return the directories in the list of files but with nil contents. This causes an issue when Inspec::Profile tries to create a sha256 checksum of the profile contents only to try to cast nil to a string when building the null-delimited profile contents string. Files that are empty will have an empty string as its contents, so it's safe to assume that file entries with nil contents are actually a directory and have no affect on the profile's checksum. Therefore, this change will eliminate any file entries in responses from the source readers where the contents are nil. Signed-off-by: Adam Leff <adam@leff.co>
55 lines
1.8 KiB
Ruby
55 lines
1.8 KiB
Ruby
# encoding: utf-8
|
|
# author: Dominik Richter
|
|
# author: Christoph Hartmann
|
|
|
|
require 'helper'
|
|
|
|
describe SourceReaders::InspecReader do
|
|
let(:reader) { SourceReaders::InspecReader }
|
|
|
|
it 'registers with the source readers registry' do
|
|
reg = Inspec::SourceReader.registry
|
|
_(reg['inspec']).must_equal reader
|
|
end
|
|
|
|
describe 'with a valid profile' do
|
|
let(:mock_file) { MockLoader.profile_tgz('complete-profile') }
|
|
let(:target) { Inspec::FileProvider.for_path(mock_file) }
|
|
let(:res) { Inspec::SourceReader.resolve(target) }
|
|
|
|
it 'resolves the target to inspec' do
|
|
_(res).must_be_kind_of reader
|
|
end
|
|
|
|
it 'retrieves metadata' do
|
|
_(res.metadata.params[:name]).must_equal 'complete'
|
|
end
|
|
|
|
it 'retrieves all files' do
|
|
_(res.tests.keys).must_equal %w{controls/filesystem_spec.rb}
|
|
_(res.tests.values[0]).must_match(/^control 'test01' do$/)
|
|
end
|
|
|
|
it 'retrieves all libraries' do
|
|
_(res.libraries.keys).must_equal %w{libraries/testlib.rb}
|
|
_(res.libraries.values[0]).must_match(/^# Library resource$/)
|
|
end
|
|
|
|
it 'retrieves all extra files' do
|
|
_(res.data_files.keys).must_equal %w{files/a_sub_dir/sub_items.conf files/items.conf}
|
|
_(res.data_files['files/items.conf']).must_equal "one\ntwo\nthree\n"
|
|
_(res.data_files['files/a_sub_dir/sub_items.conf']).must_equal "[section]\nkey = value\n"
|
|
end
|
|
end
|
|
|
|
describe 'with an invalid inspec.yml' do
|
|
let(:mock_file) { MockLoader.profile_tgz('profile-with-bad-metadata') }
|
|
let(:target) { Inspec::FileProvider.for_path(mock_file) }
|
|
let(:res) { Inspec::SourceReader.resolve(target) }
|
|
|
|
it 'raises an exception' do
|
|
err = proc { _(res.metadata) }.must_raise RuntimeError
|
|
err.message.must_match(/Unable to parse inspec\.yml: line \d+/)
|
|
end
|
|
end
|
|
end
|