inspec/test/unit/resources/file_test.rb

113 lines
6.3 KiB
Ruby
Raw Normal View History

require "helper"
require "inspec/resource"
require "inspec/resources/file"
describe Inspec::Resources::FileResource do
let(:file) { stub(unix_mode_mask: 000, mode: 000) }
it "responds on Ubuntu" do
resource = MockLoader.new(:ubuntu).load_resource("file", "/fakepath/fakefile")
resource.stubs(:exist?).returns(true)
resource.stubs(:mounted?).returns(true)
resource.stubs(:source_path).returns("/fakepath/fakefile")
resource.stubs(:file).returns(file)
resource.stubs(:content).returns("content")
resource.stubs(:mode).returns(000)
resource.stubs(:suid).returns(true)
resource.stubs(:sgid).returns(true)
resource.stubs(:sticky).returns(true)
resource.stubs(:file_permission_granted?).with("read", "by_usergroup", "by_specific_user").returns("test_result")
resource.stubs(:file_permission_granted?).with("write", "by_usergroup", "by_specific_user").returns("test_result")
resource.stubs(:file_permission_granted?).with("execute", "by_usergroup", "by_specific_user").returns("test_result")
_(resource.content).must_equal "content"
_(resource.more_permissive_than?("000")).must_equal false
_(resource.exist?).must_equal true
_(resource.mounted?).must_equal true
_(resource.to_s).must_equal "File /fakepath/fakefile"
_(resource.readable?("by_usergroup", "by_specific_user")).must_equal "test_result"
_(resource.allowed?("read", by: "by_usergroup", by_user: "by_specific_user")).must_equal "test_result"
_(resource.writable?("by_usergroup", "by_specific_user")).must_equal "test_result"
_(resource.allowed?("write", by: "by_usergroup", by_user: "by_specific_user")).must_equal "test_result"
_(resource.executable?("by_usergroup", "by_specific_user")).must_equal "test_result"
_(resource.allowed?("execute", by: "by_usergroup", by_user: "by_specific_user")).must_equal "test_result"
_(resource.suid).must_equal true
_(resource.sgid).must_equal true
_(resource.sticky).must_equal true
_(proc { resource.send(:more_permissive_than?, nil) }).must_raise(ArgumentError)
_(proc { resource.send(:more_permissive_than?, 0700) }).must_raise(ArgumentError)
end
it "responds on Windows" do
resource = MockLoader.new(:windows).load_resource("file", "C:/fakepath/fakefile")
resource.stubs(:exist?).returns(true)
resource.stubs(:mounted?).returns(true)
resource.stubs(:content).returns("content")
resource.stubs(:file_permission_granted?).with("read", "by_usergroup", "by_specific_user").returns("test_result")
resource.stubs(:file_permission_granted?).with("write", "by_usergroup", "by_specific_user").returns("test_result")
resource.stubs(:file_permission_granted?).with("execute", "by_usergroup", "by_specific_user").returns("test_result")
resource.stubs(:file_permission_granted?).with("full-control", "by_usergroup", "by_specific_user").returns("test_result")
_(resource.content).must_equal "content"
_(resource.exist?).must_equal true
_(resource.mounted?).must_equal true
_(resource.readable?("by_usergroup", "by_specific_user")).must_equal "test_result"
_(resource.allowed?("read", by: "by_usergroup", by_user: "by_specific_user")).must_equal "test_result"
_(resource.writable?("by_usergroup", "by_specific_user")).must_equal "test_result"
_(resource.allowed?("write", by: "by_usergroup", by_user: "by_specific_user")).must_equal "test_result"
_(resource.executable?("by_usergroup", "by_specific_user")).must_equal "test_result"
_(resource.allowed?("execute", by: "by_usergroup", by_user: "by_specific_user")).must_equal "test_result"
_(resource.allowed?("full-control", by: "by_usergroup", by_user: "by_specific_user")).must_equal "test_result"
Extend Windows ACL matchers (#1744) * Adds alias for 'ListDirectory' permission Signed-off-by: David Alexander <opensource@thelonelyghost.com> * Works with Ruby array of permissions as long as possible Converts to PowerShell array just before use. Signed-off-by: David Alexander <opensource@thelonelyghost.com> * Abstracts user-provided permissions to router method Signed-off-by: David Alexander <opensource@thelonelyghost.com> * Adds FullControl as a specifiable permission Signed-off-by: David Alexander <opensource@thelonelyghost.com> * Adds specific permission 'modify' Signed-off-by: David Alexander <opensource@thelonelyghost.com> * Fixes #1743 Limits Windows' broad "read" permission to if it can read all of the above, instead of just the first: - File contents - File attributes - File extended attributes - File permissions This better aligns with how Windows names the permissions. 'read' -> Read instead of 'read' -> ReadData Signed-off-by: David Alexander <opensource@thelonelyghost.com> * 'Execute' Windows ACL has alias of 'Traverse' Signed-off-by: David Alexander <opensource@thelonelyghost.com> * Adds 'Delete' permission Signed-off-by: David Alexander <opensource@thelonelyghost.com> * Adds `should allow('perm').by_user('me')` matcher Provides hooks for later use with Windows ACL matching Signed-off-by: David Alexander <opensource@thelonelyghost.com> * Adds remaining Windows ACL hooks Skips ReadAndExecute on intentionally since it just aliases the combo of 2 permissions into one new one. Signed-off-by: David Alexander <opensource@thelonelyghost.com> * [Rubocop] Reduces ABC / Cyclomatic complexity Signed-off-by: David Alexander <opensource@thelonelyghost.com> * Reduces global scope with `allows()` -> `be_allowed()` RSpec inferred matchers work nicely here. This changes the `by_user()` and `by()` chained matchers to just be an options hash on the underlying `allowed?()` method. Signed-off-by: David Alexander <opensource@thelonelyghost.com> * Fixes integration tests with rename `allows()` -> `be_allowed()` Signed-off-by: David Alexander <opensource@thelonelyghost.com>
2017-10-17 13:01:51 +00:00
end
it "does not support Windows-style ACL on Ubuntu" do
resource = MockLoader.new(:ubuntu).load_resource("file", "/fakepath/fakefile")
Extend Windows ACL matchers (#1744) * Adds alias for 'ListDirectory' permission Signed-off-by: David Alexander <opensource@thelonelyghost.com> * Works with Ruby array of permissions as long as possible Converts to PowerShell array just before use. Signed-off-by: David Alexander <opensource@thelonelyghost.com> * Abstracts user-provided permissions to router method Signed-off-by: David Alexander <opensource@thelonelyghost.com> * Adds FullControl as a specifiable permission Signed-off-by: David Alexander <opensource@thelonelyghost.com> * Adds specific permission 'modify' Signed-off-by: David Alexander <opensource@thelonelyghost.com> * Fixes #1743 Limits Windows' broad "read" permission to if it can read all of the above, instead of just the first: - File contents - File attributes - File extended attributes - File permissions This better aligns with how Windows names the permissions. 'read' -> Read instead of 'read' -> ReadData Signed-off-by: David Alexander <opensource@thelonelyghost.com> * 'Execute' Windows ACL has alias of 'Traverse' Signed-off-by: David Alexander <opensource@thelonelyghost.com> * Adds 'Delete' permission Signed-off-by: David Alexander <opensource@thelonelyghost.com> * Adds `should allow('perm').by_user('me')` matcher Provides hooks for later use with Windows ACL matching Signed-off-by: David Alexander <opensource@thelonelyghost.com> * Adds remaining Windows ACL hooks Skips ReadAndExecute on intentionally since it just aliases the combo of 2 permissions into one new one. Signed-off-by: David Alexander <opensource@thelonelyghost.com> * [Rubocop] Reduces ABC / Cyclomatic complexity Signed-off-by: David Alexander <opensource@thelonelyghost.com> * Reduces global scope with `allows()` -> `be_allowed()` RSpec inferred matchers work nicely here. This changes the `by_user()` and `by()` chained matchers to just be an options hash on the underlying `allowed?()` method. Signed-off-by: David Alexander <opensource@thelonelyghost.com> * Fixes integration tests with rename `allows()` -> `be_allowed()` Signed-off-by: David Alexander <opensource@thelonelyghost.com>
2017-10-17 13:01:51 +00:00
resource.stubs(:exist?).returns(true)
_(proc { resource.send("allowed?", "full-control", { by: "by_usergroup", by_user: "by_specific_user" }) }).must_raise(RuntimeError)
_(proc { resource.send("allowed?", "modify", { by: "by_usergroup", by_user: "by_specific_user" }) }).must_raise(RuntimeError)
end
it "does not support check by mask on Windows" do
resource = MockLoader.new(:windows).load_resource("file", "C:/fakepath/fakefile")
resource.stubs(:exist?).returns(true)
_(proc { resource.send("readable?", "by_usergroup", nil) }).must_raise(RuntimeError)
_(proc { resource.send("writable?", "by_usergroup", nil) }).must_raise(RuntimeError)
_(proc { resource.send("executable?", "by_usergroup", nil) }).must_raise(RuntimeError)
end
it "responds with errors on unsupported OS" do
resource = MockLoader.new(:undefined).load_resource("file", "C:/fakepath/fakefile")
resource.stubs(:exist?).returns(true)
_(resource.exist?).must_equal true
_(resource.readable?("by_usergroup", "by_specific_user")).must_equal "`readable?` is not supported on your OS yet."
_(resource.writable?("by_usergroup", "by_specific_user")).must_equal "`writable?` is not supported on your OS yet."
_(resource.executable?("by_usergroup", "by_specific_user")).must_equal "`executable?` is not supported on your OS yet."
_(resource.allowed?("permission", by: "by_usergroup", by_user: "by_specific_user")).must_equal "`allowed?` is not supported on your OS yet."
_(proc { resource.send(:contain, nil) }).must_raise(RuntimeError)
end
end
describe Inspec::Resources::FileResource do
let(:file) { stub(unix_mode_mask: 000, mode: 644) }
it "more_permissive_than?" do
resource = MockLoader.new(:ubuntu).load_resource("file", "/fakepath/fakefile")
# TODO: this is NOT a valid way to test. Please use _actual_ mock files
# so we aren't beholden to the CI umask and other trivialities.
path = "test/fixtures/files/emptyfile"
File.chmod 0644, path
perms = "perms = %03o" % [File.stat(path).mode]
_(resource).wont_be :more_permissive_than?, "755", perms
_(resource).wont_be :more_permissive_than?, "644", perms
_(resource).must_be :more_permissive_than?, "640", perms
_(proc { resource.send(:more_permissive_than?, "0888") }).must_raise(ArgumentError)
end
it "when file does not exist" do
resource = MockLoader.new(:ubuntu).load_resource("file", "file_does_not_exist")
assert_nil(resource.send(:more_permissive_than?, nil))
end
end