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,408 +1,408 @@
1
- # -*- encoding: utf-8 -*-
2
- #
3
- # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
4
- #
5
- # Copyright (C) 2012, 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/logging"
23
- require "kitchen/collection"
24
- require "kitchen/config"
25
- require "kitchen/driver"
26
- require "kitchen/instance"
27
- require "kitchen/platform"
28
- require "kitchen/provisioner"
29
- require "kitchen/suite"
30
- require "kitchen/transport"
31
- require "kitchen/util"
32
- require "kitchen/verifier"
33
-
34
- module Kitchen
35
-
36
- class DummyLoader
37
-
38
- attr_writer :data
39
-
40
- def read
41
- @data || Hash.new
42
- end
43
- end
44
- end
45
-
46
- describe Kitchen::Config do
47
-
48
- let(:loader) { Kitchen::DummyLoader.new }
49
- let(:config) { Kitchen::Config.new(opts) }
50
-
51
- let(:opts) do
52
- {
53
- :loader => loader,
54
- :kitchen_root => "/tmp/that/place",
55
- :log_root => "/tmp/logs",
56
- :test_base_path => "/testing/yo",
57
- :log_level => :debug,
58
- :log_overwrite => false
59
- }
60
- end
61
-
62
- let(:default_kitchen_config) do
63
- {
64
- :defaults => {
65
- :driver => "dummy",
66
- :provisioner => "chef_solo",
67
- :transport => "ssh",
68
- :verifier => "busser"
69
- },
70
- :kitchen_root => "/tmp/that/place",
71
- :test_base_path => "/testing/yo",
72
- :log_level => :debug,
73
- :log_overwrite => false
74
- }
75
- end
76
-
77
- describe "#loader" do
78
-
79
- it "returns its loader" do
80
- config.loader.must_equal loader
81
- end
82
-
83
- it "creates a Kitchen::Loader::YAML loader by default" do
84
- opts.delete(:loader)
85
-
86
- config.loader.must_be_kind_of Kitchen::Loader::YAML
87
- end
88
- end
89
-
90
- describe "#kitchen_root" do
91
-
92
- it "returns its kitchen root" do
93
- config.kitchen_root.must_equal "/tmp/that/place"
94
- end
95
-
96
- it "uses Dir.pwd by default" do
97
- opts.delete(:kitchen_root)
98
-
99
- config.kitchen_root.must_equal Dir.pwd
100
- end
101
- end
102
-
103
- describe "#log_root" do
104
-
105
- it "returns its log root" do
106
- config.log_root.must_equal "/tmp/logs"
107
- end
108
-
109
- it "calculates a default log root using kitchen_root" do
110
- opts.delete(:log_root)
111
-
112
- config.log_root.must_equal "/tmp/that/place/.kitchen/logs"
113
- end
114
- end
115
-
116
- describe "#test_base_path" do
117
-
118
- it "returns its base test path" do
119
- config.test_base_path.must_equal "/testing/yo"
120
- end
121
-
122
- it "calculates a default base using kitchen_root" do
123
- opts.delete(:test_base_path)
124
-
125
- config.test_base_path.must_equal "/tmp/that/place/test/integration"
126
- end
127
- end
128
-
129
- describe "#log_level" do
130
-
131
- it "returns its log level" do
132
- config.log_level.must_equal :debug
133
- end
134
-
135
- it "uses :info by default" do
136
- opts.delete(:log_level)
137
-
138
- config.log_level.must_equal :info
139
- end
140
- end
141
-
142
- describe "#log_overwrite" do
143
-
144
- it "returns its log level" do
145
- config.log_overwrite.must_equal false
146
- end
147
-
148
- it "uses :info by default" do
149
- opts.delete(:log_overwrite)
150
-
151
- config.log_overwrite.must_equal true
152
- end
153
- end
154
-
155
- describe "#platforms" do
156
-
157
- before do
158
- Kitchen::DataMunger.stubs(:new).returns(munger)
159
- Kitchen::Platform.stubs(:new).returns("platform")
160
- end
161
-
162
- let(:munger) do
163
- stub(
164
- :platform_data => [{ :one => "a" }, { :two => "b" }]
165
- )
166
- end
167
-
168
- it "loader loads data" do
169
- loader.expects(:read).returns(Hash.new)
170
-
171
- config.platforms
172
- end
173
-
174
- it "constructs a munger with loader data and defaults" do
175
- loader.stubs(:read).returns("datum")
176
-
177
- Kitchen::DataMunger.expects(:new).with { |data, kitchen_config|
178
- data.must_equal "datum"
179
- kitchen_config.is_a?(Hash).must_equal true
180
- }.returns(munger)
181
-
182
- config.platforms
183
- end
184
-
185
- it "platform_data is called on munger" do
186
- munger.expects(:platform_data).returns([])
187
-
188
- config.platforms
189
- end
190
-
191
- it "contructs Platform objects" do
192
- Kitchen::Platform.expects(:new).with(:one => "a")
193
- Kitchen::Platform.expects(:new).with(:two => "b")
194
-
195
- config.platforms
196
- end
197
-
198
- it "returns a Collection of platforms" do
199
- Kitchen::Platform.stubs(:new).
200
- with(:one => "a").returns(stub(:name => "one"))
201
- Kitchen::Platform.stubs(:new).
202
- with(:two => "b").returns(stub(:name => "two"))
203
-
204
- config.platforms.as_names.must_equal %w[one two]
205
- end
206
- end
207
-
208
- describe "#suites" do
209
-
210
- before do
211
- Kitchen::DataMunger.stubs(:new).returns(munger)
212
- Kitchen::Suite.stubs(:new).returns("suite")
213
- end
214
-
215
- let(:munger) do
216
- stub(
217
- :suite_data => [{ :one => "a" }, { :two => "b" }]
218
- )
219
- end
220
-
221
- it "loader loads data" do
222
- loader.expects(:read).returns(Hash.new)
223
-
224
- config.suites
225
- end
226
-
227
- it "constucts a munger with loader data and defaults" do
228
- loader.stubs(:read).returns("datum")
229
-
230
- Kitchen::DataMunger.expects(:new).with { |data, kitchen_config|
231
- data.must_equal "datum"
232
- kitchen_config.is_a?(Hash).must_equal true
233
- }.returns(munger)
234
-
235
- config.suites
236
- end
237
-
238
- it "platform_data is called on munger" do
239
- munger.expects(:suite_data).returns([])
240
-
241
- config.suites
242
- end
243
-
244
- it "contructs Suite objects" do
245
- Kitchen::Suite.expects(:new).with(:one => "a")
246
- Kitchen::Suite.expects(:new).with(:two => "b")
247
-
248
- config.suites
249
- end
250
-
251
- it "returns a Collection of suites" do
252
- Kitchen::Suite.stubs(:new).
253
- with(:one => "a").returns(stub(:name => "one"))
254
- Kitchen::Suite.stubs(:new).
255
- with(:two => "b").returns(stub(:name => "two"))
256
-
257
- config.suites.as_names.must_equal %w[one two]
258
- end
259
- end
260
-
261
- describe "#instances" do
262
-
263
- let(:platforms) do
264
- [stub(:name => "unax")]
265
- end
266
-
267
- let(:suites) do
268
- [stub(:name => "tiny", :includes => [], :excludes => [])]
269
- end
270
-
271
- let(:munger) do
272
- stub(
273
- :driver_data_for => { "junk" => true },
274
- :provisioner_data_for => { "junk" => true },
275
- :transport_data_for => { "junk" => true },
276
- :verifier_data_for => { "junk" => true }
277
- )
278
- end
279
-
280
- before do
281
- Kitchen::Instance.stubs(:new).returns("instance")
282
- Kitchen::Driver.stubs(:for_plugin).returns("driver")
283
- Kitchen::Provisioner.stubs(:for_plugin).returns("provisioner")
284
- Kitchen::Transport.stubs(:for_plugin).returns("transport")
285
- Kitchen::Verifier.stubs(:for_plugin).returns("verifier")
286
- Kitchen::Logger.stubs(:new).returns("logger")
287
- Kitchen::StateFile.stubs(:new).returns("state_file")
288
-
289
- Kitchen::DataMunger.stubs(:new).returns(munger)
290
- config.stubs(:platforms).returns(platforms)
291
- config.stubs(:suites).returns(suites)
292
- end
293
-
294
- it "constructs a Driver object" do
295
- munger.expects(:driver_data_for).with("tiny", "unax").
296
- returns(:name => "drivey", :datum => "lots")
297
- Kitchen::Driver.unstub(:for_plugin)
298
- Kitchen::Driver.expects(:for_plugin).
299
- with("drivey", :name => "drivey", :datum => "lots")
300
-
301
- config.instances
302
- end
303
-
304
- it "constructs a Provisioner object" do
305
- munger.expects(:provisioner_data_for).with("tiny", "unax").
306
- returns(:name => "provey", :datum => "lots")
307
- Kitchen::Provisioner.unstub(:for_plugin)
308
- Kitchen::Provisioner.expects(:for_plugin).
309
- with("provey", :name => "provey", :datum => "lots")
310
-
311
- config.instances
312
- end
313
-
314
- it "constructs a Transport object" do
315
- munger.expects(:transport_data_for).with("tiny", "unax").
316
- returns(:name => "transey", :datum => "lots")
317
- Kitchen::Transport.unstub(:for_plugin)
318
- Kitchen::Transport.expects(:for_plugin).
319
- with("transey", :name => "transey", :datum => "lots")
320
-
321
- config.instances
322
- end
323
-
324
- it "constructs a Verifier object" do
325
- munger.expects(:verifier_data_for).with("tiny", "unax").
326
- returns(:name => "vervey", :datum => "lots")
327
- Kitchen::Verifier.unstub(:for_plugin)
328
- Kitchen::Verifier.expects(:for_plugin).
329
- with("vervey", :name => "vervey", :datum => "lots")
330
-
331
- config.instances
332
- end
333
-
334
- it "constructs a Logger object" do
335
- Kitchen::Logger.unstub(:new)
336
- Kitchen::Logger.expects(:new).with(
337
- :stdout => STDOUT,
338
- :color => :cyan,
339
- :logdev => "/tmp/logs/tiny-unax.log",
340
- :log_overwrite => false,
341
- :level => 0,
342
- :progname => "tiny-unax"
343
- )
344
-
345
- config.instances
346
- end
347
-
348
- it "constructs a StateFile object" do
349
- Kitchen::StateFile.unstub(:new)
350
- Kitchen::StateFile.expects(:new).with("/tmp/that/place", "tiny-unax")
351
-
352
- config.instances
353
- end
354
-
355
- it "constructs an Instance object from all built objects" do
356
- Kitchen::Instance.unstub(:new)
357
-
358
- Kitchen::Instance.expects(:new).with(
359
- :driver => "driver",
360
- :logger => "logger",
361
- :suite => suites.first,
362
- :platform => platforms.first,
363
- :provisioner => "provisioner",
364
- :transport => "transport",
365
- :verifier => "verifier",
366
- :state_file => "state_file"
367
- )
368
-
369
- config.instances
370
- end
371
- end
372
-
373
- describe "using Suite#includes" do
374
-
375
- it "selects only platforms in a suite's includes array" do
376
- config.stubs(:platforms).returns([
377
- stub(:name => "good"),
378
- stub(:name => "nope"),
379
- stub(:name => "one")
380
- ])
381
- config.stubs(:suites).returns([
382
- stub(:name => "selecta", :includes => %w[good one], :excludes => []),
383
- stub(:name => "allem", :includes => [], :excludes => [])
384
- ])
385
-
386
- config.instances.as_names.must_equal [
387
- "selecta-good", "selecta-one", "allem-good", "allem-nope", "allem-one"]
388
- end
389
- end
390
-
391
- describe "using Suite#excludes" do
392
-
393
- it "selects only platforms in a suite's includes array" do
394
- config.stubs(:platforms).returns([
395
- stub(:name => "good"),
396
- stub(:name => "nope"),
397
- stub(:name => "one")
398
- ])
399
- config.stubs(:suites).returns([
400
- stub(:name => "selecta", :includes => [], :excludes => ["nope"]),
401
- stub(:name => "allem", :includes => [], :excludes => [])
402
- ])
403
-
404
- config.instances.as_names.must_equal [
405
- "selecta-good", "selecta-one", "allem-good", "allem-nope", "allem-one"]
406
- end
407
- end
408
- end
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
4
+ #
5
+ # Copyright (C) 2012, 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/logging"
23
+ require "kitchen/collection"
24
+ require "kitchen/config"
25
+ require "kitchen/driver"
26
+ require "kitchen/instance"
27
+ require "kitchen/platform"
28
+ require "kitchen/provisioner"
29
+ require "kitchen/suite"
30
+ require "kitchen/transport"
31
+ require "kitchen/util"
32
+ require "kitchen/verifier"
33
+
34
+ module Kitchen
35
+
36
+ class DummyLoader
37
+
38
+ attr_writer :data
39
+
40
+ def read
41
+ @data || Hash.new
42
+ end
43
+ end
44
+ end
45
+
46
+ describe Kitchen::Config do
47
+
48
+ let(:loader) { Kitchen::DummyLoader.new }
49
+ let(:config) { Kitchen::Config.new(opts) }
50
+
51
+ let(:opts) do
52
+ {
53
+ :loader => loader,
54
+ :kitchen_root => "/tmp/that/place",
55
+ :log_root => "/tmp/logs",
56
+ :test_base_path => "/testing/yo",
57
+ :log_level => :debug,
58
+ :log_overwrite => false
59
+ }
60
+ end
61
+
62
+ let(:default_kitchen_config) do
63
+ {
64
+ :defaults => {
65
+ :driver => "dummy",
66
+ :provisioner => "chef_solo",
67
+ :transport => "ssh",
68
+ :verifier => "busser"
69
+ },
70
+ :kitchen_root => "/tmp/that/place",
71
+ :test_base_path => "/testing/yo",
72
+ :log_level => :debug,
73
+ :log_overwrite => false
74
+ }
75
+ end
76
+
77
+ describe "#loader" do
78
+
79
+ it "returns its loader" do
80
+ config.loader.must_equal loader
81
+ end
82
+
83
+ it "creates a Kitchen::Loader::YAML loader by default" do
84
+ opts.delete(:loader)
85
+
86
+ config.loader.must_be_kind_of Kitchen::Loader::YAML
87
+ end
88
+ end
89
+
90
+ describe "#kitchen_root" do
91
+
92
+ it "returns its kitchen root" do
93
+ config.kitchen_root.must_equal "/tmp/that/place"
94
+ end
95
+
96
+ it "uses Dir.pwd by default" do
97
+ opts.delete(:kitchen_root)
98
+
99
+ config.kitchen_root.must_equal Dir.pwd
100
+ end
101
+ end
102
+
103
+ describe "#log_root" do
104
+
105
+ it "returns its log root" do
106
+ config.log_root.must_equal "/tmp/logs"
107
+ end
108
+
109
+ it "calculates a default log root using kitchen_root" do
110
+ opts.delete(:log_root)
111
+
112
+ config.log_root.must_equal "/tmp/that/place/.kitchen/logs"
113
+ end
114
+ end
115
+
116
+ describe "#test_base_path" do
117
+
118
+ it "returns its base test path" do
119
+ config.test_base_path.must_equal "/testing/yo"
120
+ end
121
+
122
+ it "calculates a default base using kitchen_root" do
123
+ opts.delete(:test_base_path)
124
+
125
+ config.test_base_path.must_equal "/tmp/that/place/test/integration"
126
+ end
127
+ end
128
+
129
+ describe "#log_level" do
130
+
131
+ it "returns its log level" do
132
+ config.log_level.must_equal :debug
133
+ end
134
+
135
+ it "uses :info by default" do
136
+ opts.delete(:log_level)
137
+
138
+ config.log_level.must_equal :info
139
+ end
140
+ end
141
+
142
+ describe "#log_overwrite" do
143
+
144
+ it "returns its log level" do
145
+ config.log_overwrite.must_equal false
146
+ end
147
+
148
+ it "uses :info by default" do
149
+ opts.delete(:log_overwrite)
150
+
151
+ config.log_overwrite.must_equal true
152
+ end
153
+ end
154
+
155
+ describe "#platforms" do
156
+
157
+ before do
158
+ Kitchen::DataMunger.stubs(:new).returns(munger)
159
+ Kitchen::Platform.stubs(:new).returns("platform")
160
+ end
161
+
162
+ let(:munger) do
163
+ stub(
164
+ :platform_data => [{ :one => "a" }, { :two => "b" }]
165
+ )
166
+ end
167
+
168
+ it "loader loads data" do
169
+ loader.expects(:read).returns(Hash.new)
170
+
171
+ config.platforms
172
+ end
173
+
174
+ it "constructs a munger with loader data and defaults" do
175
+ loader.stubs(:read).returns("datum")
176
+
177
+ Kitchen::DataMunger.expects(:new).with { |data, kitchen_config|
178
+ data.must_equal "datum"
179
+ kitchen_config.is_a?(Hash).must_equal true
180
+ }.returns(munger)
181
+
182
+ config.platforms
183
+ end
184
+
185
+ it "platform_data is called on munger" do
186
+ munger.expects(:platform_data).returns([])
187
+
188
+ config.platforms
189
+ end
190
+
191
+ it "contructs Platform objects" do
192
+ Kitchen::Platform.expects(:new).with(:one => "a")
193
+ Kitchen::Platform.expects(:new).with(:two => "b")
194
+
195
+ config.platforms
196
+ end
197
+
198
+ it "returns a Collection of platforms" do
199
+ Kitchen::Platform.stubs(:new).
200
+ with(:one => "a").returns(stub(:name => "one"))
201
+ Kitchen::Platform.stubs(:new).
202
+ with(:two => "b").returns(stub(:name => "two"))
203
+
204
+ config.platforms.as_names.must_equal %w[one two]
205
+ end
206
+ end
207
+
208
+ describe "#suites" do
209
+
210
+ before do
211
+ Kitchen::DataMunger.stubs(:new).returns(munger)
212
+ Kitchen::Suite.stubs(:new).returns("suite")
213
+ end
214
+
215
+ let(:munger) do
216
+ stub(
217
+ :suite_data => [{ :one => "a" }, { :two => "b" }]
218
+ )
219
+ end
220
+
221
+ it "loader loads data" do
222
+ loader.expects(:read).returns(Hash.new)
223
+
224
+ config.suites
225
+ end
226
+
227
+ it "constucts a munger with loader data and defaults" do
228
+ loader.stubs(:read).returns("datum")
229
+
230
+ Kitchen::DataMunger.expects(:new).with { |data, kitchen_config|
231
+ data.must_equal "datum"
232
+ kitchen_config.is_a?(Hash).must_equal true
233
+ }.returns(munger)
234
+
235
+ config.suites
236
+ end
237
+
238
+ it "platform_data is called on munger" do
239
+ munger.expects(:suite_data).returns([])
240
+
241
+ config.suites
242
+ end
243
+
244
+ it "contructs Suite objects" do
245
+ Kitchen::Suite.expects(:new).with(:one => "a")
246
+ Kitchen::Suite.expects(:new).with(:two => "b")
247
+
248
+ config.suites
249
+ end
250
+
251
+ it "returns a Collection of suites" do
252
+ Kitchen::Suite.stubs(:new).
253
+ with(:one => "a").returns(stub(:name => "one"))
254
+ Kitchen::Suite.stubs(:new).
255
+ with(:two => "b").returns(stub(:name => "two"))
256
+
257
+ config.suites.as_names.must_equal %w[one two]
258
+ end
259
+ end
260
+
261
+ describe "#instances" do
262
+
263
+ let(:platforms) do
264
+ [stub(:name => "unax")]
265
+ end
266
+
267
+ let(:suites) do
268
+ [stub(:name => "tiny", :includes => [], :excludes => [])]
269
+ end
270
+
271
+ let(:munger) do
272
+ stub(
273
+ :driver_data_for => { "junk" => true },
274
+ :provisioner_data_for => { "junk" => true },
275
+ :transport_data_for => { "junk" => true },
276
+ :verifier_data_for => { "junk" => true }
277
+ )
278
+ end
279
+
280
+ before do
281
+ Kitchen::Instance.stubs(:new).returns("instance")
282
+ Kitchen::Driver.stubs(:for_plugin).returns("driver")
283
+ Kitchen::Provisioner.stubs(:for_plugin).returns("provisioner")
284
+ Kitchen::Transport.stubs(:for_plugin).returns("transport")
285
+ Kitchen::Verifier.stubs(:for_plugin).returns("verifier")
286
+ Kitchen::Logger.stubs(:new).returns("logger")
287
+ Kitchen::StateFile.stubs(:new).returns("state_file")
288
+
289
+ Kitchen::DataMunger.stubs(:new).returns(munger)
290
+ config.stubs(:platforms).returns(platforms)
291
+ config.stubs(:suites).returns(suites)
292
+ end
293
+
294
+ it "constructs a Driver object" do
295
+ munger.expects(:driver_data_for).with("tiny", "unax").
296
+ returns(:name => "drivey", :datum => "lots")
297
+ Kitchen::Driver.unstub(:for_plugin)
298
+ Kitchen::Driver.expects(:for_plugin).
299
+ with("drivey", :name => "drivey", :datum => "lots")
300
+
301
+ config.instances
302
+ end
303
+
304
+ it "constructs a Provisioner object" do
305
+ munger.expects(:provisioner_data_for).with("tiny", "unax").
306
+ returns(:name => "provey", :datum => "lots")
307
+ Kitchen::Provisioner.unstub(:for_plugin)
308
+ Kitchen::Provisioner.expects(:for_plugin).
309
+ with("provey", :name => "provey", :datum => "lots")
310
+
311
+ config.instances
312
+ end
313
+
314
+ it "constructs a Transport object" do
315
+ munger.expects(:transport_data_for).with("tiny", "unax").
316
+ returns(:name => "transey", :datum => "lots")
317
+ Kitchen::Transport.unstub(:for_plugin)
318
+ Kitchen::Transport.expects(:for_plugin).
319
+ with("transey", :name => "transey", :datum => "lots")
320
+
321
+ config.instances
322
+ end
323
+
324
+ it "constructs a Verifier object" do
325
+ munger.expects(:verifier_data_for).with("tiny", "unax").
326
+ returns(:name => "vervey", :datum => "lots")
327
+ Kitchen::Verifier.unstub(:for_plugin)
328
+ Kitchen::Verifier.expects(:for_plugin).
329
+ with("vervey", :name => "vervey", :datum => "lots")
330
+
331
+ config.instances
332
+ end
333
+
334
+ it "constructs a Logger object" do
335
+ Kitchen::Logger.unstub(:new)
336
+ Kitchen::Logger.expects(:new).with(
337
+ :stdout => STDOUT,
338
+ :color => :cyan,
339
+ :logdev => "/tmp/logs/tiny-unax.log",
340
+ :log_overwrite => false,
341
+ :level => 0,
342
+ :progname => "tiny-unax"
343
+ )
344
+
345
+ config.instances
346
+ end
347
+
348
+ it "constructs a StateFile object" do
349
+ Kitchen::StateFile.unstub(:new)
350
+ Kitchen::StateFile.expects(:new).with("/tmp/that/place", "tiny-unax")
351
+
352
+ config.instances
353
+ end
354
+
355
+ it "constructs an Instance object from all built objects" do
356
+ Kitchen::Instance.unstub(:new)
357
+
358
+ Kitchen::Instance.expects(:new).with(
359
+ :driver => "driver",
360
+ :logger => "logger",
361
+ :suite => suites.first,
362
+ :platform => platforms.first,
363
+ :provisioner => "provisioner",
364
+ :transport => "transport",
365
+ :verifier => "verifier",
366
+ :state_file => "state_file"
367
+ )
368
+
369
+ config.instances
370
+ end
371
+ end
372
+
373
+ describe "using Suite#includes" do
374
+
375
+ it "selects only platforms in a suite's includes array" do
376
+ config.stubs(:platforms).returns([
377
+ stub(:name => "good"),
378
+ stub(:name => "nope"),
379
+ stub(:name => "one")
380
+ ])
381
+ config.stubs(:suites).returns([
382
+ stub(:name => "selecta", :includes => %w[good one], :excludes => []),
383
+ stub(:name => "allem", :includes => [], :excludes => [])
384
+ ])
385
+
386
+ config.instances.as_names.must_equal [
387
+ "selecta-good", "selecta-one", "allem-good", "allem-nope", "allem-one"]
388
+ end
389
+ end
390
+
391
+ describe "using Suite#excludes" do
392
+
393
+ it "selects only platforms in a suite's includes array" do
394
+ config.stubs(:platforms).returns([
395
+ stub(:name => "good"),
396
+ stub(:name => "nope"),
397
+ stub(:name => "one")
398
+ ])
399
+ config.stubs(:suites).returns([
400
+ stub(:name => "selecta", :includes => [], :excludes => ["nope"]),
401
+ stub(:name => "allem", :includes => [], :excludes => [])
402
+ ])
403
+
404
+ config.instances.as_names.must_equal [
405
+ "selecta-good", "selecta-one", "allem-good", "allem-nope", "allem-one"]
406
+ end
407
+ end
408
+ end