mirror of
https://github.com/inspec/inspec
synced 2024-12-20 10:03:28 +00:00
191 lines
6.6 KiB
Ruby
191 lines
6.6 KiB
Ruby
# encoding: utf-8
|
|
|
|
require 'functional/helper'
|
|
|
|
describe 'inspec shell tests' do
|
|
include FunctionalHelper
|
|
|
|
describe 'cmd' do
|
|
def do_shell_c(code, exit_status, json = false, stderr = '')
|
|
json_suffix = " --format 'json'" if json
|
|
out = inspec("shell -c '#{code.tr('\'','\\\'')}'#{json_suffix}")
|
|
out.stderr.must_equal stderr
|
|
out.exit_status.must_equal exit_status
|
|
out
|
|
end
|
|
|
|
it 'can run ruby expressions (json output)' do
|
|
x = rand
|
|
y = rand
|
|
out = do_shell_c("#{x} + #{y}", 0, true)
|
|
j = JSON.load(out.stdout)
|
|
j.must_equal x+y
|
|
end
|
|
|
|
it 'can run ruby expressions' do
|
|
x = rand
|
|
y = rand
|
|
out = do_shell_c("#{x} + #{y}", 0)
|
|
out.stdout.must_equal "#{x+y}\n"
|
|
end
|
|
|
|
it 'can run arbitrary ruby (json output)' do
|
|
out = do_shell_c('x = [1,2,3].inject(0) {|a,v| a + v*v}; x+10', 0, true)
|
|
j = JSON.load(out.stdout)
|
|
j.must_equal 24 # 1^2 + 2^2 + 3^2 + 10
|
|
end
|
|
|
|
it 'can run arbitrary ruby' do
|
|
out = do_shell_c('x = [1,2,3].inject(0) {|a,v| a + v*v}; x+10', 0)
|
|
out.stdout.must_equal "24\n"
|
|
end
|
|
|
|
it 'retrieves resources (json output)' do
|
|
out = do_shell_c('os.params', 0, true)
|
|
j = JSON.load(out.stdout)
|
|
j.keys.must_include 'name'
|
|
j.keys.must_include 'family'
|
|
j.keys.must_include 'arch'
|
|
j.keys.must_include 'release'
|
|
end
|
|
|
|
it 'retrieves resources' do
|
|
out = do_shell_c('os.params', 0)
|
|
out.stdout.must_include 'name'
|
|
out.stdout.must_include 'family'
|
|
out.stdout.must_include 'arch'
|
|
out.stdout.must_include 'release'
|
|
end
|
|
|
|
it 'runs anonymous tests that succeed (json output)' do
|
|
out = do_shell_c("describe file(\"#{__FILE__}\") do it { should exist } end", 0, true)
|
|
j = JSON.load(out.stdout)
|
|
j.keys.must_include 'version'
|
|
j.keys.must_include 'profiles'
|
|
j.keys.must_include 'other_checks'
|
|
j.keys.must_include 'summary'
|
|
j['summary']['example_count'].must_equal 1
|
|
j['summary']['failure_count'].must_equal 0
|
|
end
|
|
|
|
it 'runs anonymous tests that succeed' do
|
|
out = do_shell_c("describe file(\"#{__FILE__}\") do it { should exist } end", 0)
|
|
out.stdout.must_include '1 successful'
|
|
out.stdout.must_include '0 failures'
|
|
end
|
|
|
|
it 'runs anonymous tests that fail (json output)' do
|
|
out = do_shell_c("describe file(\"foo/bar/baz\") do it { should exist } end", 1, true)
|
|
j = JSON.load(out.stdout)
|
|
j.keys.must_include 'version'
|
|
j.keys.must_include 'profiles'
|
|
j.keys.must_include 'other_checks'
|
|
j.keys.must_include 'summary'
|
|
j['summary']['example_count'].must_equal 1
|
|
j['summary']['failure_count'].must_equal 1
|
|
end
|
|
|
|
it 'runs anonymous tests that fail' do
|
|
out = do_shell_c("describe file(\"foo/bar/baz\") do it { should exist } end", 1)
|
|
out.stdout.must_include '0 successful'
|
|
out.stdout.must_include '1 failures'
|
|
end
|
|
|
|
it 'runs controls with tests (json output)' do
|
|
out = do_shell_c("control \"test\" do describe file(\"#{__FILE__}\") do it { should exist } end end", 0, true)
|
|
j = JSON.load(out.stdout)
|
|
j.keys.must_include 'version'
|
|
j.keys.must_include 'profiles'
|
|
j.keys.must_include 'other_checks'
|
|
j.keys.must_include 'summary'
|
|
j['summary']['example_count'].must_equal 1
|
|
j['summary']['failure_count'].must_equal 0
|
|
end
|
|
|
|
it 'runs controls with tests' do
|
|
out = do_shell_c("control \"test\" do describe file(\"#{__FILE__}\") do it { should exist } end end", 0)
|
|
out.stdout.must_include '1 successful'
|
|
out.stdout.must_include '0 failures'
|
|
end
|
|
|
|
it 'runs controls with multiple tests (json output)' do
|
|
out = do_shell_c("control \"test\" do describe file(\"#{__FILE__}\") do it { should exist } end; describe file(\"foo/bar/baz\") do it { should exist } end end", 1, true)
|
|
j = JSON.load(out.stdout)
|
|
j.keys.must_include 'version'
|
|
j.keys.must_include 'profiles'
|
|
j.keys.must_include 'other_checks'
|
|
j.keys.must_include 'summary'
|
|
j['summary']['example_count'].must_equal 2
|
|
j['summary']['failure_count'].must_equal 1
|
|
end
|
|
|
|
it 'runs controls with multiple tests' do
|
|
out = do_shell_c("control \"test\" do describe file(\"#{__FILE__}\") do it { should exist } end; describe file(\"foo/bar/baz\") do it { should exist } end end", 1)
|
|
out.stdout.must_include '1 successful'
|
|
out.stdout.must_include '1 failures'
|
|
end
|
|
end
|
|
|
|
describe 'shell' do
|
|
def do_shell(code, exit_status = 0, stderr = '')
|
|
cmd = "echo '#{code.tr('\'','\\\'')}' | #{exec_inspec} shell"
|
|
out = CMD.run_command(cmd)
|
|
#out.stderr.must_equal stderr
|
|
out.exit_status.must_equal exit_status
|
|
out
|
|
end
|
|
|
|
it 'provides a help command' do
|
|
out = do_shell('help')
|
|
out.stdout.must_include 'Available commands:'
|
|
out.stdout.must_include 'You are currently running on:'
|
|
end
|
|
|
|
it 'exposes all resources' do
|
|
out = do_shell('os')
|
|
out.stdout.must_match /\=> .*Operating.* .*System.* .*Detection/
|
|
end
|
|
|
|
it 'can run ruby expressions' do
|
|
x = rand
|
|
y = rand
|
|
out = do_shell("#{x} + #{y}")
|
|
out.stdout.must_include "#{x+y}"
|
|
end
|
|
|
|
it 'can run arbitrary ruby' do
|
|
out = do_shell('x = [1,2,3].inject(0) {|a,v| a + v*v}; x+10')
|
|
out.stdout.must_include "24"
|
|
end
|
|
|
|
it 'runs anonymous tests that succeed' do
|
|
out = do_shell("describe file(\"#{__FILE__}\") do it { should exist } end")
|
|
out.stdout.must_include '1 successful'
|
|
out.stdout.must_include '0 failures'
|
|
end
|
|
|
|
it 'runs anonymous tests that fail' do
|
|
out = do_shell("describe file(\"foo/bar/baz\") do it { should exist } end")
|
|
out.stdout.must_include '0 successful'
|
|
out.stdout.must_include '1 failures'
|
|
end
|
|
|
|
it 'runs controls with tests' do
|
|
out = do_shell("control \"test\" do describe file(\"#{__FILE__}\") do it { should exist } end end")
|
|
out.stdout.must_include '1 successful'
|
|
out.stdout.must_include '0 failures'
|
|
end
|
|
|
|
it 'runs controls with multiple tests' do
|
|
out = do_shell("control \"test\" do describe file(\"#{__FILE__}\") do it { should exist } end; describe file(\"foo/bar/baz\") do it { should exist } end end")
|
|
out.stdout.must_include '1 successful'
|
|
out.stdout.must_include '1 failures'
|
|
end
|
|
|
|
it 'reruns controls when redefined' do
|
|
out = do_shell("control \"test\" do describe file(\"#{__FILE__}\") do it { should exist } end end\ncontrol \"test\" do describe file(\"foo/bar/baz\") do it { should exist } end end")
|
|
out.stdout.must_include '1 successful'
|
|
out.stdout.must_include '1 failures'
|
|
end
|
|
end
|
|
end
|