spec/kitchen/provisioner/chef_solo_spec.rb in test-kitchen-1.10.0 vs spec/kitchen/provisioner/chef_solo_spec.rb in test-kitchen-1.10.1

- old
+ new

@@ -1,557 +1,557 @@ -# -*- encoding: utf-8 -*- -# -# Author:: Fletcher Nichol (<fnichol@nichol.ca>) -# -# Copyright (C) 2014, Fletcher Nichol -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require_relative "../../spec_helper" - -require "kitchen" -require "kitchen/provisioner/chef_solo" - -describe Kitchen::Provisioner::ChefSolo do - - let(:logged_output) { StringIO.new } - let(:logger) { Logger.new(logged_output) } - let(:platform) { stub(:os_type => nil) } - let(:suite) { stub(:name => "fries") } - - let(:config) do - { :test_base_path => "/b", :kitchen_root => "/r" } - end - - let(:instance) do - stub( - :name => "coolbeans", - :logger => logger, - :suite => suite, - :platform => platform - ) - end - - let(:provisioner) do - Kitchen::Provisioner::ChefSolo.new(config).finalize_config!(instance) - end - - it "provisioner api_version is 2" do - provisioner.diagnose_plugin[:api_version].must_equal 2 - end - - it "plugin_version is set to Kitchen::VERSION" do - provisioner.diagnose_plugin[:version].must_equal Kitchen::VERSION - end - - describe "default config" do - - describe "for unix operating systems" do - - before { platform.stubs(:os_type).returns("unix") } - - it "sets :chef_solo_path to a path using :chef_omnibus_root" do - config[:chef_omnibus_root] = "/nice/place" - - provisioner[:chef_solo_path].must_equal "/nice/place/bin/chef-solo" - end - end - - describe "for windows operating systems" do - - before { platform.stubs(:os_type).returns("windows") } - - it "sets :chef_solo_path to a path using :chef_omnibus_root" do - config[:chef_omnibus_root] = "$env:systemdrive\\nice\\place" - - provisioner[:chef_solo_path]. - must_equal "$env:systemdrive\\nice\\place\\bin\\chef-solo.bat" - end - end - - it "sets :solo_rb to an empty Hash" do - provisioner[:solo_rb].must_equal Hash.new - end - end - - describe "#create_sandbox" do - - before do - @root = Dir.mktmpdir - config[:kitchen_root] = @root - end - - after do - FileUtils.remove_entry(@root) - begin - provisioner.cleanup_sandbox - rescue # rubocop:disable Lint/HandleExceptions - end - end - - describe "solo.rb file" do - - let(:file) do - IO.read(sandbox_path("solo.rb")).lines.map(&:chomp) - end - - it "creates a solo.rb" do - provisioner.create_sandbox - - sandbox_path("solo.rb").file?.must_equal true - end - - it "logs a message on info" do - provisioner.create_sandbox - - logged_output.string.must_match info_line("Preparing solo.rb") - end - - it "logs a message on debug" do - provisioner.create_sandbox - - logged_output.string. - must_match debug_line_starting_with("Creating solo.rb from {") - end - - describe "defaults" do - - # rubocop:disable Metrics/MethodLength, Metrics/AbcSize - def self.common_solo_rb_specs - it "sets node_name to the instance name" do - file.must_include %{node_name "#{instance.name}"} - end - - it "sets checksum_path" do - file.must_include %{checksum_path "#{base}checksums"} - end - - it "sets file_backup_path" do - file.must_include %{file_backup_path "#{base}backup"} - end - - it "sets cookbook_path" do - file.must_include %{cookbook_path } + - %{["#{base}cookbooks", "#{base}site-cookbooks"]} - end - - it "sets data_bag_path" do - file.must_include %{data_bag_path "#{base}data_bags"} - end - - it "sets environment_path" do - file.must_include %{environment_path "#{base}environments"} - end - - it "sets node_path" do - file.must_include %{node_path "#{base}nodes"} - end - - it "sets role_path" do - file.must_include %{role_path "#{base}roles"} - end - - it "sets client_path" do - file.must_include %{client_path "#{base}clients"} - end - - it "sets user_path" do - file.must_include %{user_path "#{base}users"} - end - - it "sets validation_key" do - file.must_include %{validation_key "#{base}validation.pem"} - end - - it "sets client_key" do - file.must_include %{client_key "#{base}client.pem"} - end - - it "sets chef_server_url" do - file.must_include %{chef_server_url "http://127.0.0.1:8889"} - end - - it "sets encrypted_data_bag_secret" do - file.must_include %{encrypted_data_bag_secret } + - %{"#{base}encrypted_data_bag_secret"} - end - end - # rubocop:enable Metrics/MethodLength, Metrics/AbcSize - - describe "for unix os types" do - - before do - platform.stubs(:os_type).returns("unix") - provisioner.create_sandbox - end - - let(:base) { "/tmp/kitchen/" } - - common_solo_rb_specs - end - - describe "for windows os types with full path" do - - before do - platform.stubs(:os_type).returns("windows") - config[:root_path] = "\\a\\b" - provisioner.create_sandbox - end - - let(:base) { "\\\\a\\\\b\\\\" } - - common_solo_rb_specs - end - - describe "for windows os types with $env:TEMP prefixed paths" do - - before do - platform.stubs(:os_type).returns("windows") - config[:root_path] = "$env:TEMP\\a" - provisioner.create_sandbox - end - - let(:base) { "\#{ENV['TEMP']}\\\\a\\\\" } - - common_solo_rb_specs - end - end - - it "supports overwriting defaults" do - config[:solo_rb] = { - :node_name => "eagles", - :user_path => "/a/b/c/u", - :client_key => "lol" - } - provisioner.create_sandbox - - file.must_include %{node_name "eagles"} - file.must_include %{user_path "/a/b/c/u"} - file.must_include %{client_key "lol"} - end - - it "supports adding new configuration" do - config[:solo_rb] = { - :dark_secret => "golang" - } - provisioner.create_sandbox - - file.must_include %{dark_secret "golang"} - end - - it "formats array values correctly" do - config[:solo_rb] = { - :foos => %w[foo1 foo2] - } - provisioner.create_sandbox - - file.must_include %{foos ["foo1", "foo2"]} - end - - it "formats integer values correctly" do - config[:solo_rb] = { - :foo => 7 - } - provisioner.create_sandbox - - file.must_include %{foo 7} - end - - it "formats symbol-looking string values correctly" do - config[:solo_rb] = { - :foo => ":bar" - } - provisioner.create_sandbox - - file.must_include %{foo :bar} - end - - it "formats boolean values correctly" do - config[:solo_rb] = { - :foo => false, - :bar => true - } - provisioner.create_sandbox - - file.must_include %{foo false} - file.must_include %{bar true} - end - end - - def sandbox_path(path) - Pathname.new(provisioner.sandbox_path).join(path) - end - end - - describe "#run_command" do - - let(:cmd) { provisioner.run_command } - - describe "common behavior" do - - before { platform.stubs(:shell_type).returns("fake") } - - it "prefixs the whole command with the command_prefix if set" do - config[:command_prefix] = "my_prefix" - - cmd.must_match(/\Amy_prefix /) - end - - it "does not prefix the command if command_prefix is not set" do - config[:command_prefix] = nil - - cmd.wont_match(/\Amy_prefix /) - end - end - - describe "for bourne shells" do - - before { platform.stubs(:shell_type).returns("bourne") } - - it "uses bourne shell" do - cmd.must_match(/\Ash -c '$/) - cmd.must_match(/'\Z/) - end - - it "ends with a single quote" do - cmd.must_match(/'\Z/) - end - - it "exports http_proxy & HTTP_PROXY when :http_proxy is set" do - config[:http_proxy] = "http://proxy" - - cmd.lines.to_a[1..2].must_equal([ - %{http_proxy="http://proxy"; export http_proxy\n}, - %{HTTP_PROXY="http://proxy"; export HTTP_PROXY\n} - ]) - end - - it "exports https_proxy & HTTPS_PROXY when :https_proxy is set" do - config[:https_proxy] = "https://proxy" - - cmd.lines.to_a[1..2].must_equal([ - %{https_proxy="https://proxy"; export https_proxy\n}, - %{HTTPS_PROXY="https://proxy"; export HTTPS_PROXY\n} - ]) - end - - it "exports all http proxy variables when both are set" do - config[:http_proxy] = "http://proxy" - config[:https_proxy] = "https://proxy" - - cmd.lines.to_a[1..4].must_equal([ - %{http_proxy="http://proxy"; export http_proxy\n}, - %{HTTP_PROXY="http://proxy"; export HTTP_PROXY\n}, - %{https_proxy="https://proxy"; export https_proxy\n}, - %{HTTPS_PROXY="https://proxy"; export HTTPS_PROXY\n} - ]) - end - - it "does no powershell PATH reloading for older chef omnibus packages" do - cmd.wont_match regexify(%{[System.Environment]::}) - end - - it "uses sudo for chef-solo when configured" do - config[:chef_omnibus_root] = "/c" - config[:sudo] = true - - cmd.must_match regexify("sudo -E /c/bin/chef-solo ", :partial_line) - end - - it "does not use sudo for chef-solo when configured" do - config[:chef_omnibus_root] = "/c" - config[:sudo] = false - - cmd.must_match regexify("chef-solo ", :partial_line) - cmd.wont_match regexify("sudo -E /c/bin/chef-solo ", :partial_line) - end - - it "sets config flag on chef-solo" do - cmd.must_match regexify(" --config /tmp/kitchen/solo.rb", :partial_line) - end - - it "sets config flag for custom root_path" do - config[:root_path] = "/a/b" - - cmd.must_match regexify(" --config /a/b/solo.rb", :partial_line) - end - - it "sets json attributes flag on chef-solo" do - cmd.must_match regexify( - " --json-attributes /tmp/kitchen/dna.json", :partial_line) - end - - it "sets json attribtes flag for custom root_path" do - config[:root_path] = "/booyah" - - cmd.must_match regexify( - " --json-attributes /booyah/dna.json", :partial_line) - end - - it "sets log level flag on chef-solo to auto by default" do - cmd.must_match regexify(" --log_level auto", :partial_line) - end - - it "set log level flag for custom level" do - config[:log_level] = :extreme - - cmd.must_match regexify(" --log_level extreme", :partial_line) - end - - it "sets force formatter flag on chef-solo" do - cmd.must_match regexify(" --force-formatter", :partial_line) - end - - it "sets no color flag on chef-solo" do - cmd.must_match regexify(" --no-color", :partial_line) - end - - it "does not set logfile flag by default" do - cmd.wont_match regexify(" --logfile ", :partial_line) - end - - it "sets logfile flag for custom value" do - config[:log_file] = "/a/out.log" - - cmd.must_match regexify(" --logfile /a/out.log", :partial_line) - end - - it "sets profile-ruby flag when config element is set" do - config[:profile_ruby] = true - - cmd.must_match regexify( - " --profile-ruby", :partial_line) - end - - it "does not set profile-ruby flag when config element is falsey" do - config[:profile_ruby] = false - - cmd.wont_match regexify(" --profile-ruby", :partial_line) - end - end - - describe "for powershell shells on windows os types" do - - before do - platform.stubs(:shell_type).returns("powershell") - platform.stubs(:os_type).returns("windows") - end - - it "exports http_proxy & HTTP_PROXY when :http_proxy is set" do - config[:http_proxy] = "http://proxy" - - cmd.lines.to_a[0..1].must_equal([ - %{$env:http_proxy = "http://proxy"\n}, - %{$env:HTTP_PROXY = "http://proxy"\n} - ]) - end - - it "exports https_proxy & HTTPS_PROXY when :https_proxy is set" do - config[:https_proxy] = "https://proxy" - - cmd.lines.to_a[0..1].must_equal([ - %{$env:https_proxy = "https://proxy"\n}, - %{$env:HTTPS_PROXY = "https://proxy"\n} - ]) - end - - it "exports all http proxy variables when both are set" do - config[:http_proxy] = "http://proxy" - config[:https_proxy] = "https://proxy" - - cmd.lines.to_a[0..3].must_equal([ - %{$env:http_proxy = "http://proxy"\n}, - %{$env:HTTP_PROXY = "http://proxy"\n}, - %{$env:https_proxy = "https://proxy"\n}, - %{$env:HTTPS_PROXY = "https://proxy"\n} - ]) - end - - it "reloads PATH for older chef omnibus packages" do - cmd.must_match regexify("$env:PATH = " + - %{[System.Environment]::GetEnvironmentVariable("PATH","Machine")}) - end - - it "calls the chef-solo command from :chef_solo_path" do - config[:chef_solo_path] = "\\r\\chef-solo.bat" - - cmd.must_match regexify("& \\r\\chef-solo.bat ", :partial_line) - end - - it "sets config flag on chef-solo" do - cmd.must_match regexify( - " --config $env:TEMP\\kitchen\\solo.rb", :partial_line) - end - - it "sets config flag for custom root_path" do - config[:root_path] = "\\a\\b" - - cmd.must_match regexify( - " --config \\a\\b\\solo.rb", :partial_line) - end - - it "sets json attributes flag on chef-solo" do - cmd.must_match regexify( - " --json-attributes $env:TEMP\\kitchen\\dna.json", :partial_line) - end - - it "sets json attribtes flag for custom root_path" do - config[:root_path] = "\\booyah" - - cmd.must_match regexify( - " --json-attributes \\booyah\\dna.json", :partial_line) - end - - it "sets log level flag on chef-solo to auto by default" do - cmd.must_match regexify(" --log_level auto", :partial_line) - end - - it "set log level flag for custom level" do - config[:log_level] = :extreme - - cmd.must_match regexify(" --log_level extreme", :partial_line) - end - - it "sets force formatter flag on chef-solo" do - cmd.must_match regexify(" --force-formatter", :partial_line) - end - - it "sets no color flag on chef-solo" do - cmd.must_match regexify(" --no-color", :partial_line) - end - - it "does not set logfile flag by default" do - cmd.wont_match regexify(" --logfile ", :partial_line) - end - - it "sets logfile flag for custom value" do - config[:log_file] = "\\a\\out.log" - - cmd.must_match regexify(" --logfile \\a\\out.log", :partial_line) - end - end - end - - def info_line(msg) - %r{^I, .* : #{Regexp.escape(msg)}$} - end - - def debug_line_starting_with(msg) - %r{^D, .* : #{Regexp.escape(msg)}} - end - - def regexify(str, line = :whole_line) - r = Regexp.escape(str) - r = "^\s*#{r}$" if line == :whole_line - Regexp.new(r) - end -end +# -*- encoding: utf-8 -*- +# +# Author:: Fletcher Nichol (<fnichol@nichol.ca>) +# +# Copyright (C) 2014, Fletcher Nichol +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +require_relative "../../spec_helper" + +require "kitchen" +require "kitchen/provisioner/chef_solo" + +describe Kitchen::Provisioner::ChefSolo do + + let(:logged_output) { StringIO.new } + let(:logger) { Logger.new(logged_output) } + let(:platform) { stub(:os_type => nil) } + let(:suite) { stub(:name => "fries") } + + let(:config) do + { :test_base_path => "/b", :kitchen_root => "/r" } + end + + let(:instance) do + stub( + :name => "coolbeans", + :logger => logger, + :suite => suite, + :platform => platform + ) + end + + let(:provisioner) do + Kitchen::Provisioner::ChefSolo.new(config).finalize_config!(instance) + end + + it "provisioner api_version is 2" do + provisioner.diagnose_plugin[:api_version].must_equal 2 + end + + it "plugin_version is set to Kitchen::VERSION" do + provisioner.diagnose_plugin[:version].must_equal Kitchen::VERSION + end + + describe "default config" do + + describe "for unix operating systems" do + + before { platform.stubs(:os_type).returns("unix") } + + it "sets :chef_solo_path to a path using :chef_omnibus_root" do + config[:chef_omnibus_root] = "/nice/place" + + provisioner[:chef_solo_path].must_equal "/nice/place/bin/chef-solo" + end + end + + describe "for windows operating systems" do + + before { platform.stubs(:os_type).returns("windows") } + + it "sets :chef_solo_path to a path using :chef_omnibus_root" do + config[:chef_omnibus_root] = "$env:systemdrive\\nice\\place" + + provisioner[:chef_solo_path]. + must_equal "$env:systemdrive\\nice\\place\\bin\\chef-solo.bat" + end + end + + it "sets :solo_rb to an empty Hash" do + provisioner[:solo_rb].must_equal Hash.new + end + end + + describe "#create_sandbox" do + + before do + @root = Dir.mktmpdir + config[:kitchen_root] = @root + end + + after do + FileUtils.remove_entry(@root) + begin + provisioner.cleanup_sandbox + rescue # rubocop:disable Lint/HandleExceptions + end + end + + describe "solo.rb file" do + + let(:file) do + IO.read(sandbox_path("solo.rb")).lines.map(&:chomp) + end + + it "creates a solo.rb" do + provisioner.create_sandbox + + sandbox_path("solo.rb").file?.must_equal true + end + + it "logs a message on info" do + provisioner.create_sandbox + + logged_output.string.must_match info_line("Preparing solo.rb") + end + + it "logs a message on debug" do + provisioner.create_sandbox + + logged_output.string. + must_match debug_line_starting_with("Creating solo.rb from {") + end + + describe "defaults" do + + # rubocop:disable Metrics/MethodLength, Metrics/AbcSize + def self.common_solo_rb_specs + it "sets node_name to the instance name" do + file.must_include %{node_name "#{instance.name}"} + end + + it "sets checksum_path" do + file.must_include %{checksum_path "#{base}checksums"} + end + + it "sets file_backup_path" do + file.must_include %{file_backup_path "#{base}backup"} + end + + it "sets cookbook_path" do + file.must_include %{cookbook_path } + + %{["#{base}cookbooks", "#{base}site-cookbooks"]} + end + + it "sets data_bag_path" do + file.must_include %{data_bag_path "#{base}data_bags"} + end + + it "sets environment_path" do + file.must_include %{environment_path "#{base}environments"} + end + + it "sets node_path" do + file.must_include %{node_path "#{base}nodes"} + end + + it "sets role_path" do + file.must_include %{role_path "#{base}roles"} + end + + it "sets client_path" do + file.must_include %{client_path "#{base}clients"} + end + + it "sets user_path" do + file.must_include %{user_path "#{base}users"} + end + + it "sets validation_key" do + file.must_include %{validation_key "#{base}validation.pem"} + end + + it "sets client_key" do + file.must_include %{client_key "#{base}client.pem"} + end + + it "sets chef_server_url" do + file.must_include %{chef_server_url "http://127.0.0.1:8889"} + end + + it "sets encrypted_data_bag_secret" do + file.must_include %{encrypted_data_bag_secret } + + %{"#{base}encrypted_data_bag_secret"} + end + end + # rubocop:enable Metrics/MethodLength, Metrics/AbcSize + + describe "for unix os types" do + + before do + platform.stubs(:os_type).returns("unix") + provisioner.create_sandbox + end + + let(:base) { "/tmp/kitchen/" } + + common_solo_rb_specs + end + + describe "for windows os types with full path" do + + before do + platform.stubs(:os_type).returns("windows") + config[:root_path] = "\\a\\b" + provisioner.create_sandbox + end + + let(:base) { "\\\\a\\\\b\\\\" } + + common_solo_rb_specs + end + + describe "for windows os types with $env:TEMP prefixed paths" do + + before do + platform.stubs(:os_type).returns("windows") + config[:root_path] = "$env:TEMP\\a" + provisioner.create_sandbox + end + + let(:base) { "\#{ENV['TEMP']}\\\\a\\\\" } + + common_solo_rb_specs + end + end + + it "supports overwriting defaults" do + config[:solo_rb] = { + :node_name => "eagles", + :user_path => "/a/b/c/u", + :client_key => "lol" + } + provisioner.create_sandbox + + file.must_include %{node_name "eagles"} + file.must_include %{user_path "/a/b/c/u"} + file.must_include %{client_key "lol"} + end + + it "supports adding new configuration" do + config[:solo_rb] = { + :dark_secret => "golang" + } + provisioner.create_sandbox + + file.must_include %{dark_secret "golang"} + end + + it "formats array values correctly" do + config[:solo_rb] = { + :foos => %w[foo1 foo2] + } + provisioner.create_sandbox + + file.must_include %{foos ["foo1", "foo2"]} + end + + it "formats integer values correctly" do + config[:solo_rb] = { + :foo => 7 + } + provisioner.create_sandbox + + file.must_include %{foo 7} + end + + it "formats symbol-looking string values correctly" do + config[:solo_rb] = { + :foo => ":bar" + } + provisioner.create_sandbox + + file.must_include %{foo :bar} + end + + it "formats boolean values correctly" do + config[:solo_rb] = { + :foo => false, + :bar => true + } + provisioner.create_sandbox + + file.must_include %{foo false} + file.must_include %{bar true} + end + end + + def sandbox_path(path) + Pathname.new(provisioner.sandbox_path).join(path) + end + end + + describe "#run_command" do + + let(:cmd) { provisioner.run_command } + + describe "common behavior" do + + before { platform.stubs(:shell_type).returns("fake") } + + it "prefixs the whole command with the command_prefix if set" do + config[:command_prefix] = "my_prefix" + + cmd.must_match(/\Amy_prefix /) + end + + it "does not prefix the command if command_prefix is not set" do + config[:command_prefix] = nil + + cmd.wont_match(/\Amy_prefix /) + end + end + + describe "for bourne shells" do + + before { platform.stubs(:shell_type).returns("bourne") } + + it "uses bourne shell" do + cmd.must_match(/\Ash -c '$/) + cmd.must_match(/'\Z/) + end + + it "ends with a single quote" do + cmd.must_match(/'\Z/) + end + + it "exports http_proxy & HTTP_PROXY when :http_proxy is set" do + config[:http_proxy] = "http://proxy" + + cmd.lines.to_a[1..2].must_equal([ + %{http_proxy="http://proxy"; export http_proxy\n}, + %{HTTP_PROXY="http://proxy"; export HTTP_PROXY\n} + ]) + end + + it "exports https_proxy & HTTPS_PROXY when :https_proxy is set" do + config[:https_proxy] = "https://proxy" + + cmd.lines.to_a[1..2].must_equal([ + %{https_proxy="https://proxy"; export https_proxy\n}, + %{HTTPS_PROXY="https://proxy"; export HTTPS_PROXY\n} + ]) + end + + it "exports all http proxy variables when both are set" do + config[:http_proxy] = "http://proxy" + config[:https_proxy] = "https://proxy" + + cmd.lines.to_a[1..4].must_equal([ + %{http_proxy="http://proxy"; export http_proxy\n}, + %{HTTP_PROXY="http://proxy"; export HTTP_PROXY\n}, + %{https_proxy="https://proxy"; export https_proxy\n}, + %{HTTPS_PROXY="https://proxy"; export HTTPS_PROXY\n} + ]) + end + + it "does no powershell PATH reloading for older chef omnibus packages" do + cmd.wont_match regexify(%{[System.Environment]::}) + end + + it "uses sudo for chef-solo when configured" do + config[:chef_omnibus_root] = "/c" + config[:sudo] = true + + cmd.must_match regexify("sudo -E /c/bin/chef-solo ", :partial_line) + end + + it "does not use sudo for chef-solo when configured" do + config[:chef_omnibus_root] = "/c" + config[:sudo] = false + + cmd.must_match regexify("chef-solo ", :partial_line) + cmd.wont_match regexify("sudo -E /c/bin/chef-solo ", :partial_line) + end + + it "sets config flag on chef-solo" do + cmd.must_match regexify(" --config /tmp/kitchen/solo.rb", :partial_line) + end + + it "sets config flag for custom root_path" do + config[:root_path] = "/a/b" + + cmd.must_match regexify(" --config /a/b/solo.rb", :partial_line) + end + + it "sets json attributes flag on chef-solo" do + cmd.must_match regexify( + " --json-attributes /tmp/kitchen/dna.json", :partial_line) + end + + it "sets json attribtes flag for custom root_path" do + config[:root_path] = "/booyah" + + cmd.must_match regexify( + " --json-attributes /booyah/dna.json", :partial_line) + end + + it "sets log level flag on chef-solo to auto by default" do + cmd.must_match regexify(" --log_level auto", :partial_line) + end + + it "set log level flag for custom level" do + config[:log_level] = :extreme + + cmd.must_match regexify(" --log_level extreme", :partial_line) + end + + it "sets force formatter flag on chef-solo" do + cmd.must_match regexify(" --force-formatter", :partial_line) + end + + it "sets no color flag on chef-solo" do + cmd.must_match regexify(" --no-color", :partial_line) + end + + it "does not set logfile flag by default" do + cmd.wont_match regexify(" --logfile ", :partial_line) + end + + it "sets logfile flag for custom value" do + config[:log_file] = "/a/out.log" + + cmd.must_match regexify(" --logfile /a/out.log", :partial_line) + end + + it "sets profile-ruby flag when config element is set" do + config[:profile_ruby] = true + + cmd.must_match regexify( + " --profile-ruby", :partial_line) + end + + it "does not set profile-ruby flag when config element is falsey" do + config[:profile_ruby] = false + + cmd.wont_match regexify(" --profile-ruby", :partial_line) + end + end + + describe "for powershell shells on windows os types" do + + before do + platform.stubs(:shell_type).returns("powershell") + platform.stubs(:os_type).returns("windows") + end + + it "exports http_proxy & HTTP_PROXY when :http_proxy is set" do + config[:http_proxy] = "http://proxy" + + cmd.lines.to_a[0..1].must_equal([ + %{$env:http_proxy = "http://proxy"\n}, + %{$env:HTTP_PROXY = "http://proxy"\n} + ]) + end + + it "exports https_proxy & HTTPS_PROXY when :https_proxy is set" do + config[:https_proxy] = "https://proxy" + + cmd.lines.to_a[0..1].must_equal([ + %{$env:https_proxy = "https://proxy"\n}, + %{$env:HTTPS_PROXY = "https://proxy"\n} + ]) + end + + it "exports all http proxy variables when both are set" do + config[:http_proxy] = "http://proxy" + config[:https_proxy] = "https://proxy" + + cmd.lines.to_a[0..3].must_equal([ + %{$env:http_proxy = "http://proxy"\n}, + %{$env:HTTP_PROXY = "http://proxy"\n}, + %{$env:https_proxy = "https://proxy"\n}, + %{$env:HTTPS_PROXY = "https://proxy"\n} + ]) + end + + it "reloads PATH for older chef omnibus packages" do + cmd.must_match regexify("$env:PATH = " + + %{[System.Environment]::GetEnvironmentVariable("PATH","Machine")}) + end + + it "calls the chef-solo command from :chef_solo_path" do + config[:chef_solo_path] = "\\r\\chef-solo.bat" + + cmd.must_match regexify("& \\r\\chef-solo.bat ", :partial_line) + end + + it "sets config flag on chef-solo" do + cmd.must_match regexify( + " --config $env:TEMP\\kitchen\\solo.rb", :partial_line) + end + + it "sets config flag for custom root_path" do + config[:root_path] = "\\a\\b" + + cmd.must_match regexify( + " --config \\a\\b\\solo.rb", :partial_line) + end + + it "sets json attributes flag on chef-solo" do + cmd.must_match regexify( + " --json-attributes $env:TEMP\\kitchen\\dna.json", :partial_line) + end + + it "sets json attribtes flag for custom root_path" do + config[:root_path] = "\\booyah" + + cmd.must_match regexify( + " --json-attributes \\booyah\\dna.json", :partial_line) + end + + it "sets log level flag on chef-solo to auto by default" do + cmd.must_match regexify(" --log_level auto", :partial_line) + end + + it "set log level flag for custom level" do + config[:log_level] = :extreme + + cmd.must_match regexify(" --log_level extreme", :partial_line) + end + + it "sets force formatter flag on chef-solo" do + cmd.must_match regexify(" --force-formatter", :partial_line) + end + + it "sets no color flag on chef-solo" do + cmd.must_match regexify(" --no-color", :partial_line) + end + + it "does not set logfile flag by default" do + cmd.wont_match regexify(" --logfile ", :partial_line) + end + + it "sets logfile flag for custom value" do + config[:log_file] = "\\a\\out.log" + + cmd.must_match regexify(" --logfile \\a\\out.log", :partial_line) + end + end + end + + def info_line(msg) + %r{^I, .* : #{Regexp.escape(msg)}$} + end + + def debug_line_starting_with(msg) + %r{^D, .* : #{Regexp.escape(msg)}} + end + + def regexify(str, line = :whole_line) + r = Regexp.escape(str) + r = "^\s*#{r}$" if line == :whole_line + Regexp.new(r) + end +end