2019-06-11 22:24:35 +00:00
require " functional/helper "
2016-08-19 22:58:39 +00:00
2019-06-11 22:24:35 +00:00
describe " inspec shell tests " do
2016-08-19 22:58:39 +00:00
include FunctionalHelper
2019-06-11 22:24:35 +00:00
before do
2019-06-04 06:08:14 +00:00
skip_windows!
2019-06-11 22:24:35 +00:00
end
2019-06-04 06:08:14 +00:00
2019-06-11 22:24:35 +00:00
describe " cmd " do
def do_shell_c ( code , exit_status , json = false , stderr = " " )
2018-02-08 09:06:58 +00:00
json_suffix = " --reporter 'json' " if json
2019-06-11 22:24:35 +00:00
command = " shell -c ' #{ code . tr ( '\'' , '\\\'' ) } ' #{ json_suffix } "
2018-11-08 17:00:14 +00:00
out = inspec ( command )
2016-08-19 22:58:39 +00:00
out . stderr . must_equal stderr
out . exit_status . must_equal exit_status
out
end
2017-12-04 21:40:14 +00:00
2019-06-11 22:24:35 +00:00
it " loads a dependency " do
2018-01-04 19:39:01 +00:00
res = inspec ( " shell -c 'gordon_config' --depends #{ example_profile } " )
2019-06-11 22:24:35 +00:00
res . stderr . must_equal " "
2018-01-04 19:39:01 +00:00
res . exit_status . must_equal 0
2019-06-11 22:24:35 +00:00
res . stdout . chop . must_equal " gordon_config "
2018-01-04 19:39:01 +00:00
end
2019-06-11 22:24:35 +00:00
it " confirm file caching is disabled " do
out = do_shell_c ( " inspec.backend.cache_enabled?(:file) " , 0 )
out . stdout . chop . must_equal " false "
2017-12-04 21:40:14 +00:00
end
2019-06-11 22:24:35 +00:00
it " confirm command caching is disabled " do
out = do_shell_c ( " inspec.backend.cache_enabled?(:command) " , 0 )
out . stdout . chop . must_equal " false "
2017-12-04 21:40:14 +00:00
end
2016-08-19 22:58:39 +00:00
2019-06-11 22:24:35 +00:00
it " can run ruby expressions (json output) " do
2016-08-19 22:58:39 +00:00
x = rand
y = rand
out = do_shell_c ( " #{ x } + #{ y } " , 0 , true )
j = JSON . load ( out . stdout )
2019-06-11 22:24:35 +00:00
j . must_equal x + y
2016-08-19 22:58:39 +00:00
end
2019-06-11 22:24:35 +00:00
it " can run ruby expressions " do
2016-08-19 22:58:39 +00:00
x = rand
y = rand
out = do_shell_c ( " #{ x } + #{ y } " , 0 )
2019-06-11 22:24:35 +00:00
out . stdout . must_equal " #{ x + y } \n "
2016-08-19 22:58:39 +00:00
end
2019-06-11 22:24:35 +00:00
it " can run arbitrary ruby (json output) " do
2018-11-08 17:00:14 +00:00
# You cannot have a pipe in a windows command line
return if is_windows?
2019-06-11 22:24:35 +00:00
out = do_shell_c ( " x = [1,2,3].inject(0) {|a,v| a + v*v}; x+10 " , 0 , true )
2016-08-19 22:58:39 +00:00
j = JSON . load ( out . stdout )
2019-06-11 22:24:35 +00:00
j . must_equal 24 # 1^2 + 2^2 + 3^2 + 10
2016-08-19 22:58:39 +00:00
end
2019-06-11 22:24:35 +00:00
it " can run arbitrary ruby " do
2018-11-08 17:00:14 +00:00
# You cannot have a pipe in a windows command line
return if is_windows?
2019-06-11 22:24:35 +00:00
out = do_shell_c ( " x = [1,2,3].inject(0) {|a,v| a + v*v}; x+10 " , 0 )
2016-08-19 22:58:39 +00:00
out . stdout . must_equal " 24 \n "
end
2019-06-11 22:24:35 +00:00
it " retrieves resources (json output) " do
out = do_shell_c ( " platform.params " , 0 , true )
2016-08-19 22:58:39 +00:00
j = JSON . load ( out . stdout )
2019-06-11 22:24:35 +00:00
j . keys . must_include " name "
j . keys . must_include " families "
j . keys . must_include " arch "
j . keys . must_include " release "
2016-08-19 22:58:39 +00:00
end
2019-06-11 22:24:35 +00:00
it " retrieves resources " do
out = do_shell_c ( " os.params " , 0 )
out . stdout . must_include " name "
out . stdout . must_include " families "
out . stdout . must_include " arch "
out . stdout . must_include " release "
2016-08-19 22:58:39 +00:00
end
2019-06-11 22:24:35 +00:00
it " runs anonymous tests that succeed (json output) " do
2016-08-19 22:58:39 +00:00
out = do_shell_c ( " describe file( \" #{ __FILE__ } \" ) do it { should exist } end " , 0 , true )
j = JSON . load ( out . stdout )
2019-06-11 22:24:35 +00:00
j . keys . must_include " version "
j . keys . must_include " profiles "
j . keys . must_include " statistics "
2016-08-19 22:58:39 +00:00
end
2019-06-11 22:24:35 +00:00
it " runs anonymous tests that succeed " do
2016-08-19 22:58:39 +00:00
out = do_shell_c ( " describe file( \" #{ __FILE__ } \" ) do it { should exist } end " , 0 )
2019-06-11 22:24:35 +00:00
out . stdout . must_include " 1 successful "
out . stdout . must_include " 0 failures "
2016-08-19 22:58:39 +00:00
end
2019-06-11 22:24:35 +00:00
it " runs anonymous tests that fail (json output) " do
2018-02-14 16:54:20 +00:00
out = do_shell_c ( " describe file( \" foo/bar/baz \" ) do it { should exist } end " , 100 , true )
2016-08-19 22:58:39 +00:00
j = JSON . load ( out . stdout )
2019-06-11 22:24:35 +00:00
j . keys . must_include " version "
j . keys . must_include " profiles "
j . keys . must_include " statistics "
2016-08-19 22:58:39 +00:00
end
2019-06-11 22:24:35 +00:00
it " runs anonymous tests that fail " do
2018-02-14 16:54:20 +00:00
out = do_shell_c ( " describe file( \" foo/bar/baz \" ) do it { should exist } end " , 100 )
2019-06-11 22:24:35 +00:00
out . stdout . must_include " 0 successful "
out . stdout . must_include " 1 failure "
2016-08-19 22:58:39 +00:00
end
2019-06-11 22:24:35 +00:00
it " runs controls with tests (json output) " do
2016-08-19 22:58:39 +00:00
out = do_shell_c ( " control \" test \" do describe file( \" #{ __FILE__ } \" ) do it { should exist } end end " , 0 , true )
j = JSON . load ( out . stdout )
2019-06-11 22:24:35 +00:00
j . keys . must_include " version "
j . keys . must_include " profiles "
j . keys . must_include " statistics "
2016-08-19 22:58:39 +00:00
end
2019-06-11 22:24:35 +00:00
it " runs controls with tests " do
2016-08-19 22:58:39 +00:00
out = do_shell_c ( " control \" test \" do describe file( \" #{ __FILE__ } \" ) do it { should exist } end end " , 0 )
2019-06-11 22:24:35 +00:00
out . stdout . must_include " 1 successful "
out . stdout . must_include " 0 failures "
2016-08-19 22:58:39 +00:00
end
2019-06-11 22:24:35 +00:00
it " runs controls with multiple tests (json output) " do
2018-02-14 16:54:20 +00:00
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 " , 100 , true )
2016-08-19 22:58:39 +00:00
j = JSON . load ( out . stdout )
2019-06-11 22:24:35 +00:00
j . keys . must_include " version "
j . keys . must_include " profiles "
j . keys . must_include " statistics "
2016-08-19 22:58:39 +00:00
end
2019-06-11 22:24:35 +00:00
it " runs controls with multiple tests " do
2018-02-14 16:54:20 +00:00
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 " , 100 )
2019-06-11 22:24:35 +00:00
out . stdout . must_include " 0 successful "
out . stdout . must_include " 1 failure "
2016-08-19 22:58:39 +00:00
end
end
2018-11-08 17:00:14 +00:00
# Pry does not support STDIN from windows currently. Skipping these for now.
unless FunctionalHelper . is_windows?
2019-06-11 22:24:35 +00:00
describe " shell " do
def do_shell ( code , exit_status = 0 , stderr = " " )
cmd = " echo ' #{ code . tr ( '\'' , '\\\'' ) } ' | #{ exec_inspec } shell "
2018-11-08 17:00:14 +00:00
out = CMD . run_command ( cmd )
out . exit_status . must_equal exit_status
out
end
2019-06-11 22:24:35 +00:00
it " loads a dependency " do
2018-11-08 17:00:14 +00:00
cmd = " echo 'gordon_config' | #{ exec_inspec } shell --depends #{ example_profile } "
res = CMD . run_command ( cmd )
res . exit_status . must_equal 0
res . stdout . must_include " => gordon_config "
end
2019-06-11 22:24:35 +00:00
it " displays the target device information for the user without requiring the help command " do
out = do_shell ( " 1+1 " )
out . stdout . must_include " You are currently running on: "
2018-11-08 17:00:14 +00:00
end
2019-06-11 22:24:35 +00:00
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: "
2018-11-08 17:00:14 +00:00
end
2019-06-11 22:24:35 +00:00
it " provides resource help " do
out = do_shell ( " help file " )
out . stdout . must_include " Use the file InSpec audit resource "
2018-11-08 17:00:14 +00:00
end
2019-06-11 22:24:35 +00:00
it " provides helpful feedback if an invalid resource is provided " do
out = do_shell ( " help not_a_valid_resource " )
out . stdout . must_include " The resource not_a_valid_resource does not exist. "
2018-11-08 17:00:14 +00:00
end
2019-06-11 22:24:35 +00:00
it " provides a list of resources " do
out = do_shell ( " help resources " )
out . stdout . must_include " - command "
out . stdout . must_include " - file "
out . stdout . must_include " - sshd_config "
2018-11-08 17:00:14 +00:00
end
2019-06-11 22:24:35 +00:00
it " provides matchers help " do
out = do_shell ( " help matchers " )
out . stdout . must_include " For more examples, see: https://www.inspec.io/docs/reference/matchers/ "
2018-11-08 17:00:14 +00:00
end
2019-06-11 22:24:35 +00:00
it " provides empty example help " do
out = do_shell ( " help file " )
out . stdout . must_include " Name "
out . stdout . must_include " Description "
out . stdout . must_include " Example "
out . stdout . must_include " Web Reference "
2018-11-08 17:00:14 +00:00
end
2019-06-11 22:24:35 +00:00
it " exposes all resources " do
out = do_shell ( " os " )
2018-11-08 17:00:14 +00:00
out . stdout . must_match ( / \ => .*Operating.* .*System.* .*Detection / )
end
2019-06-11 22:24:35 +00:00
it " can run ruby expressions " do
2018-11-08 17:00:14 +00:00
x = rand
y = rand
out = do_shell ( " #{ x } + #{ y } " )
2019-06-11 22:24:35 +00:00
out . stdout . must_include " #{ x + y } "
2018-11-08 17:00:14 +00:00
end
2019-06-11 22:24:35 +00:00
it " can run arbitrary ruby " do
out = do_shell ( " x = [1,2,3].inject(0) {|a,v| a + v*v}; x+10 " )
2018-11-08 17:00:14 +00:00
out . stdout . must_include " 24 "
end
2019-06-11 22:24:35 +00:00
it " runs anonymous tests that succeed " do
2018-11-08 17:00:14 +00:00
out = do_shell ( " describe file( \" #{ __FILE__ } \" ) do it { should exist } end " )
2019-06-11 22:24:35 +00:00
out . stdout . must_include " 1 successful "
out . stdout . must_include " 0 failures "
2018-11-08 17:00:14 +00:00
end
2019-06-11 22:24:35 +00:00
it " runs anonymous tests that fail " do
2018-11-08 17:00:14 +00:00
out = do_shell ( " describe file( \" foo/bar/baz \" ) do it { should exist } end " )
2019-06-11 22:24:35 +00:00
out . stdout . must_include " 0 successful "
out . stdout . must_include " 1 failure "
2018-11-08 17:00:14 +00:00
end
2019-06-11 22:24:35 +00:00
it " runs controls with tests " do
2018-11-08 17:00:14 +00:00
out = do_shell ( " control \" test \" do describe file( \" #{ __FILE__ } \" ) do it { should exist } end end " )
2019-06-11 22:24:35 +00:00
out . stdout . must_include " 1 successful "
out . stdout . must_include " 0 failures "
2018-11-08 17:00:14 +00:00
end
2019-06-11 22:24:35 +00:00
it " runs controls with multiple tests " do
2018-11-08 17:00:14 +00:00
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 " )
2019-06-11 22:24:35 +00:00
out . stdout . must_include " 0 successful "
out . stdout . must_include " 1 failure "
2018-11-08 17:00:14 +00:00
end
2019-06-11 22:24:35 +00:00
it " reruns controls when redefined " do
2018-11-08 17:00:14 +00:00
out = do_shell ( " control \" test \" do describe file( \" #{ __FILE__ } \" ) do it { should exist } end end \n control \" test \" do describe file( \" foo/bar/baz \" ) do it { should exist } end end " )
2019-06-11 22:24:35 +00:00
out . stdout . must_include " 1 successful "
out . stdout . must_include " 1 failure "
2018-11-08 17:00:14 +00:00
end
2016-08-19 22:58:39 +00:00
end
end
end