2018-12-26 18:43:09 +00:00
# Logging and deprecation facilities functional tests
require 'functional/helper'
describe 'Deprecation Facility Behavior' do
include FunctionalHelper
2019-06-04 06:08:14 +00:00
before {
skip_windows!
}
2018-12-26 18:43:09 +00:00
let ( :profile ) { File . join ( profile_path , 'deprecation' , profile_name ) }
let ( :invocation ) { " exec #{ profile } #{ control_flag } " }
2019-05-18 00:43:58 +00:00
# Running in JSON mode has the side-effect of sending log messages to $stderr
2019-01-14 18:56:01 +00:00
let ( :run_result ) { run_inspec_process ( invocation , json : true ) }
2018-12-26 18:43:09 +00:00
# Expect one control, 3 results
let ( :json_result ) { run_result . payload . json [ 'profiles' ] [ 0 ] [ 'controls' ] [ 0 ] [ 'results' ] }
describe 'when the deprecation is in a custom resource and the deprecate DSL method is used' do
describe 'when the action is to fail the control' do
describe 'when the resource is called in a control' do
let ( :profile_name ) { 'typical' }
let ( :control_flag ) { '--controls deprecate_fail_mode' }
2019-01-14 18:56:01 +00:00
it 'should result in a failed control' do
2018-12-26 18:43:09 +00:00
run_result . stderr . must_be_empty
run_result . exit_status . must_equal 100
json_result . count . must_equal 3
json_result [ 0 ] [ 'status' ] . must_equal 'passed'
json_result [ 2 ] [ 'status' ] . must_equal 'passed'
json_result [ 1 ] [ 'status' ] . must_equal 'failed'
json_result [ 1 ] [ 'message' ] . must_include 'DEPRECATION'
json_result [ 1 ] [ 'message' ] . must_include 'This should fail'
json_result [ 1 ] [ 'message' ] . must_include '(used at'
json_result [ 1 ] [ 'message' ] . must_include 'test/unit/mock/profiles/deprecation/typical/controls/typical.rb'
2019-05-30 07:10:52 +00:00
json_result [ 1 ] [ 'message' ] . must_include 'typical.rb:10' # Line number check
2018-12-26 18:43:09 +00:00
end
end
describe 'when the resource is called outside a control' do
let ( :profile_name ) { 'bare' }
let ( :control_flag ) { '' }
2019-01-14 18:56:01 +00:00
it 'should result in a warning, not a stacktrace or abort' do
2018-12-26 18:43:09 +00:00
run_result . exit_status . must_equal 0
json_result . count . must_equal 1
json_result [ 0 ] [ 'status' ] . must_equal 'passed'
stderr_lines = run_result . stderr . split ( " \n " )
stderr_lines . count . must_equal 1
deprecation_line = stderr_lines . first
deprecation_line . must_include 'DEPRECATION'
deprecation_line . must_include 'WARN'
deprecation_line . must_include 'This should fail'
deprecation_line . must_include '(used at'
deprecation_line . must_include 'test/unit/mock/profiles/deprecation/bare/controls/bare.rb'
2019-05-30 07:10:52 +00:00
deprecation_line . must_include 'bare.rb:2'
2018-12-26 18:43:09 +00:00
end
end
end
describe 'when the action is exit and no code is specified' do
let ( :profile_name ) { 'typical' }
let ( :control_flag ) { '--controls deprecate_exit_mode_implicit' }
2019-01-14 18:56:01 +00:00
it 'should result in an exit with a special code' do
2018-12-26 18:53:28 +00:00
# 3 is the FATAL_DEPRECATION value from Inspec::UI
run_result . exit_status . must_equal 3
2018-12-26 18:43:09 +00:00
# Exactly one error should be output
stderr_lines = run_result . stderr . split ( " \n " )
stderr_lines . count . must_equal 1
# Contents of the deprecation
deprecation_line = stderr_lines . first
deprecation_line . must_include 'DEPRECATION'
deprecation_line . must_include 'ERROR'
deprecation_line . must_include 'This should exit'
2019-01-14 18:56:01 +00:00
deprecation_line . must_include '(used at' # Beginning of a single-frame stack locator
2018-12-26 18:43:09 +00:00
deprecation_line . must_include 'test/unit/mock/profiles/deprecation/typical/controls/typical.rb' # Frame should have been identified as coming from the test profile
2019-05-30 07:10:52 +00:00
deprecation_line . must_include 'typical.rb:27' # Line number check
2018-12-26 18:43:09 +00:00
# The reporter should not fire
run_result . stdout . must_be_empty
end
end
describe 'when the action is exit and a specific code is specified' do
let ( :profile_name ) { 'typical' }
let ( :control_flag ) { '--controls deprecate_exit_mode_explicit' }
2019-01-14 18:56:01 +00:00
it 'should result in an exit with a special code' do
2018-12-26 18:43:09 +00:00
# 8 is a custom value
run_result . exit_status . must_equal 8
# Exactly one error should be output
stderr_lines = run_result . stderr . split ( " \n " )
stderr_lines . count . must_equal 1
# Contents of the deprecation
deprecation_line = stderr_lines . first
deprecation_line . must_include 'DEPRECATION' # Flagged as deprecation
2019-01-14 18:56:01 +00:00
deprecation_line . must_include 'ERROR' # Flagged as an error
2018-12-26 18:43:09 +00:00
deprecation_line . must_include 'This should exit' # Specific deprecation message
2019-01-14 18:56:01 +00:00
deprecation_line . must_include '(used at' # Beginning of a single-frame stack locator
2018-12-26 18:43:09 +00:00
deprecation_line . must_include 'test/unit/mock/profiles/deprecation/typical/controls/typical.rb' # Frame should have been identified as coming from the test profile
2019-05-30 07:10:52 +00:00
deprecation_line . must_include 'typical.rb:44' # Line number check
2018-12-26 18:43:09 +00:00
# The reporter should not fire
run_result . stdout . must_be_empty
end
end
describe 'when the action is warn' do
let ( :profile_name ) { 'typical' }
let ( :control_flag ) { '--controls deprecate_warn_mode' }
2019-01-14 18:56:01 +00:00
it 'should result in a warning, not a stacktrace or abort' do
2018-12-26 18:43:09 +00:00
run_result . exit_status . must_equal 0
json_result . count . must_equal 3
json_result [ 0 ] [ 'status' ] . must_equal 'passed'
json_result [ 1 ] [ 'status' ] . must_equal 'passed'
json_result [ 2 ] [ 'status' ] . must_equal 'passed'
stderr_lines = run_result . stderr . split ( " \n " )
stderr_lines . count . must_equal 1
2019-01-14 18:56:01 +00:00
# Content of the deprecation
2018-12-26 18:43:09 +00:00
deprecation_line = stderr_lines . first
2019-01-14 18:56:01 +00:00
deprecation_line . must_include 'DEPRECATION' # Flagged as deprecation
deprecation_line . must_include 'WARN' # Flagged as a warning
deprecation_line . must_include 'This should warn' # Specific deprecation message
deprecation_line . must_include '(used at' # Beginning of a single-frame stack locator
2018-12-26 18:43:09 +00:00
deprecation_line . must_include 'test/unit/mock/profiles/deprecation/typical/controls/typical.rb' # Frame should have been identified as coming from the test profile
2019-05-30 07:10:52 +00:00
deprecation_line . must_include 'typical.rb:61' # Line number check
2018-12-26 18:43:09 +00:00
end
end
describe 'when the action is ignore' do
let ( :profile_name ) { 'typical' }
2019-01-16 04:49:11 +00:00
let ( :control_flag ) { '--controls deprecate_ignore_mode --log-level debug' }
2018-12-26 18:43:09 +00:00
2019-01-16 04:49:11 +00:00
it 'should appear to be a normal run, no warnings or stacktrace or abort, but include debug message' do
2018-12-26 18:43:09 +00:00
run_result . exit_status . must_equal 0
json_result . count . must_equal 3
json_result [ 0 ] [ 'status' ] . must_equal 'passed'
json_result [ 1 ] [ 'status' ] . must_equal 'passed'
json_result [ 2 ] [ 'status' ] . must_equal 'passed'
2019-05-18 00:43:58 +00:00
# JSON mode will send debug messages to $stderr
2019-01-16 04:49:11 +00:00
# [2019-01-15T23:41:41-05:00] DEBUG: DEPRECATION: This should be ignored (used at test/unit/mock/profiles/deprecation/typical/controls/typical.rb:79)
deprecation_line = run_result . stderr . split ( " \n " ) . detect { | line | line . include? ( 'This should be ignored' ) }
deprecation_line . wont_be_nil
deprecation_line . must_include 'DEBUG'
deprecation_line . must_include 'DEPRECATION'
deprecation_line . must_include '(used at' # Beginning of a single-frame stack locator
deprecation_line . must_include 'test/unit/mock/profiles/deprecation/typical/controls/typical.rb' # Frame should have been identified as coming from the test profile
2019-05-30 07:10:52 +00:00
deprecation_line . must_include 'typical.rb:77' # Line number check
2018-12-26 18:43:09 +00:00
end
end
end
2019-04-30 19:40:12 +00:00
describe 'when inspec check is used in json mode against a profile with a deprecation' do
describe 'inspec check with json formatter' do
let ( :profile_name ) { 'check' }
it 'can check a profile and produce valid JSON' do
run_result = run_inspec_process ( 'check ' + profile + ' --format json' )
run_result . stdout . wont_include 'DEPRECATION'
run_result . stderr . must_include 'DEPRECATION'
JSON . parse ( run_result . stdout ) # No exception here
end
end
end
2019-01-14 18:56:01 +00:00
end