test-kitchen 1.6.0 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (180) hide show
  1. checksums.yaml +4 -4
  2. data/.cane +8 -7
  3. data/.github/ISSUE_TEMPLATE.md +56 -0
  4. data/.gitignore +28 -27
  5. data/.kitchen.ci.yml +23 -0
  6. data/.kitchen.proxy.yml +27 -0
  7. data/.rubocop.yml +3 -3
  8. data/.travis.yml +70 -53
  9. data/.yardopts +3 -3
  10. data/Berksfile +3 -0
  11. data/CHANGELOG.md +1083 -1051
  12. data/CONTRIBUTING.md +14 -14
  13. data/Gemfile +19 -14
  14. data/Gemfile.proxy_tests +4 -5
  15. data/Guardfile +42 -42
  16. data/LICENSE +15 -15
  17. data/MAINTAINERS.md +23 -24
  18. data/README.md +135 -135
  19. data/Rakefile +61 -76
  20. data/appveyor.yml +44 -34
  21. data/features/kitchen_action_commands.feature +164 -164
  22. data/features/kitchen_command.feature +16 -16
  23. data/features/kitchen_console_command.feature +34 -34
  24. data/features/kitchen_defaults.feature +38 -38
  25. data/features/kitchen_diagnose_command.feature +96 -96
  26. data/features/kitchen_driver_create_command.feature +64 -64
  27. data/features/kitchen_driver_discover_command.feature +25 -25
  28. data/features/kitchen_help_command.feature +16 -16
  29. data/features/kitchen_init_command.feature +274 -274
  30. data/features/kitchen_list_command.feature +104 -104
  31. data/features/kitchen_login_command.feature +62 -62
  32. data/features/kitchen_sink_command.feature +30 -30
  33. data/features/kitchen_test_command.feature +88 -88
  34. data/features/step_definitions/gem_steps.rb +36 -36
  35. data/features/step_definitions/git_steps.rb +5 -5
  36. data/features/step_definitions/output_steps.rb +5 -5
  37. data/features/support/env.rb +75 -75
  38. data/lib/kitchen.rb +150 -150
  39. data/lib/kitchen/base64_stream.rb +55 -55
  40. data/lib/kitchen/cli.rb +419 -419
  41. data/lib/kitchen/collection.rb +55 -55
  42. data/lib/kitchen/color.rb +65 -65
  43. data/lib/kitchen/command.rb +185 -185
  44. data/lib/kitchen/command/action.rb +45 -45
  45. data/lib/kitchen/command/console.rb +58 -58
  46. data/lib/kitchen/command/diagnose.rb +92 -92
  47. data/lib/kitchen/command/driver_discover.rb +105 -105
  48. data/lib/kitchen/command/exec.rb +41 -41
  49. data/lib/kitchen/command/list.rb +119 -119
  50. data/lib/kitchen/command/login.rb +43 -43
  51. data/lib/kitchen/command/sink.rb +54 -54
  52. data/lib/kitchen/command/test.rb +51 -51
  53. data/lib/kitchen/config.rb +322 -322
  54. data/lib/kitchen/configurable.rb +529 -529
  55. data/lib/kitchen/data_munger.rb +959 -960
  56. data/lib/kitchen/diagnostic.rb +141 -141
  57. data/lib/kitchen/driver.rb +56 -56
  58. data/lib/kitchen/driver/base.rb +134 -134
  59. data/lib/kitchen/driver/dummy.rb +108 -108
  60. data/lib/kitchen/driver/proxy.rb +72 -72
  61. data/lib/kitchen/driver/ssh_base.rb +357 -357
  62. data/lib/kitchen/errors.rb +229 -229
  63. data/lib/kitchen/generator/driver_create.rb +177 -177
  64. data/lib/kitchen/generator/init.rb +296 -296
  65. data/lib/kitchen/instance.rb +662 -662
  66. data/lib/kitchen/lazy_hash.rb +142 -142
  67. data/lib/kitchen/loader/yaml.rb +349 -349
  68. data/lib/kitchen/logger.rb +423 -423
  69. data/lib/kitchen/logging.rb +56 -56
  70. data/lib/kitchen/login_command.rb +52 -52
  71. data/lib/kitchen/metadata_chopper.rb +52 -52
  72. data/lib/kitchen/platform.rb +67 -67
  73. data/lib/kitchen/provisioner.rb +54 -54
  74. data/lib/kitchen/provisioner/base.rb +236 -236
  75. data/lib/kitchen/provisioner/chef/berkshelf.rb +114 -114
  76. data/lib/kitchen/provisioner/chef/common_sandbox.rb +322 -322
  77. data/lib/kitchen/provisioner/chef/librarian.rb +112 -112
  78. data/lib/kitchen/provisioner/chef_apply.rb +124 -125
  79. data/lib/kitchen/provisioner/chef_base.rb +341 -294
  80. data/lib/kitchen/provisioner/chef_solo.rb +88 -89
  81. data/lib/kitchen/provisioner/chef_zero.rb +245 -245
  82. data/lib/kitchen/provisioner/dummy.rb +79 -79
  83. data/lib/kitchen/provisioner/shell.rb +138 -138
  84. data/lib/kitchen/rake_tasks.rb +63 -63
  85. data/lib/kitchen/shell_out.rb +93 -93
  86. data/lib/kitchen/ssh.rb +276 -276
  87. data/lib/kitchen/state_file.rb +120 -120
  88. data/lib/kitchen/suite.rb +51 -51
  89. data/lib/kitchen/thor_tasks.rb +66 -66
  90. data/lib/kitchen/transport.rb +54 -54
  91. data/lib/kitchen/transport/base.rb +176 -176
  92. data/lib/kitchen/transport/dummy.rb +79 -79
  93. data/lib/kitchen/transport/ssh.rb +364 -364
  94. data/lib/kitchen/transport/winrm.rb +486 -486
  95. data/lib/kitchen/util.rb +147 -147
  96. data/lib/kitchen/verifier.rb +55 -55
  97. data/lib/kitchen/verifier/base.rb +235 -235
  98. data/lib/kitchen/verifier/busser.rb +277 -277
  99. data/lib/kitchen/verifier/dummy.rb +79 -79
  100. data/lib/kitchen/verifier/shell.rb +101 -101
  101. data/lib/kitchen/version.rb +21 -21
  102. data/lib/vendor/hash_recursive_merge.rb +82 -82
  103. data/spec/kitchen/base64_stream_spec.rb +77 -77
  104. data/spec/kitchen/cli_spec.rb +56 -56
  105. data/spec/kitchen/collection_spec.rb +80 -80
  106. data/spec/kitchen/color_spec.rb +54 -54
  107. data/spec/kitchen/config_spec.rb +408 -408
  108. data/spec/kitchen/configurable_spec.rb +1095 -1062
  109. data/spec/kitchen/data_munger_spec.rb +2694 -2383
  110. data/spec/kitchen/diagnostic_spec.rb +129 -129
  111. data/spec/kitchen/driver/base_spec.rb +121 -121
  112. data/spec/kitchen/driver/dummy_spec.rb +199 -199
  113. data/spec/kitchen/driver/proxy_spec.rb +138 -138
  114. data/spec/kitchen/driver/ssh_base_spec.rb +1115 -1115
  115. data/spec/kitchen/driver_spec.rb +112 -112
  116. data/spec/kitchen/errors_spec.rb +309 -309
  117. data/spec/kitchen/instance_spec.rb +1419 -1419
  118. data/spec/kitchen/lazy_hash_spec.rb +117 -117
  119. data/spec/kitchen/loader/yaml_spec.rb +774 -774
  120. data/spec/kitchen/logger_spec.rb +429 -429
  121. data/spec/kitchen/logging_spec.rb +59 -59
  122. data/spec/kitchen/login_command_spec.rb +68 -68
  123. data/spec/kitchen/metadata_chopper_spec.rb +82 -82
  124. data/spec/kitchen/platform_spec.rb +89 -89
  125. data/spec/kitchen/provisioner/base_spec.rb +386 -386
  126. data/spec/kitchen/provisioner/chef_apply_spec.rb +136 -136
  127. data/spec/kitchen/provisioner/chef_base_spec.rb +1161 -1067
  128. data/spec/kitchen/provisioner/chef_solo_spec.rb +557 -557
  129. data/spec/kitchen/provisioner/chef_zero_spec.rb +1001 -1001
  130. data/spec/kitchen/provisioner/dummy_spec.rb +99 -99
  131. data/spec/kitchen/provisioner/shell_spec.rb +566 -566
  132. data/spec/kitchen/provisioner_spec.rb +107 -107
  133. data/spec/kitchen/shell_out_spec.rb +150 -150
  134. data/spec/kitchen/ssh_spec.rb +693 -693
  135. data/spec/kitchen/state_file_spec.rb +129 -129
  136. data/spec/kitchen/suite_spec.rb +62 -62
  137. data/spec/kitchen/transport/base_spec.rb +89 -89
  138. data/spec/kitchen/transport/ssh_spec.rb +1255 -1255
  139. data/spec/kitchen/transport/winrm_spec.rb +1143 -1143
  140. data/spec/kitchen/transport_spec.rb +112 -112
  141. data/spec/kitchen/util_spec.rb +165 -165
  142. data/spec/kitchen/verifier/base_spec.rb +362 -362
  143. data/spec/kitchen/verifier/busser_spec.rb +610 -610
  144. data/spec/kitchen/verifier/dummy_spec.rb +99 -99
  145. data/spec/kitchen/verifier/shell_spec.rb +160 -158
  146. data/spec/kitchen/verifier_spec.rb +120 -120
  147. data/spec/kitchen_spec.rb +114 -114
  148. data/spec/spec_helper.rb +85 -85
  149. data/spec/support/powershell_max_size_spec.rb +40 -40
  150. data/support/busser_install_command.ps1 +14 -14
  151. data/support/busser_install_command.sh +14 -14
  152. data/support/chef-client-zero.rb +77 -77
  153. data/support/chef_base_init_command.ps1 +18 -18
  154. data/support/chef_base_init_command.sh +2 -2
  155. data/support/chef_base_install_command.ps1 +85 -85
  156. data/support/chef_base_install_command.sh +229 -229
  157. data/support/chef_zero_prepare_command_legacy.ps1 +9 -9
  158. data/support/chef_zero_prepare_command_legacy.sh +10 -10
  159. data/support/download_helpers.sh +109 -109
  160. data/support/dummy-validation.pem +27 -27
  161. data/templates/driver/CHANGELOG.md.erb +3 -3
  162. data/templates/driver/Gemfile.erb +3 -3
  163. data/templates/driver/README.md.erb +64 -64
  164. data/templates/driver/Rakefile.erb +21 -21
  165. data/templates/driver/driver.rb.erb +23 -23
  166. data/templates/driver/gemspec.erb +29 -29
  167. data/templates/driver/gitignore.erb +17 -17
  168. data/templates/driver/license_apachev2.erb +15 -15
  169. data/templates/driver/license_lgplv3.erb +16 -16
  170. data/templates/driver/license_mit.erb +22 -22
  171. data/templates/driver/license_reserved.erb +5 -5
  172. data/templates/driver/tailor.erb +4 -4
  173. data/templates/driver/travis.yml.erb +11 -11
  174. data/templates/driver/version.rb.erb +12 -12
  175. data/templates/init/chefignore.erb +1 -1
  176. data/templates/init/kitchen.yml.erb +18 -18
  177. data/test-kitchen.gemspec +62 -62
  178. data/test/integration/default/default_spec.rb +3 -0
  179. data/testing_windows.md +37 -37
  180. metadata +23 -11
@@ -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