test-kitchen 1.7.0 → 1.7.1.dev
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.cane +8 -8
- data/.gitattributes +3 -0
- data/.github/ISSUE_TEMPLATE.md +55 -55
- data/.gitignore +28 -28
- data/.kitchen.ci.yml +23 -23
- data/.kitchen.proxy.yml +27 -27
- data/.rubocop.yml +3 -3
- data/.travis.yml +70 -70
- data/.yardopts +3 -3
- data/Berksfile +3 -3
- data/CHANGELOG.md +1090 -1083
- data/CONTRIBUTING.md +14 -14
- data/Gemfile +19 -19
- data/Gemfile.proxy_tests +4 -4
- data/Guardfile +42 -42
- data/LICENSE +15 -15
- data/MAINTAINERS.md +23 -23
- data/README.md +135 -135
- data/Rakefile +61 -61
- data/appveyor.yml +44 -44
- data/features/kitchen_action_commands.feature +164 -164
- data/features/kitchen_command.feature +16 -16
- data/features/kitchen_console_command.feature +34 -34
- data/features/kitchen_defaults.feature +38 -38
- data/features/kitchen_diagnose_command.feature +96 -96
- data/features/kitchen_driver_create_command.feature +64 -64
- data/features/kitchen_driver_discover_command.feature +25 -25
- data/features/kitchen_help_command.feature +16 -16
- data/features/kitchen_init_command.feature +274 -274
- data/features/kitchen_list_command.feature +104 -104
- data/features/kitchen_login_command.feature +62 -62
- data/features/kitchen_sink_command.feature +30 -30
- data/features/kitchen_test_command.feature +88 -88
- data/features/step_definitions/gem_steps.rb +36 -36
- data/features/step_definitions/git_steps.rb +5 -5
- data/features/step_definitions/output_steps.rb +5 -5
- data/features/support/env.rb +75 -75
- data/lib/kitchen.rb +150 -150
- data/lib/kitchen/base64_stream.rb +55 -55
- data/lib/kitchen/cli.rb +419 -419
- data/lib/kitchen/collection.rb +55 -55
- data/lib/kitchen/color.rb +65 -65
- data/lib/kitchen/command.rb +185 -185
- data/lib/kitchen/command/action.rb +45 -45
- data/lib/kitchen/command/console.rb +58 -58
- data/lib/kitchen/command/diagnose.rb +92 -92
- data/lib/kitchen/command/driver_discover.rb +105 -105
- data/lib/kitchen/command/exec.rb +41 -41
- data/lib/kitchen/command/list.rb +119 -119
- data/lib/kitchen/command/login.rb +43 -43
- data/lib/kitchen/command/sink.rb +54 -54
- data/lib/kitchen/command/test.rb +51 -51
- data/lib/kitchen/config.rb +322 -322
- data/lib/kitchen/configurable.rb +529 -529
- data/lib/kitchen/data_munger.rb +959 -959
- data/lib/kitchen/diagnostic.rb +141 -141
- data/lib/kitchen/driver.rb +56 -56
- data/lib/kitchen/driver/base.rb +134 -134
- data/lib/kitchen/driver/dummy.rb +108 -108
- data/lib/kitchen/driver/proxy.rb +72 -72
- data/lib/kitchen/driver/ssh_base.rb +357 -357
- data/lib/kitchen/errors.rb +229 -229
- data/lib/kitchen/generator/driver_create.rb +177 -177
- data/lib/kitchen/generator/init.rb +296 -296
- data/lib/kitchen/instance.rb +662 -662
- data/lib/kitchen/lazy_hash.rb +142 -142
- data/lib/kitchen/loader/yaml.rb +349 -349
- data/lib/kitchen/logger.rb +423 -423
- data/lib/kitchen/logging.rb +56 -56
- data/lib/kitchen/login_command.rb +52 -52
- data/lib/kitchen/metadata_chopper.rb +52 -52
- data/lib/kitchen/platform.rb +67 -67
- data/lib/kitchen/provisioner.rb +54 -54
- data/lib/kitchen/provisioner/base.rb +236 -236
- data/lib/kitchen/provisioner/chef/berkshelf.rb +114 -114
- data/lib/kitchen/provisioner/chef/common_sandbox.rb +322 -322
- data/lib/kitchen/provisioner/chef/librarian.rb +112 -112
- data/lib/kitchen/provisioner/chef_apply.rb +124 -124
- data/lib/kitchen/provisioner/chef_base.rb +341 -341
- data/lib/kitchen/provisioner/chef_solo.rb +88 -88
- data/lib/kitchen/provisioner/chef_zero.rb +245 -245
- data/lib/kitchen/provisioner/dummy.rb +79 -79
- data/lib/kitchen/provisioner/shell.rb +138 -138
- data/lib/kitchen/rake_tasks.rb +63 -63
- data/lib/kitchen/shell_out.rb +93 -93
- data/lib/kitchen/ssh.rb +276 -276
- data/lib/kitchen/state_file.rb +120 -120
- data/lib/kitchen/suite.rb +51 -51
- data/lib/kitchen/thor_tasks.rb +66 -66
- data/lib/kitchen/transport.rb +54 -54
- data/lib/kitchen/transport/base.rb +176 -176
- data/lib/kitchen/transport/dummy.rb +79 -79
- data/lib/kitchen/transport/ssh.rb +364 -364
- data/lib/kitchen/transport/winrm.rb +486 -486
- data/lib/kitchen/util.rb +147 -147
- data/lib/kitchen/verifier.rb +55 -55
- data/lib/kitchen/verifier/base.rb +235 -235
- data/lib/kitchen/verifier/busser.rb +277 -277
- data/lib/kitchen/verifier/dummy.rb +79 -79
- data/lib/kitchen/verifier/shell.rb +101 -101
- data/lib/kitchen/version.rb +21 -21
- data/lib/vendor/hash_recursive_merge.rb +82 -82
- data/spec/kitchen/base64_stream_spec.rb +77 -77
- data/spec/kitchen/cli_spec.rb +56 -56
- data/spec/kitchen/collection_spec.rb +80 -80
- data/spec/kitchen/color_spec.rb +54 -54
- data/spec/kitchen/config_spec.rb +408 -408
- data/spec/kitchen/configurable_spec.rb +1095 -1095
- data/spec/kitchen/data_munger_spec.rb +2694 -2694
- data/spec/kitchen/diagnostic_spec.rb +129 -129
- data/spec/kitchen/driver/base_spec.rb +121 -121
- data/spec/kitchen/driver/dummy_spec.rb +199 -199
- data/spec/kitchen/driver/proxy_spec.rb +138 -138
- data/spec/kitchen/driver/ssh_base_spec.rb +1115 -1115
- data/spec/kitchen/driver_spec.rb +112 -112
- data/spec/kitchen/errors_spec.rb +309 -309
- data/spec/kitchen/instance_spec.rb +1419 -1419
- data/spec/kitchen/lazy_hash_spec.rb +117 -117
- data/spec/kitchen/loader/yaml_spec.rb +774 -774
- data/spec/kitchen/logger_spec.rb +429 -429
- data/spec/kitchen/logging_spec.rb +59 -59
- data/spec/kitchen/login_command_spec.rb +68 -68
- data/spec/kitchen/metadata_chopper_spec.rb +82 -82
- data/spec/kitchen/platform_spec.rb +89 -89
- data/spec/kitchen/provisioner/base_spec.rb +386 -386
- data/spec/kitchen/provisioner/chef_apply_spec.rb +136 -136
- data/spec/kitchen/provisioner/chef_base_spec.rb +1161 -1161
- data/spec/kitchen/provisioner/chef_solo_spec.rb +557 -557
- data/spec/kitchen/provisioner/chef_zero_spec.rb +1001 -1001
- data/spec/kitchen/provisioner/dummy_spec.rb +99 -99
- data/spec/kitchen/provisioner/shell_spec.rb +566 -566
- data/spec/kitchen/provisioner_spec.rb +107 -107
- data/spec/kitchen/shell_out_spec.rb +150 -150
- data/spec/kitchen/ssh_spec.rb +693 -693
- data/spec/kitchen/state_file_spec.rb +129 -129
- data/spec/kitchen/suite_spec.rb +62 -62
- data/spec/kitchen/transport/base_spec.rb +89 -89
- data/spec/kitchen/transport/ssh_spec.rb +1255 -1255
- data/spec/kitchen/transport/winrm_spec.rb +1143 -1143
- data/spec/kitchen/transport_spec.rb +112 -112
- data/spec/kitchen/util_spec.rb +165 -165
- data/spec/kitchen/verifier/base_spec.rb +362 -362
- data/spec/kitchen/verifier/busser_spec.rb +610 -610
- data/spec/kitchen/verifier/dummy_spec.rb +99 -99
- data/spec/kitchen/verifier/shell_spec.rb +160 -160
- data/spec/kitchen/verifier_spec.rb +120 -120
- data/spec/kitchen_spec.rb +114 -114
- data/spec/spec_helper.rb +85 -85
- data/spec/support/powershell_max_size_spec.rb +40 -40
- data/support/busser_install_command.ps1 +14 -14
- data/support/busser_install_command.sh +14 -14
- data/support/chef-client-zero.rb +77 -77
- data/support/chef_base_init_command.ps1 +18 -18
- data/support/chef_base_init_command.sh +2 -2
- data/support/chef_base_install_command.ps1 +85 -85
- data/support/chef_base_install_command.sh +229 -229
- data/support/chef_zero_prepare_command_legacy.ps1 +9 -9
- data/support/chef_zero_prepare_command_legacy.sh +10 -10
- data/support/download_helpers.sh +109 -109
- data/support/dummy-validation.pem +27 -27
- data/templates/driver/CHANGELOG.md.erb +3 -3
- data/templates/driver/Gemfile.erb +3 -3
- data/templates/driver/README.md.erb +64 -64
- data/templates/driver/Rakefile.erb +21 -21
- data/templates/driver/driver.rb.erb +23 -23
- data/templates/driver/gemspec.erb +29 -29
- data/templates/driver/gitignore.erb +17 -17
- data/templates/driver/license_apachev2.erb +15 -15
- data/templates/driver/license_lgplv3.erb +16 -16
- data/templates/driver/license_mit.erb +22 -22
- data/templates/driver/license_reserved.erb +5 -5
- data/templates/driver/tailor.erb +4 -4
- data/templates/driver/travis.yml.erb +11 -11
- data/templates/driver/version.rb.erb +12 -12
- data/templates/init/chefignore.erb +1 -1
- data/templates/init/kitchen.yml.erb +18 -18
- data/test-kitchen.gemspec +62 -62
- data/test/integration/default/default_spec.rb +3 -3
- data/testing_windows.md +37 -37
- metadata +5 -4
|
@@ -1,99 +1,99 @@
|
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
|
2
|
-
#
|
|
3
|
-
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
|
4
|
-
#
|
|
5
|
-
# Copyright (C) 2015, Fletcher Nichol
|
|
6
|
-
#
|
|
7
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
-
# you may not use this file except in compliance with the License.
|
|
9
|
-
# You may obtain a copy of the License at
|
|
10
|
-
#
|
|
11
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
-
#
|
|
13
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
-
# See the License for the specific language governing permissions and
|
|
17
|
-
# limitations under the License.
|
|
18
|
-
|
|
19
|
-
require_relative "../../spec_helper"
|
|
20
|
-
|
|
21
|
-
require "logger"
|
|
22
|
-
require "stringio"
|
|
23
|
-
|
|
24
|
-
require "kitchen/provisioner/dummy"
|
|
25
|
-
|
|
26
|
-
describe Kitchen::Provisioner::Dummy do
|
|
27
|
-
|
|
28
|
-
let(:logged_output) { StringIO.new }
|
|
29
|
-
let(:logger) { Logger.new(logged_output) }
|
|
30
|
-
let(:platform) { stub(:os_type => nil, :shell_type => nil) }
|
|
31
|
-
let(:suite) { stub(:name => "fries") }
|
|
32
|
-
let(:state) { Hash.new }
|
|
33
|
-
|
|
34
|
-
let(:config) do
|
|
35
|
-
{ :test_base_path => "/basist", :kitchen_root => "/rooty" }
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
let(:instance) do
|
|
39
|
-
stub(
|
|
40
|
-
:name => "coolbeans",
|
|
41
|
-
:to_str => "instance",
|
|
42
|
-
:logger => logger,
|
|
43
|
-
:suite => suite,
|
|
44
|
-
:platform => platform
|
|
45
|
-
)
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
let(:provisioner) do
|
|
49
|
-
Kitchen::Provisioner::Dummy.new(config).finalize_config!(instance)
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
it "provisioner api_version is 2" do
|
|
53
|
-
provisioner.diagnose_plugin[:api_version].must_equal 2
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
it "plugin_version is set to Kitchen::VERSION" do
|
|
57
|
-
provisioner.diagnose_plugin[:version].must_equal Kitchen::VERSION
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
describe "configuration" do
|
|
61
|
-
|
|
62
|
-
it "sets :sleep to 0 by default" do
|
|
63
|
-
provisioner[:sleep].must_equal 0
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
it "sets :random_failure to false by default" do
|
|
67
|
-
provisioner[:random_failure].must_equal false
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
describe "#call" do
|
|
72
|
-
|
|
73
|
-
it "calls sleep if :sleep value is greater than 0" do
|
|
74
|
-
config[:sleep] = 12.5
|
|
75
|
-
provisioner.expects(:sleep).with(12.5).returns(true)
|
|
76
|
-
|
|
77
|
-
provisioner.call(state)
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
it "raises ActionFailed if :fail is set" do
|
|
81
|
-
config[:fail] = true
|
|
82
|
-
|
|
83
|
-
proc { provisioner.call(state) }.must_raise Kitchen::ActionFailed
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
it "randomly raises ActionFailed if :random_failure is set" do
|
|
87
|
-
config[:random_failure] = true
|
|
88
|
-
provisioner.stubs(:randomly_fail?).returns(true)
|
|
89
|
-
|
|
90
|
-
proc { provisioner.call(state) }.must_raise Kitchen::ActionFailed
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
it "logs a converge event to INFO" do
|
|
94
|
-
provisioner.call(state)
|
|
95
|
-
|
|
96
|
-
logged_output.string.must_match(/^.+ INFO .+ \[Dummy\] Converge on .+$/)
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
end
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
|
4
|
+
#
|
|
5
|
+
# Copyright (C) 2015, Fletcher Nichol
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
|
|
19
|
+
require_relative "../../spec_helper"
|
|
20
|
+
|
|
21
|
+
require "logger"
|
|
22
|
+
require "stringio"
|
|
23
|
+
|
|
24
|
+
require "kitchen/provisioner/dummy"
|
|
25
|
+
|
|
26
|
+
describe Kitchen::Provisioner::Dummy do
|
|
27
|
+
|
|
28
|
+
let(:logged_output) { StringIO.new }
|
|
29
|
+
let(:logger) { Logger.new(logged_output) }
|
|
30
|
+
let(:platform) { stub(:os_type => nil, :shell_type => nil) }
|
|
31
|
+
let(:suite) { stub(:name => "fries") }
|
|
32
|
+
let(:state) { Hash.new }
|
|
33
|
+
|
|
34
|
+
let(:config) do
|
|
35
|
+
{ :test_base_path => "/basist", :kitchen_root => "/rooty" }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
let(:instance) do
|
|
39
|
+
stub(
|
|
40
|
+
:name => "coolbeans",
|
|
41
|
+
:to_str => "instance",
|
|
42
|
+
:logger => logger,
|
|
43
|
+
:suite => suite,
|
|
44
|
+
:platform => platform
|
|
45
|
+
)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
let(:provisioner) do
|
|
49
|
+
Kitchen::Provisioner::Dummy.new(config).finalize_config!(instance)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "provisioner api_version is 2" do
|
|
53
|
+
provisioner.diagnose_plugin[:api_version].must_equal 2
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "plugin_version is set to Kitchen::VERSION" do
|
|
57
|
+
provisioner.diagnose_plugin[:version].must_equal Kitchen::VERSION
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
describe "configuration" do
|
|
61
|
+
|
|
62
|
+
it "sets :sleep to 0 by default" do
|
|
63
|
+
provisioner[:sleep].must_equal 0
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "sets :random_failure to false by default" do
|
|
67
|
+
provisioner[:random_failure].must_equal false
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
describe "#call" do
|
|
72
|
+
|
|
73
|
+
it "calls sleep if :sleep value is greater than 0" do
|
|
74
|
+
config[:sleep] = 12.5
|
|
75
|
+
provisioner.expects(:sleep).with(12.5).returns(true)
|
|
76
|
+
|
|
77
|
+
provisioner.call(state)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it "raises ActionFailed if :fail is set" do
|
|
81
|
+
config[:fail] = true
|
|
82
|
+
|
|
83
|
+
proc { provisioner.call(state) }.must_raise Kitchen::ActionFailed
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it "randomly raises ActionFailed if :random_failure is set" do
|
|
87
|
+
config[:random_failure] = true
|
|
88
|
+
provisioner.stubs(:randomly_fail?).returns(true)
|
|
89
|
+
|
|
90
|
+
proc { provisioner.call(state) }.must_raise Kitchen::ActionFailed
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it "logs a converge event to INFO" do
|
|
94
|
+
provisioner.call(state)
|
|
95
|
+
|
|
96
|
+
logged_output.string.must_match(/^.+ INFO .+ \[Dummy\] Converge on .+$/)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
@@ -1,566 +1,566 @@
|
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
|
2
|
-
#
|
|
3
|
-
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
|
4
|
-
#
|
|
5
|
-
# Copyright (C) 2014, Fletcher Nichol
|
|
6
|
-
#
|
|
7
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
-
# you may not use this file except in compliance with the License.
|
|
9
|
-
# You may obtain a copy of the License at
|
|
10
|
-
#
|
|
11
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
-
#
|
|
13
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
-
# See the License for the specific language governing permissions and
|
|
17
|
-
# limitations under the License.
|
|
18
|
-
|
|
19
|
-
require_relative "../../spec_helper"
|
|
20
|
-
|
|
21
|
-
require "kitchen"
|
|
22
|
-
require "kitchen/provisioner/shell"
|
|
23
|
-
|
|
24
|
-
describe Kitchen::Provisioner::Shell do
|
|
25
|
-
|
|
26
|
-
let(:logged_output) { StringIO.new }
|
|
27
|
-
let(:logger) { Logger.new(logged_output) }
|
|
28
|
-
let(:platform) { stub(:os_type => nil, :shell_type => nil) }
|
|
29
|
-
let(:suite) { stub(:name => "fries") }
|
|
30
|
-
|
|
31
|
-
let(:config) do
|
|
32
|
-
{ :test_base_path => "/basist", :kitchen_root => "/rooty" }
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
let(:instance) do
|
|
36
|
-
stub(
|
|
37
|
-
:name => "coolbeans",
|
|
38
|
-
:logger => logger,
|
|
39
|
-
:suite => suite,
|
|
40
|
-
:platform => platform
|
|
41
|
-
)
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
let(:provisioner) do
|
|
45
|
-
Class.new(Kitchen::Provisioner::Shell) {
|
|
46
|
-
def calculate_path(path, _opts = {})
|
|
47
|
-
"<calculated>/#{path}"
|
|
48
|
-
end
|
|
49
|
-
}.new(config).finalize_config!(instance)
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
it "provisioner api_version is 2" do
|
|
53
|
-
provisioner = Kitchen::Provisioner::Shell.new(config).finalize_config!(instance)
|
|
54
|
-
provisioner.diagnose_plugin[:api_version].must_equal 2
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
it "plugin_version is set to Kitchen::VERSION" do
|
|
58
|
-
provisioner = Kitchen::Provisioner::Shell.new(config).finalize_config!(instance)
|
|
59
|
-
provisioner.diagnose_plugin[:version].must_equal Kitchen::VERSION
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
describe "configuration" do
|
|
63
|
-
|
|
64
|
-
describe "for bourne shells" do
|
|
65
|
-
|
|
66
|
-
before { platform.stubs(:shell_type).returns("bourne") }
|
|
67
|
-
|
|
68
|
-
it ":script uses calculate_path and is expanded" do
|
|
69
|
-
provisioner[:script].must_equal os_safe_root_path("/rooty/<calculated>/bootstrap.sh")
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
describe "for powershell shells" do
|
|
74
|
-
|
|
75
|
-
before { platform.stubs(:shell_type).returns("powershell") }
|
|
76
|
-
|
|
77
|
-
it ":script uses calculate_path and is expanded" do
|
|
78
|
-
provisioner[:script].must_equal os_safe_root_path("/rooty/<calculated>/bootstrap.ps1")
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
it ":data_path uses calculate_path and is expanded" do
|
|
83
|
-
provisioner[:data_path].must_equal os_safe_root_path("/rooty/<calculated>/data")
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
describe "#init_command" do
|
|
88
|
-
|
|
89
|
-
let(:cmd) { provisioner.init_command }
|
|
90
|
-
|
|
91
|
-
describe "for bourne shells" do
|
|
92
|
-
|
|
93
|
-
before { platform.stubs(:shell_type).returns("bourne") }
|
|
94
|
-
|
|
95
|
-
it "uses bourne shell" do
|
|
96
|
-
cmd.must_match(/\Ash -c '$/)
|
|
97
|
-
cmd.must_match(/'\Z/)
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
it "ends with a single quote" do
|
|
101
|
-
cmd.must_match(/'\Z/)
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
it "exports http_proxy & HTTP_PROXY when :http_proxy is set" do
|
|
105
|
-
config[:http_proxy] = "http://proxy"
|
|
106
|
-
|
|
107
|
-
cmd.lines.to_a[1..2].must_equal([
|
|
108
|
-
%{http_proxy="http://proxy"; export http_proxy\n},
|
|
109
|
-
%{HTTP_PROXY="http://proxy"; export HTTP_PROXY\n}
|
|
110
|
-
])
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
it "exports https_proxy & HTTPS_PROXY when :https_proxy is set" do
|
|
114
|
-
config[:https_proxy] = "https://proxy"
|
|
115
|
-
|
|
116
|
-
cmd.lines.to_a[1..2].must_equal([
|
|
117
|
-
%{https_proxy="https://proxy"; export https_proxy\n},
|
|
118
|
-
%{HTTPS_PROXY="https://proxy"; export HTTPS_PROXY\n}
|
|
119
|
-
])
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
it "exports ftp_proxy & FTP_PROXY when :ftp_proxy is set" do
|
|
123
|
-
config[:ftp_proxy] = "ftp://proxy"
|
|
124
|
-
|
|
125
|
-
cmd.lines.to_a[1..2].must_equal([
|
|
126
|
-
%{ftp_proxy="ftp://proxy"; export ftp_proxy\n},
|
|
127
|
-
%{FTP_PROXY="ftp://proxy"; export FTP_PROXY\n}
|
|
128
|
-
])
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
it "exports all proxy variables when all are set" do
|
|
132
|
-
config[:http_proxy] = "http://proxy"
|
|
133
|
-
config[:https_proxy] = "https://proxy"
|
|
134
|
-
config[:ftp_proxy] = "ftp://proxy"
|
|
135
|
-
|
|
136
|
-
cmd.lines.to_a[1..6].must_equal([
|
|
137
|
-
%{http_proxy="http://proxy"; export http_proxy\n},
|
|
138
|
-
%{HTTP_PROXY="http://proxy"; export HTTP_PROXY\n},
|
|
139
|
-
%{https_proxy="https://proxy"; export https_proxy\n},
|
|
140
|
-
%{HTTPS_PROXY="https://proxy"; export HTTPS_PROXY\n},
|
|
141
|
-
%{ftp_proxy="ftp://proxy"; export ftp_proxy\n},
|
|
142
|
-
%{FTP_PROXY="ftp://proxy"; export FTP_PROXY\n}
|
|
143
|
-
])
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
it "uses sudo for rm when configured" do
|
|
147
|
-
config[:sudo] = true
|
|
148
|
-
|
|
149
|
-
cmd.must_match regexify("sudo -E rm -rf ", :partial_line)
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
it "does not use sudo for rm when configured" do
|
|
153
|
-
config[:sudo] = false
|
|
154
|
-
|
|
155
|
-
provisioner.init_command.
|
|
156
|
-
must_match regexify("rm -rf ", :partial_line)
|
|
157
|
-
provisioner.init_command.
|
|
158
|
-
wont_match regexify("sudo -E rm -rf ", :partial_line)
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
it "removes the data directory" do
|
|
162
|
-
config[:root_path] = "/route"
|
|
163
|
-
|
|
164
|
-
cmd.must_match %r{rm -rf\b.*\s+/route/data\s+}
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
it "creates :root_path directory" do
|
|
168
|
-
config[:root_path] = "/root/path"
|
|
169
|
-
|
|
170
|
-
cmd.must_match regexify("mkdir -p /root/path", :partial_line)
|
|
171
|
-
end
|
|
172
|
-
end
|
|
173
|
-
|
|
174
|
-
describe "for powershell shells on windows os types" do
|
|
175
|
-
|
|
176
|
-
before do
|
|
177
|
-
platform.stubs(:os_type).returns("windows")
|
|
178
|
-
platform.stubs(:shell_type).returns("powershell")
|
|
179
|
-
end
|
|
180
|
-
|
|
181
|
-
it "exports http_proxy & HTTP_PROXY when :http_proxy is set" do
|
|
182
|
-
config[:http_proxy] = "http://proxy"
|
|
183
|
-
|
|
184
|
-
cmd.lines.to_a[0..1].must_equal([
|
|
185
|
-
%{$env:http_proxy = "http://proxy"\n},
|
|
186
|
-
%{$env:HTTP_PROXY = "http://proxy"\n}
|
|
187
|
-
])
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
it "exports https_proxy & HTTPS_PROXY when :https_proxy is set" do
|
|
191
|
-
config[:https_proxy] = "https://proxy"
|
|
192
|
-
|
|
193
|
-
cmd.lines.to_a[0..1].must_equal([
|
|
194
|
-
%{$env:https_proxy = "https://proxy"\n},
|
|
195
|
-
%{$env:HTTPS_PROXY = "https://proxy"\n}
|
|
196
|
-
])
|
|
197
|
-
end
|
|
198
|
-
|
|
199
|
-
it "exports ftp_proxy & FTP_PROXY when :ftp_proxy is set" do
|
|
200
|
-
config[:ftp_proxy] = "ftp://proxy"
|
|
201
|
-
|
|
202
|
-
cmd.lines.to_a[0..1].must_equal([
|
|
203
|
-
%{$env:ftp_proxy = "ftp://proxy"\n},
|
|
204
|
-
%{$env:FTP_PROXY = "ftp://proxy"\n}
|
|
205
|
-
])
|
|
206
|
-
end
|
|
207
|
-
|
|
208
|
-
it "exports all proxy variables when all are set" do
|
|
209
|
-
config[:http_proxy] = "http://proxy"
|
|
210
|
-
config[:https_proxy] = "https://proxy"
|
|
211
|
-
config[:ftp_proxy] = "ftp://proxy"
|
|
212
|
-
|
|
213
|
-
cmd.lines.to_a[0..5].must_equal([
|
|
214
|
-
%{$env:http_proxy = "http://proxy"\n},
|
|
215
|
-
%{$env:HTTP_PROXY = "http://proxy"\n},
|
|
216
|
-
%{$env:https_proxy = "https://proxy"\n},
|
|
217
|
-
%{$env:HTTPS_PROXY = "https://proxy"\n},
|
|
218
|
-
%{$env:ftp_proxy = "ftp://proxy"\n},
|
|
219
|
-
%{$env:FTP_PROXY = "ftp://proxy"\n}
|
|
220
|
-
])
|
|
221
|
-
end
|
|
222
|
-
|
|
223
|
-
it "removes the data directory" do
|
|
224
|
-
config[:root_path] = "\\route"
|
|
225
|
-
|
|
226
|
-
cmd.must_match regexify(Kitchen::Util.outdent!(<<-POWERSHELL).chomp)
|
|
227
|
-
if (Test-Path "\\route\\data") {
|
|
228
|
-
Remove-Item "\\route\\data" -Recurse -Force
|
|
229
|
-
}
|
|
230
|
-
POWERSHELL
|
|
231
|
-
end
|
|
232
|
-
|
|
233
|
-
it "creates the :root_path directory" do
|
|
234
|
-
config[:root_path] = "\\route"
|
|
235
|
-
|
|
236
|
-
cmd.must_match regexify(Kitchen::Util.outdent!(<<-POWERSHELL).chomp)
|
|
237
|
-
if (-Not (Test-Path "\\route")) {
|
|
238
|
-
New-Item "\\route" -ItemType directory | Out-Null
|
|
239
|
-
}
|
|
240
|
-
POWERSHELL
|
|
241
|
-
end
|
|
242
|
-
end
|
|
243
|
-
end
|
|
244
|
-
|
|
245
|
-
describe "#run_command" do
|
|
246
|
-
|
|
247
|
-
let(:cmd) { provisioner.run_command }
|
|
248
|
-
|
|
249
|
-
describe "for bourne shells" do
|
|
250
|
-
|
|
251
|
-
before { platform.stubs(:shell_type).returns("bourne") }
|
|
252
|
-
|
|
253
|
-
it "uses bourne shell" do
|
|
254
|
-
cmd.must_match(/\Ash -c '$/)
|
|
255
|
-
cmd.must_match(/'\Z/)
|
|
256
|
-
end
|
|
257
|
-
|
|
258
|
-
it "ends with a single quote" do
|
|
259
|
-
cmd.must_match(/'\Z/)
|
|
260
|
-
end
|
|
261
|
-
|
|
262
|
-
it "exports http_proxy & HTTP_PROXY when :http_proxy is set" do
|
|
263
|
-
config[:http_proxy] = "http://proxy"
|
|
264
|
-
|
|
265
|
-
cmd.lines.to_a[1..2].must_equal([
|
|
266
|
-
%{http_proxy="http://proxy"; export http_proxy\n},
|
|
267
|
-
%{HTTP_PROXY="http://proxy"; export HTTP_PROXY\n}
|
|
268
|
-
])
|
|
269
|
-
end
|
|
270
|
-
|
|
271
|
-
it "exports https_proxy & HTTPS_PROXY when :https_proxy is set" do
|
|
272
|
-
config[:https_proxy] = "https://proxy"
|
|
273
|
-
|
|
274
|
-
cmd.lines.to_a[1..2].must_equal([
|
|
275
|
-
%{https_proxy="https://proxy"; export https_proxy\n},
|
|
276
|
-
%{HTTPS_PROXY="https://proxy"; export HTTPS_PROXY\n}
|
|
277
|
-
])
|
|
278
|
-
end
|
|
279
|
-
|
|
280
|
-
it "exports ftp_proxy & FTP_PROXY when :ftp_proxy is set" do
|
|
281
|
-
config[:ftp_proxy] = "ftp://proxy"
|
|
282
|
-
|
|
283
|
-
cmd.lines.to_a[1..2].must_equal([
|
|
284
|
-
%{ftp_proxy="ftp://proxy"; export ftp_proxy\n},
|
|
285
|
-
%{FTP_PROXY="ftp://proxy"; export FTP_PROXY\n}
|
|
286
|
-
])
|
|
287
|
-
end
|
|
288
|
-
|
|
289
|
-
it "exports all proxy variables when all are set" do
|
|
290
|
-
config[:http_proxy] = "http://proxy"
|
|
291
|
-
config[:https_proxy] = "https://proxy"
|
|
292
|
-
config[:ftp_proxy] = "ftp://proxy"
|
|
293
|
-
|
|
294
|
-
cmd.lines.to_a[1..6].must_equal([
|
|
295
|
-
%{http_proxy="http://proxy"; export http_proxy\n},
|
|
296
|
-
%{HTTP_PROXY="http://proxy"; export HTTP_PROXY\n},
|
|
297
|
-
%{https_proxy="https://proxy"; export https_proxy\n},
|
|
298
|
-
%{HTTPS_PROXY="https://proxy"; export HTTPS_PROXY\n},
|
|
299
|
-
%{ftp_proxy="ftp://proxy"; export ftp_proxy\n},
|
|
300
|
-
%{FTP_PROXY="ftp://proxy"; export FTP_PROXY\n}
|
|
301
|
-
])
|
|
302
|
-
end
|
|
303
|
-
|
|
304
|
-
it "uses sudo for script when configured" do
|
|
305
|
-
config[:root_path] = "/r"
|
|
306
|
-
config[:sudo] = true
|
|
307
|
-
|
|
308
|
-
cmd.must_match regexify("sudo -E /r/bootstrap.sh", :partial_line)
|
|
309
|
-
end
|
|
310
|
-
|
|
311
|
-
it "does not use sudo for script when configured" do
|
|
312
|
-
config[:root_path] = "/r"
|
|
313
|
-
config[:sudo] = false
|
|
314
|
-
|
|
315
|
-
cmd.must_match regexify("/r/bootstrap.sh", :partial_line)
|
|
316
|
-
cmd.wont_match regexify("sudo -E /r/bootstrap.sh", :partial_line)
|
|
317
|
-
end
|
|
318
|
-
end
|
|
319
|
-
|
|
320
|
-
describe "for powershell shells on windows os types" do
|
|
321
|
-
|
|
322
|
-
before do
|
|
323
|
-
platform.stubs(:shell_type).returns("powershell")
|
|
324
|
-
platform.stubs(:os_type).returns("windows")
|
|
325
|
-
end
|
|
326
|
-
|
|
327
|
-
it "exports http_proxy & HTTP_PROXY when :http_proxy is set" do
|
|
328
|
-
config[:http_proxy] = "http://proxy"
|
|
329
|
-
|
|
330
|
-
cmd.lines.to_a[0..1].must_equal([
|
|
331
|
-
%{$env:http_proxy = "http://proxy"\n},
|
|
332
|
-
%{$env:HTTP_PROXY = "http://proxy"\n}
|
|
333
|
-
])
|
|
334
|
-
end
|
|
335
|
-
|
|
336
|
-
it "exports https_proxy & HTTPS_PROXY when :https_proxy is set" do
|
|
337
|
-
config[:https_proxy] = "https://proxy"
|
|
338
|
-
|
|
339
|
-
cmd.lines.to_a[0..1].must_equal([
|
|
340
|
-
%{$env:https_proxy = "https://proxy"\n},
|
|
341
|
-
%{$env:HTTPS_PROXY = "https://proxy"\n}
|
|
342
|
-
])
|
|
343
|
-
end
|
|
344
|
-
|
|
345
|
-
it "exports ftp_proxy & FTP_PROXY when :ftp_proxy is set" do
|
|
346
|
-
config[:ftp_proxy] = "ftp://proxy"
|
|
347
|
-
|
|
348
|
-
cmd.lines.to_a[0..1].must_equal([
|
|
349
|
-
%{$env:ftp_proxy = "ftp://proxy"\n},
|
|
350
|
-
%{$env:FTP_PROXY = "ftp://proxy"\n}
|
|
351
|
-
])
|
|
352
|
-
end
|
|
353
|
-
|
|
354
|
-
it "exports all proxy variables when all are set" do
|
|
355
|
-
config[:http_proxy] = "http://proxy"
|
|
356
|
-
config[:https_proxy] = "https://proxy"
|
|
357
|
-
config[:ftp_proxy] = "ftp://proxy"
|
|
358
|
-
|
|
359
|
-
cmd.lines.to_a[0..5].must_equal([
|
|
360
|
-
%{$env:http_proxy = "http://proxy"\n},
|
|
361
|
-
%{$env:HTTP_PROXY = "http://proxy"\n},
|
|
362
|
-
%{$env:https_proxy = "https://proxy"\n},
|
|
363
|
-
%{$env:HTTPS_PROXY = "https://proxy"\n},
|
|
364
|
-
%{$env:ftp_proxy = "ftp://proxy"\n},
|
|
365
|
-
%{$env:FTP_PROXY = "ftp://proxy"\n}
|
|
366
|
-
])
|
|
367
|
-
end
|
|
368
|
-
|
|
369
|
-
it "invokes the bootstrap.ps1 script" do
|
|
370
|
-
config[:root_path] = "\\r"
|
|
371
|
-
|
|
372
|
-
cmd.must_match regexify(%{& "\\r\\bootstrap.ps1"})
|
|
373
|
-
end
|
|
374
|
-
end
|
|
375
|
-
end
|
|
376
|
-
|
|
377
|
-
describe "#create_sandbox" do
|
|
378
|
-
|
|
379
|
-
before do
|
|
380
|
-
@root = Dir.mktmpdir
|
|
381
|
-
config[:kitchen_root] = @root
|
|
382
|
-
end
|
|
383
|
-
|
|
384
|
-
after do
|
|
385
|
-
FileUtils.remove_entry(@root)
|
|
386
|
-
begin
|
|
387
|
-
provisioner.cleanup_sandbox
|
|
388
|
-
rescue # rubocop:disable Lint/HandleExceptions
|
|
389
|
-
end
|
|
390
|
-
end
|
|
391
|
-
|
|
392
|
-
let(:provisioner) do
|
|
393
|
-
Kitchen::Provisioner::Shell.new(config).finalize_config!(instance)
|
|
394
|
-
end
|
|
395
|
-
|
|
396
|
-
describe "data files" do
|
|
397
|
-
|
|
398
|
-
before do
|
|
399
|
-
create_files_under("#{config[:kitchen_root]}/my_data")
|
|
400
|
-
config[:data_path] = "#{config[:kitchen_root]}/my_data"
|
|
401
|
-
end
|
|
402
|
-
|
|
403
|
-
it "skips directory creation if :data_path is not set" do
|
|
404
|
-
config[:data_path] = nil
|
|
405
|
-
provisioner.create_sandbox
|
|
406
|
-
|
|
407
|
-
sandbox_path("data").directory?.must_equal false
|
|
408
|
-
end
|
|
409
|
-
|
|
410
|
-
it "copies tree from :data_path into sandbox" do
|
|
411
|
-
provisioner.create_sandbox
|
|
412
|
-
|
|
413
|
-
sandbox_path("data/alpha.txt").file?.must_equal true
|
|
414
|
-
IO.read(sandbox_path("data/alpha.txt")).must_equal "stuff"
|
|
415
|
-
sandbox_path("data/sub").directory?.must_equal true
|
|
416
|
-
sandbox_path("data/sub/bravo.txt").file?.must_equal true
|
|
417
|
-
IO.read(sandbox_path("data/sub/bravo.txt")).must_equal "junk"
|
|
418
|
-
end
|
|
419
|
-
|
|
420
|
-
it "logs a message on info" do
|
|
421
|
-
provisioner.create_sandbox
|
|
422
|
-
|
|
423
|
-
logged_output.string.must_match info_line("Preparing data")
|
|
424
|
-
end
|
|
425
|
-
|
|
426
|
-
it "logs a message on debug" do
|
|
427
|
-
provisioner.create_sandbox
|
|
428
|
-
|
|
429
|
-
logged_output.string.must_match debug_line(
|
|
430
|
-
"Using data from #{config[:kitchen_root]}/my_data")
|
|
431
|
-
end
|
|
432
|
-
end
|
|
433
|
-
|
|
434
|
-
describe "script file" do
|
|
435
|
-
|
|
436
|
-
describe "with a valid :script file" do
|
|
437
|
-
|
|
438
|
-
before do
|
|
439
|
-
File.open("#{config[:kitchen_root]}/my_script", "wb") do |file|
|
|
440
|
-
file.write("gonuts")
|
|
441
|
-
end
|
|
442
|
-
config[:script] = "#{config[:kitchen_root]}/my_script"
|
|
443
|
-
end
|
|
444
|
-
|
|
445
|
-
it "creates a file in the sandbox directory" do
|
|
446
|
-
provisioner.create_sandbox
|
|
447
|
-
|
|
448
|
-
sandbox_path("my_script").file?.must_equal true
|
|
449
|
-
unless running_tests_on_windows?
|
|
450
|
-
# Windows doesn't have the concept of executable
|
|
451
|
-
sandbox_path("my_script").executable?.must_equal true
|
|
452
|
-
end
|
|
453
|
-
IO.read(sandbox_path("my_script")).must_equal "gonuts"
|
|
454
|
-
end
|
|
455
|
-
|
|
456
|
-
it "logs a message on info" do
|
|
457
|
-
provisioner.create_sandbox
|
|
458
|
-
|
|
459
|
-
logged_output.string.must_match info_line("Preparing script")
|
|
460
|
-
end
|
|
461
|
-
|
|
462
|
-
it "logs a message on debug" do
|
|
463
|
-
provisioner.create_sandbox
|
|
464
|
-
|
|
465
|
-
logged_output.string.must_match debug_line(
|
|
466
|
-
"Using script from #{config[:kitchen_root]}/my_script")
|
|
467
|
-
end
|
|
468
|
-
end
|
|
469
|
-
|
|
470
|
-
describe "with no :script file" do
|
|
471
|
-
|
|
472
|
-
before { config[:script] = nil }
|
|
473
|
-
|
|
474
|
-
describe "for bourne shells" do
|
|
475
|
-
|
|
476
|
-
before { platform.stubs(:shell_type).returns("bourne") }
|
|
477
|
-
|
|
478
|
-
it "logs a message on info" do
|
|
479
|
-
provisioner.create_sandbox
|
|
480
|
-
|
|
481
|
-
logged_output.string.must_match info_line("Preparing script")
|
|
482
|
-
end
|
|
483
|
-
|
|
484
|
-
it "logs a warning on info" do
|
|
485
|
-
provisioner.create_sandbox
|
|
486
|
-
|
|
487
|
-
logged_output.string.must_match info_line(
|
|
488
|
-
"bootstrap.sh not found so Kitchen will run a stubbed script. " \
|
|
489
|
-
"Is this intended?")
|
|
490
|
-
end
|
|
491
|
-
|
|
492
|
-
it "creates a file in the sandbox directory" do
|
|
493
|
-
provisioner.create_sandbox
|
|
494
|
-
|
|
495
|
-
sandbox_path("bootstrap.sh").file?.must_equal true
|
|
496
|
-
unless running_tests_on_windows?
|
|
497
|
-
# Windows doesn't have the concept of executable
|
|
498
|
-
sandbox_path("bootstrap.sh").executable?.must_equal true
|
|
499
|
-
end
|
|
500
|
-
IO.read(sandbox_path("bootstrap.sh")).
|
|
501
|
-
must_match(/NO BOOTSTRAP SCRIPT PRESENT/)
|
|
502
|
-
end
|
|
503
|
-
end
|
|
504
|
-
|
|
505
|
-
describe "for powershell shells" do
|
|
506
|
-
|
|
507
|
-
before { platform.stubs(:shell_type).returns("powershell") }
|
|
508
|
-
|
|
509
|
-
it "logs a message on info" do
|
|
510
|
-
provisioner.create_sandbox
|
|
511
|
-
|
|
512
|
-
logged_output.string.must_match info_line("Preparing script")
|
|
513
|
-
end
|
|
514
|
-
|
|
515
|
-
it "logs a warning on info" do
|
|
516
|
-
provisioner.create_sandbox
|
|
517
|
-
|
|
518
|
-
logged_output.string.must_match info_line(
|
|
519
|
-
"bootstrap.ps1 not found so Kitchen will run a stubbed script. " \
|
|
520
|
-
"Is this intended?")
|
|
521
|
-
end
|
|
522
|
-
|
|
523
|
-
it "creates a file in the sandbox directory" do
|
|
524
|
-
provisioner.create_sandbox
|
|
525
|
-
|
|
526
|
-
sandbox_path("bootstrap.ps1").file?.must_equal true
|
|
527
|
-
unless running_tests_on_windows?
|
|
528
|
-
# Windows doesn't have the concept of executable
|
|
529
|
-
sandbox_path("bootstrap.ps1").executable?.must_equal true
|
|
530
|
-
end
|
|
531
|
-
IO.read(sandbox_path("bootstrap.ps1")).
|
|
532
|
-
must_match(/Write-Host "NO BOOTSTRAP SCRIPT PRESENT`n"/)
|
|
533
|
-
end
|
|
534
|
-
end
|
|
535
|
-
end
|
|
536
|
-
end
|
|
537
|
-
|
|
538
|
-
def sandbox_path(path)
|
|
539
|
-
Pathname.new(provisioner.sandbox_path).join(path)
|
|
540
|
-
end
|
|
541
|
-
|
|
542
|
-
def create_files_under(path)
|
|
543
|
-
FileUtils.mkdir_p(File.join(path, "sub"))
|
|
544
|
-
File.open(File.join(path, "alpha.txt"), "wb") do |file|
|
|
545
|
-
file.write("stuff")
|
|
546
|
-
end
|
|
547
|
-
File.open(File.join(path, "sub", "bravo.txt"), "wb") do |file|
|
|
548
|
-
file.write("junk")
|
|
549
|
-
end
|
|
550
|
-
end
|
|
551
|
-
|
|
552
|
-
def info_line(msg)
|
|
553
|
-
%r{^I, .* : #{Regexp.escape(msg)}$}
|
|
554
|
-
end
|
|
555
|
-
|
|
556
|
-
def debug_line(msg)
|
|
557
|
-
%r{^D, .* : #{Regexp.escape(msg)}$}
|
|
558
|
-
end
|
|
559
|
-
end
|
|
560
|
-
|
|
561
|
-
def regexify(str, line = :whole_line)
|
|
562
|
-
r = Regexp.escape(str)
|
|
563
|
-
r = "^\s*#{r}$" if line == :whole_line
|
|
564
|
-
Regexp.new(r)
|
|
565
|
-
end
|
|
566
|
-
end
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
|
4
|
+
#
|
|
5
|
+
# Copyright (C) 2014, Fletcher Nichol
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
|
|
19
|
+
require_relative "../../spec_helper"
|
|
20
|
+
|
|
21
|
+
require "kitchen"
|
|
22
|
+
require "kitchen/provisioner/shell"
|
|
23
|
+
|
|
24
|
+
describe Kitchen::Provisioner::Shell do
|
|
25
|
+
|
|
26
|
+
let(:logged_output) { StringIO.new }
|
|
27
|
+
let(:logger) { Logger.new(logged_output) }
|
|
28
|
+
let(:platform) { stub(:os_type => nil, :shell_type => nil) }
|
|
29
|
+
let(:suite) { stub(:name => "fries") }
|
|
30
|
+
|
|
31
|
+
let(:config) do
|
|
32
|
+
{ :test_base_path => "/basist", :kitchen_root => "/rooty" }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
let(:instance) do
|
|
36
|
+
stub(
|
|
37
|
+
:name => "coolbeans",
|
|
38
|
+
:logger => logger,
|
|
39
|
+
:suite => suite,
|
|
40
|
+
:platform => platform
|
|
41
|
+
)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
let(:provisioner) do
|
|
45
|
+
Class.new(Kitchen::Provisioner::Shell) {
|
|
46
|
+
def calculate_path(path, _opts = {})
|
|
47
|
+
"<calculated>/#{path}"
|
|
48
|
+
end
|
|
49
|
+
}.new(config).finalize_config!(instance)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "provisioner api_version is 2" do
|
|
53
|
+
provisioner = Kitchen::Provisioner::Shell.new(config).finalize_config!(instance)
|
|
54
|
+
provisioner.diagnose_plugin[:api_version].must_equal 2
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "plugin_version is set to Kitchen::VERSION" do
|
|
58
|
+
provisioner = Kitchen::Provisioner::Shell.new(config).finalize_config!(instance)
|
|
59
|
+
provisioner.diagnose_plugin[:version].must_equal Kitchen::VERSION
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
describe "configuration" do
|
|
63
|
+
|
|
64
|
+
describe "for bourne shells" do
|
|
65
|
+
|
|
66
|
+
before { platform.stubs(:shell_type).returns("bourne") }
|
|
67
|
+
|
|
68
|
+
it ":script uses calculate_path and is expanded" do
|
|
69
|
+
provisioner[:script].must_equal os_safe_root_path("/rooty/<calculated>/bootstrap.sh")
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
describe "for powershell shells" do
|
|
74
|
+
|
|
75
|
+
before { platform.stubs(:shell_type).returns("powershell") }
|
|
76
|
+
|
|
77
|
+
it ":script uses calculate_path and is expanded" do
|
|
78
|
+
provisioner[:script].must_equal os_safe_root_path("/rooty/<calculated>/bootstrap.ps1")
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it ":data_path uses calculate_path and is expanded" do
|
|
83
|
+
provisioner[:data_path].must_equal os_safe_root_path("/rooty/<calculated>/data")
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
describe "#init_command" do
|
|
88
|
+
|
|
89
|
+
let(:cmd) { provisioner.init_command }
|
|
90
|
+
|
|
91
|
+
describe "for bourne shells" do
|
|
92
|
+
|
|
93
|
+
before { platform.stubs(:shell_type).returns("bourne") }
|
|
94
|
+
|
|
95
|
+
it "uses bourne shell" do
|
|
96
|
+
cmd.must_match(/\Ash -c '$/)
|
|
97
|
+
cmd.must_match(/'\Z/)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
it "ends with a single quote" do
|
|
101
|
+
cmd.must_match(/'\Z/)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it "exports http_proxy & HTTP_PROXY when :http_proxy is set" do
|
|
105
|
+
config[:http_proxy] = "http://proxy"
|
|
106
|
+
|
|
107
|
+
cmd.lines.to_a[1..2].must_equal([
|
|
108
|
+
%{http_proxy="http://proxy"; export http_proxy\n},
|
|
109
|
+
%{HTTP_PROXY="http://proxy"; export HTTP_PROXY\n}
|
|
110
|
+
])
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it "exports https_proxy & HTTPS_PROXY when :https_proxy is set" do
|
|
114
|
+
config[:https_proxy] = "https://proxy"
|
|
115
|
+
|
|
116
|
+
cmd.lines.to_a[1..2].must_equal([
|
|
117
|
+
%{https_proxy="https://proxy"; export https_proxy\n},
|
|
118
|
+
%{HTTPS_PROXY="https://proxy"; export HTTPS_PROXY\n}
|
|
119
|
+
])
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it "exports ftp_proxy & FTP_PROXY when :ftp_proxy is set" do
|
|
123
|
+
config[:ftp_proxy] = "ftp://proxy"
|
|
124
|
+
|
|
125
|
+
cmd.lines.to_a[1..2].must_equal([
|
|
126
|
+
%{ftp_proxy="ftp://proxy"; export ftp_proxy\n},
|
|
127
|
+
%{FTP_PROXY="ftp://proxy"; export FTP_PROXY\n}
|
|
128
|
+
])
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
it "exports all proxy variables when all are set" do
|
|
132
|
+
config[:http_proxy] = "http://proxy"
|
|
133
|
+
config[:https_proxy] = "https://proxy"
|
|
134
|
+
config[:ftp_proxy] = "ftp://proxy"
|
|
135
|
+
|
|
136
|
+
cmd.lines.to_a[1..6].must_equal([
|
|
137
|
+
%{http_proxy="http://proxy"; export http_proxy\n},
|
|
138
|
+
%{HTTP_PROXY="http://proxy"; export HTTP_PROXY\n},
|
|
139
|
+
%{https_proxy="https://proxy"; export https_proxy\n},
|
|
140
|
+
%{HTTPS_PROXY="https://proxy"; export HTTPS_PROXY\n},
|
|
141
|
+
%{ftp_proxy="ftp://proxy"; export ftp_proxy\n},
|
|
142
|
+
%{FTP_PROXY="ftp://proxy"; export FTP_PROXY\n}
|
|
143
|
+
])
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
it "uses sudo for rm when configured" do
|
|
147
|
+
config[:sudo] = true
|
|
148
|
+
|
|
149
|
+
cmd.must_match regexify("sudo -E rm -rf ", :partial_line)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
it "does not use sudo for rm when configured" do
|
|
153
|
+
config[:sudo] = false
|
|
154
|
+
|
|
155
|
+
provisioner.init_command.
|
|
156
|
+
must_match regexify("rm -rf ", :partial_line)
|
|
157
|
+
provisioner.init_command.
|
|
158
|
+
wont_match regexify("sudo -E rm -rf ", :partial_line)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
it "removes the data directory" do
|
|
162
|
+
config[:root_path] = "/route"
|
|
163
|
+
|
|
164
|
+
cmd.must_match %r{rm -rf\b.*\s+/route/data\s+}
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
it "creates :root_path directory" do
|
|
168
|
+
config[:root_path] = "/root/path"
|
|
169
|
+
|
|
170
|
+
cmd.must_match regexify("mkdir -p /root/path", :partial_line)
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
describe "for powershell shells on windows os types" do
|
|
175
|
+
|
|
176
|
+
before do
|
|
177
|
+
platform.stubs(:os_type).returns("windows")
|
|
178
|
+
platform.stubs(:shell_type).returns("powershell")
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
it "exports http_proxy & HTTP_PROXY when :http_proxy is set" do
|
|
182
|
+
config[:http_proxy] = "http://proxy"
|
|
183
|
+
|
|
184
|
+
cmd.lines.to_a[0..1].must_equal([
|
|
185
|
+
%{$env:http_proxy = "http://proxy"\n},
|
|
186
|
+
%{$env:HTTP_PROXY = "http://proxy"\n}
|
|
187
|
+
])
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
it "exports https_proxy & HTTPS_PROXY when :https_proxy is set" do
|
|
191
|
+
config[:https_proxy] = "https://proxy"
|
|
192
|
+
|
|
193
|
+
cmd.lines.to_a[0..1].must_equal([
|
|
194
|
+
%{$env:https_proxy = "https://proxy"\n},
|
|
195
|
+
%{$env:HTTPS_PROXY = "https://proxy"\n}
|
|
196
|
+
])
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
it "exports ftp_proxy & FTP_PROXY when :ftp_proxy is set" do
|
|
200
|
+
config[:ftp_proxy] = "ftp://proxy"
|
|
201
|
+
|
|
202
|
+
cmd.lines.to_a[0..1].must_equal([
|
|
203
|
+
%{$env:ftp_proxy = "ftp://proxy"\n},
|
|
204
|
+
%{$env:FTP_PROXY = "ftp://proxy"\n}
|
|
205
|
+
])
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
it "exports all proxy variables when all are set" do
|
|
209
|
+
config[:http_proxy] = "http://proxy"
|
|
210
|
+
config[:https_proxy] = "https://proxy"
|
|
211
|
+
config[:ftp_proxy] = "ftp://proxy"
|
|
212
|
+
|
|
213
|
+
cmd.lines.to_a[0..5].must_equal([
|
|
214
|
+
%{$env:http_proxy = "http://proxy"\n},
|
|
215
|
+
%{$env:HTTP_PROXY = "http://proxy"\n},
|
|
216
|
+
%{$env:https_proxy = "https://proxy"\n},
|
|
217
|
+
%{$env:HTTPS_PROXY = "https://proxy"\n},
|
|
218
|
+
%{$env:ftp_proxy = "ftp://proxy"\n},
|
|
219
|
+
%{$env:FTP_PROXY = "ftp://proxy"\n}
|
|
220
|
+
])
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
it "removes the data directory" do
|
|
224
|
+
config[:root_path] = "\\route"
|
|
225
|
+
|
|
226
|
+
cmd.must_match regexify(Kitchen::Util.outdent!(<<-POWERSHELL).chomp)
|
|
227
|
+
if (Test-Path "\\route\\data") {
|
|
228
|
+
Remove-Item "\\route\\data" -Recurse -Force
|
|
229
|
+
}
|
|
230
|
+
POWERSHELL
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
it "creates the :root_path directory" do
|
|
234
|
+
config[:root_path] = "\\route"
|
|
235
|
+
|
|
236
|
+
cmd.must_match regexify(Kitchen::Util.outdent!(<<-POWERSHELL).chomp)
|
|
237
|
+
if (-Not (Test-Path "\\route")) {
|
|
238
|
+
New-Item "\\route" -ItemType directory | Out-Null
|
|
239
|
+
}
|
|
240
|
+
POWERSHELL
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
describe "#run_command" do
|
|
246
|
+
|
|
247
|
+
let(:cmd) { provisioner.run_command }
|
|
248
|
+
|
|
249
|
+
describe "for bourne shells" do
|
|
250
|
+
|
|
251
|
+
before { platform.stubs(:shell_type).returns("bourne") }
|
|
252
|
+
|
|
253
|
+
it "uses bourne shell" do
|
|
254
|
+
cmd.must_match(/\Ash -c '$/)
|
|
255
|
+
cmd.must_match(/'\Z/)
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
it "ends with a single quote" do
|
|
259
|
+
cmd.must_match(/'\Z/)
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
it "exports http_proxy & HTTP_PROXY when :http_proxy is set" do
|
|
263
|
+
config[:http_proxy] = "http://proxy"
|
|
264
|
+
|
|
265
|
+
cmd.lines.to_a[1..2].must_equal([
|
|
266
|
+
%{http_proxy="http://proxy"; export http_proxy\n},
|
|
267
|
+
%{HTTP_PROXY="http://proxy"; export HTTP_PROXY\n}
|
|
268
|
+
])
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
it "exports https_proxy & HTTPS_PROXY when :https_proxy is set" do
|
|
272
|
+
config[:https_proxy] = "https://proxy"
|
|
273
|
+
|
|
274
|
+
cmd.lines.to_a[1..2].must_equal([
|
|
275
|
+
%{https_proxy="https://proxy"; export https_proxy\n},
|
|
276
|
+
%{HTTPS_PROXY="https://proxy"; export HTTPS_PROXY\n}
|
|
277
|
+
])
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
it "exports ftp_proxy & FTP_PROXY when :ftp_proxy is set" do
|
|
281
|
+
config[:ftp_proxy] = "ftp://proxy"
|
|
282
|
+
|
|
283
|
+
cmd.lines.to_a[1..2].must_equal([
|
|
284
|
+
%{ftp_proxy="ftp://proxy"; export ftp_proxy\n},
|
|
285
|
+
%{FTP_PROXY="ftp://proxy"; export FTP_PROXY\n}
|
|
286
|
+
])
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
it "exports all proxy variables when all are set" do
|
|
290
|
+
config[:http_proxy] = "http://proxy"
|
|
291
|
+
config[:https_proxy] = "https://proxy"
|
|
292
|
+
config[:ftp_proxy] = "ftp://proxy"
|
|
293
|
+
|
|
294
|
+
cmd.lines.to_a[1..6].must_equal([
|
|
295
|
+
%{http_proxy="http://proxy"; export http_proxy\n},
|
|
296
|
+
%{HTTP_PROXY="http://proxy"; export HTTP_PROXY\n},
|
|
297
|
+
%{https_proxy="https://proxy"; export https_proxy\n},
|
|
298
|
+
%{HTTPS_PROXY="https://proxy"; export HTTPS_PROXY\n},
|
|
299
|
+
%{ftp_proxy="ftp://proxy"; export ftp_proxy\n},
|
|
300
|
+
%{FTP_PROXY="ftp://proxy"; export FTP_PROXY\n}
|
|
301
|
+
])
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
it "uses sudo for script when configured" do
|
|
305
|
+
config[:root_path] = "/r"
|
|
306
|
+
config[:sudo] = true
|
|
307
|
+
|
|
308
|
+
cmd.must_match regexify("sudo -E /r/bootstrap.sh", :partial_line)
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
it "does not use sudo for script when configured" do
|
|
312
|
+
config[:root_path] = "/r"
|
|
313
|
+
config[:sudo] = false
|
|
314
|
+
|
|
315
|
+
cmd.must_match regexify("/r/bootstrap.sh", :partial_line)
|
|
316
|
+
cmd.wont_match regexify("sudo -E /r/bootstrap.sh", :partial_line)
|
|
317
|
+
end
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
describe "for powershell shells on windows os types" do
|
|
321
|
+
|
|
322
|
+
before do
|
|
323
|
+
platform.stubs(:shell_type).returns("powershell")
|
|
324
|
+
platform.stubs(:os_type).returns("windows")
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
it "exports http_proxy & HTTP_PROXY when :http_proxy is set" do
|
|
328
|
+
config[:http_proxy] = "http://proxy"
|
|
329
|
+
|
|
330
|
+
cmd.lines.to_a[0..1].must_equal([
|
|
331
|
+
%{$env:http_proxy = "http://proxy"\n},
|
|
332
|
+
%{$env:HTTP_PROXY = "http://proxy"\n}
|
|
333
|
+
])
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
it "exports https_proxy & HTTPS_PROXY when :https_proxy is set" do
|
|
337
|
+
config[:https_proxy] = "https://proxy"
|
|
338
|
+
|
|
339
|
+
cmd.lines.to_a[0..1].must_equal([
|
|
340
|
+
%{$env:https_proxy = "https://proxy"\n},
|
|
341
|
+
%{$env:HTTPS_PROXY = "https://proxy"\n}
|
|
342
|
+
])
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
it "exports ftp_proxy & FTP_PROXY when :ftp_proxy is set" do
|
|
346
|
+
config[:ftp_proxy] = "ftp://proxy"
|
|
347
|
+
|
|
348
|
+
cmd.lines.to_a[0..1].must_equal([
|
|
349
|
+
%{$env:ftp_proxy = "ftp://proxy"\n},
|
|
350
|
+
%{$env:FTP_PROXY = "ftp://proxy"\n}
|
|
351
|
+
])
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
it "exports all proxy variables when all are set" do
|
|
355
|
+
config[:http_proxy] = "http://proxy"
|
|
356
|
+
config[:https_proxy] = "https://proxy"
|
|
357
|
+
config[:ftp_proxy] = "ftp://proxy"
|
|
358
|
+
|
|
359
|
+
cmd.lines.to_a[0..5].must_equal([
|
|
360
|
+
%{$env:http_proxy = "http://proxy"\n},
|
|
361
|
+
%{$env:HTTP_PROXY = "http://proxy"\n},
|
|
362
|
+
%{$env:https_proxy = "https://proxy"\n},
|
|
363
|
+
%{$env:HTTPS_PROXY = "https://proxy"\n},
|
|
364
|
+
%{$env:ftp_proxy = "ftp://proxy"\n},
|
|
365
|
+
%{$env:FTP_PROXY = "ftp://proxy"\n}
|
|
366
|
+
])
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
it "invokes the bootstrap.ps1 script" do
|
|
370
|
+
config[:root_path] = "\\r"
|
|
371
|
+
|
|
372
|
+
cmd.must_match regexify(%{& "\\r\\bootstrap.ps1"})
|
|
373
|
+
end
|
|
374
|
+
end
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
describe "#create_sandbox" do
|
|
378
|
+
|
|
379
|
+
before do
|
|
380
|
+
@root = Dir.mktmpdir
|
|
381
|
+
config[:kitchen_root] = @root
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
after do
|
|
385
|
+
FileUtils.remove_entry(@root)
|
|
386
|
+
begin
|
|
387
|
+
provisioner.cleanup_sandbox
|
|
388
|
+
rescue # rubocop:disable Lint/HandleExceptions
|
|
389
|
+
end
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
let(:provisioner) do
|
|
393
|
+
Kitchen::Provisioner::Shell.new(config).finalize_config!(instance)
|
|
394
|
+
end
|
|
395
|
+
|
|
396
|
+
describe "data files" do
|
|
397
|
+
|
|
398
|
+
before do
|
|
399
|
+
create_files_under("#{config[:kitchen_root]}/my_data")
|
|
400
|
+
config[:data_path] = "#{config[:kitchen_root]}/my_data"
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
it "skips directory creation if :data_path is not set" do
|
|
404
|
+
config[:data_path] = nil
|
|
405
|
+
provisioner.create_sandbox
|
|
406
|
+
|
|
407
|
+
sandbox_path("data").directory?.must_equal false
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
it "copies tree from :data_path into sandbox" do
|
|
411
|
+
provisioner.create_sandbox
|
|
412
|
+
|
|
413
|
+
sandbox_path("data/alpha.txt").file?.must_equal true
|
|
414
|
+
IO.read(sandbox_path("data/alpha.txt")).must_equal "stuff"
|
|
415
|
+
sandbox_path("data/sub").directory?.must_equal true
|
|
416
|
+
sandbox_path("data/sub/bravo.txt").file?.must_equal true
|
|
417
|
+
IO.read(sandbox_path("data/sub/bravo.txt")).must_equal "junk"
|
|
418
|
+
end
|
|
419
|
+
|
|
420
|
+
it "logs a message on info" do
|
|
421
|
+
provisioner.create_sandbox
|
|
422
|
+
|
|
423
|
+
logged_output.string.must_match info_line("Preparing data")
|
|
424
|
+
end
|
|
425
|
+
|
|
426
|
+
it "logs a message on debug" do
|
|
427
|
+
provisioner.create_sandbox
|
|
428
|
+
|
|
429
|
+
logged_output.string.must_match debug_line(
|
|
430
|
+
"Using data from #{config[:kitchen_root]}/my_data")
|
|
431
|
+
end
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
describe "script file" do
|
|
435
|
+
|
|
436
|
+
describe "with a valid :script file" do
|
|
437
|
+
|
|
438
|
+
before do
|
|
439
|
+
File.open("#{config[:kitchen_root]}/my_script", "wb") do |file|
|
|
440
|
+
file.write("gonuts")
|
|
441
|
+
end
|
|
442
|
+
config[:script] = "#{config[:kitchen_root]}/my_script"
|
|
443
|
+
end
|
|
444
|
+
|
|
445
|
+
it "creates a file in the sandbox directory" do
|
|
446
|
+
provisioner.create_sandbox
|
|
447
|
+
|
|
448
|
+
sandbox_path("my_script").file?.must_equal true
|
|
449
|
+
unless running_tests_on_windows?
|
|
450
|
+
# Windows doesn't have the concept of executable
|
|
451
|
+
sandbox_path("my_script").executable?.must_equal true
|
|
452
|
+
end
|
|
453
|
+
IO.read(sandbox_path("my_script")).must_equal "gonuts"
|
|
454
|
+
end
|
|
455
|
+
|
|
456
|
+
it "logs a message on info" do
|
|
457
|
+
provisioner.create_sandbox
|
|
458
|
+
|
|
459
|
+
logged_output.string.must_match info_line("Preparing script")
|
|
460
|
+
end
|
|
461
|
+
|
|
462
|
+
it "logs a message on debug" do
|
|
463
|
+
provisioner.create_sandbox
|
|
464
|
+
|
|
465
|
+
logged_output.string.must_match debug_line(
|
|
466
|
+
"Using script from #{config[:kitchen_root]}/my_script")
|
|
467
|
+
end
|
|
468
|
+
end
|
|
469
|
+
|
|
470
|
+
describe "with no :script file" do
|
|
471
|
+
|
|
472
|
+
before { config[:script] = nil }
|
|
473
|
+
|
|
474
|
+
describe "for bourne shells" do
|
|
475
|
+
|
|
476
|
+
before { platform.stubs(:shell_type).returns("bourne") }
|
|
477
|
+
|
|
478
|
+
it "logs a message on info" do
|
|
479
|
+
provisioner.create_sandbox
|
|
480
|
+
|
|
481
|
+
logged_output.string.must_match info_line("Preparing script")
|
|
482
|
+
end
|
|
483
|
+
|
|
484
|
+
it "logs a warning on info" do
|
|
485
|
+
provisioner.create_sandbox
|
|
486
|
+
|
|
487
|
+
logged_output.string.must_match info_line(
|
|
488
|
+
"bootstrap.sh not found so Kitchen will run a stubbed script. " \
|
|
489
|
+
"Is this intended?")
|
|
490
|
+
end
|
|
491
|
+
|
|
492
|
+
it "creates a file in the sandbox directory" do
|
|
493
|
+
provisioner.create_sandbox
|
|
494
|
+
|
|
495
|
+
sandbox_path("bootstrap.sh").file?.must_equal true
|
|
496
|
+
unless running_tests_on_windows?
|
|
497
|
+
# Windows doesn't have the concept of executable
|
|
498
|
+
sandbox_path("bootstrap.sh").executable?.must_equal true
|
|
499
|
+
end
|
|
500
|
+
IO.read(sandbox_path("bootstrap.sh")).
|
|
501
|
+
must_match(/NO BOOTSTRAP SCRIPT PRESENT/)
|
|
502
|
+
end
|
|
503
|
+
end
|
|
504
|
+
|
|
505
|
+
describe "for powershell shells" do
|
|
506
|
+
|
|
507
|
+
before { platform.stubs(:shell_type).returns("powershell") }
|
|
508
|
+
|
|
509
|
+
it "logs a message on info" do
|
|
510
|
+
provisioner.create_sandbox
|
|
511
|
+
|
|
512
|
+
logged_output.string.must_match info_line("Preparing script")
|
|
513
|
+
end
|
|
514
|
+
|
|
515
|
+
it "logs a warning on info" do
|
|
516
|
+
provisioner.create_sandbox
|
|
517
|
+
|
|
518
|
+
logged_output.string.must_match info_line(
|
|
519
|
+
"bootstrap.ps1 not found so Kitchen will run a stubbed script. " \
|
|
520
|
+
"Is this intended?")
|
|
521
|
+
end
|
|
522
|
+
|
|
523
|
+
it "creates a file in the sandbox directory" do
|
|
524
|
+
provisioner.create_sandbox
|
|
525
|
+
|
|
526
|
+
sandbox_path("bootstrap.ps1").file?.must_equal true
|
|
527
|
+
unless running_tests_on_windows?
|
|
528
|
+
# Windows doesn't have the concept of executable
|
|
529
|
+
sandbox_path("bootstrap.ps1").executable?.must_equal true
|
|
530
|
+
end
|
|
531
|
+
IO.read(sandbox_path("bootstrap.ps1")).
|
|
532
|
+
must_match(/Write-Host "NO BOOTSTRAP SCRIPT PRESENT`n"/)
|
|
533
|
+
end
|
|
534
|
+
end
|
|
535
|
+
end
|
|
536
|
+
end
|
|
537
|
+
|
|
538
|
+
def sandbox_path(path)
|
|
539
|
+
Pathname.new(provisioner.sandbox_path).join(path)
|
|
540
|
+
end
|
|
541
|
+
|
|
542
|
+
def create_files_under(path)
|
|
543
|
+
FileUtils.mkdir_p(File.join(path, "sub"))
|
|
544
|
+
File.open(File.join(path, "alpha.txt"), "wb") do |file|
|
|
545
|
+
file.write("stuff")
|
|
546
|
+
end
|
|
547
|
+
File.open(File.join(path, "sub", "bravo.txt"), "wb") do |file|
|
|
548
|
+
file.write("junk")
|
|
549
|
+
end
|
|
550
|
+
end
|
|
551
|
+
|
|
552
|
+
def info_line(msg)
|
|
553
|
+
%r{^I, .* : #{Regexp.escape(msg)}$}
|
|
554
|
+
end
|
|
555
|
+
|
|
556
|
+
def debug_line(msg)
|
|
557
|
+
%r{^D, .* : #{Regexp.escape(msg)}$}
|
|
558
|
+
end
|
|
559
|
+
end
|
|
560
|
+
|
|
561
|
+
def regexify(str, line = :whole_line)
|
|
562
|
+
r = Regexp.escape(str)
|
|
563
|
+
r = "^\s*#{r}$" if line == :whole_line
|
|
564
|
+
Regexp.new(r)
|
|
565
|
+
end
|
|
566
|
+
end
|