inspec/test/docker_test.rb
Steven Danna dea19846a3
Explicitly require docker transport to avoid autoload bug
Ruby's autoload feature is not threadsafe.  We are hoping requiring the
docker plugin early will fix odd failures we have been seeing.

Signed-off-by: Steven Danna <steve@chef.io>
2016-08-05 17:58:20 +01:00

58 lines
1.3 KiB
Ruby

# encoding: utf-8
# author: Dominik Richter
require_relative 'docker_run'
require_relative '../lib/inspec'
#
# BUGON: These requires are to get around concurrency issues with
# autoloading in Ruby
#
require 'train'
require 'train/plugins'
require 'train/plugins/transport'
require 'train/transports/docker'
tests = ARGV
if tests.empty?
puts 'Nothing to do.'
exit 0
end
class DockerTester
def initialize(tests)
@tests = tests
@docker = DockerRunner.new
end
def run
puts ['Running tests:', @tests].flatten.join("\n- ")
puts ''
conf = RSpec.configuration
reporter = conf.reporter
results = nil
# start reporting loop
reporter.report(0) do |report|
results = @docker.run_all do |name, container|
status = test_container(container, report)
status.all? ? nil : "Failed to run tests on #{name}"
end
end
# check if we were successful
failures = results.compact
failures.each { |f| puts "\033[31;1m#{f}\033[0m\n\n" }
failures.empty? or fail 'Test failures'
end
def test_container(container, report)
puts "--> run test on docker #{container.id}"
opts = { 'target' => "docker://#{container.id}" }
runner = Inspec::Runner.new(opts)
@tests.each { |test| runner.add_target(test, opts) }
runner.tests.map { |g| g.run(report) }
end
end
DockerTester.new(tests).run