test-kitchen 1.6.0 → 1.7.0

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.
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,277 +1,277 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
- # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
4
- #
5
- # Copyright (C) 2012, 2013, 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 "base64"
20
- require "digest"
21
-
22
- require "kitchen/verifier/base"
23
-
24
- module Kitchen
25
-
26
- module Verifier
27
-
28
- # Command string generator to interface with Busser. The commands that are
29
- # generated are safe to pass to an SSH command or as an unix command
30
- # argument (escaped in single quotes).
31
- #
32
- # @author Fletcher Nichol <fnichol@nichol.ca>
33
- class Busser < Kitchen::Verifier::Base
34
-
35
- kitchen_verifier_api_version 1
36
-
37
- plugin_version Kitchen::VERSION
38
-
39
- default_config :busser_bin do |verifier|
40
- verifier.
41
- remote_path_join(%W[#{verifier[:root_path]} bin busser]).
42
- tap { |path| path.concat(".bat") if verifier.windows_os? }
43
- end
44
-
45
- default_config :ruby_bindir do |verifier|
46
- if verifier.windows_os?
47
- "$env:systemdrive\\opscode\\chef\\embedded\\bin"
48
- else
49
- verifier.remote_path_join(%W[#{verifier[:chef_omnibus_root]} embedded bin])
50
- end
51
- end
52
-
53
- default_config :version, "busser"
54
-
55
- expand_path_for :test_base_path
56
-
57
- # Creates a new Busser object using the provided configuration data
58
- # which will be merged with any default configuration.
59
- #
60
- # @param config [Hash] provided driver configuration
61
- def initialize(config = {})
62
- init_config(config)
63
- end
64
-
65
- # (see Base#create_sandbox)
66
- def create_sandbox
67
- super
68
- prepare_helpers
69
- prepare_suites
70
- end
71
-
72
- # (see Base#init_command)
73
- def init_command
74
- return if local_suite_files.empty?
75
-
76
- cmd = sudo(config[:busser_bin]).dup.
77
- tap { |str| str.insert(0, "& ") if powershell_shell? }
78
-
79
- prefix_command(wrap_shell_code(Util.outdent!(<<-CMD)))
80
- #{busser_env}
81
-
82
- #{cmd} suite cleanup
83
- CMD
84
- end
85
-
86
- # (see Base#install_command)
87
- def install_command
88
- return if local_suite_files.empty?
89
-
90
- vars = install_command_vars
91
-
92
- prefix_command(shell_code_from_file(vars, "busser_install_command"))
93
- end
94
-
95
- # (see Base#run_command)
96
- def run_command
97
- return if local_suite_files.empty?
98
-
99
- cmd = sudo(config[:busser_bin]).dup.
100
- tap { |str| str.insert(0, "& ") if powershell_shell? }
101
-
102
- prefix_command(wrap_shell_code(Util.outdent!(<<-CMD)))
103
- #{busser_env}
104
-
105
- #{cmd} test
106
- CMD
107
- end
108
-
109
- # Legacy method stub for `#setup_cmd` which calls `#install_command`.
110
- #
111
- # @return [String] command string
112
- # @deprecated When backwards compatibility for old Busser methods is
113
- # removed, this method will no longer be available. Use
114
- # `#install_command` in its place.
115
- define_method(:setup_cmd) { install_command }
116
-
117
- # Legacy method stub for `#run_cmd` which calls `#run_command`.
118
- #
119
- # @return [String] command string
120
- # @deprecated When backwards compatibility for old Busser methods is
121
- # removed, this method will no longer be available. Use
122
- # `#run_command` in its place.
123
- define_method(:run_cmd) { run_command }
124
-
125
- # Legacy method stub for `#sync_cmd`.
126
- #
127
- # @deprecated When backwards compatibility for old Busser methods is
128
- # removed, this method will no longer be available. Use
129
- # `transport#upload` to transfer test files in its place.
130
- def sync_cmd
131
- warn("Legacy call to #sync_cmd cannot be preserved, meaning that " \
132
- "test files will not be uploaded. " \
133
- "Code that calls #sync_cmd can now use the transport#upload " \
134
- "method to transfer files.")
135
- end
136
-
137
- private
138
-
139
- # Returns a command string that sets appropriate environment variables for
140
- # busser commands.
141
- #
142
- # @return [String] command string
143
- # @api private
144
- def busser_env
145
- root = config[:root_path]
146
- gem_home = gem_path = remote_path_join(root, "gems")
147
- gem_cache = remote_path_join(gem_home, "cache")
148
-
149
- [
150
- shell_env_var("BUSSER_ROOT", root),
151
- shell_env_var("GEM_HOME", gem_home),
152
- shell_env_var("GEM_PATH", gem_path),
153
- shell_env_var("GEM_CACHE", gem_cache)
154
- ].join("\n")
155
- end
156
-
157
- # Determines whether or not a local workstation file exists under a
158
- # Chef-related directory.
159
- #
160
- # @return [truthy,falsey] whether or not a given file is some kind of
161
- # Chef-related file
162
- # @api private
163
- def chef_data_dir?(base, file)
164
- file =~ %r{^#{base}/(data|data_bags|environments|nodes|roles)/}
165
- end
166
-
167
- # Returns arguments to a `gem install` command, suitable to install the
168
- # Busser gem.
169
- #
170
- # @return [String] arguments string
171
- # @api private
172
- def gem_install_args
173
- gem, version = config[:version].split("@")
174
- gem, version = "busser", gem if gem =~ /^\d+\.\d+\.\d+/
175
-
176
- root = config[:root_path]
177
- gem_bin = remote_path_join(root, "bin")
178
-
179
- # We don't want the gems to be installed in the home directory,
180
- # this will force the bindir and the gem install location both
181
- # to be under /tmp/verifier
182
- args = gem
183
- args += " --version #{version}" if version
184
- args += " --no-rdoc --no-ri --no-format-executable -n #{gem_bin}"
185
- args += " --no-user-install"
186
- args
187
- end
188
-
189
- # Returns an Array of common helper filenames currently residing on the
190
- # local workstation.
191
- #
192
- # @return [Array<String>] array of helper files
193
- # @api private
194
- def helper_files
195
- glob = File.join(config[:test_base_path], "helpers", "*/**/*")
196
- Dir.glob(glob).reject { |f| File.directory?(f) }
197
- end
198
-
199
- def install_command_vars
200
- ruby = remote_path_join(config[:ruby_bindir], "ruby").
201
- tap { |path| path.concat(".exe") if windows_os? }
202
- gem = remote_path_join(config[:ruby_bindir], "gem")
203
-
204
- [
205
- busser_env,
206
- shell_var("ruby", ruby),
207
- shell_var("gem", gem),
208
- shell_var("version", config[:version]),
209
- shell_var("gem_install_args", gem_install_args),
210
- shell_var("busser", sudo(config[:busser_bin])),
211
- shell_var("plugins", plugins.join(" "))
212
- ].join("\n")
213
- end
214
-
215
- # Returns an Array of test suite filenames for the related suite currently
216
- # residing on the local workstation. Any special provisioner-specific
217
- # directories (such as a Chef roles/ directory) are excluded.
218
- #
219
- # @return [Array<String>] array of suite files
220
- # @api private
221
- def local_suite_files
222
- base = File.join(config[:test_base_path], config[:suite_name])
223
- glob = File.join(base, "*/**/*")
224
- Dir.glob(glob).reject do |f|
225
- chef_data_dir?(base, f) || File.directory?(f)
226
- end
227
- end
228
-
229
- # Returns a uniquely sorted Array of Busser plugin gems that need to
230
- # be installed for the related suite.
231
- #
232
- # @return [Array<String>] a lexically sorted, unique item array of Busser
233
- # plugin gem names
234
- # @api private
235
- def plugins
236
- non_suite_dirs = %w[data data_bags environments nodes roles]
237
- glob = File.join(config[:test_base_path], config[:suite_name], "*")
238
- Dir.glob(glob).reject { |d|
239
- !File.directory?(d) || non_suite_dirs.include?(File.basename(d))
240
- }.map { |d| "busser-#{File.basename(d)}" }.sort.uniq
241
- end
242
-
243
- # Copies all common testing helper files into the suites directory in
244
- # the sandbox.
245
- #
246
- # @api private
247
- def prepare_helpers
248
- base = File.join(config[:test_base_path], "helpers")
249
-
250
- helper_files.each do |src|
251
- dest = File.join(sandbox_suites_dir, src.sub("#{base}/", ""))
252
- FileUtils.mkdir_p(File.dirname(dest))
253
- FileUtils.cp(src, dest, :preserve => true)
254
- end
255
- end
256
-
257
- # Copies all test suite files into the suites directory in the sandbox.
258
- #
259
- # @api private
260
- def prepare_suites
261
- base = File.join(config[:test_base_path], config[:suite_name])
262
-
263
- local_suite_files.each do |src|
264
- dest = File.join(sandbox_suites_dir, src.sub("#{base}/", ""))
265
- FileUtils.mkdir_p(File.dirname(dest))
266
- FileUtils.cp(src, dest, :preserve => true)
267
- end
268
- end
269
-
270
- # @return [String] path to suites directory under sandbox path
271
- # @api private
272
- def sandbox_suites_dir
273
- File.join(sandbox_path, "suites")
274
- end
275
- end
276
- end
277
- end
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
4
+ #
5
+ # Copyright (C) 2012, 2013, 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 "base64"
20
+ require "digest"
21
+
22
+ require "kitchen/verifier/base"
23
+
24
+ module Kitchen
25
+
26
+ module Verifier
27
+
28
+ # Command string generator to interface with Busser. The commands that are
29
+ # generated are safe to pass to an SSH command or as an unix command
30
+ # argument (escaped in single quotes).
31
+ #
32
+ # @author Fletcher Nichol <fnichol@nichol.ca>
33
+ class Busser < Kitchen::Verifier::Base
34
+
35
+ kitchen_verifier_api_version 1
36
+
37
+ plugin_version Kitchen::VERSION
38
+
39
+ default_config :busser_bin do |verifier|
40
+ verifier.
41
+ remote_path_join(%W[#{verifier[:root_path]} bin busser]).
42
+ tap { |path| path.concat(".bat") if verifier.windows_os? }
43
+ end
44
+
45
+ default_config :ruby_bindir do |verifier|
46
+ if verifier.windows_os?
47
+ "$env:systemdrive\\opscode\\chef\\embedded\\bin"
48
+ else
49
+ verifier.remote_path_join(%W[#{verifier[:chef_omnibus_root]} embedded bin])
50
+ end
51
+ end
52
+
53
+ default_config :version, "busser"
54
+
55
+ expand_path_for :test_base_path
56
+
57
+ # Creates a new Busser object using the provided configuration data
58
+ # which will be merged with any default configuration.
59
+ #
60
+ # @param config [Hash] provided driver configuration
61
+ def initialize(config = {})
62
+ init_config(config)
63
+ end
64
+
65
+ # (see Base#create_sandbox)
66
+ def create_sandbox
67
+ super
68
+ prepare_helpers
69
+ prepare_suites
70
+ end
71
+
72
+ # (see Base#init_command)
73
+ def init_command
74
+ return if local_suite_files.empty?
75
+
76
+ cmd = sudo(config[:busser_bin]).dup.
77
+ tap { |str| str.insert(0, "& ") if powershell_shell? }
78
+
79
+ prefix_command(wrap_shell_code(Util.outdent!(<<-CMD)))
80
+ #{busser_env}
81
+
82
+ #{cmd} suite cleanup
83
+ CMD
84
+ end
85
+
86
+ # (see Base#install_command)
87
+ def install_command
88
+ return if local_suite_files.empty?
89
+
90
+ vars = install_command_vars
91
+
92
+ prefix_command(shell_code_from_file(vars, "busser_install_command"))
93
+ end
94
+
95
+ # (see Base#run_command)
96
+ def run_command
97
+ return if local_suite_files.empty?
98
+
99
+ cmd = sudo(config[:busser_bin]).dup.
100
+ tap { |str| str.insert(0, "& ") if powershell_shell? }
101
+
102
+ prefix_command(wrap_shell_code(Util.outdent!(<<-CMD)))
103
+ #{busser_env}
104
+
105
+ #{cmd} test
106
+ CMD
107
+ end
108
+
109
+ # Legacy method stub for `#setup_cmd` which calls `#install_command`.
110
+ #
111
+ # @return [String] command string
112
+ # @deprecated When backwards compatibility for old Busser methods is
113
+ # removed, this method will no longer be available. Use
114
+ # `#install_command` in its place.
115
+ define_method(:setup_cmd) { install_command }
116
+
117
+ # Legacy method stub for `#run_cmd` which calls `#run_command`.
118
+ #
119
+ # @return [String] command string
120
+ # @deprecated When backwards compatibility for old Busser methods is
121
+ # removed, this method will no longer be available. Use
122
+ # `#run_command` in its place.
123
+ define_method(:run_cmd) { run_command }
124
+
125
+ # Legacy method stub for `#sync_cmd`.
126
+ #
127
+ # @deprecated When backwards compatibility for old Busser methods is
128
+ # removed, this method will no longer be available. Use
129
+ # `transport#upload` to transfer test files in its place.
130
+ def sync_cmd
131
+ warn("Legacy call to #sync_cmd cannot be preserved, meaning that " \
132
+ "test files will not be uploaded. " \
133
+ "Code that calls #sync_cmd can now use the transport#upload " \
134
+ "method to transfer files.")
135
+ end
136
+
137
+ private
138
+
139
+ # Returns a command string that sets appropriate environment variables for
140
+ # busser commands.
141
+ #
142
+ # @return [String] command string
143
+ # @api private
144
+ def busser_env
145
+ root = config[:root_path]
146
+ gem_home = gem_path = remote_path_join(root, "gems")
147
+ gem_cache = remote_path_join(gem_home, "cache")
148
+
149
+ [
150
+ shell_env_var("BUSSER_ROOT", root),
151
+ shell_env_var("GEM_HOME", gem_home),
152
+ shell_env_var("GEM_PATH", gem_path),
153
+ shell_env_var("GEM_CACHE", gem_cache)
154
+ ].join("\n")
155
+ end
156
+
157
+ # Determines whether or not a local workstation file exists under a
158
+ # Chef-related directory.
159
+ #
160
+ # @return [truthy,falsey] whether or not a given file is some kind of
161
+ # Chef-related file
162
+ # @api private
163
+ def chef_data_dir?(base, file)
164
+ file =~ %r{^#{base}/(data|data_bags|environments|nodes|roles)/}
165
+ end
166
+
167
+ # Returns arguments to a `gem install` command, suitable to install the
168
+ # Busser gem.
169
+ #
170
+ # @return [String] arguments string
171
+ # @api private
172
+ def gem_install_args
173
+ gem, version = config[:version].split("@")
174
+ gem, version = "busser", gem if gem =~ /^\d+\.\d+\.\d+/
175
+
176
+ root = config[:root_path]
177
+ gem_bin = remote_path_join(root, "bin")
178
+
179
+ # We don't want the gems to be installed in the home directory,
180
+ # this will force the bindir and the gem install location both
181
+ # to be under /tmp/verifier
182
+ args = gem
183
+ args += " --version #{version}" if version
184
+ args += " --no-rdoc --no-ri --no-format-executable -n #{gem_bin}"
185
+ args += " --no-user-install"
186
+ args
187
+ end
188
+
189
+ # Returns an Array of common helper filenames currently residing on the
190
+ # local workstation.
191
+ #
192
+ # @return [Array<String>] array of helper files
193
+ # @api private
194
+ def helper_files
195
+ glob = File.join(config[:test_base_path], "helpers", "*/**/*")
196
+ Dir.glob(glob).reject { |f| File.directory?(f) }
197
+ end
198
+
199
+ def install_command_vars
200
+ ruby = remote_path_join(config[:ruby_bindir], "ruby").
201
+ tap { |path| path.concat(".exe") if windows_os? }
202
+ gem = remote_path_join(config[:ruby_bindir], "gem")
203
+
204
+ [
205
+ busser_env,
206
+ shell_var("ruby", ruby),
207
+ shell_var("gem", gem),
208
+ shell_var("version", config[:version]),
209
+ shell_var("gem_install_args", gem_install_args),
210
+ shell_var("busser", sudo(config[:busser_bin])),
211
+ shell_var("plugins", plugins.join(" "))
212
+ ].join("\n")
213
+ end
214
+
215
+ # Returns an Array of test suite filenames for the related suite currently
216
+ # residing on the local workstation. Any special provisioner-specific
217
+ # directories (such as a Chef roles/ directory) are excluded.
218
+ #
219
+ # @return [Array<String>] array of suite files
220
+ # @api private
221
+ def local_suite_files
222
+ base = File.join(config[:test_base_path], config[:suite_name])
223
+ glob = File.join(base, "*/**/*")
224
+ Dir.glob(glob).reject do |f|
225
+ chef_data_dir?(base, f) || File.directory?(f)
226
+ end
227
+ end
228
+
229
+ # Returns a uniquely sorted Array of Busser plugin gems that need to
230
+ # be installed for the related suite.
231
+ #
232
+ # @return [Array<String>] a lexically sorted, unique item array of Busser
233
+ # plugin gem names
234
+ # @api private
235
+ def plugins
236
+ non_suite_dirs = %w[data data_bags environments nodes roles]
237
+ glob = File.join(config[:test_base_path], config[:suite_name], "*")
238
+ Dir.glob(glob).reject { |d|
239
+ !File.directory?(d) || non_suite_dirs.include?(File.basename(d))
240
+ }.map { |d| "busser-#{File.basename(d)}" }.sort.uniq
241
+ end
242
+
243
+ # Copies all common testing helper files into the suites directory in
244
+ # the sandbox.
245
+ #
246
+ # @api private
247
+ def prepare_helpers
248
+ base = File.join(config[:test_base_path], "helpers")
249
+
250
+ helper_files.each do |src|
251
+ dest = File.join(sandbox_suites_dir, src.sub("#{base}/", ""))
252
+ FileUtils.mkdir_p(File.dirname(dest))
253
+ FileUtils.cp(src, dest, :preserve => true)
254
+ end
255
+ end
256
+
257
+ # Copies all test suite files into the suites directory in the sandbox.
258
+ #
259
+ # @api private
260
+ def prepare_suites
261
+ base = File.join(config[:test_base_path], config[:suite_name])
262
+
263
+ local_suite_files.each do |src|
264
+ dest = File.join(sandbox_suites_dir, src.sub("#{base}/", ""))
265
+ FileUtils.mkdir_p(File.dirname(dest))
266
+ FileUtils.cp(src, dest, :preserve => true)
267
+ end
268
+ end
269
+
270
+ # @return [String] path to suites directory under sandbox path
271
+ # @api private
272
+ def sandbox_suites_dir
273
+ File.join(sandbox_path, "suites")
274
+ end
275
+ end
276
+ end
277
+ end