test-kitchen 1.7.0 → 1.7.1.dev
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.cane +8 -8
- data/.gitattributes +3 -0
- data/.github/ISSUE_TEMPLATE.md +55 -55
- data/.gitignore +28 -28
- data/.kitchen.ci.yml +23 -23
- data/.kitchen.proxy.yml +27 -27
- data/.rubocop.yml +3 -3
- data/.travis.yml +70 -70
- data/.yardopts +3 -3
- data/Berksfile +3 -3
- data/CHANGELOG.md +1090 -1083
- data/CONTRIBUTING.md +14 -14
- data/Gemfile +19 -19
- data/Gemfile.proxy_tests +4 -4
- data/Guardfile +42 -42
- data/LICENSE +15 -15
- data/MAINTAINERS.md +23 -23
- data/README.md +135 -135
- data/Rakefile +61 -61
- data/appveyor.yml +44 -44
- data/features/kitchen_action_commands.feature +164 -164
- data/features/kitchen_command.feature +16 -16
- data/features/kitchen_console_command.feature +34 -34
- data/features/kitchen_defaults.feature +38 -38
- data/features/kitchen_diagnose_command.feature +96 -96
- data/features/kitchen_driver_create_command.feature +64 -64
- data/features/kitchen_driver_discover_command.feature +25 -25
- data/features/kitchen_help_command.feature +16 -16
- data/features/kitchen_init_command.feature +274 -274
- data/features/kitchen_list_command.feature +104 -104
- data/features/kitchen_login_command.feature +62 -62
- data/features/kitchen_sink_command.feature +30 -30
- data/features/kitchen_test_command.feature +88 -88
- data/features/step_definitions/gem_steps.rb +36 -36
- data/features/step_definitions/git_steps.rb +5 -5
- data/features/step_definitions/output_steps.rb +5 -5
- data/features/support/env.rb +75 -75
- data/lib/kitchen.rb +150 -150
- data/lib/kitchen/base64_stream.rb +55 -55
- data/lib/kitchen/cli.rb +419 -419
- data/lib/kitchen/collection.rb +55 -55
- data/lib/kitchen/color.rb +65 -65
- data/lib/kitchen/command.rb +185 -185
- data/lib/kitchen/command/action.rb +45 -45
- data/lib/kitchen/command/console.rb +58 -58
- data/lib/kitchen/command/diagnose.rb +92 -92
- data/lib/kitchen/command/driver_discover.rb +105 -105
- data/lib/kitchen/command/exec.rb +41 -41
- data/lib/kitchen/command/list.rb +119 -119
- data/lib/kitchen/command/login.rb +43 -43
- data/lib/kitchen/command/sink.rb +54 -54
- data/lib/kitchen/command/test.rb +51 -51
- data/lib/kitchen/config.rb +322 -322
- data/lib/kitchen/configurable.rb +529 -529
- data/lib/kitchen/data_munger.rb +959 -959
- data/lib/kitchen/diagnostic.rb +141 -141
- data/lib/kitchen/driver.rb +56 -56
- data/lib/kitchen/driver/base.rb +134 -134
- data/lib/kitchen/driver/dummy.rb +108 -108
- data/lib/kitchen/driver/proxy.rb +72 -72
- data/lib/kitchen/driver/ssh_base.rb +357 -357
- data/lib/kitchen/errors.rb +229 -229
- data/lib/kitchen/generator/driver_create.rb +177 -177
- data/lib/kitchen/generator/init.rb +296 -296
- data/lib/kitchen/instance.rb +662 -662
- data/lib/kitchen/lazy_hash.rb +142 -142
- data/lib/kitchen/loader/yaml.rb +349 -349
- data/lib/kitchen/logger.rb +423 -423
- data/lib/kitchen/logging.rb +56 -56
- data/lib/kitchen/login_command.rb +52 -52
- data/lib/kitchen/metadata_chopper.rb +52 -52
- data/lib/kitchen/platform.rb +67 -67
- data/lib/kitchen/provisioner.rb +54 -54
- data/lib/kitchen/provisioner/base.rb +236 -236
- data/lib/kitchen/provisioner/chef/berkshelf.rb +114 -114
- data/lib/kitchen/provisioner/chef/common_sandbox.rb +322 -322
- data/lib/kitchen/provisioner/chef/librarian.rb +112 -112
- data/lib/kitchen/provisioner/chef_apply.rb +124 -124
- data/lib/kitchen/provisioner/chef_base.rb +341 -341
- data/lib/kitchen/provisioner/chef_solo.rb +88 -88
- data/lib/kitchen/provisioner/chef_zero.rb +245 -245
- data/lib/kitchen/provisioner/dummy.rb +79 -79
- data/lib/kitchen/provisioner/shell.rb +138 -138
- data/lib/kitchen/rake_tasks.rb +63 -63
- data/lib/kitchen/shell_out.rb +93 -93
- data/lib/kitchen/ssh.rb +276 -276
- data/lib/kitchen/state_file.rb +120 -120
- data/lib/kitchen/suite.rb +51 -51
- data/lib/kitchen/thor_tasks.rb +66 -66
- data/lib/kitchen/transport.rb +54 -54
- data/lib/kitchen/transport/base.rb +176 -176
- data/lib/kitchen/transport/dummy.rb +79 -79
- data/lib/kitchen/transport/ssh.rb +364 -364
- data/lib/kitchen/transport/winrm.rb +486 -486
- data/lib/kitchen/util.rb +147 -147
- data/lib/kitchen/verifier.rb +55 -55
- data/lib/kitchen/verifier/base.rb +235 -235
- data/lib/kitchen/verifier/busser.rb +277 -277
- data/lib/kitchen/verifier/dummy.rb +79 -79
- data/lib/kitchen/verifier/shell.rb +101 -101
- data/lib/kitchen/version.rb +21 -21
- data/lib/vendor/hash_recursive_merge.rb +82 -82
- data/spec/kitchen/base64_stream_spec.rb +77 -77
- data/spec/kitchen/cli_spec.rb +56 -56
- data/spec/kitchen/collection_spec.rb +80 -80
- data/spec/kitchen/color_spec.rb +54 -54
- data/spec/kitchen/config_spec.rb +408 -408
- data/spec/kitchen/configurable_spec.rb +1095 -1095
- data/spec/kitchen/data_munger_spec.rb +2694 -2694
- data/spec/kitchen/diagnostic_spec.rb +129 -129
- data/spec/kitchen/driver/base_spec.rb +121 -121
- data/spec/kitchen/driver/dummy_spec.rb +199 -199
- data/spec/kitchen/driver/proxy_spec.rb +138 -138
- data/spec/kitchen/driver/ssh_base_spec.rb +1115 -1115
- data/spec/kitchen/driver_spec.rb +112 -112
- data/spec/kitchen/errors_spec.rb +309 -309
- data/spec/kitchen/instance_spec.rb +1419 -1419
- data/spec/kitchen/lazy_hash_spec.rb +117 -117
- data/spec/kitchen/loader/yaml_spec.rb +774 -774
- data/spec/kitchen/logger_spec.rb +429 -429
- data/spec/kitchen/logging_spec.rb +59 -59
- data/spec/kitchen/login_command_spec.rb +68 -68
- data/spec/kitchen/metadata_chopper_spec.rb +82 -82
- data/spec/kitchen/platform_spec.rb +89 -89
- data/spec/kitchen/provisioner/base_spec.rb +386 -386
- data/spec/kitchen/provisioner/chef_apply_spec.rb +136 -136
- data/spec/kitchen/provisioner/chef_base_spec.rb +1161 -1161
- data/spec/kitchen/provisioner/chef_solo_spec.rb +557 -557
- data/spec/kitchen/provisioner/chef_zero_spec.rb +1001 -1001
- data/spec/kitchen/provisioner/dummy_spec.rb +99 -99
- data/spec/kitchen/provisioner/shell_spec.rb +566 -566
- data/spec/kitchen/provisioner_spec.rb +107 -107
- data/spec/kitchen/shell_out_spec.rb +150 -150
- data/spec/kitchen/ssh_spec.rb +693 -693
- data/spec/kitchen/state_file_spec.rb +129 -129
- data/spec/kitchen/suite_spec.rb +62 -62
- data/spec/kitchen/transport/base_spec.rb +89 -89
- data/spec/kitchen/transport/ssh_spec.rb +1255 -1255
- data/spec/kitchen/transport/winrm_spec.rb +1143 -1143
- data/spec/kitchen/transport_spec.rb +112 -112
- data/spec/kitchen/util_spec.rb +165 -165
- data/spec/kitchen/verifier/base_spec.rb +362 -362
- data/spec/kitchen/verifier/busser_spec.rb +610 -610
- data/spec/kitchen/verifier/dummy_spec.rb +99 -99
- data/spec/kitchen/verifier/shell_spec.rb +160 -160
- data/spec/kitchen/verifier_spec.rb +120 -120
- data/spec/kitchen_spec.rb +114 -114
- data/spec/spec_helper.rb +85 -85
- data/spec/support/powershell_max_size_spec.rb +40 -40
- data/support/busser_install_command.ps1 +14 -14
- data/support/busser_install_command.sh +14 -14
- data/support/chef-client-zero.rb +77 -77
- data/support/chef_base_init_command.ps1 +18 -18
- data/support/chef_base_init_command.sh +2 -2
- data/support/chef_base_install_command.ps1 +85 -85
- data/support/chef_base_install_command.sh +229 -229
- data/support/chef_zero_prepare_command_legacy.ps1 +9 -9
- data/support/chef_zero_prepare_command_legacy.sh +10 -10
- data/support/download_helpers.sh +109 -109
- data/support/dummy-validation.pem +27 -27
- data/templates/driver/CHANGELOG.md.erb +3 -3
- data/templates/driver/Gemfile.erb +3 -3
- data/templates/driver/README.md.erb +64 -64
- data/templates/driver/Rakefile.erb +21 -21
- data/templates/driver/driver.rb.erb +23 -23
- data/templates/driver/gemspec.erb +29 -29
- data/templates/driver/gitignore.erb +17 -17
- data/templates/driver/license_apachev2.erb +15 -15
- data/templates/driver/license_lgplv3.erb +16 -16
- data/templates/driver/license_mit.erb +22 -22
- data/templates/driver/license_reserved.erb +5 -5
- data/templates/driver/tailor.erb +4 -4
- data/templates/driver/travis.yml.erb +11 -11
- data/templates/driver/version.rb.erb +12 -12
- data/templates/init/chefignore.erb +1 -1
- data/templates/init/kitchen.yml.erb +18 -18
- data/test-kitchen.gemspec +62 -62
- data/test/integration/default/default_spec.rb +3 -3
- data/testing_windows.md +37 -37
- metadata +5 -4
|
@@ -1,362 +1,362 @@
|
|
|
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
|
-
require_relative "../ssh_spec"
|
|
21
|
-
|
|
22
|
-
require "logger"
|
|
23
|
-
require "stringio"
|
|
24
|
-
|
|
25
|
-
require "kitchen/verifier/base"
|
|
26
|
-
require "kitchen/transport/base"
|
|
27
|
-
|
|
28
|
-
module Kitchen
|
|
29
|
-
|
|
30
|
-
module Verifier
|
|
31
|
-
|
|
32
|
-
class TestingDummy < Kitchen::Verifier::Base
|
|
33
|
-
|
|
34
|
-
attr_reader :called_create_sandbox, :called_cleanup_sandbox
|
|
35
|
-
|
|
36
|
-
def install_command
|
|
37
|
-
"install"
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def init_command
|
|
41
|
-
"init"
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def prepare_command
|
|
45
|
-
"prepare"
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def run_command
|
|
49
|
-
"run"
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def create_sandbox
|
|
53
|
-
@called_create_sandbox = true
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def cleanup_sandbox
|
|
57
|
-
@called_cleanup_sandbox = true
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
def sandbox_path
|
|
61
|
-
"/tmp/sandbox"
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
describe Kitchen::Verifier::Base do
|
|
68
|
-
|
|
69
|
-
let(:logged_output) { StringIO.new }
|
|
70
|
-
let(:logger) { Logger.new(logged_output) }
|
|
71
|
-
let(:platform) { stub(:os_type => nil, :shell_type => nil) }
|
|
72
|
-
let(:suite) { stub(:name => "germany") }
|
|
73
|
-
let(:config) { Hash.new }
|
|
74
|
-
|
|
75
|
-
let(:transport) do
|
|
76
|
-
t = mock("transport")
|
|
77
|
-
t.responds_like_instance_of(Kitchen::Transport::Base)
|
|
78
|
-
t
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
let(:instance) do
|
|
82
|
-
stub(
|
|
83
|
-
:name => "coolbeans",
|
|
84
|
-
:to_str => "instance",
|
|
85
|
-
:logger => logger,
|
|
86
|
-
:platform => platform,
|
|
87
|
-
:suite => suite,
|
|
88
|
-
:transport => transport
|
|
89
|
-
)
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
let(:verifier) do
|
|
93
|
-
Kitchen::Verifier::Base.new(config).finalize_config!(instance)
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
describe "configuration" do
|
|
97
|
-
|
|
98
|
-
describe "for unix operating systems" do
|
|
99
|
-
|
|
100
|
-
before { platform.stubs(:os_type).returns("unix") }
|
|
101
|
-
|
|
102
|
-
it ":sudo defaults to true" do
|
|
103
|
-
verifier[:sudo].must_equal true
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
it ":sudo_command defaults to sudo -E" do
|
|
107
|
-
verifier[:sudo_command].must_equal "sudo -E"
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
it ":root_path defaults to '/tmp/verifier'" do
|
|
111
|
-
verifier[:root_path].must_equal "/tmp/verifier"
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
describe "for windows operating systems" do
|
|
116
|
-
|
|
117
|
-
before { platform.stubs(:os_type).returns("windows") }
|
|
118
|
-
|
|
119
|
-
it ":sudo defaults to nil" do
|
|
120
|
-
verifier[:sudo].must_equal nil
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
it ":sudo_command defaults to nil" do
|
|
124
|
-
verifier[:sudo_command].must_equal nil
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
it ":root_path defaults to $env:TEMP\\verifier" do
|
|
128
|
-
verifier[:root_path].must_equal "$env:TEMP\\verifier"
|
|
129
|
-
end
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
it ":suite_name defaults to the passed in suite name" do
|
|
133
|
-
verifier[:suite_name].must_equal "germany"
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
it ":http_proxy defaults to nil" do
|
|
137
|
-
verifier[:http_proxy].must_equal nil
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
it ":http_proxys defaults to nil" do
|
|
141
|
-
verifier[:https_proxy].must_equal nil
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
it ":ftp_proxy defaults to nil" do
|
|
145
|
-
verifier[:ftp_proxy].must_equal nil
|
|
146
|
-
end
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
describe "#call" do
|
|
150
|
-
|
|
151
|
-
let(:state) { Hash.new }
|
|
152
|
-
let(:cmd) { verifier.call(state) }
|
|
153
|
-
|
|
154
|
-
let(:connection) do
|
|
155
|
-
c = mock("transport_connection")
|
|
156
|
-
c.responds_like_instance_of(Kitchen::Transport::Base::Connection)
|
|
157
|
-
c
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
let(:verifier) do
|
|
161
|
-
Kitchen::Verifier::TestingDummy.new(config).finalize_config!(instance)
|
|
162
|
-
end
|
|
163
|
-
|
|
164
|
-
before do
|
|
165
|
-
FakeFS.activate!
|
|
166
|
-
FileUtils.mkdir_p(File.join(verifier.sandbox_path, "stuff"))
|
|
167
|
-
transport.stubs(:connection).yields(connection)
|
|
168
|
-
connection.stubs(:execute)
|
|
169
|
-
connection.stubs(:upload)
|
|
170
|
-
end
|
|
171
|
-
|
|
172
|
-
after do
|
|
173
|
-
FakeFS.deactivate!
|
|
174
|
-
FakeFS::FileSystem.clear
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
it "creates the sandbox" do
|
|
178
|
-
verifier.expects(:create_sandbox)
|
|
179
|
-
|
|
180
|
-
cmd
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
it "ensures that the sandbox is cleanup up" do
|
|
184
|
-
transport.stubs(:connection).raises
|
|
185
|
-
verifier.expects(:cleanup_sandbox)
|
|
186
|
-
|
|
187
|
-
begin
|
|
188
|
-
cmd
|
|
189
|
-
rescue # rubocop:disable Lint/HandleExceptions
|
|
190
|
-
end
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
it "yields a connection given the state" do
|
|
194
|
-
state[:a] = "b"
|
|
195
|
-
transport.expects(:connection).with(state).yields(connection)
|
|
196
|
-
|
|
197
|
-
cmd
|
|
198
|
-
end
|
|
199
|
-
|
|
200
|
-
it "invokes the verifier commands over the transport" do
|
|
201
|
-
order = sequence("order")
|
|
202
|
-
connection.expects(:execute).with("install").in_sequence(order)
|
|
203
|
-
connection.expects(:execute).with("init").in_sequence(order)
|
|
204
|
-
connection.expects(:execute).with("prepare").in_sequence(order)
|
|
205
|
-
connection.expects(:execute).with("run").in_sequence(order)
|
|
206
|
-
|
|
207
|
-
cmd
|
|
208
|
-
end
|
|
209
|
-
|
|
210
|
-
it "logs to info" do
|
|
211
|
-
cmd
|
|
212
|
-
|
|
213
|
-
logged_output.string.
|
|
214
|
-
must_match(/INFO -- : Transferring files to instance$/)
|
|
215
|
-
end
|
|
216
|
-
|
|
217
|
-
it "uploads sandbox files" do
|
|
218
|
-
connection.expects(:upload).with(["/tmp/sandbox/stuff"], "/tmp/verifier")
|
|
219
|
-
|
|
220
|
-
cmd
|
|
221
|
-
end
|
|
222
|
-
|
|
223
|
-
it "logs to debug" do
|
|
224
|
-
cmd
|
|
225
|
-
|
|
226
|
-
logged_output.string.must_match(/DEBUG -- : Transfer complete$/)
|
|
227
|
-
end
|
|
228
|
-
|
|
229
|
-
it "raises an ActionFailed on transfer when TransportFailed is raised" do
|
|
230
|
-
connection.stubs(:upload).
|
|
231
|
-
raises(Kitchen::Transport::TransportFailed.new("dang"))
|
|
232
|
-
|
|
233
|
-
proc { cmd }.must_raise Kitchen::ActionFailed
|
|
234
|
-
end
|
|
235
|
-
|
|
236
|
-
it "raises an ActionFailed on execute when TransportFailed is raised" do
|
|
237
|
-
connection.stubs(:execute).
|
|
238
|
-
raises(Kitchen::Transport::TransportFailed.new("dang"))
|
|
239
|
-
|
|
240
|
-
proc { cmd }.must_raise Kitchen::ActionFailed
|
|
241
|
-
end
|
|
242
|
-
end
|
|
243
|
-
|
|
244
|
-
[:init_command, :install_command, :prepare_command, :run_command].each do |cmd|
|
|
245
|
-
|
|
246
|
-
it "has a #{cmd} method" do
|
|
247
|
-
verifier.public_send(cmd).must_be_nil
|
|
248
|
-
end
|
|
249
|
-
end
|
|
250
|
-
|
|
251
|
-
describe "sandbox" do
|
|
252
|
-
|
|
253
|
-
after do
|
|
254
|
-
begin
|
|
255
|
-
verifier.cleanup_sandbox
|
|
256
|
-
rescue # rubocop:disable Lint/HandleExceptions
|
|
257
|
-
end
|
|
258
|
-
end
|
|
259
|
-
|
|
260
|
-
it "raises ClientError if #sandbox_path is called before #create_sandbox" do
|
|
261
|
-
proc { verifier.sandbox_path }.must_raise Kitchen::ClientError
|
|
262
|
-
end
|
|
263
|
-
|
|
264
|
-
it "#create_sandbox creates a temporary directory" do
|
|
265
|
-
verifier.create_sandbox
|
|
266
|
-
|
|
267
|
-
File.directory?(verifier.sandbox_path).must_equal true
|
|
268
|
-
format("%o", File.stat(verifier.sandbox_path).mode)[1, 4].
|
|
269
|
-
must_equal "0755"
|
|
270
|
-
end
|
|
271
|
-
|
|
272
|
-
it "#create_sandbox logs an info message" do
|
|
273
|
-
verifier.create_sandbox
|
|
274
|
-
|
|
275
|
-
logged_output.string.must_match info_line("Preparing files for transfer")
|
|
276
|
-
end
|
|
277
|
-
|
|
278
|
-
it "#create_sandbox logs a debug message" do
|
|
279
|
-
verifier.create_sandbox
|
|
280
|
-
|
|
281
|
-
logged_output.string.
|
|
282
|
-
must_match debug_line_starting_with("Creating local sandbox in ")
|
|
283
|
-
end
|
|
284
|
-
|
|
285
|
-
it "#cleanup_sandbox deletes the sandbox directory" do
|
|
286
|
-
verifier.create_sandbox
|
|
287
|
-
verifier.cleanup_sandbox
|
|
288
|
-
|
|
289
|
-
File.directory?(verifier.sandbox_path).must_equal false
|
|
290
|
-
end
|
|
291
|
-
|
|
292
|
-
it "#cleanup_sandbox logs a debug message" do
|
|
293
|
-
verifier.create_sandbox
|
|
294
|
-
verifier.cleanup_sandbox
|
|
295
|
-
|
|
296
|
-
logged_output.string.
|
|
297
|
-
must_match debug_line_starting_with("Cleaning up local sandbox in ")
|
|
298
|
-
end
|
|
299
|
-
|
|
300
|
-
def info_line(msg)
|
|
301
|
-
%r{^I, .* : #{Regexp.escape(msg)}$}
|
|
302
|
-
end
|
|
303
|
-
|
|
304
|
-
def debug_line_starting_with(msg)
|
|
305
|
-
%r{^D, .* : #{Regexp.escape(msg)}}
|
|
306
|
-
end
|
|
307
|
-
end
|
|
308
|
-
|
|
309
|
-
describe "#sudo" do
|
|
310
|
-
|
|
311
|
-
describe "with :sudo set" do
|
|
312
|
-
|
|
313
|
-
before { config[:sudo] = true }
|
|
314
|
-
|
|
315
|
-
it "prepends sudo command" do
|
|
316
|
-
verifier.send(:sudo, "wakka").must_equal("sudo -E wakka")
|
|
317
|
-
end
|
|
318
|
-
|
|
319
|
-
it "customizes sudo when :sudo_command is set" do
|
|
320
|
-
config[:sudo_command] = "blueto -Ohai"
|
|
321
|
-
|
|
322
|
-
verifier.send(:sudo, "wakka").must_equal("blueto -Ohai wakka")
|
|
323
|
-
end
|
|
324
|
-
end
|
|
325
|
-
|
|
326
|
-
describe "with :sudo falsey" do
|
|
327
|
-
|
|
328
|
-
before { config[:sudo] = false }
|
|
329
|
-
|
|
330
|
-
it "does not include sudo command" do
|
|
331
|
-
verifier.send(:sudo, "wakka").must_equal("wakka")
|
|
332
|
-
end
|
|
333
|
-
|
|
334
|
-
it "does not include sudo command, even when :sudo_command is set" do
|
|
335
|
-
config[:sudo_command] = "blueto -Ohai"
|
|
336
|
-
|
|
337
|
-
verifier.send(:sudo, "wakka").must_equal("wakka")
|
|
338
|
-
end
|
|
339
|
-
end
|
|
340
|
-
end
|
|
341
|
-
|
|
342
|
-
describe "#prefix_command" do
|
|
343
|
-
|
|
344
|
-
describe "with :command_prefix set" do
|
|
345
|
-
|
|
346
|
-
before { config[:command_prefix] = "my_prefix" }
|
|
347
|
-
|
|
348
|
-
it "prepends the command with the prefix" do
|
|
349
|
-
verifier.send(:prefix_command, "my_command").must_equal("my_prefix my_command")
|
|
350
|
-
end
|
|
351
|
-
end
|
|
352
|
-
|
|
353
|
-
describe "with :command_prefix unset" do
|
|
354
|
-
|
|
355
|
-
before { config[:command_prefix] = nil }
|
|
356
|
-
|
|
357
|
-
it "returns an unaltered command" do
|
|
358
|
-
verifier.send(:prefix_command, "my_command").must_equal("my_command")
|
|
359
|
-
end
|
|
360
|
-
end
|
|
361
|
-
end
|
|
362
|
-
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
|
+
require_relative "../ssh_spec"
|
|
21
|
+
|
|
22
|
+
require "logger"
|
|
23
|
+
require "stringio"
|
|
24
|
+
|
|
25
|
+
require "kitchen/verifier/base"
|
|
26
|
+
require "kitchen/transport/base"
|
|
27
|
+
|
|
28
|
+
module Kitchen
|
|
29
|
+
|
|
30
|
+
module Verifier
|
|
31
|
+
|
|
32
|
+
class TestingDummy < Kitchen::Verifier::Base
|
|
33
|
+
|
|
34
|
+
attr_reader :called_create_sandbox, :called_cleanup_sandbox
|
|
35
|
+
|
|
36
|
+
def install_command
|
|
37
|
+
"install"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def init_command
|
|
41
|
+
"init"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def prepare_command
|
|
45
|
+
"prepare"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def run_command
|
|
49
|
+
"run"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def create_sandbox
|
|
53
|
+
@called_create_sandbox = true
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def cleanup_sandbox
|
|
57
|
+
@called_cleanup_sandbox = true
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def sandbox_path
|
|
61
|
+
"/tmp/sandbox"
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
describe Kitchen::Verifier::Base do
|
|
68
|
+
|
|
69
|
+
let(:logged_output) { StringIO.new }
|
|
70
|
+
let(:logger) { Logger.new(logged_output) }
|
|
71
|
+
let(:platform) { stub(:os_type => nil, :shell_type => nil) }
|
|
72
|
+
let(:suite) { stub(:name => "germany") }
|
|
73
|
+
let(:config) { Hash.new }
|
|
74
|
+
|
|
75
|
+
let(:transport) do
|
|
76
|
+
t = mock("transport")
|
|
77
|
+
t.responds_like_instance_of(Kitchen::Transport::Base)
|
|
78
|
+
t
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
let(:instance) do
|
|
82
|
+
stub(
|
|
83
|
+
:name => "coolbeans",
|
|
84
|
+
:to_str => "instance",
|
|
85
|
+
:logger => logger,
|
|
86
|
+
:platform => platform,
|
|
87
|
+
:suite => suite,
|
|
88
|
+
:transport => transport
|
|
89
|
+
)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
let(:verifier) do
|
|
93
|
+
Kitchen::Verifier::Base.new(config).finalize_config!(instance)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
describe "configuration" do
|
|
97
|
+
|
|
98
|
+
describe "for unix operating systems" do
|
|
99
|
+
|
|
100
|
+
before { platform.stubs(:os_type).returns("unix") }
|
|
101
|
+
|
|
102
|
+
it ":sudo defaults to true" do
|
|
103
|
+
verifier[:sudo].must_equal true
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
it ":sudo_command defaults to sudo -E" do
|
|
107
|
+
verifier[:sudo_command].must_equal "sudo -E"
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
it ":root_path defaults to '/tmp/verifier'" do
|
|
111
|
+
verifier[:root_path].must_equal "/tmp/verifier"
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
describe "for windows operating systems" do
|
|
116
|
+
|
|
117
|
+
before { platform.stubs(:os_type).returns("windows") }
|
|
118
|
+
|
|
119
|
+
it ":sudo defaults to nil" do
|
|
120
|
+
verifier[:sudo].must_equal nil
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
it ":sudo_command defaults to nil" do
|
|
124
|
+
verifier[:sudo_command].must_equal nil
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
it ":root_path defaults to $env:TEMP\\verifier" do
|
|
128
|
+
verifier[:root_path].must_equal "$env:TEMP\\verifier"
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
it ":suite_name defaults to the passed in suite name" do
|
|
133
|
+
verifier[:suite_name].must_equal "germany"
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
it ":http_proxy defaults to nil" do
|
|
137
|
+
verifier[:http_proxy].must_equal nil
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
it ":http_proxys defaults to nil" do
|
|
141
|
+
verifier[:https_proxy].must_equal nil
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
it ":ftp_proxy defaults to nil" do
|
|
145
|
+
verifier[:ftp_proxy].must_equal nil
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
describe "#call" do
|
|
150
|
+
|
|
151
|
+
let(:state) { Hash.new }
|
|
152
|
+
let(:cmd) { verifier.call(state) }
|
|
153
|
+
|
|
154
|
+
let(:connection) do
|
|
155
|
+
c = mock("transport_connection")
|
|
156
|
+
c.responds_like_instance_of(Kitchen::Transport::Base::Connection)
|
|
157
|
+
c
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
let(:verifier) do
|
|
161
|
+
Kitchen::Verifier::TestingDummy.new(config).finalize_config!(instance)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
before do
|
|
165
|
+
FakeFS.activate!
|
|
166
|
+
FileUtils.mkdir_p(File.join(verifier.sandbox_path, "stuff"))
|
|
167
|
+
transport.stubs(:connection).yields(connection)
|
|
168
|
+
connection.stubs(:execute)
|
|
169
|
+
connection.stubs(:upload)
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
after do
|
|
173
|
+
FakeFS.deactivate!
|
|
174
|
+
FakeFS::FileSystem.clear
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
it "creates the sandbox" do
|
|
178
|
+
verifier.expects(:create_sandbox)
|
|
179
|
+
|
|
180
|
+
cmd
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
it "ensures that the sandbox is cleanup up" do
|
|
184
|
+
transport.stubs(:connection).raises
|
|
185
|
+
verifier.expects(:cleanup_sandbox)
|
|
186
|
+
|
|
187
|
+
begin
|
|
188
|
+
cmd
|
|
189
|
+
rescue # rubocop:disable Lint/HandleExceptions
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
it "yields a connection given the state" do
|
|
194
|
+
state[:a] = "b"
|
|
195
|
+
transport.expects(:connection).with(state).yields(connection)
|
|
196
|
+
|
|
197
|
+
cmd
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
it "invokes the verifier commands over the transport" do
|
|
201
|
+
order = sequence("order")
|
|
202
|
+
connection.expects(:execute).with("install").in_sequence(order)
|
|
203
|
+
connection.expects(:execute).with("init").in_sequence(order)
|
|
204
|
+
connection.expects(:execute).with("prepare").in_sequence(order)
|
|
205
|
+
connection.expects(:execute).with("run").in_sequence(order)
|
|
206
|
+
|
|
207
|
+
cmd
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
it "logs to info" do
|
|
211
|
+
cmd
|
|
212
|
+
|
|
213
|
+
logged_output.string.
|
|
214
|
+
must_match(/INFO -- : Transferring files to instance$/)
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
it "uploads sandbox files" do
|
|
218
|
+
connection.expects(:upload).with(["/tmp/sandbox/stuff"], "/tmp/verifier")
|
|
219
|
+
|
|
220
|
+
cmd
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
it "logs to debug" do
|
|
224
|
+
cmd
|
|
225
|
+
|
|
226
|
+
logged_output.string.must_match(/DEBUG -- : Transfer complete$/)
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
it "raises an ActionFailed on transfer when TransportFailed is raised" do
|
|
230
|
+
connection.stubs(:upload).
|
|
231
|
+
raises(Kitchen::Transport::TransportFailed.new("dang"))
|
|
232
|
+
|
|
233
|
+
proc { cmd }.must_raise Kitchen::ActionFailed
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
it "raises an ActionFailed on execute when TransportFailed is raised" do
|
|
237
|
+
connection.stubs(:execute).
|
|
238
|
+
raises(Kitchen::Transport::TransportFailed.new("dang"))
|
|
239
|
+
|
|
240
|
+
proc { cmd }.must_raise Kitchen::ActionFailed
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
[:init_command, :install_command, :prepare_command, :run_command].each do |cmd|
|
|
245
|
+
|
|
246
|
+
it "has a #{cmd} method" do
|
|
247
|
+
verifier.public_send(cmd).must_be_nil
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
describe "sandbox" do
|
|
252
|
+
|
|
253
|
+
after do
|
|
254
|
+
begin
|
|
255
|
+
verifier.cleanup_sandbox
|
|
256
|
+
rescue # rubocop:disable Lint/HandleExceptions
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
it "raises ClientError if #sandbox_path is called before #create_sandbox" do
|
|
261
|
+
proc { verifier.sandbox_path }.must_raise Kitchen::ClientError
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
it "#create_sandbox creates a temporary directory" do
|
|
265
|
+
verifier.create_sandbox
|
|
266
|
+
|
|
267
|
+
File.directory?(verifier.sandbox_path).must_equal true
|
|
268
|
+
format("%o", File.stat(verifier.sandbox_path).mode)[1, 4].
|
|
269
|
+
must_equal "0755"
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
it "#create_sandbox logs an info message" do
|
|
273
|
+
verifier.create_sandbox
|
|
274
|
+
|
|
275
|
+
logged_output.string.must_match info_line("Preparing files for transfer")
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
it "#create_sandbox logs a debug message" do
|
|
279
|
+
verifier.create_sandbox
|
|
280
|
+
|
|
281
|
+
logged_output.string.
|
|
282
|
+
must_match debug_line_starting_with("Creating local sandbox in ")
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
it "#cleanup_sandbox deletes the sandbox directory" do
|
|
286
|
+
verifier.create_sandbox
|
|
287
|
+
verifier.cleanup_sandbox
|
|
288
|
+
|
|
289
|
+
File.directory?(verifier.sandbox_path).must_equal false
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
it "#cleanup_sandbox logs a debug message" do
|
|
293
|
+
verifier.create_sandbox
|
|
294
|
+
verifier.cleanup_sandbox
|
|
295
|
+
|
|
296
|
+
logged_output.string.
|
|
297
|
+
must_match debug_line_starting_with("Cleaning up local sandbox in ")
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
def info_line(msg)
|
|
301
|
+
%r{^I, .* : #{Regexp.escape(msg)}$}
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
def debug_line_starting_with(msg)
|
|
305
|
+
%r{^D, .* : #{Regexp.escape(msg)}}
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
describe "#sudo" do
|
|
310
|
+
|
|
311
|
+
describe "with :sudo set" do
|
|
312
|
+
|
|
313
|
+
before { config[:sudo] = true }
|
|
314
|
+
|
|
315
|
+
it "prepends sudo command" do
|
|
316
|
+
verifier.send(:sudo, "wakka").must_equal("sudo -E wakka")
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
it "customizes sudo when :sudo_command is set" do
|
|
320
|
+
config[:sudo_command] = "blueto -Ohai"
|
|
321
|
+
|
|
322
|
+
verifier.send(:sudo, "wakka").must_equal("blueto -Ohai wakka")
|
|
323
|
+
end
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
describe "with :sudo falsey" do
|
|
327
|
+
|
|
328
|
+
before { config[:sudo] = false }
|
|
329
|
+
|
|
330
|
+
it "does not include sudo command" do
|
|
331
|
+
verifier.send(:sudo, "wakka").must_equal("wakka")
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
it "does not include sudo command, even when :sudo_command is set" do
|
|
335
|
+
config[:sudo_command] = "blueto -Ohai"
|
|
336
|
+
|
|
337
|
+
verifier.send(:sudo, "wakka").must_equal("wakka")
|
|
338
|
+
end
|
|
339
|
+
end
|
|
340
|
+
end
|
|
341
|
+
|
|
342
|
+
describe "#prefix_command" do
|
|
343
|
+
|
|
344
|
+
describe "with :command_prefix set" do
|
|
345
|
+
|
|
346
|
+
before { config[:command_prefix] = "my_prefix" }
|
|
347
|
+
|
|
348
|
+
it "prepends the command with the prefix" do
|
|
349
|
+
verifier.send(:prefix_command, "my_command").must_equal("my_prefix my_command")
|
|
350
|
+
end
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
describe "with :command_prefix unset" do
|
|
354
|
+
|
|
355
|
+
before { config[:command_prefix] = nil }
|
|
356
|
+
|
|
357
|
+
it "returns an unaltered command" do
|
|
358
|
+
verifier.send(:prefix_command, "my_command").must_equal("my_command")
|
|
359
|
+
end
|
|
360
|
+
end
|
|
361
|
+
end
|
|
362
|
+
end
|