Merge pull request #4180 from inspec/zenspider/windows_fixes

Stabilize windows functional testing
This commit is contained in:
Ryan Davis 2019-06-03 23:40:30 -07:00 committed by GitHub
commit fee0c2db78
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
30 changed files with 178 additions and 26 deletions

View file

@ -5,6 +5,10 @@ require 'securerandom'
class ArtifactCli < Minitest::Test
include CorePluginFunctionalHelper
before {
skip_windows!
}
def test_generating_archive_keys
Dir.mktmpdir do |dir|
unique_key_name = SecureRandom.uuid()

View file

@ -5,6 +5,7 @@ class ProfileCli < Minitest::Test
include CorePluginFunctionalHelper
def setup
skip_windows!
@tmpdir = Dir.mktmpdir
@habitat_profile = File.join(@tmpdir, 'habitat-profile')
run_inspec_process('init profile ' + @habitat_profile)

View file

@ -3,6 +3,10 @@ require_relative '../../../shared/core_plugin_test_helper.rb'
class InitPluginCli < Minitest::Test
include CorePluginFunctionalHelper
def setup
skip_windows!
end
def test_generating_inspec_plugin_correct_prefix_required
Dir.mktmpdir do |dir|
plugin = 'wacky-name'
@ -170,4 +174,4 @@ class InitPluginCli < Minitest::Test
end
end

View file

@ -4,6 +4,10 @@ require_relative '../../../shared/core_plugin_test_helper.rb'
class InitCli < Minitest::Test
include CorePluginFunctionalHelper
def setup
skip_windows!
end
def test_generating_inspec_profile
Dir.mktmpdir do |dir|
profile = File.join(dir, 'test-profile')
@ -95,4 +99,4 @@ class InitCli < Minitest::Test
assert_includes Dir.entries(profile).join, 'README.md'
end
end
end
end

View file

@ -19,6 +19,10 @@ module PluginManagerHelpers
end
end
def setup
skip_windows!
end
def copy_in_project_config_dir(fixture_name, dest = nil)
src = Dir.glob(File.join(project_config_dirs_path, fixture_name, '*'))
dest ||= File.join(project_config_dirs_path, 'empty')
@ -49,6 +53,10 @@ end
class PluginManagerCliHelp < Minitest::Test
include CorePluginFunctionalHelper
def setup
skip_windows!
end
# Main inspec help subcommand listing
def test_inspec_help_includes_plugin
result = run_inspec_process_with_this_plugin('help')

View file

@ -16,7 +16,7 @@ require 'inspec/plugin/v2'
# Configure Minitest to expose things like `let`
class Module
include Minitest::Spec::DSL
include Minitest::Spec::DSL # TODO: NO! remove this!
end
module Inspec
@ -49,8 +49,11 @@ module CorePluginBaseHelper
let(:registry) { Inspec::Plugin::V2::Registry.instance }
end
require 'functional/helper'
module CorePluginFunctionalHelper
include CorePluginBaseHelper
include FunctionalHelper
require 'train'
TRAIN_CONNECTION = Train.create('local', command_runner: :generic).connection

View file

@ -5,6 +5,10 @@ describe 'filtertable functional tests' do
let(:run_opts) { { json: true, ignore_rspec_deprecations: true } }
let(:ft_profile_path) { File.join(profile_path, 'filter_table') }
def setup
skip_windows!
end
def run_result_for_controls(controls)
cmd = 'exec ' + ft_profile_path + ' --controls ' + controls.join(' ')
run_inspec_process(cmd, run_opts)
@ -123,4 +127,4 @@ describe 'filtertable functional tests' do
expect_clean_run(controls)
end
end
end
end

View file

@ -6,6 +6,8 @@ require 'yaml'
describe 'profiles with git-based dependencies' do
include FunctionalHelper
before(:all) do
skip_windows!
@tmpdir = Dir.mktmpdir
@profile_dir = File.join(@tmpdir, "test-profile")
@git_dep_dir = File.join(@tmpdir, "git-dep")

View file

@ -107,6 +107,15 @@ module FunctionalHelper
ENV["CHEF_LICENSE"] = "accept-no-persist"
end
def skip_windows!
skip_until 2019, 7, 31, "These have never passed" if windows?
end
def assert_exit_code exp, cmd
exp = 1 if exp != 0 if windows?
assert_equal exp, cmd.exit_status
end
def convert_windows_output(text)
text = text.force_encoding("UTF-8")
text.gsub!("[PASS]", '✔')
@ -127,7 +136,7 @@ module FunctionalHelper
def inspec(commandline, prefix = nil)
if is_windows?
invocation = "powershell -NonInteractive -Command \"#{prefix} bundle exec #{exec_inspec} #{commandline}\""
invocation = "cmd /C \"#{prefix} #{exec_inspec} #{commandline}\""
result = CMD.run_command(invocation)
result.stdout.encode!(universal_newline: true)
result.stderr.encode!(universal_newline: true)

View file

@ -5,6 +5,10 @@ describe 'example inheritance profile' do
let(:path) { File.join(examples_path, 'inheritance') }
let(:input_file) { File.join(examples_path, 'profile-attribute.yml') } # TODO rename attributes in examples
before {
skip_windows!
}
it 'check succeeds with --profiles-path' do
out = inspec('check ' + path + ' --profiles-path ' + examples_path)
out.stderr.must_equal ''

View file

@ -4,6 +4,10 @@ describe 'inputs' do
include FunctionalHelper
let(:inputs_profiles_path) { File.join(profile_path, 'inputs') }
before {
skip_windows!
}
# This tests being able to load complex structures from
# cli option-specified files.
[
@ -18,7 +22,7 @@ describe 'inputs' do
cmd += ' --controls ' + input_file
result = run_inspec_process(cmd)
result.stderr.must_equal ''
result.exit_status.must_equal 0
assert_exit_code 0, result
end
end
@ -29,9 +33,11 @@ describe 'inputs' do
line = lines.detect { |l| l.include? '--input-file' }
line.wont_be_nil
end
it 'includes the legacy --attrs option' do
result = run_inspec_process('exec help', lock: true)
lines = result.stdout.split("\n")
p lines
line = lines.detect { |l| l.include? '--attrs' }
line.wont_be_nil
end
@ -48,13 +54,13 @@ describe 'inputs' do
describe 'when the --input-file flag is used' do
let(:flag) { '--input-file' }
it 'works' do
result.exit_status.must_equal 0
assert_exit_code 0, result
end
end
describe 'when the --attrs flag is used' do
let(:flag) { '--attrs' }
it 'works' do
result.exit_status.must_equal 0
assert_exit_code 0, result
end
end
end
@ -78,7 +84,7 @@ describe 'inputs' do
cmd += File.join(inputs_profiles_path, 'metadata-empty')
result = run_inspec_process(cmd, json: true)
result.stderr.must_include 'WARN: Inputs must be defined as an Array. Skipping current definition.'
result.exit_status.must_equal 0
assert_exit_code 0, result
end
it "errors with invalid input types" do
@ -86,7 +92,7 @@ describe 'inputs' do
cmd += File.join(inputs_profiles_path, 'metadata-invalid')
result = run_inspec_process(cmd, json: true)
result.stderr.must_equal "Type 'Color' is not a valid input type.\n"
result.exit_status.must_equal 1
assert_exit_code 1, result
end
it "errors with required input not defined" do
@ -94,7 +100,7 @@ describe 'inputs' do
cmd += File.join(inputs_profiles_path, 'metadata-required')
result = run_inspec_process(cmd, json: true)
result.stderr.must_include "Input 'a_required_input' is required and does not have a value.\n"
result.exit_status.must_equal 1
assert_exit_code 1, result
end
describe 'when profile inheritance is used' do

View file

@ -5,6 +5,10 @@ describe 'inspec archive' do
include FunctionalHelper
let(:auto_dst) { File.expand_path(File.join(repo_path, 'profile-1.0.0.tar.gz')) }
before {
skip_windows!
}
it 'archive is successful' do
prepare_examples('profile') do |dir|
out = inspec('archive ' + dir + ' --overwrite')

View file

@ -5,6 +5,10 @@ require 'securerandom'
describe 'inspec exec' do
include FunctionalHelper
before {
skip_windows!
}
it 'can generate keys' do
prepare_examples do |dir|
unique_key_name = SecureRandom.uuid()

View file

@ -4,6 +4,10 @@ require 'tmpdir'
describe 'inspec check' do
include FunctionalHelper
before {
skip_windows!
}
describe 'inspec check with json formatter' do
it 'can check a profile and produce valid JSON' do
out = inspec('check ' + example_profile + ' --format json')

View file

@ -3,6 +3,10 @@ require 'functional/helper'
describe 'inspec detect' do
include FunctionalHelper
before {
skip_windows!
}
it 'outputs the correct data' do
res = inspec('detect')
res.stderr.must_equal ''

View file

@ -4,6 +4,10 @@ require 'tempfile'
describe 'inspec exec automate' do
include FunctionalHelper
before {
skip_windows!
}
let(:config_path) do
file = Tempfile.new('config.json')
file.write(config_data)

View file

@ -4,6 +4,10 @@ require 'json-schema'
describe 'inspec exec with json formatter' do
include FunctionalHelper
before {
skip_windows!
}
it 'can execute a simple file and validate the json schema' do
out = inspec('exec ' + example_control + ' --reporter json --no-create-lockfile')
out.stderr.must_equal ''

View file

@ -4,6 +4,10 @@ require 'json-schema'
describe 'inspec exec' do
include FunctionalHelper
before {
skip_windows!
}
it 'can execute a profile with the mini json formatter and validate its schema' do
out = inspec('exec ' + example_profile + ' --reporter json-min --no-create-lockfile')
out.stderr.must_equal ''

View file

@ -4,6 +4,10 @@ require 'rexml/document'
describe 'inspec exec with junit formatter' do
include FunctionalHelper
before {
skip_windows!
}
it 'can execute a simple file with the junit formatter' do
out = inspec('exec ' + example_control + ' --reporter junit --no-create-lockfile')
out.stderr.must_equal ''

View file

@ -4,6 +4,10 @@ describe 'inspec exec' do
include FunctionalHelper
let(:looks_like_a_stacktrace) { %r{lib/inspec/.+\.rb:\d+:in} }
before {
skip_windows!
}
it 'can execute the profile' do
out = inspec('exec ' + example_profile + ' --no-create-lockfile')
out.stderr.must_equal ''
@ -181,9 +185,11 @@ Test Summary: 0 successful, 0 failures, 0 skipped
let(:json) { JSON.load(out.stdout) }
it 'exits with an error' do
out.stdout.force_encoding(Encoding::UTF_8).must_include "skippy\e[0m\n\e[38;5;247m ↺ This will be skipped super intentionally.\e[0m\n"
out.stdout.force_encoding(Encoding::UTF_8).must_include " ↺ CONTROL database: MySQL Session\e[0m\n\e[38;5;247m ↺ Can't run MySQL SQL checks without authentication\e[0m\n"
out.stdout.force_encoding(Encoding::UTF_8).must_include "Profile Summary: 0 successful controls, 0 control failures, \e[38;5;247m2 controls skipped\e[0m\nTest Summary: 0 successful, 0 failures, \e[38;5;247m2 skipped\e[0m\n"
stdout = out.stdout.force_encoding(Encoding::UTF_8)
stdout.must_include "skippy\e[0m\n\e[38;5;247m ↺ This will be skipped super intentionally.\e[0m\n"
stdout.must_include " ↺ CONTROL database: MySQL Session\e[0m\n\e[38;5;247m ↺ Can't run MySQL SQL checks without authentication\e[0m\n"
stdout.must_include "Profile Summary: 0 successful controls, 0 control failures, \e[38;5;247m2 controls skipped\e[0m\nTest Summary: 0 successful, 0 failures, \e[38;5;247m2 skipped\e[0m\n"
out.exit_status.must_equal 101
end
end

View file

@ -4,6 +4,10 @@ require 'mixlib/shellout'
describe 'inspec json' do
include FunctionalHelper
before {
skip_windows!
}
it 'read the profile json' do
out = inspec('json ' + example_profile)
out.stderr.must_equal ''
@ -149,7 +153,8 @@ describe 'inspec json' do
it 'can execute a profile with warn calls and parse STDOUT as valid JSON' do
out = inspec('json ' + File.join(profile_path, 'warn_logs'))
out.exit_status.must_equal 0
JSON.load(out.stdout)
refute_empty out.stdout
assert_kind_of Hash, JSON.load(out.stdout)
end
end

View file

@ -3,6 +3,10 @@ require 'functional/helper'
describe 'inspec schema' do
include FunctionalHelper
before {
skip_windows!
}
describe 'extracting the platforms schema export' do
it 'can execute a platforms schema command' do
out = inspec('schema platforms')

View file

@ -3,6 +3,10 @@ require 'functional/helper'
describe 'inspec shell tests' do
include FunctionalHelper
before {
skip_windows!
}
describe 'cmd' do
def do_shell_c(code, exit_status, json = false, stderr = '')
json_suffix = " --reporter 'json'" if json

View file

@ -3,6 +3,10 @@ require 'functional/helper'
describe 'inspec supermarket' do
include FunctionalHelper
before {
skip_windows!
}
it 'help' do
out = inspec('supermarket help')
out.exit_status.must_equal 0

View file

@ -3,6 +3,10 @@ require 'functional/helper'
describe 'command tests' do
include FunctionalHelper
before {
skip_windows!
}
describe 'version' do
it 'provides the version number on stdout' do
out = inspec('version')

View file

@ -4,6 +4,10 @@ require 'tmpdir'
describe 'example inheritance profile' do
include FunctionalHelper
before {
skip_windows!
}
it 'can vendor profile dependencies' do
prepare_examples('inheritance') do |dir|
out = inspec('vendor ' + dir + ' --overwrite')

View file

@ -7,6 +7,10 @@ describe 'The license acceptance mechanism' do
describe 'when the license has not been accepted' do
describe 'when the user passes the --chef-license accept flag' do
before {
skip_windows!
}
it 'should silently work normally' do
without_license do
Dir.mktmpdir do |tmp_home|
@ -39,6 +43,11 @@ describe 'The license acceptance mechanism' do
# Since the license-acceptance library detects TTYs, and changes behavior
# if not found, we can't test interactive acceptance anymore
describe 'when no mechanism is used to accept the license and we are non-interactive' do
before {
skip_windows!
}
it 'should exit ASAP with code 172' do
without_license do
Dir.mktmpdir do |tmp_home|

View file

@ -5,6 +5,10 @@ require 'functional/helper'
describe 'Deprecation Facility Behavior' do
include FunctionalHelper
before {
skip_windows!
}
let(:profile) { File.join(profile_path, 'deprecation', profile_name) }
let(:invocation) { "exec #{profile} #{control_flag}" }
# Running in JSON mode has the side-effect of sending log messages to $stderr

View file

@ -8,6 +8,10 @@ require 'functional/helper'
describe 'plugin loader' do
include FunctionalHelper
before {
skip_windows!
}
it 'handles an unloadable plugin correctly' do
outcome = inspec_with_env('version', INSPEC_CONFIG_DIR: File.join(config_dir_path, 'plugin_error_on_load'))
outcome.exit_status.must_equal 2
@ -30,6 +34,10 @@ end
describe 'when disabling plugins' do
include FunctionalHelper
before {
skip_windows!
}
describe 'when disabling the core plugins' do
it 'should not be able to use core-provided commands' do
run_result = run_inspec_process('--disable-core-plugins habitat')
@ -56,6 +64,10 @@ end
describe 'cli command plugins' do
include FunctionalHelper
before {
skip_windows!
}
it 'is able to respond to a plugin-based cli subcommand' do
outcome = inspec_with_env('meaningoflife answer', INSPEC_CONFIG_DIR: File.join(config_dir_path, 'meaning_by_path'))
outcome.stderr.wont_include 'Could not find command "meaningoflife"'
@ -94,6 +106,10 @@ end
describe 'disable plugin usage message integration' do
include FunctionalHelper
before {
skip_windows!
}
it "mentions the --disable-{user,core}-plugins options" do
outcome = inspec('help')
['--disable-user-plugins', '--disable-core-plugins'].each do |option|
@ -109,6 +125,10 @@ end
describe 'DSL plugin types support' do
include PluginFunctionalHelper
before {
skip_windows!
}
let(:fixture_path) { File.join(profile_path, 'dsl_plugins', 'controls', profile_file)}
let(:dsl_plugin_path) { File.join(mock_path, 'plugins', 'inspec-dsl-test', 'lib', 'inspec-dsl-test.rb')}
let(:run_result) { run_inspec_with_plugin("exec #{fixture_path}", plugin_path: dsl_plugin_path) }
@ -230,6 +250,10 @@ end
#=========================================================================================#
describe 'train plugin support' do
before {
skip_windows!
}
describe 'when a train plugin is installed' do
include FunctionalHelper
it 'can run inspec detect against a URL target' do

View file

@ -18,6 +18,10 @@ describe 'InSpec UI behavior' do
include PluginFunctionalHelper
include VisibleSpaces
before {
skip_windows!
}
let(:plugin_path) { File.join(mock_path, 'plugins', 'inspec-test-ui', 'lib', 'inspec-test-ui') }
let(:run_result) { run_inspec_with_plugin("#{pre_opts} testui #{feature} #{post_opts}", plugin_path: plugin_path) }
let(:pre_opts) { '' }
@ -117,11 +121,10 @@ EOT
end
describe 'exit codes' do
describe 'normal exit' do
let(:feature) { 'exitnormal' }
it 'has correct output' do
run_result.exit_status.must_equal 0
assert_exit_code 0, run_result
run_result.stderr.must_equal ''
run_result.stdout.must_equal "test exit normal\n"
end
@ -130,7 +133,7 @@ EOT
describe 'usage exit' do
let(:feature) { 'exitusage' }
it 'has correct output' do
run_result.exit_status.must_equal 1
assert_exit_code 1, run_result
run_result.stderr.must_equal '' # ie, we intentionally exit-1'd; not a crash
run_result.stdout.must_equal "test exit usage_error\n"
end
@ -139,7 +142,7 @@ EOT
describe 'plugin exit' do
let(:feature) { 'exitplugin' }
it 'has correct output' do
run_result.exit_status.must_equal 2
assert_exit_code 2, run_result
run_result.stderr.must_equal ''
run_result.stdout.must_equal "test exit plugin_error\n"
end
@ -148,7 +151,7 @@ EOT
describe 'skipped exit' do
let(:feature) { 'exitskipped' }
it 'has correct output' do
run_result.exit_status.must_equal 101
assert_exit_code 101, run_result
run_result.stderr.must_equal ''
run_result.stdout.must_equal "test exit skipped_tests\n"
end
@ -157,7 +160,7 @@ EOT
describe 'failed exit' do
let(:feature) { 'exitfailed' }
it 'has correct output' do
run_result.exit_status.must_equal 100
assert_exit_code 100, run_result
run_result.stderr.must_equal ''
run_result.stdout.must_equal "test exit failed_tests\n"
end
@ -171,7 +174,7 @@ EOT
describe 'the interactive flag' do
let(:feature) { 'interactive' }
it "should report the interactive flag is on" do
run_result.exit_status.must_equal 0
assert_exit_code 0, run_result
run_result.stdout.must_include 'true'
end
end
@ -187,7 +190,7 @@ EOT
describe 'prompting' do
let(:feature) { 'prompt' }
it "should launch apollo" do
run_result.exit_status.must_equal 0
assert_exit_code 0, run_result
run_result.stdout.must_include 'Apollo'
end
end
@ -200,7 +203,7 @@ EOT
describe 'the interactive flag' do
let(:feature) { 'interactive' }
it "should report the interactive flag is off" do
run_result.exit_status.must_equal 0
assert_exit_code 0, run_result
run_result.stdout.must_include 'false'
end
end
@ -208,9 +211,9 @@ EOT
describe 'prompting' do
let(:feature) { 'prompt' }
it "should crash with stacktrace" do
run_result.exit_status.must_equal 1
assert_exit_code 1, run_result
run_result.stderr.must_include 'Inspec::UserInteractionRequired'
end
end
end
end
end