From bfbb89a05cf0d24c17489cc86a9fd2d4da62a462 Mon Sep 17 00:00:00 2001 From: Ryan Davis Date: Fri, 7 Jun 2019 03:15:22 -0700 Subject: [PATCH 1/5] First pass making bin/inspec faster. This removes requiring 'inspec' in bin/inspec and goes straight to 'inspec/cli'. It removes almost all the top-level requires in inspec/cli.rb. This requires some autoloads and rearrangements of requires to the command methods themselves. ``` % SLOW=1 time rake test:functional before: Finished in 1072.442633s, 0.3264 runs/s, 1.9013 assertions/s. after: Finished in 681.514579s, 0.5136 runs/s, 2.9919 assertions/s. ``` I'm positive there is more we can do. Signed-off-by: Ryan Davis --- inspec-bin/bin/inspec | 1 - lib/inspec/cli.rb | 57 ++++++++++++++++++++++++++++---------- lib/inspec/runner.rb | 1 + lib/inspec/runner_rspec.rb | 2 ++ 4 files changed, 46 insertions(+), 15 deletions(-) diff --git a/inspec-bin/bin/inspec b/inspec-bin/bin/inspec index 6ec84339fc..ce68cc7995 100755 --- a/inspec-bin/bin/inspec +++ b/inspec-bin/bin/inspec @@ -7,6 +7,5 @@ Encoding.default_internal = Encoding::UTF_8 lib = File.expand_path("../lib", __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) -require "inspec" require "inspec/cli" Inspec::InspecCLI.start(ARGV) diff --git a/lib/inspec/cli.rb b/lib/inspec/cli.rb index 03c51984ee..365440b3c5 100644 --- a/lib/inspec/cli.rb +++ b/lib/inspec/cli.rb @@ -1,19 +1,30 @@ # Copyright 2015 Dominik Richter -require "logger" -require "thor" -require "json" -require "pp" -require "inspec/utils/json_log" -require "inspec/utils/latest_version" -require "inspec/base_cli" -require "inspec/plugin/v1" -require "inspec/plugin/v2" -require "inspec/runner_mock" -require "inspec/env_printer" -require "inspec/schema" -require "inspec/config" -require "inspec/dist" +require "inspec/utils/deprecation/deprecator" + +module Inspec # TODO: move this somewhere "better"? + autoload :BaseCLI, "inspec/base_cli" + autoload :Deprecation, "inspec/utils/deprecation" + autoload :Exceptions, "inspec/exceptions" + autoload :Fetcher, "inspec/fetcher" + autoload :Formatters, "inspec/formatters" + autoload :Globals, "inspec/globals" + autoload :Impact, "inspec/impact" + autoload :Impact, "inspec/impact" + autoload :InputRegistry, "inspec/input_registry" + autoload :Profile, "inspec/profile" + autoload :Reporters, "inspec/reporters" + autoload :Resource, "inspec/resource" + autoload :Rule, "inspec/rule" + autoload :Runner, "inspec/runner" + autoload :Runner, "inspec/runner" + autoload :Shell, "inspec/shell" + autoload :SourceReader, "inspec/source_reader" + autoload :Telemetry, "inspec/utils/telemetry" + autoload :V1, "inspec/plugin/v1" + autoload :V2, "inspec/plugin/v2" + autoload :VERSION, "inspec/version" +end class Inspec::InspecCLI < Inspec::BaseCLI class_option :log_level, aliases: :l, type: :string, @@ -50,6 +61,9 @@ class Inspec::InspecCLI < Inspec::BaseCLI desc: "A list of controls to include. Ignore all other tests." profile_options def json(target) + require 'inspec/resources' + require 'json' + o = config diagnose(o) o["log_location"] = $stderr @@ -86,6 +100,8 @@ def json(target) option :format, type: :string profile_options def check(path) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength + require 'inspec/resources' + o = config diagnose(o) o["log_location"] ||= STDERR if o["format"] == "json" @@ -142,6 +158,8 @@ def check(path) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength option :overwrite, type: :boolean, default: false, desc: "Overwrite existing vendored dependencies and lockfile." def vendor(path = nil) + require 'inspec/resources' + o = config configure_logger(o) o[:logger] = Logger.new($stdout) @@ -163,6 +181,8 @@ def vendor(path = nil) option :ignore_errors, type: :boolean, default: false, desc: "Ignore profile warnings." def archive(path) + require 'inspec/resources' + o = config diagnose(o) @@ -347,6 +367,8 @@ def env(shell = nil) desc "schema NAME", "print the JSON schema", hide: true def schema(name) + require 'inspec/schema' + puts Inspec::Schema.json(name) rescue StandardError => e puts e @@ -360,8 +382,10 @@ def version v = { version: Inspec::VERSION } puts v.to_json else + require 'inspec/utils/latest_version' puts Inspec::VERSION # display outdated version + # TODO: remove this. Don't notify of update to a gem when they install omnibus latest = LatestInSpecVersion.new.latest || Inspec::VERSION if Gem::Version.new(Inspec::VERSION) < Gem::Version.new(latest) puts "\nYour version of #{Inspec::Dist::PRODUCT_NAME} is out of date! The latest version is #{latest}." @@ -370,6 +394,11 @@ def version end map %w{-v --version} => :version + desc 'nothing', 'does nothing' + def nothing + puts 'you did nothing' + end + private def run_command(opts) diff --git a/lib/inspec/runner.rb b/lib/inspec/runner.rb index 915469bd89..16cc8e87e4 100644 --- a/lib/inspec/runner.rb +++ b/lib/inspec/runner.rb @@ -9,6 +9,7 @@ require "inspec/config" require "inspec/dependencies/cache" require "inspec/dist" +require "inspec/resources" require "inspec/reporters" require "inspec/runner_rspec" # spec requirements diff --git a/lib/inspec/runner_rspec.rb b/lib/inspec/runner_rspec.rb index 990532de2c..4d263d7beb 100644 --- a/lib/inspec/runner_rspec.rb +++ b/lib/inspec/runner_rspec.rb @@ -1,6 +1,8 @@ require "rspec/core" require "rspec/its" require "inspec/formatters" +require "matchers/matchers" +require "inspec/rspec_extensions" # There be dragons!! Or borgs, or something... # This file and all its contents cannot be unit-tested. both test-suits From fae4230a41bbed6dfd597d8ec1438df70989b217 Mon Sep 17 00:00:00 2001 From: Ryan Davis Date: Fri, 7 Jun 2019 16:33:56 -0700 Subject: [PATCH 2/5] Removing inspec/profile_vendor from inspec/base_cli. This was the next most expensive require in the analysis. Also rearranged the way that ui handled tables to be lazy. ``` % SLOW=1 time rake test:functional before: Finished in 681.514579s, 0.5136 runs/s, 2.9919 assertions/s. after : Finished in 642.655918s, 0.5446 runs/s, 3.1728 assertions/s. ``` Signed-off-by: Ryan Davis --- lib/fetchers/mock.rb | 2 ++ lib/inspec/backend.rb | 1 + lib/inspec/base_cli.rb | 5 +++- lib/inspec/cli.rb | 23 +++++++++++-------- lib/inspec/fetcher.rb | 1 + lib/inspec/file_provider.rb | 1 + lib/inspec/metadata.rb | 2 +- lib/inspec/plugin/v1/plugin_types/resource.rb | 2 ++ lib/inspec/resource.rb | 1 + lib/inspec/resources.rb | 2 ++ lib/inspec/resources/command.rb | 2 ++ lib/inspec/ui.rb | 14 ++++------- lib/inspec/ui_table_helper.rb | 12 ++++++++++ lib/inspec/utils/pkey_reader.rb | 2 ++ test/functional/inspec_archive_test.rb | 2 ++ test/functional/inspec_exec_test.rb | 1 + test/helpers/mock_loader.rb | 3 +++ test/unit/config_test.rb | 1 + test/unit/dependencies/lockfile_test.rb | 1 + test/unit/dsl/control_test.rb | 1 + test/unit/fetchers/git_test.rb | 1 + test/unit/fetchers/local_test.rb | 1 + test/unit/fetchers/source_reader_test.rb | 1 + test/unit/fetchers/url_test.rb | 1 + test/unit/file_provider_test.rb | 1 + test/unit/plugin/v1/resource_test.rb | 6 ++++- .../profiles/control_eval_context_test.rb | 1 + test/unit/profiles/profile_test.rb | 1 + test/unit/source_readers/flat_test.rb | 2 ++ test/unit/source_readers/inspec_test.rb | 2 ++ test/unit/ui_test.rb | 1 + 31 files changed, 75 insertions(+), 22 deletions(-) create mode 100644 lib/inspec/ui_table_helper.rb diff --git a/lib/fetchers/mock.rb b/lib/fetchers/mock.rb index 5b408300ee..515ff106d5 100644 --- a/lib/fetchers/mock.rb +++ b/lib/fetchers/mock.rb @@ -1,3 +1,5 @@ +require "inspec/fetcher" + module Fetchers class Mock < Inspec.fetcher(1) name "mock" diff --git a/lib/inspec/backend.rb b/lib/inspec/backend.rb index 371f7a263c..001a957eb1 100644 --- a/lib/inspec/backend.rb +++ b/lib/inspec/backend.rb @@ -2,6 +2,7 @@ require "train" require "inspec/config" +require "inspec/version" module Inspec module Backend diff --git a/lib/inspec/base_cli.rb b/lib/inspec/base_cli.rb index dfc84b39c6..0f150b342f 100644 --- a/lib/inspec/base_cli.rb +++ b/lib/inspec/base_cli.rb @@ -1,7 +1,8 @@ require "thor" require "inspec/log" -require "inspec/profile_vendor" require "inspec/ui" +require "inspec/config" +require "inspec/utils/deprecation/global_method" # Allow end of options during array type parsing # https://github.com/erikhuda/thor/issues/631 @@ -233,6 +234,8 @@ def pretty_handle_exception(exception) end def vendor_deps(path, opts) + require "inspec/profile_vendor" + profile_path = path || Dir.pwd profile_vendor = Inspec::ProfileVendor.new(profile_path) diff --git a/lib/inspec/cli.rb b/lib/inspec/cli.rb index 365440b3c5..90c5fd25b4 100644 --- a/lib/inspec/cli.rb +++ b/lib/inspec/cli.rb @@ -1,6 +1,9 @@ # Copyright 2015 Dominik Richter require "inspec/utils/deprecation/deprecator" +require "inspec/dist" +require "inspec/backend" +require "inspec/dependencies/cache" module Inspec # TODO: move this somewhere "better"? autoload :BaseCLI, "inspec/base_cli" @@ -61,8 +64,8 @@ class Inspec::InspecCLI < Inspec::BaseCLI desc: "A list of controls to include. Ignore all other tests." profile_options def json(target) - require 'inspec/resources' - require 'json' + require "inspec/resources" + require "json" o = config diagnose(o) @@ -100,7 +103,7 @@ def json(target) option :format, type: :string profile_options def check(path) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength - require 'inspec/resources' + require "inspec/resources" o = config diagnose(o) @@ -158,7 +161,7 @@ def check(path) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength option :overwrite, type: :boolean, default: false, desc: "Overwrite existing vendored dependencies and lockfile." def vendor(path = nil) - require 'inspec/resources' + require "inspec/resources" o = config configure_logger(o) @@ -181,7 +184,7 @@ def vendor(path = nil) option :ignore_errors, type: :boolean, default: false, desc: "Ignore profile warnings." def archive(path) - require 'inspec/resources' + require "inspec/resources" o = config diagnose(o) @@ -367,7 +370,7 @@ def env(shell = nil) desc "schema NAME", "print the JSON schema", hide: true def schema(name) - require 'inspec/schema' + require "inspec/schema" puts Inspec::Schema.json(name) rescue StandardError => e @@ -382,7 +385,7 @@ def version v = { version: Inspec::VERSION } puts v.to_json else - require 'inspec/utils/latest_version' + require "inspec/utils/latest_version" puts Inspec::VERSION # display outdated version # TODO: remove this. Don't notify of update to a gem when they install omnibus @@ -394,9 +397,9 @@ def version end map %w{-v --version} => :version - desc 'nothing', 'does nothing' + desc "nothing", "does nothing" def nothing - puts 'you did nothing' + puts "you did nothing" end private @@ -452,6 +455,8 @@ def run_command(opts) #---------------------------------------------------------------------# # Plugin Loading #---------------------------------------------------------------------# +require "inspec/plugin/v2" + begin # Load v2 plugins. Manually check for plugin disablement. omit_core = ARGV.delete("--disable-core-plugins") diff --git a/lib/inspec/fetcher.rb b/lib/inspec/fetcher.rb index 1a3ef015c8..99d4a0b0d8 100644 --- a/lib/inspec/fetcher.rb +++ b/lib/inspec/fetcher.rb @@ -35,6 +35,7 @@ def self.fetcher(version) end end +# TODO: remove. require up, not down. require "fetchers/local" require "fetchers/url" require "fetchers/git" diff --git a/lib/inspec/file_provider.rb b/lib/inspec/file_provider.rb index da0e4d4648..636b2bc75e 100644 --- a/lib/inspec/file_provider.rb +++ b/lib/inspec/file_provider.rb @@ -1,4 +1,5 @@ require "rubygems/package" +require "pathname" require "zlib" require "zip" diff --git a/lib/inspec/metadata.rb b/lib/inspec/metadata.rb index 36f5899048..8d38a85555 100644 --- a/lib/inspec/metadata.rb +++ b/lib/inspec/metadata.rb @@ -4,7 +4,6 @@ require "rubygems/version" require "rubygems/requirement" require "semverse" -require "erb" require "inspec/version" require "inspec/utils/spdx" @@ -200,6 +199,7 @@ def self.finalize(metadata, profile_id, options, logger = nil) end def self.from_yaml(ref, content, profile_id, logger = nil) + require "erb" res = Metadata.new(ref, logger) res.params = YAML.load(ERB.new(content).result) res.content = content diff --git a/lib/inspec/plugin/v1/plugin_types/resource.rb b/lib/inspec/plugin/v1/plugin_types/resource.rb index 6700db6174..dca898e957 100644 --- a/lib/inspec/plugin/v1/plugin_types/resource.rb +++ b/lib/inspec/plugin/v1/plugin_types/resource.rb @@ -1,3 +1,5 @@ +require "inspec/exceptions" + module Inspec module ResourceBehaviors def to_s diff --git a/lib/inspec/resource.rb b/lib/inspec/resource.rb index 1853468a8f..20ad39b3ee 100644 --- a/lib/inspec/resource.rb +++ b/lib/inspec/resource.rb @@ -1,5 +1,6 @@ # copyright: 2015, Vulcano Security GmbH require "inspec/plugin/v1" +require "inspec/utils/deprecation/global_method" # for resources module Inspec class ProfileNotFound < StandardError; end diff --git a/lib/inspec/resources.rb b/lib/inspec/resources.rb index 2ae7c03153..3cefacfc4e 100644 --- a/lib/inspec/resources.rb +++ b/lib/inspec/resources.rb @@ -4,6 +4,8 @@ # This relies on AWS being stripped from the inspec-core gem inspec_core_only = !File.exist?(File.join(File.dirname(__FILE__), "..", "resource_support", "aws.rb")) +require "rspec/matchers" + # Do not attempt to load cloud resources if we are in inspec-core mode unless inspec_core_only require "resource_support/aws" diff --git a/lib/inspec/resources/command.rb b/lib/inspec/resources/command.rb index be326132bf..bd0b0d67e2 100644 --- a/lib/inspec/resources/command.rb +++ b/lib/inspec/resources/command.rb @@ -1,5 +1,7 @@ # copyright: 2015, Vulcano Security GmbH +require "inspec/resource" + module Inspec::Resources class Cmd < Inspec.resource(1) name "command" diff --git a/lib/inspec/ui.rb b/lib/inspec/ui.rb index ad3fc3b249..8ad8126e55 100644 --- a/lib/inspec/ui.rb +++ b/lib/inspec/ui.rb @@ -1,6 +1,3 @@ -require "tty-table" -require "tty-prompt" - module Inspec # Provides simple terminal UI interaction primitives for CLI commands and plugins. class UI @@ -158,6 +155,8 @@ def list_item(str, opts = { print: true }) # t << ['', '', 1] # end def table(opts = { print: true }) + require "inspec/ui_table_helper" + the_table = TableHelper.new yield(the_table) @@ -174,13 +173,6 @@ def table(opts = { print: true }) print_or_return(result, opts[:print]) end - class TableHelper < TTY::Table - def header=(ary) - cells = ary.dup.map { |label| { value: label, alignment: :center } } - @header = TTY::Table::Header.new(cells) - end - end - #=========================================================================# # Exit Codes #=========================================================================# @@ -212,6 +204,8 @@ def prompt unless interactive? raise Inspec::UserInteractionRequired, "Somthing is trying to ask the user a question, but interactivity is disabled." end + require "tty-prompt" + @prompt ||= TTY::Prompt.new end end diff --git a/lib/inspec/ui_table_helper.rb b/lib/inspec/ui_table_helper.rb new file mode 100644 index 0000000000..f683deda13 --- /dev/null +++ b/lib/inspec/ui_table_helper.rb @@ -0,0 +1,12 @@ +require "tty-table" + +module Inspec + class UI + class TableHelper < TTY::Table + def header=(ary) + cells = ary.dup.map { |label| { value: label, alignment: :center } } + @header = TTY::Table::Header.new(cells) + end + end + end +end diff --git a/lib/inspec/utils/pkey_reader.rb b/lib/inspec/utils/pkey_reader.rb index daf29c053e..c05a3dbe10 100644 --- a/lib/inspec/utils/pkey_reader.rb +++ b/lib/inspec/utils/pkey_reader.rb @@ -1,3 +1,5 @@ +require "inspec/objects/input" + module PkeyReader def read_pkey(filecontent, passphrase) raise_if_unset(passphrase) diff --git a/test/functional/inspec_archive_test.rb b/test/functional/inspec_archive_test.rb index 7fa075ebac..2a160604e7 100644 --- a/test/functional/inspec_archive_test.rb +++ b/test/functional/inspec_archive_test.rb @@ -1,5 +1,7 @@ require "functional/helper" require "tmpdir" +require "zip" +require "rubygems/package" describe "inspec archive" do include FunctionalHelper diff --git a/test/functional/inspec_exec_test.rb b/test/functional/inspec_exec_test.rb index a876f95863..c3612a0b74 100644 --- a/test/functional/inspec_exec_test.rb +++ b/test/functional/inspec_exec_test.rb @@ -217,6 +217,7 @@ let(:out) { inspec("exec " + File.join(profile_path, "aws-profile")) } let(:stdout) { out.stdout.force_encoding(Encoding::UTF_8) } it "exits with an error" do + skip if ENV["NO_AWS"] stdout.must_include "Resource `aws_iam_users` is not supported on platform" stdout.must_include "Resource `aws_iam_access_keys` is not supported on platform" stdout.must_include "Resource `aws_s3_bucket` is not supported on platform" diff --git a/test/helpers/mock_loader.rb b/test/helpers/mock_loader.rb index 31ae717826..051076a3f0 100644 --- a/test/helpers/mock_loader.rb +++ b/test/helpers/mock_loader.rb @@ -1,3 +1,5 @@ +require "inspec/resources" + class MockLoader # collects emulation operating systems OPERATING_SYSTEMS = { @@ -568,6 +570,7 @@ def self.profile_path(name) end def self.load_profile(name, opts = {}) + require "inspec/profile" opts[:test_collector] = Inspec::RunnerMock.new opts[:backend] = Inspec::Backend.create(Inspec::Config.mock(opts)) Inspec::Profile.for_target(profile_path(name), opts) diff --git a/test/unit/config_test.rb b/test/unit/config_test.rb index 0c0da7b5a7..bf683ecdf5 100644 --- a/test/unit/config_test.rb +++ b/test/unit/config_test.rb @@ -2,6 +2,7 @@ require "stringio" require "inspec/config" +require "plugins/inspec-compliance/lib/inspec-compliance/api" describe "Inspec::Config" do diff --git a/test/unit/dependencies/lockfile_test.rb b/test/unit/dependencies/lockfile_test.rb index 36eba600e0..af76f535fb 100644 --- a/test/unit/dependencies/lockfile_test.rb +++ b/test/unit/dependencies/lockfile_test.rb @@ -1,4 +1,5 @@ require "helper" +require "inspec/dependencies/lockfile" # TODO: move files or namespace properly describe Inspec::Lockfile do # Ruby 1.9: .to_yaml format is slightly different diff --git a/test/unit/dsl/control_test.rb b/test/unit/dsl/control_test.rb index 909c74b190..04905fee59 100644 --- a/test/unit/dsl/control_test.rb +++ b/test/unit/dsl/control_test.rb @@ -1,5 +1,6 @@ require "helper" require "inspec/config" +require "inspec/profile" require "inspec/runner_mock" require "fetchers/mock" diff --git a/test/unit/fetchers/git_test.rb b/test/unit/fetchers/git_test.rb index 9ac069c8af..b425616761 100644 --- a/test/unit/fetchers/git_test.rb +++ b/test/unit/fetchers/git_test.rb @@ -1,4 +1,5 @@ require "helper" +require "inspec/fetcher" describe Fetchers::Git do let(:fetcher) { Fetchers::Git } diff --git a/test/unit/fetchers/local_test.rb b/test/unit/fetchers/local_test.rb index d2e492de15..f7869d7160 100644 --- a/test/unit/fetchers/local_test.rb +++ b/test/unit/fetchers/local_test.rb @@ -1,4 +1,5 @@ require "helper" +require "inspec/fetcher" describe Fetchers::Local do let(:fetcher) { Fetchers::Local } diff --git a/test/unit/fetchers/source_reader_test.rb b/test/unit/fetchers/source_reader_test.rb index 39a8471c48..517d805687 100644 --- a/test/unit/fetchers/source_reader_test.rb +++ b/test/unit/fetchers/source_reader_test.rb @@ -1,4 +1,5 @@ require "helper" +require "inspec/source_reader" describe Inspec::SourceReader do let(:reg) { Inspec::SourceReader } diff --git a/test/unit/fetchers/url_test.rb b/test/unit/fetchers/url_test.rb index c683c61e65..78d35ae91e 100644 --- a/test/unit/fetchers/url_test.rb +++ b/test/unit/fetchers/url_test.rb @@ -1,4 +1,5 @@ require "helper" +require "inspec/fetcher" # TODO: require fetchers/url directly describe Fetchers::Url do it "registers with the fetchers registry" do diff --git a/test/unit/file_provider_test.rb b/test/unit/file_provider_test.rb index ca9f7e272d..ad5483fe8c 100644 --- a/test/unit/file_provider_test.rb +++ b/test/unit/file_provider_test.rb @@ -1,4 +1,5 @@ require "helper" +require "inspec/file_provider" # TODO: split describe Inspec::MockProvider do let(:subject) { Inspec::MockProvider.new(target) } diff --git a/test/unit/plugin/v1/resource_test.rb b/test/unit/plugin/v1/resource_test.rb index 398f47eb12..af7c505685 100644 --- a/test/unit/plugin/v1/resource_test.rb +++ b/test/unit/plugin/v1/resource_test.rb @@ -1,4 +1,7 @@ require "helper" +require "inspec/resource" +require "inspec/resources/os" +# require 'inspec/plugin/v1/plugin_types/resource' describe Inspec::Plugins::Resource do let(:base) { Inspec::Plugins::Resource } @@ -17,7 +20,8 @@ end def create(&block) - random_name = (0...50).map { (65 + rand(26)).chr }.join + # random_name = (0...50).map { (65 + rand(26)).chr }.join + random_name = "NotSoRandomName" Class.new(base) do name random_name instance_eval(&block) diff --git a/test/unit/profiles/control_eval_context_test.rb b/test/unit/profiles/control_eval_context_test.rb index d00ad3c63d..fb8da5edcf 100644 --- a/test/unit/profiles/control_eval_context_test.rb +++ b/test/unit/profiles/control_eval_context_test.rb @@ -1,5 +1,6 @@ require "helper" require "inspec/control_eval_context" +require "inspec/profile_context" describe Inspec::ControlEvalContext do module FakeDSL diff --git a/test/unit/profiles/profile_test.rb b/test/unit/profiles/profile_test.rb index 246c623f76..d5aadfc4ff 100644 --- a/test/unit/profiles/profile_test.rb +++ b/test/unit/profiles/profile_test.rb @@ -3,6 +3,7 @@ require "inspec/runner_mock" require "inspec/resource" require "inspec/resources/command" +require "inspec/profile" describe Inspec::Profile do let(:logger) { Minitest::Mock.new } diff --git a/test/unit/source_readers/flat_test.rb b/test/unit/source_readers/flat_test.rb index 2427d12fa5..04f19a0242 100644 --- a/test/unit/source_readers/flat_test.rb +++ b/test/unit/source_readers/flat_test.rb @@ -1,4 +1,6 @@ require "helper" +require "inspec/source_reader" +require "source_readers/flat" # TODO: break circular describe SourceReaders::Flat do let(:reader) { SourceReaders::Flat } diff --git a/test/unit/source_readers/inspec_test.rb b/test/unit/source_readers/inspec_test.rb index 935e7d65df..c300c2303c 100644 --- a/test/unit/source_readers/inspec_test.rb +++ b/test/unit/source_readers/inspec_test.rb @@ -1,4 +1,6 @@ require "helper" +require "inspec/source_reader" +require "source_readers/inspec" # TODO: break circular describe SourceReaders::InspecReader do let(:reader) { SourceReaders::InspecReader } diff --git a/test/unit/ui_test.rb b/test/unit/ui_test.rb index 0c40955389..de7273ee27 100644 --- a/test/unit/ui_test.rb +++ b/test/unit/ui_test.rb @@ -3,6 +3,7 @@ require "minitest/autorun" require "inspec/ui" require "inspec/base_cli" +require "inspec/errors" require "stringio" # https://gist.github.com/chrisopedia/8754917 From dd7f9abb209c0539e6830b34301e17a11ba5fc0c Mon Sep 17 00:00:00 2001 From: Ryan Davis Date: Mon, 10 Jun 2019 12:32:05 -0700 Subject: [PATCH 3/5] Revamped test/functional/ui_test.rb to check output before exit codes. Helps with debugging. Signed-off-by: Ryan Davis --- test/functional/ui_test.rb | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/test/functional/ui_test.rb b/test/functional/ui_test.rb index b2d23f99e6..7812a87824 100644 --- a/test/functional/ui_test.rb +++ b/test/functional/ui_test.rb @@ -32,19 +32,18 @@ def show_spaces(str) describe "headline" do let(:feature) { "headline" } it "has correct output" do - run_result.exit_status.must_equal 0 expected = <<-EOT ───────────────────────────────── \e[1m\e[37mBig News!\e[0m ───────────────────────────────── \n EOT show_spaces(run_result.stdout).must_equal show_spaces(expected) + run_result.exit_status.must_equal 0 end end describe "table" do let(:feature) { "table" } it "has correct output" do - run_result.exit_status.must_equal 0 expected = <<~EOT ┌──────────────────────┬──────────┬───────────┐ │\e[1m\e[37m Band \e[0m│\e[1m\e[37m Coolness \e[0m│\e[1m\e[37m Nerd Cred \e[0m│ @@ -55,39 +54,40 @@ def show_spaces(str) └──────────────────────┴──────────┴───────────┘ EOT show_spaces(run_result.stdout).must_equal show_spaces(expected) + run_result.exit_status.must_equal 0 end end describe "warning" do let(:feature) { "warning" } it "has correct output" do - run_result.exit_status.must_equal 0 expected = <<~EOT \e[1m\e[33mWARNING:\e[0m Things will be OK in the end EOT show_spaces(run_result.stdout).must_equal show_spaces(expected) + run_result.exit_status.must_equal 0 end end describe "error" do let(:feature) { "error" } it "has correct output" do - run_result.exit_status.must_equal 0 expected = <<~EOT \e[1m\e[38;5;9mERROR:\e[0m Burned down, fell over, and then sank into the swamp. EOT show_spaces(run_result.stdout).must_equal show_spaces(expected) + run_result.exit_status.must_equal 0 end end describe "list_item" do let(:feature) { "list_item" } it "has correct output" do - run_result.exit_status.must_equal 0 expected = <<-EOT \e[1m\e[37m•\e[0m TODO: make more lists EOT show_spaces(run_result.stdout).must_equal show_spaces(expected) + run_result.exit_status.must_equal 0 end end end @@ -97,8 +97,9 @@ def show_spaces(str) let(:post_opts) { "--no-color" } describe "everything" do let(:feature) { "everything" } + it "has correct output" do - run_result.exit_status.must_equal 0 + # TODO: trailing whitespace required in tests. Hidden via "--- \n" expected = <<~EOT --------------------------------- Big News! --------------------------------- \n @@ -114,6 +115,7 @@ def show_spaces(str) * TODO: make more lists EOT show_spaces(run_result.stdout).must_equal show_spaces(expected) + run_result.exit_status.must_equal 0 end end end @@ -122,45 +124,45 @@ def show_spaces(str) describe "normal exit" do let(:feature) { "exitnormal" } it "has correct output" do - assert_exit_code 0, run_result run_result.stderr.must_equal "" run_result.stdout.must_equal "test exit normal\n" + assert_exit_code 0, run_result end end describe "usage exit" do let(:feature) { "exitusage" } it "has correct output" do - 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" + assert_exit_code 1, run_result end end describe "plugin exit" do let(:feature) { "exitplugin" } it "has correct output" do - assert_exit_code 2, run_result run_result.stderr.must_equal "" run_result.stdout.must_equal "test exit plugin_error\n" + assert_exit_code 2, run_result end end describe "skipped exit" do let(:feature) { "exitskipped" } it "has correct output" do - assert_exit_code 101, run_result run_result.stderr.must_equal "" run_result.stdout.must_equal "test exit skipped_tests\n" + assert_exit_code 101, run_result end end describe "failed exit" do let(:feature) { "exitfailed" } it "has correct output" do - assert_exit_code 100, run_result run_result.stderr.must_equal "" run_result.stdout.must_equal "test exit failed_tests\n" + assert_exit_code 100, run_result end end @@ -172,8 +174,8 @@ def show_spaces(str) describe "the interactive flag" do let(:feature) { "interactive" } it "should report the interactive flag is on" do - assert_exit_code 0, run_result run_result.stdout.must_include "true" + assert_exit_code 0, run_result end end @@ -188,8 +190,8 @@ def show_spaces(str) describe "prompting" do let(:feature) { "prompt" } it "should launch apollo" do - assert_exit_code 0, run_result run_result.stdout.must_include "Apollo" + assert_exit_code 0, run_result end end end @@ -201,16 +203,16 @@ def show_spaces(str) describe "the interactive flag" do let(:feature) { "interactive" } it "should report the interactive flag is off" do - assert_exit_code 0, run_result run_result.stdout.must_include "false" + assert_exit_code 0, run_result end end describe "prompting" do let(:feature) { "prompt" } it "should crash with stacktrace" do - assert_exit_code 1, run_result run_result.stderr.must_include "Inspec::UserInteractionRequired" + assert_exit_code 1, run_result end end end From 387b713d791aa7b39bf72be9185e7ec8c30a530f Mon Sep 17 00:00:00 2001 From: Ryan Davis Date: Mon, 10 Jun 2019 15:04:14 -0700 Subject: [PATCH 4/5] Removing extra requires from inspec/profile. Signed-off-by: Ryan Davis --- lib/inspec/backend.rb | 1 + lib/inspec/profile.rb | 9 ++------- lib/plugins/inspec-habitat/test/unit/profile_test.rb | 1 + 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/lib/inspec/backend.rb b/lib/inspec/backend.rb index 001a957eb1..14773c4402 100644 --- a/lib/inspec/backend.rb +++ b/lib/inspec/backend.rb @@ -3,6 +3,7 @@ require "train" require "inspec/config" require "inspec/version" +require "inspec/resource" module Inspec module Backend diff --git a/lib/inspec/profile.rb b/lib/inspec/profile.rb index 9f8b2fa5f8..b709d6eab7 100644 --- a/lib/inspec/profile.rb +++ b/lib/inspec/profile.rb @@ -2,15 +2,10 @@ require "forwardable" require "openssl" +require "pathname" require "inspec/input_registry" -require "inspec/polyfill" -require "inspec/cached_fetcher" -require "inspec/file_provider" +require "inspec/cached_fetcher" # TODO: split or rename require "inspec/source_reader" -require "inspec/metadata" -require "inspec/backend" -require "inspec/rule" -require "inspec/log" require "inspec/profile_context" require "inspec/runtime_profile" require "inspec/method_source" diff --git a/lib/plugins/inspec-habitat/test/unit/profile_test.rb b/lib/plugins/inspec-habitat/test/unit/profile_test.rb index ef5be72a89..f4d3b7f63b 100644 --- a/lib/plugins/inspec-habitat/test/unit/profile_test.rb +++ b/lib/plugins/inspec-habitat/test/unit/profile_test.rb @@ -1,6 +1,7 @@ require "mixlib/log" require "fileutils" require "minitest/autorun" +require "inspec/backend" require_relative "../../lib/inspec-habitat/profile.rb" class InspecPlugins::Habitat::ProfileTest < Minitest::Test From f16238607daad6db91c6101d010ae32aef47f02e Mon Sep 17 00:00:00 2001 From: Ryan Davis Date: Mon, 10 Jun 2019 15:09:34 -0700 Subject: [PATCH 5/5] Turn off aws and azure testing via NO_AWS env. This massively speeds up our testing, shaving our functionals by a third (639s -> 423s). We can realize this speedup either by setting the env or by jettisoning aws and azure into their own separately tested gems. This is currently turned off for travis just for demonstration purposes. Signed-off-by: Ryan Davis --- .travis.yml | 4 ++-- lib/inspec/input_registry.rb | 1 + lib/inspec/resources.rb | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index d94a3f4f8b..34cd6d44ca 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,7 +22,7 @@ before_install: - gem --version - bundle --version env: - - SLOW=1 + - SLOW=1 NO_AWS=1 - CI_ENABLE_COVERAGE=true SLOW=1 script: bundle exec rake $SUITE matrix: @@ -31,7 +31,7 @@ matrix: - os: osx env: CI_ENABLE_COVERAGE=true SLOW=1 - os: linux - env: SLOW=1 + env: SLOW=1 NO_AWS=1 include: - rvm: 2.6.3 - rvm: 2.5.5 diff --git a/lib/inspec/input_registry.rb b/lib/inspec/input_registry.rb index 5cf0359566..96f39b1884 100644 --- a/lib/inspec/input_registry.rb +++ b/lib/inspec/input_registry.rb @@ -3,6 +3,7 @@ require "inspec/objects/input" require "inspec/secrets" require "inspec/exceptions" +require "inspec/plugin/v2" module Inspec # The InputRegistry's responsibilities include: diff --git a/lib/inspec/resources.rb b/lib/inspec/resources.rb index 3cefacfc4e..4f453f0d1e 100644 --- a/lib/inspec/resources.rb +++ b/lib/inspec/resources.rb @@ -2,7 +2,7 @@ # Detect if we are running the stripped-down inspec-core # This relies on AWS being stripped from the inspec-core gem -inspec_core_only = !File.exist?(File.join(File.dirname(__FILE__), "..", "resource_support", "aws.rb")) +inspec_core_only = ENV["NO_AWS"] || !File.exist?(File.join(File.dirname(__FILE__), "..", "resource_support", "aws.rb")) require "rspec/matchers"