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