test-kitchen 1.5.0 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -17,5 +17,5 @@
17
17
  # limitations under the License.
18
18
 
19
19
  module Kitchen
20
- VERSION = "1.5.0"
20
+ VERSION = "1.6.0"
21
21
  end
@@ -330,6 +330,39 @@ describe Kitchen::Provisioner::Base do
330
330
  end
331
331
  end
332
332
 
333
+ describe "#sudo_command" do
334
+
335
+ describe "with :sudo set" do
336
+
337
+ before { config[:sudo] = true }
338
+
339
+ it "returns the default sudo_command" do
340
+ provisioner.send(:sudo_command).must_equal("sudo -E")
341
+ end
342
+
343
+ it "returns the custom sudo_command" do
344
+ config[:sudo_command] = "mysudo"
345
+
346
+ provisioner.send(:sudo_command).must_equal("mysudo")
347
+ end
348
+ end
349
+
350
+ describe "with :sudo falsey" do
351
+
352
+ before { config[:sudo] = false }
353
+
354
+ it "returns empty string for default sudo_command" do
355
+ provisioner.send(:sudo_command).must_equal("")
356
+ end
357
+
358
+ it "returns empty string for custom sudo_command" do
359
+ config[:sudo_command] = "mysudo"
360
+
361
+ provisioner.send(:sudo_command).must_equal("")
362
+ end
363
+ end
364
+ end
365
+
333
366
  describe "#prefix_command" do
334
367
 
335
368
  describe "with :command_prefix set" do
@@ -0,0 +1,136 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Author:: SAWANOBORI Yukihiko <sawanoboriyu@higanworks.com>)
4
+ #
5
+ # Copyright (C) 2015, HiganWorks LLC
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require_relative "../../spec_helper"
20
+
21
+ require "kitchen"
22
+ require "kitchen/provisioner/chef_apply"
23
+
24
+ describe Kitchen::Provisioner::ChefApply do
25
+
26
+ let(:logged_output) { StringIO.new }
27
+ let(:logger) { Logger.new(logged_output) }
28
+ let(:platform) { stub(:os_type => nil) }
29
+ let(:suite) { stub(:name => "fries") }
30
+
31
+ let(:config) do
32
+ { :test_base_path => "/b", :kitchen_root => "/r", :log_level => :info }
33
+ end
34
+
35
+ let(:instance) do
36
+ stub(
37
+ :name => "coolbeans",
38
+ :logger => logger,
39
+ :suite => suite,
40
+ :platform => platform
41
+ )
42
+ end
43
+
44
+ let(:provisioner) do
45
+ Kitchen::Provisioner::ChefApply.new(config).finalize_config!(instance)
46
+ end
47
+
48
+ it "provisioner api_version is 2" do
49
+ provisioner.diagnose_plugin[:api_version].must_equal 2
50
+ end
51
+
52
+ it "plugin_version is set to Kitchen::VERSION" do
53
+ provisioner.diagnose_plugin[:version].must_equal Kitchen::VERSION
54
+ end
55
+
56
+ describe "default config" do
57
+
58
+ it "sets :chef_apply_path to a path using :chef_omnibus_root" do
59
+ config[:chef_omnibus_root] = "/nice/place"
60
+
61
+ provisioner[:chef_apply_path].must_equal "/nice/place/bin/chef-apply"
62
+ end
63
+ end
64
+
65
+ describe "#create_sandbox" do
66
+
67
+ before do
68
+ @root = Dir.mktmpdir
69
+ config[:kitchen_root] = @root
70
+ end
71
+
72
+ after do
73
+ FileUtils.remove_entry(@root)
74
+ begin
75
+ provisioner.cleanup_sandbox
76
+ rescue # rubocop:disable Lint/HandleExceptions
77
+ end
78
+ end
79
+ end
80
+
81
+ describe "#run_command" do
82
+
83
+ before do
84
+ config[:run_list] = %w[appry_recipe1 appry_recipe2]
85
+ end
86
+
87
+ let(:cmd) { provisioner.run_command }
88
+
89
+ describe "for bourne shells" do
90
+
91
+ before { platform.stubs(:shell_type).returns("bourne") }
92
+
93
+ it "uses bourne shell" do
94
+ cmd.must_match(/\Ash -c '$/)
95
+ cmd.must_match(/'\Z/)
96
+ end
97
+
98
+ it "uses sudo for chef-apply when configured" do
99
+ config[:chef_omnibus_root] = "/c"
100
+ config[:sudo] = true
101
+
102
+ cmd.must_match regexify("sudo -E /c/bin/chef-apply apply/appry_recipe1.rb ", :partial_line)
103
+ cmd.must_match regexify("sudo -E /c/bin/chef-apply apply/appry_recipe2.rb ", :partial_line)
104
+ end
105
+
106
+ it "does not use sudo for chef-apply when configured" do
107
+ config[:chef_omnibus_root] = "/c"
108
+ config[:sudo] = false
109
+
110
+ cmd.must_match regexify("chef-apply apply/appry_recipe1.rb ", :partial_line)
111
+ cmd.must_match regexify("chef-apply apply/appry_recipe2.rb ", :partial_line)
112
+ cmd.wont_match regexify("sudo -E /c/bin/chef-apply ")
113
+ end
114
+
115
+ it "sets log level flag on chef-apply to auto by default" do
116
+ cmd.must_match regexify(" --log_level auto", :partial_line)
117
+ end
118
+
119
+ it "set log level flag for custom level" do
120
+ config[:log_level] = :extreme
121
+
122
+ cmd.must_match regexify(" --log_level extreme", :partial_line)
123
+ end
124
+
125
+ it "sets no color flag on chef-apply" do
126
+ cmd.must_match regexify(" --no-color", :partial_line)
127
+ end
128
+ end
129
+ end
130
+
131
+ def regexify(str, line = :whole_line)
132
+ r = Regexp.escape(str)
133
+ r = "^\s*#{r}$" if line == :whole_line
134
+ Regexp.new(r)
135
+ end
136
+ end
@@ -150,8 +150,8 @@ describe Kitchen::Provisioner::ChefBase do
150
150
 
151
151
  let(:install_opts) {
152
152
  { :omnibus_url => "https://www.chef.io/chef/install.sh",
153
- :project => nil, :install_flags => nil, :http_proxy => nil,
154
- :https_proxy => nil }
153
+ :project => nil, :install_flags => nil, :sudo_command => "sudo -E",
154
+ :http_proxy => nil, :https_proxy => nil }
155
155
  }
156
156
 
157
157
  it "returns nil if :require_chef_omnibus is falsey" do
@@ -323,17 +323,21 @@ describe Kitchen::Provisioner::ChefBase do
323
323
  it "prepends sudo for sh commands when :sudo is set" do
324
324
  config[:sudo] = true
325
325
  config[:sudo_command] = "my_sudo_command"
326
+ install_opts_clone = install_opts.clone
327
+ install_opts_clone[:sudo_command] = config[:sudo_command]
326
328
 
327
329
  Mixlib::Install.expects(:new).
328
- with(default_version, false, install_opts).returns(installer)
330
+ with(default_version, false, install_opts_clone).returns(installer)
329
331
  cmd.must_equal "my_sudo_command my_install_command"
330
332
  end
331
333
 
332
334
  it "does not sudo for sh commands when :sudo is falsey" do
333
335
  config[:sudo] = false
334
336
 
337
+ install_opts_clone = install_opts.clone
338
+ install_opts_clone[:sudo_command] = ""
335
339
  Mixlib::Install.expects(:new).
336
- with(default_version, false, install_opts).returns(installer)
340
+ with(default_version, false, install_opts_clone).returns(installer)
337
341
  cmd.must_equal "my_install_command"
338
342
  end
339
343
  end
@@ -347,8 +351,10 @@ describe Kitchen::Provisioner::ChefBase do
347
351
  end
348
352
 
349
353
  it "sets the powershell flag for Mixlib::Install" do
354
+ install_opts_clone = install_opts.clone
355
+ install_opts_clone[:sudo_command] = ""
350
356
  Mixlib::Install.expects(:new).
351
- with("", true, install_opts).returns(installer)
357
+ with("", true, install_opts_clone).returns(installer)
352
358
  cmd
353
359
  end
354
360
  end
@@ -18,7 +18,6 @@
18
18
 
19
19
  require_relative "../spec_helper"
20
20
 
21
- require "net/ssh/test"
22
21
  require "kitchen/ssh"
23
22
  require "tmpdir"
24
23
 
@@ -55,7 +54,7 @@ end
55
54
  # `IO.select` with a version for testing Net::SSH code. Unfortunetly this
56
55
  # impacts other code, so we'll "un-patch" this after each spec and "re-patch"
57
56
  # it before the next one.
58
-
57
+ require "net/ssh/test"
59
58
  def depatch_io
60
59
  IO.class_exec do
61
60
  class << self
@@ -63,6 +62,10 @@ def depatch_io
63
62
  end
64
63
  end
65
64
  end
65
+ # We need to immediately call depatch so that `IO.select` is in a good state
66
+ # _right now_. The require immediately monkeypatches it and we only want
67
+ # it monkey patched inside each ssh test
68
+ depatch_io
66
69
 
67
70
  def repatch_io
68
71
  IO.class_exec do
@@ -82,7 +85,7 @@ end
82
85
  # `LocalPacket` which can deal with the `"pty-req"` type.
83
86
  #
84
87
  # An upstream patch to Net::SSH will be required to retire this yak shave ;)
85
-
88
+ require "net/ssh/test/channel"
86
89
  module Net
87
90
 
88
91
  module SSH
@@ -18,8 +18,6 @@
18
18
 
19
19
  require_relative "../../spec_helper"
20
20
 
21
- require "net/ssh/test"
22
-
23
21
  require "kitchen/transport/ssh"
24
22
 
25
23
  # Hack to sort results in `Dir.entries` only within the yielded block, to limit
@@ -55,7 +53,7 @@ end
55
53
  # `IO.select` with a version for testing Net::SSH code. Unfortunetly this
56
54
  # impacts other code, so we'll "un-patch" this after each spec and "re-patch"
57
55
  # it before the next one.
58
-
56
+ require "net/ssh/test"
59
57
  def depatch_io
60
58
  IO.class_exec do
61
59
  class << self
@@ -63,6 +61,10 @@ def depatch_io
63
61
  end
64
62
  end
65
63
  end
64
+ # We need to immediately call depatch so that `IO.select` is in a good state
65
+ # _right now_. The require immediately monkeypatches it and we only want
66
+ # it monkey patched inside each ssh test
67
+ depatch_io
66
68
 
67
69
  def repatch_io
68
70
  IO.class_exec do
@@ -82,7 +84,7 @@ end
82
84
  # `LocalPacket` which can deal with the `"pty-req"` type.
83
85
  #
84
86
  # An upstream patch to Net::SSH will be required to retire this yak shave ;)
85
-
87
+ require "net/ssh/test/channel"
86
88
  module Net
87
89
 
88
90
  module SSH
@@ -20,9 +20,7 @@ require_relative "../../spec_helper"
20
20
 
21
21
  require "kitchen/transport/winrm"
22
22
  require "winrm"
23
- require "winrm/transport/command_executor"
24
- require "winrm/transport/shell_closer"
25
- require "winrm/transport/file_transporter"
23
+ require "winrm-fs"
26
24
 
27
25
  module Kitchen
28
26
 
@@ -107,8 +105,8 @@ describe Kitchen::Transport::Winrm do
107
105
  transport[:max_wait_until_ready].must_equal 600
108
106
  end
109
107
 
110
- it "sets :winrm_transport to :plaintext" do
111
- transport[:winrm_transport].must_equal :plaintext
108
+ it "sets :winrm_transport to :negotiate" do
109
+ transport[:winrm_transport].must_equal :negotiate
112
110
  end
113
111
  end
114
112
 
@@ -150,25 +148,17 @@ describe Kitchen::Transport::Winrm do
150
148
  make_connection
151
149
  end
152
150
 
153
- it "sets the :winrm_transport to :plaintext" do
151
+ it "sets the :winrm_transport to :negotiate" do
154
152
  klass.expects(:new).with do |hash|
155
- hash[:winrm_transport] == :plaintext
153
+ hash[:winrm_transport] == :negotiate
156
154
  end
157
155
 
158
156
  make_connection
159
157
  end
160
158
 
161
- it "sets the :disable_sspi to true" do
159
+ it "sets the :disable_sspi to false" do
162
160
  klass.expects(:new).with do |hash|
163
- hash[:disable_sspi] == true
164
- end
165
-
166
- make_connection
167
- end
168
-
169
- it "sets the :basic_auth_only to true" do
170
- klass.expects(:new).with do |hash|
171
- hash[:basic_auth_only] == true
161
+ hash[:disable_sspi] == false
172
162
  end
173
163
 
174
164
  make_connection
@@ -336,42 +326,20 @@ describe Kitchen::Transport::Winrm do
336
326
  make_connection
337
327
  end
338
328
 
339
- describe "when sspinegotiate is set in config" do
329
+ describe "when negotiate is set in config" do
340
330
  before do
341
- config[:winrm_transport] = "sspinegotiate"
331
+ config[:winrm_transport] = "negotiate"
342
332
  end
343
333
 
344
- describe "for Windows workstations" do
345
- before do
346
- RbConfig::CONFIG.stubs(:[]).with("host_os").returns("mingw32")
347
- end
348
-
349
- it "sets :winrm_transport to sspinegotiate on Windows" do
350
-
351
- klass.expects(:new).with do |hash|
352
- hash[:winrm_transport] == :sspinegotiate &&
353
- hash[:disable_sspi] == false &&
354
- hash[:basic_auth_only] == false
355
- end
334
+ it "sets :winrm_transport to negotiate" do
356
335
 
357
- make_connection
336
+ klass.expects(:new).with do |hash|
337
+ hash[:winrm_transport] == :negotiate &&
338
+ hash[:disable_sspi] == false &&
339
+ hash[:basic_auth_only] == false
358
340
  end
359
- end
360
341
 
361
- describe "for non-Windows workstations" do
362
- before do
363
- RbConfig::CONFIG.stubs(:[]).with("host_os").returns("darwin14")
364
- end
365
-
366
- it "sets :winrm_transport to plaintext" do
367
- klass.expects(:new).with do |hash|
368
- hash[:winrm_transport] == :plaintext &&
369
- hash[:disable_sspi] == true &&
370
- hash[:basic_auth_only] == true
371
- end
372
-
373
- make_connection
374
- end
342
+ make_connection
375
343
  end
376
344
  end
377
345
 
@@ -438,48 +406,46 @@ describe Kitchen::Transport::Winrm do
438
406
  end
439
407
 
440
408
  describe "#load_needed_dependencies" do
441
- describe "winrm-transport" do
409
+ describe "winrm-fs" do
442
410
  before do
443
- # force loading of winrm-transport to get the version constant
444
- require "winrm/transport/version"
411
+ # force loading of winrm-fs to get the version constant
412
+ require "winrm-fs"
445
413
  end
446
414
 
447
415
  it "logs a message to debug that code will be loaded" do
448
- transport.stubs(:require)
449
416
  transport
450
417
 
451
418
  logged_output.string.must_match debug_line_with(
452
- "Winrm Transport requested, loading WinRM::Transport gem")
419
+ "winrm-fs requested, loading winrm-fs gem")
453
420
  end
454
421
 
455
422
  it "logs a message to debug when library is initially loaded" do
456
423
  transport = Kitchen::Transport::Winrm.new(config)
457
- transport.stubs(:require)
458
- transport.stubs(:execute_block).returns(true)
459
-
424
+ transport.stubs(:require).with("winrm", anything)
425
+ transport.stubs(:require).with("winrm-fs").returns(true)
460
426
  transport.finalize_config!(instance)
461
427
 
462
428
  logged_output.string.must_match(
463
- /WinRM::Transport library loaded/
429
+ /winrm-fs is loaded/
464
430
  )
465
431
  end
466
432
 
467
433
  it "logs a message to debug when library is previously loaded" do
468
434
  transport = Kitchen::Transport::Winrm.new(config)
469
- transport.stubs(:require)
470
- transport.stubs(:execute_block).returns(false)
471
-
435
+ transport.stubs(:require).with("winrm", anything)
436
+ transport.stubs(:require).with("winrm-fs").returns(false)
472
437
  transport.finalize_config!(instance)
473
438
 
474
439
  logged_output.string.must_match(
475
- /WinRM::Transport previously loaded/
440
+ /winrm-fs was already loaded/
476
441
  )
477
442
  end
478
443
 
479
444
  it "logs a message to fatal when libraries cannot be loaded" do
480
445
  transport = Kitchen::Transport::Winrm.new(config)
481
- transport.stubs(:require)
482
- transport.stubs(:execute_block).raises(LoadError, "uh oh")
446
+ transport.stubs(:require).with("winrm", anything)
447
+ transport.stubs(:require).with("winrm-fs").
448
+ raises(LoadError, "uh oh")
483
449
  begin
484
450
  transport.finalize_config!(instance)
485
451
  rescue # rubocop:disable Lint/HandleExceptions
@@ -487,64 +453,61 @@ describe Kitchen::Transport::Winrm do
487
453
  end
488
454
 
489
455
  logged_output.string.must_match fatal_line_with(
490
- "The `winrm-transport` gem is missing and must be installed")
456
+ "The `winrm-fs` gem is missing and must be installed")
491
457
  end
492
458
 
493
459
  it "raises a UserError when libraries cannot be loaded" do
494
460
  transport = Kitchen::Transport::Winrm.new(config)
495
- transport.stubs(:require)
496
- transport.stubs(:execute_block).raises(LoadError, "uh oh")
461
+ transport.stubs(:require).with("winrm", anything)
462
+ transport.stubs(:require).with("winrm-fs").
463
+ raises(LoadError, "uh oh")
497
464
 
498
465
  err = proc {
499
466
  transport.finalize_config!(instance)
500
467
  }.must_raise Kitchen::UserError
501
- err.message.must_match(/^Could not load or activate winrm-transport\. /)
468
+ err.message.must_match(/^Could not load or activate winrm-fs\. /)
502
469
  end
503
470
  end
504
471
 
505
- describe "winrm-s" do
506
- before do
507
- RbConfig::CONFIG.stubs(:[]).with("host_os").returns("mingw32")
508
- end
509
-
472
+ describe "winrm" do
510
473
  it "logs a message to debug that code will be loaded" do
511
474
  transport = Kitchen::Transport::Winrm.new(config)
512
- transport.stubs(:load_winrm_transport!)
475
+ transport.stubs(:require).with("winrm-fs", anything)
513
476
  transport.stubs(:require)
514
477
  transport.finalize_config!(instance)
515
478
 
516
479
  logged_output.string.must_match debug_line_with(
517
- "The winrm-s gem is being loaded")
480
+ "winrm requested, loading winrm gem")
518
481
  end
519
482
 
520
483
  it "logs a message to debug when library is initially loaded" do
521
484
  transport = Kitchen::Transport::Winrm.new(config)
522
- transport.stubs(:load_winrm_transport!)
523
- transport.stubs(:execute_block).returns(true)
485
+ transport.stubs(:require).with("winrm-fs", anything)
486
+ transport.stubs(:require).returns(true)
524
487
 
525
488
  transport.finalize_config!(instance)
526
489
 
527
490
  logged_output.string.must_match(
528
- /winrm-s is loaded/
491
+ /winrm is loaded/
529
492
  )
530
493
  end
531
494
 
532
495
  it "logs a message to debug when library is previously loaded" do
533
496
  transport = Kitchen::Transport::Winrm.new(config)
534
- transport.stubs(:load_winrm_transport!)
535
- transport.stubs(:execute_block).returns(false)
497
+ transport.stubs(:require).with("winrm-fs", anything)
498
+ transport.stubs(:require).returns(false)
536
499
 
537
500
  transport.finalize_config!(instance)
538
501
 
539
502
  logged_output.string.must_match(
540
- /winrm-s was already loaded/
503
+ /winrm was already loaded/
541
504
  )
542
505
  end
543
506
 
544
507
  it "logs a message to fatal when libraries cannot be loaded" do
545
508
  transport = Kitchen::Transport::Winrm.new(config)
546
- transport.stubs(:load_winrm_transport!)
547
- transport.stubs(:execute_block).raises(LoadError, "uh oh")
509
+ transport.stubs(:require).with("winrm-fs", anything)
510
+ transport.stubs(:require).raises(LoadError, "uh oh")
548
511
  begin
549
512
  transport.finalize_config!(instance)
550
513
  rescue # rubocop:disable Lint/HandleExceptions
@@ -552,18 +515,18 @@ describe Kitchen::Transport::Winrm do
552
515
  end
553
516
 
554
517
  logged_output.string.must_match fatal_line_with(
555
- "The `winrm-s` gem is missing and must be installed")
518
+ "The `winrm` gem is missing and must be installed")
556
519
  end
557
520
 
558
521
  it "raises a UserError when libraries cannot be loaded" do
559
522
  transport = Kitchen::Transport::Winrm.new(config)
560
- transport.stubs(:load_winrm_transport!)
561
- transport.stubs(:execute_block).raises(LoadError, "uh oh")
523
+ transport.stubs(:require).with("winrm-fs", anything)
524
+ transport.stubs(:require).raises(LoadError, "uh oh")
562
525
 
563
526
  err = proc {
564
527
  transport.finalize_config!(instance)
565
528
  }.must_raise Kitchen::UserError
566
- err.message.must_match(/^Could not load or activate winrm-s\. /)
529
+ err.message.must_match(/^Could not load or activate winrm\. /)
567
530
  end
568
531
  end
569
532
  end
@@ -602,7 +565,7 @@ describe Kitchen::Transport::Winrm::Connection do
602
565
 
603
566
  let(:executor) do
604
567
  s = mock("command_executor")
605
- s.responds_like_instance_of(WinRM::Transport::CommandExecutor)
568
+ s.responds_like_instance_of(WinRM::CommandExecutor)
606
569
  s
607
570
  end
608
571
 
@@ -611,6 +574,8 @@ describe Kitchen::Transport::Winrm::Connection do
611
574
  end
612
575
 
613
576
  before do
577
+ WinRM::WinRMWebService.stubs(:new).returns(winrm_session)
578
+ winrm_session.stubs(:logger=)
614
579
  logger.level = Logger::DEBUG
615
580
  end
616
581
 
@@ -624,29 +589,12 @@ describe Kitchen::Transport::Winrm::Connection do
624
589
  end
625
590
 
626
591
  before do
627
- WinRM::Transport::CommandExecutor.stubs(:new).returns(executor)
628
- # disable finalizer as service is a fake anyway
629
- ObjectSpace.stubs(:define_finalizer).
630
- with { |obj, _| obj.class == Kitchen::Transport::Winrm::Connection }
631
- executor.stubs(:open).returns("shell-123")
632
- executor.stubs(:shell).returns("shell-123")
592
+ winrm_session.stubs(:create_executor).returns(executor)
633
593
  executor.stubs(:close)
634
594
  executor.stubs(:run_powershell_script).
635
595
  with("doit").yields("ok\n", nil).returns(response)
636
596
  end
637
597
 
638
- it "logger displays closing connection on debug" do
639
- connection.execute("doit")
640
- connection.close
641
-
642
- logged_output.string.must_match debug_line(
643
- "[WinRM] closing remote shell shell-123 on #{info}"
644
- )
645
- logged_output.string.must_match debug_line(
646
- "[WinRM] remote shell shell-123 closed"
647
- )
648
- end
649
-
650
598
  it "only closes the shell once for multiple calls" do
651
599
  executor.expects(:close).once
652
600
 
@@ -660,10 +608,7 @@ describe Kitchen::Transport::Winrm::Connection do
660
608
  describe "#execute" do
661
609
 
662
610
  before do
663
- WinRM::Transport::CommandExecutor.stubs(:new).returns(executor)
664
- # disable finalizer as service is a fake anyway
665
- ObjectSpace.stubs(:define_finalizer).
666
- with { |obj, _| obj.class == Kitchen::Transport::Winrm::Connection }
611
+ winrm_session.stubs(:create_executor).returns(executor)
667
612
  end
668
613
 
669
614
  describe "for a successful command" do
@@ -679,7 +624,6 @@ describe Kitchen::Transport::Winrm::Connection do
679
624
  end
680
625
 
681
626
  before do
682
- executor.expects(:open).returns("shell-123")
683
627
  executor.expects(:run_powershell_script).
684
628
  with("doit").yields("ok\n", nil).returns(response)
685
629
  end
@@ -691,17 +635,6 @@ describe Kitchen::Transport::Winrm::Connection do
691
635
  "[WinRM] #{info} (doit)")
692
636
  end
693
637
 
694
- it "logger displays establishing connection on debug" do
695
- connection.execute("doit")
696
-
697
- logged_output.string.must_match debug_line(
698
- "[WinRM] opening remote shell on #{info}"
699
- )
700
- logged_output.string.must_match debug_line(
701
- "[WinRM] remote shell shell-123 is open on #{info}"
702
- )
703
- end
704
-
705
638
  it "logger captures stdout" do
706
639
  connection.execute("doit")
707
640
 
@@ -741,10 +674,9 @@ describe Kitchen::Transport::Winrm::Connection do
741
674
  end
742
675
 
743
676
  before do
744
- executor.expects(:open).returns("shell-123")
745
- executor.expects(:run_powershell_script).
746
- with(%{& "$env:TEMP/kitchen/coolbeans-long_script.ps1"}).
747
- yields("ok\n", nil).returns(response)
677
+ executor.expects(:run_powershell_script).with(
678
+ %{powershell -ExecutionPolicy Bypass -File "$env:TEMP/kitchen/coolbeans-long_script.ps1"}
679
+ ).yields("ok\n", nil).returns(response)
748
680
  end
749
681
 
750
682
  it "uploads the long command" do
@@ -786,12 +718,11 @@ describe Kitchen::Transport::Winrm::Connection do
786
718
  end
787
719
 
788
720
  before do
789
- executor.expects(:open).returns("shell-123")
790
721
  executor.expects(:run_powershell_script).
791
722
  with("doit").yields("nope\n", nil).returns(response)
792
723
  end
793
724
 
794
- # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
725
+ # rubocop:disable Metrics/MethodLength
795
726
  def self.common_failed_command_specs
796
727
  it "logger displays command on debug" do
797
728
  begin
@@ -805,21 +736,6 @@ describe Kitchen::Transport::Winrm::Connection do
805
736
  )
806
737
  end
807
738
 
808
- it "logger displays establishing connection on debug" do
809
- begin
810
- connection.execute("doit")
811
- rescue # rubocop:disable Lint/HandleExceptions
812
- # the raise is not what is being tested here, rather its side-effect
813
- end
814
-
815
- logged_output.string.must_match debug_line(
816
- "[WinRM] opening remote shell on #{info}"
817
- )
818
- logged_output.string.must_match debug_line(
819
- "[WinRM] remote shell shell-123 is open on #{info}"
820
- )
821
- end
822
-
823
739
  it "logger captures stdout" do
824
740
  begin
825
741
  connection.execute("doit")
@@ -854,7 +770,7 @@ MSG
854
770
  end
855
771
  end
856
772
  end
857
- # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
773
+ # rubocop:enable Metrics/MethodLength
858
774
 
859
775
  describe "when a non-zero exit code is returned" do
860
776
 
@@ -897,64 +813,12 @@ MSG
897
813
 
898
814
  options[:connection_retries] = 3
899
815
  options[:connection_retry_sleep] = 7
900
- connection.stubs(:sleep)
901
- executor.stubs(:open).raises(k)
816
+ winrm_session.stubs(:create_executor).raises(k)
902
817
  end
903
818
 
904
819
  it "reraises the #{klass} exception" do
905
820
  proc { connection.execute("nope") }.must_raise klass
906
821
  end
907
-
908
- it "attempts to connect :connection_retries times" do
909
- begin
910
- connection.execute("nope")
911
- rescue # rubocop:disable Lint/HandleExceptions
912
- # the raise is not what is being tested here, rather its side-effect
913
- end
914
-
915
- logged_output.string.lines.count { |l|
916
- l =~ debug_line("[WinRM] opening remote shell on #{info}")
917
- }.must_equal 3
918
- logged_output.string.lines.count { |l|
919
- l =~ debug_line("[WinRM] remote shell shell-123 is open on #{info}")
920
- }.must_equal 0
921
- end
922
-
923
- it "sleeps for :connection_retry_sleep seconds between retries" do
924
- connection.unstub(:sleep)
925
- connection.expects(:sleep).with(7).twice
926
-
927
- begin
928
- connection.execute("nope")
929
- rescue # rubocop:disable Lint/HandleExceptions
930
- # the raise is not what is being tested here, rather its side-effect
931
- end
932
- end
933
-
934
- it "logs the first 2 retry failures on info" do
935
- begin
936
- connection.execute("nope")
937
- rescue # rubocop:disable Lint/HandleExceptions
938
- # the raise is not what is being tested here, rather its side-effect
939
- end
940
-
941
- logged_output.string.lines.count { |l|
942
- l =~ info_line_with(
943
- "[WinRM] connection failed, retrying in 7 seconds")
944
- }.must_equal 2
945
- end
946
-
947
- it "logs the last retry failures on warn" do
948
- begin
949
- connection.execute("nope")
950
- rescue # rubocop:disable Lint/HandleExceptions
951
- # the raise is not what is being tested here, rather its side-effect
952
- end
953
-
954
- logged_output.string.lines.count { |l|
955
- l =~ warn_line_with("[WinRM] connection failed, terminating ")
956
- }.must_equal 1
957
- end
958
822
  end
959
823
  end
960
824
  end
@@ -1131,38 +995,33 @@ MSG
1131
995
 
1132
996
  let(:transporter) do
1133
997
  t = mock("file_transporter")
1134
- t.responds_like_instance_of(WinRM::Transport::FileTransporter)
998
+ t.responds_like_instance_of(WinRM::FS::Core::FileTransporter)
1135
999
  t
1136
1000
  end
1137
1001
 
1138
1002
  before do
1139
- # disable finalizer as service is a fake anyway
1140
- ObjectSpace.stubs(:define_finalizer).
1141
- with { |obj, _| obj.class == Kitchen::Transport::Winrm::Connection }
1003
+ winrm_session.stubs(:create_executor).returns(executor)
1142
1004
 
1143
- WinRM::Transport::CommandExecutor.stubs(:new).returns(executor)
1144
- executor.stubs(:open)
1145
-
1146
- WinRM::Transport::FileTransporter.stubs(:new).
1147
- with(executor, logger).returns(transporter)
1005
+ WinRM::FS::Core::FileTransporter.stubs(:new).
1006
+ with(executor).returns(transporter)
1148
1007
  transporter.stubs(:upload)
1149
1008
  end
1150
1009
 
1151
1010
  def self.common_specs_for_upload
1152
1011
  it "builds a Winrm::FileTransporter" do
1153
- WinRM::Transport::FileTransporter.unstub(:new)
1012
+ WinRM::FS::Core::FileTransporter.unstub(:new)
1154
1013
 
1155
- WinRM::Transport::FileTransporter.expects(:new).
1156
- with(executor, logger).returns(transporter)
1014
+ WinRM::FS::Core::FileTransporter.expects(:new).
1015
+ with(executor).returns(transporter)
1157
1016
 
1158
1017
  upload
1159
1018
  end
1160
1019
 
1161
1020
  it "reuses the Winrm::FileTransporter" do
1162
- WinRM::Transport::FileTransporter.unstub(:new)
1021
+ WinRM::FS::Core::FileTransporter.unstub(:new)
1163
1022
 
1164
- WinRM::Transport::FileTransporter.expects(:new).
1165
- with(executor, logger).returns(transporter).once
1023
+ WinRM::FS::Core::FileTransporter.expects(:new).
1024
+ with(executor).returns(transporter).once
1166
1025
 
1167
1026
  upload
1168
1027
  upload
@@ -1192,49 +1051,8 @@ MSG
1192
1051
  describe "#wait_until_ready" do
1193
1052
 
1194
1053
  before do
1195
- WinRM::Transport::CommandExecutor.stubs(:new).returns(executor)
1196
- # disable finalizer as service is a fake anyway
1197
- ObjectSpace.stubs(:define_finalizer).
1198
- with { |obj, _| obj.class == Kitchen::Transport::Winrm::Connection }
1054
+ winrm_session.stubs(:create_executor).returns(executor)
1199
1055
  options[:max_wait_until_ready] = 300
1200
- connection.stubs(:sleep)
1201
- end
1202
-
1203
- describe "when failing to connect" do
1204
-
1205
- before do
1206
- executor.stubs(:open).raises(Errno::ECONNREFUSED)
1207
- end
1208
-
1209
- it "attempts to connect :max_wait_until_ready / 3 times if failing" do
1210
- begin
1211
- connection.wait_until_ready
1212
- rescue # rubocop:disable Lint/HandleExceptions
1213
- # the raise is not what is being tested here, rather its side-effect
1214
- end
1215
-
1216
- logged_output.string.lines.count { |l|
1217
- l =~ info_line_with(
1218
- "Waiting for WinRM service on http://foo:5985/wsman, retrying in 3 seconds")
1219
- }.must_equal((300 / 3) - 1)
1220
- logged_output.string.lines.count { |l|
1221
- l =~ debug_line_with("[WinRM] connection failed ")
1222
- }.must_equal((300 / 3) - 1)
1223
- logged_output.string.lines.count { |l|
1224
- l =~ warn_line_with("[WinRM] connection failed, terminating ")
1225
- }.must_equal 1
1226
- end
1227
-
1228
- it "sleeps for 3 seconds between retries" do
1229
- connection.unstub(:sleep)
1230
- connection.expects(:sleep).with(3).times((300 / 3) - 1)
1231
-
1232
- begin
1233
- connection.wait_until_ready
1234
- rescue # rubocop:disable Lint/HandleExceptions
1235
- # the raise is not what is being tested here, rather its side-effect
1236
- end
1237
- end
1238
1056
  end
1239
1057
 
1240
1058
  describe "when connection is successful" do
@@ -1247,7 +1065,6 @@ MSG
1247
1065
  end
1248
1066
 
1249
1067
  before do
1250
- executor.stubs(:open).returns("shell-123")
1251
1068
  executor.expects(:run_powershell_script).
1252
1069
  with("Write-Host '[WinRM] Established\n'").returns(response)
1253
1070
  end
@@ -1267,7 +1084,6 @@ MSG
1267
1084
  end
1268
1085
 
1269
1086
  before do
1270
- executor.stubs(:open).returns("shell-123")
1271
1087
  executor.expects(:run_powershell_script).
1272
1088
  with("Write-Host '[WinRM] Established\n'").returns(response)
1273
1089
  end