beaker 0.0.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. checksums.yaml +8 -8
  2. data/.travis.yml +8 -0
  3. data/README.md +6 -6
  4. data/beaker.gemspec +6 -2
  5. data/lib/beaker.rb +1 -1
  6. data/lib/beaker/answers.rb +34 -7
  7. data/lib/beaker/answers/version20.rb +124 -0
  8. data/lib/beaker/answers/version28.rb +21 -0
  9. data/lib/beaker/answers/version30.rb +24 -5
  10. data/lib/beaker/cli.rb +55 -41
  11. data/lib/beaker/command.rb +2 -2
  12. data/lib/beaker/dsl/helpers.rb +320 -106
  13. data/lib/beaker/dsl/install_utils.rb +202 -81
  14. data/lib/beaker/dsl/roles.rb +40 -0
  15. data/lib/beaker/host.rb +28 -20
  16. data/lib/beaker/host/unix.rb +7 -4
  17. data/lib/beaker/host/unix/pkg.rb +42 -12
  18. data/lib/beaker/host/windows.rb +9 -5
  19. data/lib/beaker/host/windows/group.rb +1 -1
  20. data/lib/beaker/host/windows/pkg.rb +41 -8
  21. data/lib/beaker/hypervisor.rb +23 -10
  22. data/lib/beaker/hypervisor/aixer.rb +15 -19
  23. data/lib/beaker/hypervisor/blimper.rb +71 -72
  24. data/lib/beaker/hypervisor/fusion.rb +11 -10
  25. data/lib/beaker/hypervisor/solaris.rb +17 -23
  26. data/lib/beaker/hypervisor/vagrant.rb +27 -12
  27. data/lib/beaker/hypervisor/vcloud.rb +154 -138
  28. data/lib/beaker/hypervisor/vcloud_pooled.rb +97 -0
  29. data/lib/beaker/hypervisor/vsphere.rb +8 -5
  30. data/lib/beaker/hypervisor/vsphere_helper.rb +43 -33
  31. data/lib/beaker/network_manager.rb +16 -12
  32. data/lib/beaker/options/command_line_parser.rb +199 -0
  33. data/lib/beaker/options/hosts_file_parser.rb +39 -0
  34. data/lib/beaker/options/options_file_parser.rb +45 -0
  35. data/lib/beaker/options/options_hash.rb +294 -0
  36. data/lib/beaker/options/parser.rb +288 -0
  37. data/lib/beaker/options/pe_version_scraper.rb +35 -0
  38. data/lib/beaker/options/presets.rb +70 -0
  39. data/lib/beaker/shared.rb +2 -1
  40. data/lib/beaker/shared/host_handler.rb +7 -2
  41. data/lib/beaker/shared/repetition.rb +1 -0
  42. data/lib/beaker/shared/timed.rb +14 -0
  43. data/lib/beaker/test_case.rb +2 -38
  44. data/lib/beaker/test_suite.rb +11 -25
  45. data/lib/beaker/utils/repo_control.rb +6 -8
  46. data/lib/beaker/utils/setup_helper.rb +9 -20
  47. data/spec/beaker/answers_spec.rb +109 -0
  48. data/spec/beaker/command_spec.rb +2 -2
  49. data/spec/beaker/dsl/assertions_spec.rb +1 -3
  50. data/spec/beaker/dsl/helpers_spec.rb +519 -84
  51. data/spec/beaker/dsl/install_utils_spec.rb +265 -16
  52. data/spec/beaker/dsl/roles_spec.rb +31 -10
  53. data/spec/beaker/host/windows/group_spec.rb +55 -0
  54. data/spec/beaker/host_spec.rb +130 -40
  55. data/spec/beaker/hypervisor/aixer_spec.rb +34 -0
  56. data/spec/beaker/hypervisor/blimper_spec.rb +77 -0
  57. data/spec/beaker/hypervisor/fusion_spec.rb +26 -0
  58. data/spec/beaker/hypervisor/hypervisor_spec.rb +66 -0
  59. data/spec/beaker/hypervisor/solaris_spec.rb +39 -0
  60. data/spec/beaker/hypervisor/vagrant_spec.rb +105 -0
  61. data/spec/beaker/hypervisor/vcloud_pooled_spec.rb +60 -0
  62. data/spec/beaker/hypervisor/vcloud_spec.rb +70 -0
  63. data/spec/beaker/hypervisor/vsphere_helper_spec.rb +162 -0
  64. data/spec/beaker/hypervisor/vsphere_spec.rb +76 -0
  65. data/spec/beaker/options/command_line_parser_spec.rb +25 -0
  66. data/spec/beaker/options/data/LATEST +1 -0
  67. data/spec/beaker/options/data/badyaml.cfg +21 -0
  68. data/spec/beaker/options/data/hosts.cfg +21 -0
  69. data/spec/beaker/options/data/opts.txt +6 -0
  70. data/spec/beaker/options/hosts_file_parser_spec.rb +30 -0
  71. data/spec/beaker/options/options_file_parser_spec.rb +23 -0
  72. data/spec/beaker/options/options_hash_spec.rb +111 -0
  73. data/spec/beaker/options/parser_spec.rb +172 -0
  74. data/spec/beaker/options/pe_version_scaper_spec.rb +15 -0
  75. data/spec/beaker/options/presets_spec.rb +24 -0
  76. data/spec/beaker/puppet_command_spec.rb +54 -21
  77. data/spec/beaker/shared/error_handler_spec.rb +40 -0
  78. data/spec/beaker/shared/host_handler_spec.rb +104 -0
  79. data/spec/beaker/shared/repetition_spec.rb +72 -0
  80. data/spec/beaker/test_suite_spec.rb +3 -16
  81. data/spec/beaker/utils/ntp_control_spec.rb +42 -0
  82. data/spec/beaker/utils/repo_control_spec.rb +168 -0
  83. data/spec/beaker/utils/setup_helper_spec.rb +82 -0
  84. data/spec/beaker/utils/validator_spec.rb +58 -0
  85. data/spec/helpers.rb +97 -0
  86. data/spec/matchers.rb +39 -0
  87. data/spec/mock_blimpy.rb +48 -0
  88. data/spec/mock_fission.rb +60 -0
  89. data/spec/mock_vsphere.rb +310 -0
  90. data/spec/mock_vsphere_helper.rb +183 -0
  91. data/spec/mocks.rb +83 -0
  92. data/spec/spec_helper.rb +8 -1
  93. metadata +106 -13
  94. data/beaker.rb +0 -10
  95. data/lib/beaker/options_parsing.rb +0 -323
  96. data/lib/beaker/test_config.rb +0 -148
  97. data/spec/beaker/options_parsing_spec.rb +0 -37
  98. data/spec/mocks_and_helpers.rb +0 -34
@@ -0,0 +1,72 @@
1
+ require 'spec_helper'
2
+
3
+ module Beaker
4
+ module Shared
5
+ describe Repetition do
6
+
7
+ context 'repeat_for' do
8
+ it "repeats a block for 5 seconds" do
9
+ Time.stub( :now ).and_return( 0, 1, 2, 3, 4, 5, 6 )
10
+
11
+ block = double( 'block' )
12
+ block.should_receive( :exec ).exactly( 5 ).times.and_return( false )
13
+
14
+ subject.repeat_for( 5 ) do
15
+ block.exec
16
+ end
17
+ end
18
+
19
+ it "should short circuit if the block is complete" do
20
+ Time.stub( :now ).and_return( 0, 1, 2, 3, 4, 5 )
21
+
22
+ block = double( 'block' )
23
+ block.should_receive( :exec ).once.and_return( true )
24
+
25
+ subject.repeat_for( 5 ) do
26
+ block.exec
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+
33
+ context 'repeat_fibonacci_style_for' do
34
+ it "sleeps in fibonacci increasing intervals" do
35
+
36
+ block = double( 'block' )
37
+ block.should_receive( :exec ).exactly( 5 ).times.and_return( false )
38
+ subject.stub( 'sleep' ).and_return( true )
39
+ subject.should_receive( :sleep ).with( 1 ).exactly( 2 ).times
40
+ subject.should_receive( :sleep ).with( 2 ).once
41
+ subject.should_receive( :sleep ).with( 3 ).once
42
+ subject.should_receive( :sleep ).with( 5 ).once
43
+ subject.should_receive( :sleep ).with( 8 ).never
44
+
45
+ subject.repeat_fibonacci_style_for( 5 ) do
46
+ block.exec
47
+ end
48
+
49
+ end
50
+
51
+ it "should short circuit if the block is complete" do
52
+
53
+ block = double( 'block' )
54
+ block.should_receive( :exec ).once.and_return( true )
55
+ subject.stub( 'sleep' ).and_return( true )
56
+ subject.should_receive( :sleep ).with( 1 ).once
57
+ subject.should_receive( :sleep ).with( 2 ).never
58
+ subject.should_receive( :sleep ).with( 3 ).never
59
+ subject.should_receive( :sleep ).with( 5 ).never
60
+ subject.should_receive( :sleep ).with( 8 ).never
61
+
62
+ subject.repeat_fibonacci_style_for( 5 ) do
63
+ block.exec
64
+ end
65
+
66
+ end
67
+ end
68
+
69
+ end
70
+
71
+ end
72
+ end
@@ -7,38 +7,25 @@ module Beaker
7
7
  context 'new', :use_fakefs => true do
8
8
  let(:test_dir) { 'tmp/tests' }
9
9
 
10
- let(:options) { {:tests => create_files(@files)} }
10
+ let(:options) { {'name' => create_files(@files)} }
11
11
  let(:rb_test) { File.expand_path(test_dir + '/my_ruby_file.rb') }
12
12
  let(:pl_test) { File.expand_path(test_dir + '/my_perl_file.pl') }
13
13
  let(:sh_test) { File.expand_path(test_dir + '/my_shell_file.sh') }
14
14
 
15
15
  it 'fails without test files' do
16
16
  expect { Beaker::TestSuite.new 'name', 'hosts',
17
- Hash.new, 'config', :stop_on_error }.to raise_error
17
+ Hash.new, :stop_on_error }.to raise_error
18
18
  end
19
19
 
20
20
  it 'includes specific files as test file when explicitly passed' do
21
21
  @files = [ rb_test ]
22
22
  ts = Beaker::TestSuite.new 'name', 'hosts', options,
23
- 'config', :stop_on_error
23
+ :stop_on_error
24
24
 
25
25
  expect { ts.instance_variable_get(:@test_files).
26
26
  include? rb_test }.to be_true
27
27
  end
28
28
 
29
- it 'includes only .rb files as test files when dir is passed' do
30
- create_files [ rb_test, pl_test, sh_test ]
31
- @files = [ test_dir ]
32
-
33
- ts = Beaker::TestSuite.new 'name', 'hosts',
34
- options, 'config', :stop_on_error
35
-
36
- processed_files = ts.instance_variable_get :@test_files
37
-
38
- expect(processed_files).to include(rb_test)
39
- expect(processed_files).to_not include(sh_test)
40
- expect(processed_files).to_not include(pl_test)
41
- end
42
29
  end
43
30
  end
44
31
  end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ module Beaker
4
+ module Utils
5
+ describe NTPControl do
6
+ let( :ntpserver ) { Beaker::Utils::NTPControl::NTPSERVER }
7
+ let( :ntp_control ) { Beaker::Utils::NTPControl.new( make_opts, @hosts) }
8
+
9
+ it "can sync time on unix hosts" do
10
+ @hosts = make_hosts( { :platform => 'unix' } )
11
+
12
+ Command.should_receive( :new ).with("ntpdate -t 20 #{ntpserver}").exactly( 3 ).times
13
+
14
+ ntp_control.timesync
15
+
16
+ end
17
+
18
+ it "can sync time on solaris-10 hosts" do
19
+ @hosts = make_hosts( { :platform => 'solaris-10' } )
20
+
21
+ Command.should_receive( :new ).with("sleep 10 && ntpdate -w #{ntpserver}").exactly( 3 ).times
22
+
23
+ ntp_control.timesync
24
+
25
+ end
26
+
27
+ it "can sync time on windows hosts" do
28
+ @hosts = make_hosts( { :platform => 'windows' } )
29
+
30
+ Command.should_receive( :new ).with("w32tm /register").exactly( 3 ).times
31
+ Command.should_receive( :new ).with("net start w32time").exactly( 3 ).times
32
+ Command.should_receive( :new ).with("w32tm /config /manualpeerlist:#{ntpserver} /syncfromflags:manual /update").exactly( 3 ).times
33
+ Command.should_receive( :new ).with("w32tm /resync").exactly( 3 ).times
34
+
35
+ ntp_control.timesync
36
+
37
+ end
38
+
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,168 @@
1
+ require 'spec_helper'
2
+
3
+ module Beaker
4
+ module Utils
5
+ describe RepoControl do
6
+ let( :apt_cfg ) { Beaker::Utils::RepoControl::APT_CFG }
7
+ let( :ips_pkg_repo ) { Beaker::Utils::RepoControl::IPS_PKG_REPO }
8
+ let( :repo_control ) { Beaker::Utils::RepoControl.new( make_opts, @hosts) }
9
+
10
+ context "epel_info_for!" do
11
+
12
+ it "can return the correct url for an el-6 host" do
13
+ host = make_host( 'testhost', { :platform => 'el-6-platform' } )
14
+
15
+ expect( repo_control.epel_info_for!( host )).to be === "http://mirror.itc.virginia.edu/fedora-epel/6/i386/epel-release-6-8.noarch.rpm"
16
+ end
17
+
18
+ it "can return the correct url for an el-5 host" do
19
+ host = make_host( 'testhost', { :platform => 'el-5-platform' } )
20
+
21
+ expect( repo_control.epel_info_for!( host )).to be === "http://archive.linux.duke.edu/pub/epel/5/i386/epel-release-5-4.noarch.rpm"
22
+
23
+ end
24
+
25
+ it "raises an error on non el-5/6 host" do
26
+ host = make_host( 'testhost', { :platform => 'el-4-platform' } )
27
+
28
+ expect{ repo_control.epel_info_for!( host )}.to raise_error
29
+
30
+ end
31
+
32
+ end
33
+
34
+ context "apt_get_update" do
35
+
36
+ it "can perform apt-get on ubuntu hosts" do
37
+ host = make_host( 'testhost', { :platform => 'ubuntu' } )
38
+
39
+ Command.should_receive( :new ).with("apt-get -y -f -m update").once
40
+
41
+ repo_control.apt_get_update( host )
42
+
43
+ end
44
+
45
+ it "can perform apt-get on debian hosts" do
46
+ host = make_host( 'testhost', { :platform => 'debian' } )
47
+
48
+ Command.should_receive( :new ).with("apt-get -y -f -m update").once
49
+
50
+ repo_control.apt_get_update( host )
51
+
52
+ end
53
+
54
+ it "does nothing on non debian/ubuntu hosts" do
55
+ host = make_host( 'testhost', { :platform => 'windows' } )
56
+
57
+ Command.should_receive( :new ).never
58
+
59
+ repo_control.apt_get_update( host )
60
+
61
+ end
62
+
63
+ end
64
+
65
+ context "copy_file_to_remote" do
66
+
67
+ it "can copy a file to a remote host" do
68
+ content = "this is the content"
69
+ tempfilepath = "/path/to/tempfile"
70
+ filepath = "/path/to/file"
71
+ host = make_host( 'testhost', { :platform => 'windows' })
72
+ tempfile = double( 'tempfile' )
73
+ tempfile.stub( :path ).and_return( tempfilepath )
74
+ Tempfile.stub( :open ).and_yield( tempfile )
75
+ file = double( 'file' )
76
+ File.stub( :open ).and_yield( file )
77
+
78
+ file.should_receive( :puts ).with( content ).once
79
+ host.should_receive( :do_scp_to ).with( tempfilepath, filepath, repo_control.instance_variable_get( :@options ) ).once
80
+
81
+ repo_control.copy_file_to_remote(host, filepath, content)
82
+
83
+ end
84
+
85
+
86
+ end
87
+
88
+ context "proxy_config" do
89
+
90
+ it "correctly configures ubuntu hosts" do
91
+ @hosts = make_hosts( { :platform => 'ubuntu', :exit_code => 1 } )
92
+
93
+ Command.should_receive( :new ).with( "if test -f /etc/apt/apt.conf; then mv /etc/apt/apt.conf /etc/apt/apt.conf.bk; fi" ).exactly( 3 )
94
+ @hosts.each do |host|
95
+ repo_control.should_receive( :copy_file_to_remote ).with( host, '/etc/apt/apt.conf', apt_cfg ).once
96
+ repo_control.should_receive( :apt_get_update ).with( host ).once
97
+ end
98
+
99
+ repo_control.proxy_config
100
+
101
+ end
102
+
103
+ it "correctly configures debian hosts" do
104
+ @hosts = make_hosts( { :platform => 'debian' } )
105
+
106
+ Command.should_receive( :new ).with( "if test -f /etc/apt/apt.conf; then mv /etc/apt/apt.conf /etc/apt/apt.conf.bk; fi" ).exactly( 3 ).times
107
+ @hosts.each do |host|
108
+ repo_control.should_receive( :copy_file_to_remote ).with( host, '/etc/apt/apt.conf', apt_cfg ).once
109
+ repo_control.should_receive( :apt_get_update ).with( host ).once
110
+ end
111
+
112
+ repo_control.proxy_config
113
+
114
+ end
115
+
116
+ it "correctly configures solaris-11 hosts" do
117
+ @hosts = make_hosts( { :platform => 'solaris-11' } )
118
+
119
+ Command.should_receive( :new ).with( "/usr/bin/pkg unset-publisher solaris || :" ).exactly( 3 ).times
120
+ @hosts.each do |host|
121
+ Command.should_receive( :new ).with( "/usr/bin/pkg set-publisher -g %s solaris" % ips_pkg_repo ).once
122
+ end
123
+
124
+ repo_control.proxy_config
125
+
126
+ end
127
+
128
+ it "does nothing for non ubuntu/debian/solaris-11 hosts" do
129
+ @hosts = make_hosts( { :platform => 'windows' } )
130
+
131
+ Command.should_receive( :new ).never
132
+
133
+ repo_control.proxy_config
134
+
135
+ end
136
+ end
137
+
138
+ context "add_el_extras" do
139
+
140
+ it "add extras for el-5/6 hosts" do
141
+ @hosts = make_hosts( { :platform => 'el-5', :exit_code => 1 } )
142
+ @hosts[0][:platform] = 'el-6'
143
+ url = "http://el_extras_url"
144
+
145
+ repo_control.stub( :epel_info_for! ).and_return( url )
146
+
147
+ Command.should_receive( :new ).with("rpm -qa | grep epel-release").exactly( 3 ).times
148
+ Command.should_receive( :new ).with("rpm -i #{url}").exactly( 3 ).times
149
+ Command.should_receive( :new ).with("yum clean all && yum makecache").exactly( 3 ).times
150
+
151
+ repo_control.add_el_extras
152
+
153
+ end
154
+
155
+ it "should do nothing for non el-5/6 hosts" do
156
+ @hosts = make_hosts( { :platform => 'windows' } )
157
+
158
+ Command.should_receive( :new ).never
159
+
160
+ repo_control.add_el_extras
161
+
162
+ end
163
+ end
164
+
165
+ end
166
+
167
+ end
168
+ end
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+
3
+ module Beaker
4
+ module Utils
5
+ describe SetupHelper do
6
+ let( :setup_helper ) { Beaker::Utils::SetupHelper.new( make_opts, hosts) }
7
+ let( :sync_cmd ) { Beaker::Utils::SetupHelper::ROOT_KEYS_SYNC_CMD }
8
+ let( :platform ) { @platform || 'unix' }
9
+ let( :ip ) { "ip.address.0.0" }
10
+ let( :stdout) { @stdout || ip }
11
+ let( :hosts ) { hosts = make_hosts( { :stdout => stdout, :platform => platform } )
12
+ hosts[0][:roles] = ['agent']
13
+ hosts[1][:roles] = ['master', 'dashboard', 'agent', 'database']
14
+ hosts[2][:roles] = ['agent']
15
+ hosts }
16
+
17
+ context "add_master_entry" do
18
+
19
+ it "can configure /etc/hosts on a unix master" do
20
+ path = Beaker::Utils::SetupHelper::ETC_HOSTS_PATH
21
+ master = setup_helper.only_host_with_role(hosts, :master)
22
+
23
+ Command.should_receive( :new ).with( "ip a|awk '/g/{print$2}' | cut -d/ -f1 | head -1" ).once
24
+ Command.should_receive( :new ).with( "cp %s %s.old" % [path, path] ).once
25
+ Command.should_receive( :new ).with( "cp %s %s.new" % [path, path] ).once
26
+ Command.should_receive( :new ).with( "grep -v '#{ip} #{master}' %s > %s.new" % [path, path] ).once
27
+ Command.should_receive( :new ).with( "echo '#{ip} #{master}' >> %s.new" % path ).once
28
+ Command.should_receive( :new ).with( "mv %s.new %s" % [path, path] ).once
29
+
30
+ setup_helper.add_master_entry
31
+ end
32
+
33
+ it "can configure /etc/hosts on a solaris master" do
34
+ @platform = 'solaris'
35
+ path = Beaker::Utils::SetupHelper::ETC_HOSTS_PATH_SOLARIS
36
+ master = setup_helper.only_host_with_role(hosts, :master)
37
+
38
+ Command.should_receive( :new ).with( "ifconfig -a inet| awk '/broadcast/ {print $2}' | cut -d/ -f1 | head -1" ).once
39
+ Command.should_receive( :new ).with( "cp %s %s.old" % [path, path] ).once
40
+ Command.should_receive( :new ).with( "cp %s %s.new" % [path, path] ).once
41
+ Command.should_receive( :new ).with( "grep -v '#{ip} #{master}' %s > %s.new" % [path, path] ).once
42
+ Command.should_receive( :new ).with( "echo '#{ip} #{master}' >> %s.new" % path ).once
43
+ Command.should_receive( :new ).with( "mv %s.new %s" % [path, path] ).once
44
+
45
+ setup_helper.add_master_entry
46
+ end
47
+
48
+ it "does nothing on a vagrant master" do
49
+ master = setup_helper.only_host_with_role(hosts, :master)
50
+ master[:hypervisor] = 'vagrant'
51
+
52
+ Command.should_receive( :new ).never
53
+
54
+ setup_helper.add_master_entry
55
+
56
+ end
57
+ end
58
+
59
+ context "sync_root_keys" do
60
+
61
+ it "can sync keys on a solaris host" do
62
+ @platform = 'solaris'
63
+
64
+ Command.should_receive( :new ).with( sync_cmd % "bash" ).exactly( 3 ).times
65
+
66
+ setup_helper.sync_root_keys
67
+
68
+ end
69
+
70
+ it "can sync keys on a non-solaris host" do
71
+
72
+ Command.should_receive( :new ).with( sync_cmd % "env PATH=/usr/gnu/bin:$PATH bash" ).exactly( 3 ).times
73
+
74
+ setup_helper.sync_root_keys
75
+
76
+ end
77
+
78
+ end
79
+
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ module Beaker
4
+ module Utils
5
+ describe Validator do
6
+ let( :validator ) { Beaker::Utils::Validator }
7
+ let( :pkgs ) { Beaker::Utils::Validator::PACKAGES }
8
+ let( :unix_only_pkgs ) { Beaker::Utils::Validator::UNIX_PACKAGES }
9
+ let( :platform ) { @platform || 'unix' }
10
+ let( :hosts ) { hosts = make_hosts( { :platform => platform } )
11
+ hosts[0][:roles] = ['agent']
12
+ hosts[1][:roles] = ['master', 'dashboard', 'agent', 'database']
13
+ hosts[2][:roles] = ['agent']
14
+ hosts }
15
+
16
+ context "can validate the SUTs" do
17
+
18
+ it "can validate unix hosts" do
19
+
20
+ hosts.each do |host|
21
+ pkgs.each do |pkg|
22
+ host.should_receive( :check_for_package ).with( pkg ).once.and_return( false )
23
+ host.should_receive( :install_package ).with( pkg ).once
24
+ end
25
+ unix_only_pkgs.each do |pkg|
26
+ host.should_receive( :check_for_package ).with( pkg ).once.and_return( false )
27
+ host.should_receive( :install_package ).with( pkg ).once
28
+ end
29
+
30
+ end
31
+
32
+ validator.validate(hosts, logger)
33
+
34
+ end
35
+
36
+ it "can validate windows hosts" do
37
+ @platform = 'windows'
38
+
39
+ hosts.each do |host|
40
+ pkgs.each do |pkg|
41
+ host.should_receive( :check_for_package ).with( pkg ).once.and_return( false )
42
+ host.should_receive( :install_package ).with( pkg ).once
43
+ end
44
+ unix_only_pkgs.each do |pkg|
45
+ host.should_receive( :check_for_package).with( pkg ).never
46
+ host.should_receive( :install_package ).with( pkg ).never
47
+ end
48
+ end
49
+
50
+ validator.validate(hosts, logger)
51
+
52
+ end
53
+ end
54
+
55
+
56
+ end
57
+ end
58
+ end