class ChefDK::ComponentTest

Constants

DEFAULT_TEST

Attributes

base_dir[RW]
name[R]
omnibus_root[W]

Public Class Methods

new(name) click to toggle source
# File lib/chef-dk/component_test.rb, line 69
def initialize(name)
  @name = name
  @unit_test = DEFAULT_TEST
  @integration_test = DEFAULT_TEST
  @smoke_test = DEFAULT_TEST
  @base_dir = nil
  @gem_name_for_base_dir = nil
end

Public Instance Methods

assert_present!() click to toggle source
# File lib/chef-dk/component_test.rb, line 167
def assert_present!
  unless File.exist?( component_path )
    raise MissingComponentError.new(name, "Could not find #{component_path}")
  end
rescue Gem::LoadError => e
  raise MissingComponentError.new(name, e)
end
bin(binary) click to toggle source
# File lib/chef-dk/component_test.rb, line 102
def bin(binary)
  File.join(omnibus_bin_dir, binary)
end
component_path() click to toggle source
# File lib/chef-dk/component_test.rb, line 188
def component_path
  if base_dir
    File.join(omnibus_root, base_dir)
  elsif gem_base_dir
    gem_base_dir
  else
    raise "`base_dir` or `gem_base_dir` must be defined for component `#{name}`"
  end
end
default_command_options() click to toggle source
# File lib/chef-dk/component_test.rb, line 175
def default_command_options
  {
    cwd: component_path,
    env: {
      # Add the embedded/bin to the PATH so that bundle executable can
      # be found while running the tests.
      path_variable_key => omnibus_path,
      "CHEF_LICENSE" => "accept-no-persist",
    },
    timeout: 3600,
  }
end
embedded_bin(binary) click to toggle source
# File lib/chef-dk/component_test.rb, line 106
def embedded_bin(binary)
  File.join(omnibus_embedded_bin_dir, binary)
end
fail_if_exit_zero(cmd_string, failure_string = "") click to toggle source

Run a command, if the command returns zero, raise an error, otherwise, if it returns non-zero or doesn't exist, return a passing command so that the test parser doesn't crash.

# File lib/chef-dk/component_test.rb, line 135
def fail_if_exit_zero(cmd_string, failure_string = "")
  result = sh(cmd_string)
  if result.status.exitstatus == 0
    raise failure_string
  else
    sh("true")
  end
rescue Errno::ENOENT
  sh("true")
end
gem_base_dir() click to toggle source
# File lib/chef-dk/component_test.rb, line 198
def gem_base_dir
  return nil if @gem_name_for_base_dir.nil?

  # There is no way to say "give me the latest prerelease OR normal version of this gem.
  # So we first ask if there is a normal version, and if there is not, we ask if there
  # is a prerelease version.  ">= 0.a" is how we ask for a prerelease version, because a
  # prerelease version is defined as "any version with a letter in it."
  gem = Gem::Specification.find_by_name(@gem_name_for_base_dir)
  gem ||= Gem::Specification.find_by_name(@gem_name_for_base_dir, ">= 0.a")
  gem.gem_dir
end
gem_base_dir=(gem_name) click to toggle source
# File lib/chef-dk/component_test.rb, line 210
def gem_base_dir=(gem_name)
  @gem_name_for_base_dir = gem_name
end
integration_test(&test_block) click to toggle source
# File lib/chef-dk/component_test.rb, line 86
def integration_test(&test_block)
  @integration_test = test_block
end
nix_platform_native_bin_dir() click to toggle source
# File lib/chef-dk/component_test.rb, line 146
def nix_platform_native_bin_dir
  if /darwin/ =~ RUBY_PLATFORM
    "/usr/local/bin"
  else
    "/usr/bin"
  end
end
omnibus_path() click to toggle source
# File lib/chef-dk/component_test.rb, line 218
def omnibus_path
  [omnibus_bin_dir, omnibus_embedded_bin_dir, ENV["PATH"]].join(File::PATH_SEPARATOR)
end
omnibus_root() click to toggle source
# File lib/chef-dk/component_test.rb, line 214
def omnibus_root
  @omnibus_root || raise("`omnibus_root` must be set before running tests")
end
path_variable_key() click to toggle source
# File lib/chef-dk/component_test.rb, line 222
def path_variable_key
  ENV.keys.grep(/\Apath\Z/i).first
end
run_in_tmpdir(command, options = {}) click to toggle source
# File lib/chef-dk/component_test.rb, line 154
def run_in_tmpdir(command, options = {})
  tmpdir do |dir|
    options[:cwd] = dir
    sh(command, options)
  end
end
run_integration_test() click to toggle source
# File lib/chef-dk/component_test.rb, line 90
def run_integration_test
  instance_eval(&@integration_test)
end
run_smoke_test() click to toggle source
# File lib/chef-dk/component_test.rb, line 98
def run_smoke_test
  instance_eval(&@smoke_test)
end
run_unit_test() click to toggle source
# File lib/chef-dk/component_test.rb, line 82
def run_unit_test
  instance_eval(&@unit_test)
end
sh(command, options = {}) click to toggle source
# File lib/chef-dk/component_test.rb, line 110
def sh(command, options = {})
  combined_opts = default_command_options.merge(options)

  # Env is a hash, so it needs to be merged separately
  if options.key?(:env)
    combined_opts[:env] = default_command_options[:env].merge(options[:env])
  end
  system_command(command, combined_opts)
end
sh!(*args) click to toggle source

Just like sh but raises an error if the the command returns an unexpected exit code.

Most verification steps just run a single command, then ChefDK::Command::Verify#invoke_tests handles the results by inspecting the return value of the test block. For tests that run a lot of commands, this is inconvenient so you can use sh! instead.

# File lib/chef-dk/component_test.rb, line 127
def sh!(*args)
  sh(*args).tap(&:error!)
end
smoke_test(&test_block) click to toggle source
# File lib/chef-dk/component_test.rb, line 94
def smoke_test(&test_block)
  @smoke_test = test_block
end
tmpdir() { |tmpdir| ... } click to toggle source
# File lib/chef-dk/component_test.rb, line 161
def tmpdir
  Dir.mktmpdir do |tmpdir|
    yield tmpdir
  end
end
unit_test(&test_block) click to toggle source
# File lib/chef-dk/component_test.rb, line 78
def unit_test(&test_block)
  @unit_test = test_block
end