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,172 @@
1
+ require "spec_helper"
2
+
3
+ module Beaker
4
+ module Options
5
+
6
+ describe Parser do
7
+ let(:parser) { Parser.new }
8
+ let(:opts_path) { File.join(File.expand_path(File.dirname(__FILE__)), "data", "opts.txt") }
9
+ let(:hosts_path) { File.join(File.expand_path(File.dirname(__FILE__)), "data", "hosts.cfg") }
10
+ let(:badyaml_path) { File.join(File.expand_path(File.dirname(__FILE__)), "data", "badyaml.cfg") }
11
+ let(:home) {ENV['HOME']}
12
+
13
+ it "supports usage function" do
14
+ expect{parser.usage}.to_not raise_error
15
+ end
16
+
17
+ repo = 'git://github.com/puppetlabs'
18
+
19
+ it "has repo set to #{repo}" do
20
+ expect(parser.repo).to be === "#{repo}"
21
+ end
22
+
23
+ #test parse_install_options
24
+ it "can transform --install PUPPET/3.1 into #{repo}/puppet.git#3.1" do
25
+ opts = ["PUPPET/3.1"]
26
+ expect(parser.parse_git_repos(opts)).to be === ["#{repo}/puppet.git#3.1"]
27
+ end
28
+ it "can transform --install FACTER/v.1.0 into #{repo}/facter.git#v.1.0" do
29
+ opts = ["FACTER/v.1.0"]
30
+ expect(parser.parse_git_repos(opts)).to be === ["#{repo}/facter.git#v.1.0"]
31
+ end
32
+ it "can transform --install HIERA/xyz into #{repo}/hiera.git#xyz" do
33
+ opts = ["HIERA/xyz"]
34
+ expect(parser.parse_git_repos(opts)).to be === ["#{repo}/hiera.git#xyz"]
35
+ end
36
+ it "can transform --install HIERA-PUPPET/path/to/repo into #{repo}/hiera-puppet.git#path/to/repo" do
37
+ opts = ["HIERA-PUPPET/path/to/repo"]
38
+ expect(parser.parse_git_repos(opts)).to be === ["#{repo}/hiera-puppet.git#path/to/repo"]
39
+ end
40
+ it "can transform --install PUPPET/3.1,FACTER/v.1.0 into #{repo}/puppet.git#3.1,#{repo}/facter.git#v.1.0" do
41
+ opts = ["PUPPET/3.1", "FACTER/v.1.0"]
42
+ expect(parser.parse_git_repos(opts)).to be === ["#{repo}/puppet.git#3.1", "#{repo}/facter.git#v.1.0"]
43
+ end
44
+ it "can leave --install git://github.com/puppetlabs/puppet.git#my/full/path alone" do
45
+ opts = ["git://github.com/puppetlabs/puppet.git#my/full/path"]
46
+ expect(parser.parse_git_repos(opts)).to be === ["git://github.com/puppetlabs/puppet.git#my/full/path"]
47
+ end
48
+
49
+ #split_arg testing
50
+ it "can split comma separated list into an array" do
51
+ arg = "file1,file2,file3"
52
+ expect(parser.split_arg(arg)).to be === ["file1", "file2", "file3"]
53
+ end
54
+ it "can use an existing Array as an acceptable argument" do
55
+ arg = ["file1", "file2", "file3"]
56
+ expect(parser.split_arg(arg)).to be === ["file1", "file2", "file3"]
57
+ end
58
+ it "can generate an array from a single value" do
59
+ arg = "i'mjustastring"
60
+ expect(parser.split_arg(arg)).to be === ["i'mjustastring"]
61
+ end
62
+
63
+ context 'testing path traversing', :use_fakefs => true do
64
+ let(:test_dir) { 'tmp/tests' }
65
+
66
+ let(:paths) { create_files(@files) }
67
+ let(:rb_test) { File.expand_path(test_dir + '/my_ruby_file.rb') }
68
+ let(:pl_test) { File.expand_path(test_dir + '/my_perl_file.pl') }
69
+ let(:sh_test) { File.expand_path(test_dir + '/my_shell_file.sh') }
70
+ let(:rb_other) { File.expand_path(test_dir + '/other/my_other_ruby_file.rb') }
71
+
72
+ it 'only collects ruby files as test files' do
73
+ @files = [ rb_test, pl_test, sh_test, rb_other ]
74
+ paths
75
+ expect(parser.file_list([File.expand_path(test_dir)])).to be === [rb_test, rb_other]
76
+ end
77
+ it 'raises an error when no ruby files are found' do
78
+ @files = [ pl_test, sh_test ]
79
+ paths
80
+ expect{parser.file_list([File.expand_path(test_dir)])}.to raise_error(ArgumentError)
81
+ end
82
+ it 'raises an error when no paths are specified for searching' do
83
+ @files = ''
84
+ expect{parser.file_list('')}.to raise_error(ArgumentError)
85
+ end
86
+
87
+ end
88
+
89
+ #test yaml file checking
90
+ it "raises error on improperly formatted yaml file" do
91
+ FakeFS.deactivate!
92
+ expect{parser.check_yaml_file(badyaml_path)}.to raise_error(ArgumentError)
93
+ end
94
+ it "raises an error when a yaml file is missing" do
95
+ FakeFS.deactivate!
96
+ expect{parser.check_yaml_file("not a path")}.to raise_error(ArgumentError)
97
+ end
98
+
99
+ it "can correctly combine arguments from different sources" do
100
+ FakeFS.deactivate!
101
+ args = ["-h", hosts_path, "--debug", "--type", "git", "--install", "PUPPET/1.0,HIERA/hello"]
102
+ expect(parser.parse_args(args)).to be === {:hosts_file=>hosts_path, :options_file=>nil, :type=>"git", :provision=>true, :preserve_hosts=>false, :root_keys=>false, :quiet=>false, :xml=>false, :color=>true, :debug=>true, :dry_run=>false, :timeout=>300, :fail_mode=>nil, :timesync=>false, :repo_proxy=>false, :add_el_extras=>false, :consoleport=>443, :pe_dir=>"/opt/enterprise/dists", :pe_version_file=>"LATEST", :pe_version_file_win=>"LATEST-win", :dot_fog=>"#{home}/.fog", :help=>false, :ec2_yaml=>"config/image_templates/ec2.yaml", :ssh=>{:config=>false, :paranoid=>false, :timeout=>300, :auth_methods=>["publickey"], :port=>22, :forward_agent=>true, :keys=>["#{home}/.ssh/id_rsa"], :user_known_hosts_file=>"#{home}/.ssh/known_hosts"}, :install=>["git://github.com/puppetlabs/puppet.git#1.0", "git://github.com/puppetlabs/hiera.git#hello"], :HOSTS=>{:"pe-ubuntu-lucid"=>{:roles=>["agent", "dashboard", "database", "master"], :vmname=>"pe-ubuntu-lucid", :platform=>"ubuntu-10.04-i386", :snapshot=>"clean-w-keys", :hypervisor=>"fusion"}, :"pe-centos6"=>{:roles=>["agent"], :vmname=>"pe-centos6", :platform=>"el-6-i386", :hypervisor=>"fusion", :snapshot=>"clean-w-keys"}}, :nfs_server=>"none", :helper=>[], :load_path=>[], :tests=>[], :pre_suite=>[], :post_suite=>[], :modules=>[]}
103
+ end
104
+
105
+ it "ensures that file-mode is one of fast/stop" do
106
+ FakeFS.deactivate!
107
+ args = ["-h", hosts_path, "--debug", "--fail-mode", "slow"]
108
+ expect{parser.parse_args(args)}.to raise_error(ArgumentError)
109
+ end
110
+
111
+ it "ensures that type is one of pe/git" do
112
+ FakeFS.deactivate!
113
+ args = ["-h", hosts_path, "--debug", "--type", "unkowns"]
114
+ expect{parser.parse_args(args)}.to raise_error(ArgumentError)
115
+ end
116
+
117
+ describe "normalize_args" do
118
+ let(:hosts) do
119
+ {
120
+ 'HOSTS' => {
121
+ :master => {
122
+ :roles => ["master","agent"],
123
+ },
124
+ :agent => {
125
+ :roles => ["agent"],
126
+ },
127
+ }
128
+ }
129
+ end
130
+
131
+ def fake_hosts_file_for_platform(hosts, platform)
132
+ hosts['HOSTS'].values.each { |h| h[:platform] = platform }
133
+ filename = "hosts_file_#{platform}"
134
+ File.open(filename, "w") do |file|
135
+ YAML.dump(hosts, file)
136
+ end
137
+ filename
138
+ end
139
+
140
+ shared_examples_for(:a_platform_supporting_only_agents) do |platform,type|
141
+ let(:args) { ["--type", type] }
142
+
143
+ it "restricts #{platform} hosts to agent for #{type}" do
144
+ hosts_file = fake_hosts_file_for_platform(hosts, platform)
145
+ args << "--hosts" << hosts_file
146
+ expect { parser.parse_args(args) }.to raise_error(ArgumentError, /#{platform}.*can only have role 'agent'/)
147
+ end
148
+ end
149
+
150
+ context "for pe" do
151
+ it_should_behave_like(:a_platform_supporting_only_agents, 'solaris', 'pe')
152
+ it_should_behave_like(:a_platform_supporting_only_agents, 'windows', 'pe')
153
+ it_should_behave_like(:a_platform_supporting_only_agents, 'el-4', 'pe')
154
+ end
155
+
156
+ context "for foss" do
157
+ it_should_behave_like(:a_platform_supporting_only_agents, 'windows', 'git')
158
+ it_should_behave_like(:a_platform_supporting_only_agents, 'el-4', 'git')
159
+
160
+ it "allows master role for solaris" do
161
+ hosts_file = fake_hosts_file_for_platform(hosts, 'solaris')
162
+ args = ["--type", "git", "--hosts", hosts_file]
163
+ options_hash = parser.parse_args(args)
164
+ expect(options_hash[:HOSTS][:master][:platform]).to match(/solaris/)
165
+ expect(options_hash[:HOSTS][:master][:roles]).to include('master')
166
+ expect(options_hash[:type]).to eq('git')
167
+ end
168
+ end
169
+ end
170
+ end
171
+ end
172
+ end
@@ -0,0 +1,15 @@
1
+ require "spec_helper"
2
+
3
+ module Beaker
4
+ module Options
5
+ describe PEVersionScraper do
6
+ it "can pull version from local LATEST file" do
7
+ expect(PEVersionScraper.load_pe_version(File.expand_path(File.dirname(__FILE__)), "data/LATEST")) === '3.0.0'
8
+ end
9
+ it "raises error when file doesn't exist" do
10
+ expect{PEVersionScraper.load_pe_version("not a valid path", "not a valid filename")}.to raise_error(ArgumentError)
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,24 @@
1
+ require "spec_helper"
2
+
3
+ module Beaker
4
+ module Options
5
+
6
+ describe Presets do
7
+ let(:presets) { Presets }
8
+
9
+ it "returns an env_vars OptionsHash" do
10
+ expect(presets.env_vars).to be_instance_of(Beaker::Options::OptionsHash)
11
+ end
12
+
13
+ it "removes all empty/nil entries in env_vars" do
14
+ expect(presets.env_vars.has_value?(nil)).to be === false and expect(presets.env_vars.has_value?({})).to be === false
15
+ end
16
+
17
+ it "returns a presets OptionsHash" do
18
+ expect(presets.presets).to be_instance_of(Beaker::Options::OptionsHash)
19
+ end
20
+
21
+
22
+ end
23
+ end
24
+ end
@@ -5,13 +5,12 @@ module Beaker
5
5
  describe PuppetCommand do
6
6
  let(:command) { @command || '/bin/ls' }
7
7
  let(:args) { @args || Array.new }
8
- let(:options) { @options || Hash.new }
8
+ let(:options) { @options || {} }
9
+ subject(:cmd) { PuppetCommand.new( command, args, options ) }
10
+ let(:host) { make_host( 'name', { :platform => @platform } ) }
9
11
 
10
- subject(:cmd) { PuppetCommand.new( command, *args, options ) }
11
- let :config do
12
- MockConfig.new({}, {'name' => {'platform' => @platform}}, @pe)
13
- end
14
- let(:host) { Host.create 'name', {}, config }
12
+ let( :nix_path ) { %q[PATH="/usr/bin:/opt/puppet-git-repos/hiera/bin:${PATH}"] }
13
+ let( :nix_lib ) { %q[RUBYLIB="/opt/puppet-git-repos/hiera/lib:/opt/puppet-git-repos/hiera-puppet/lib:${RUBYLIB}"] }
15
14
 
16
15
  it 'creates a Windows env for a Windows host' do
17
16
  @platform = 'windows'
@@ -20,13 +19,21 @@ module Beaker
20
19
  @options = { :foo => 'bar' }
21
20
 
22
21
  expect( host ).to be_a_kind_of Windows::Host
23
- expect( cmd.options ).to be == @options
24
- expect( cmd.args ).to be == @args
22
+ expect( cmd.options ).to be == options
23
+ expect( cmd.args ).to be == [@args]
25
24
  expect( cmd.command ).to be == "puppet " + @command
26
25
 
27
26
  expect( cmd.args_string ).to be == 'to the baz'
28
27
  expect( cmd.options_string ).to be == '--foo=bar'
29
- expect( cmd.environment_string_for(host, cmd.environment) ).to be == "env PATH=\"/opt/puppet-git-repos/hiera/bin:${PATH}\" RUBYLIB=\"`cygpath -w /opt/puppet-git-repos/hiera/lib`;`cygpath -w /opt/puppet-git-repos/hiera-puppet/lib`;${RUBYLIB}\" cmd.exe /c"
28
+
29
+ win_path = %q[PATH="/opt/puppet-git-repos/hiera/bin:${PATH}"]
30
+ win_lib = %q[RUBYLIB="`cygpath -w /opt/puppet-git-repos/hiera/lib`;`cygpath -w /opt/puppet-git-repos/hiera-puppet/lib`;${RUBYLIB}"]
31
+ cmd_exe = %q[cmd.exe /c]
32
+
33
+ command_line = cmd.environment_string_for( host, cmd.environment )
34
+ expect( command_line ).to include( win_path )
35
+ expect( command_line ).to include( win_lib )
36
+ expect( command_line ).to include( cmd_exe )
30
37
  end
31
38
 
32
39
  it 'creates a Unix env for a Unix host' do
@@ -37,12 +44,15 @@ module Beaker
37
44
 
38
45
  expect( host ).to be_a_kind_of Unix::Host
39
46
  expect( cmd.options ).to be == @options
40
- expect( cmd.args ).to be == @args
47
+ expect( cmd.args ).to be == [@args]
41
48
  expect( cmd.command ).to be == "puppet " + @command
42
49
 
43
50
  expect( cmd.args_string ).to be == 'to the baz'
44
51
  expect( cmd.options_string ).to be == '--foo=bar'
45
- expect( cmd.environment_string_for(host, cmd.environment) ).to be == "env PATH=\"/usr/bin:/opt/puppet-git-repos/hiera/bin:${PATH}\" RUBYLIB=\"/opt/puppet-git-repos/hiera/lib:/opt/puppet-git-repos/hiera-puppet/lib:${RUBYLIB}\""
52
+
53
+ command_line = cmd.environment_string_for( host, cmd.environment )
54
+ expect( command_line ).to include( nix_path )
55
+ expect( command_line ).to include( nix_lib )
46
56
  end
47
57
 
48
58
  it 'creates an AIX env for an AIX host' do
@@ -53,12 +63,15 @@ module Beaker
53
63
 
54
64
  expect( host ).to be_a_kind_of Aix::Host
55
65
  expect( cmd.options ).to be == @options
56
- expect( cmd.args ).to be == @args
66
+ expect( cmd.args ).to be == [@args]
57
67
  expect( cmd.command ).to be == "puppet " + @command
58
68
 
59
69
  expect( cmd.args_string ).to be == 'to the baz'
60
70
  expect( cmd.options_string ).to be == '--foo=bar'
61
- expect( cmd.environment_string_for(host, cmd.environment) ).to be == "env PATH=\"/usr/bin:/opt/puppet-git-repos/hiera/bin:${PATH}\" RUBYLIB=\"/opt/puppet-git-repos/hiera/lib:/opt/puppet-git-repos/hiera-puppet/lib:${RUBYLIB}\""
71
+
72
+ command_line = cmd.environment_string_for( host, cmd.environment )
73
+ expect( command_line ).to include( nix_path )
74
+ expect( command_line ).to include( nix_lib )
62
75
  end
63
76
 
64
77
  it 'correctly adds additional ENV to default ENV' do
@@ -69,12 +82,17 @@ module Beaker
69
82
 
70
83
  expect( host ).to be_a_kind_of Unix::Host
71
84
  expect( cmd.options ).to be == @options
72
- expect( cmd.args ).to be == @args
85
+ expect( cmd.args ).to be == [@args]
73
86
  expect( cmd.command ).to be == "puppet " + @command
74
87
 
75
88
  expect( cmd.args_string ).to be == 'to the baz'
76
89
  expect( cmd.options_string ).to be == '--foo=bar'
77
- expect( cmd.environment_string_for(host, cmd.environment) ).to be == "env PATH=\"/STRING_ENV/bin\" PATH=\"/usr/bin:/opt/puppet-git-repos/hiera/bin:${PATH}\" RUBYLIB=\"/opt/puppet-git-repos/hiera/lib:/opt/puppet-git-repos/hiera-puppet/lib:${RUBYLIB}\""
90
+ custom = %q[PATH="/STRING_ENV/bin"]
91
+
92
+ command_line = cmd.environment_string_for( host, cmd.environment )
93
+ expect( command_line ).to include( nix_path )
94
+ expect( command_line ).to include( nix_lib )
95
+ expect( command_line ).to include( custom )
78
96
  end
79
97
 
80
98
  it 'correctly adds additional :ENV to default ENV' do
@@ -85,12 +103,17 @@ module Beaker
85
103
 
86
104
  expect( host ).to be_a_kind_of Unix::Host
87
105
  expect( cmd.options ).to be == @options
88
- expect( cmd.args ).to be == @args
106
+ expect( cmd.args ).to be == [@args]
89
107
  expect( cmd.command ).to be == "puppet " + @command
90
108
 
91
109
  expect( cmd.args_string ).to be == 'to the baz'
92
110
  expect( cmd.options_string ).to be == '--foo=bar'
93
- expect( cmd.environment_string_for(host, cmd.environment) ).to be == "env PATH=\"/SYMBOL_ENV/bin\" PATH=\"/usr/bin:/opt/puppet-git-repos/hiera/bin:${PATH}\" RUBYLIB=\"/opt/puppet-git-repos/hiera/lib:/opt/puppet-git-repos/hiera-puppet/lib:${RUBYLIB}\""
111
+
112
+ custom = %q[PATH="/SYMBOL_ENV/bin"]
113
+ command_line = cmd.environment_string_for( host, cmd.environment )
114
+ expect( command_line ).to include( nix_path )
115
+ expect( command_line ).to include( nix_lib )
116
+ expect( command_line ).to include( custom )
94
117
  end
95
118
 
96
119
  it 'correctly adds additional :environment to default ENV' do
@@ -101,12 +124,17 @@ module Beaker
101
124
 
102
125
  expect( host ).to be_a_kind_of Unix::Host
103
126
  expect( cmd.options ).to be == @options
104
- expect( cmd.args ).to be == @args
127
+ expect( cmd.args ).to be == [@args]
105
128
  expect( cmd.command ).to be == "puppet " + @command
106
129
 
107
130
  expect( cmd.args_string ).to be == 'to the baz'
108
131
  expect( cmd.options_string ).to be == '--foo=bar'
109
- expect( cmd.environment_string_for(host, cmd.environment) ).to be == "env PATH=\"/SYMBOL_ENVIRONMENT/bin\" PATH=\"/usr/bin:/opt/puppet-git-repos/hiera/bin:${PATH}\" RUBYLIB=\"/opt/puppet-git-repos/hiera/lib:/opt/puppet-git-repos/hiera-puppet/lib:${RUBYLIB}\""
132
+
133
+ custom = %q[PATH="/SYMBOL_ENVIRONMENT/bin"]
134
+ command_line = cmd.environment_string_for( host, cmd.environment )
135
+ expect( command_line ).to include( nix_path )
136
+ expect( command_line ).to include( nix_lib )
137
+ expect( command_line ).to include( custom )
110
138
  end
111
139
 
112
140
  it 'correctly adds additional environment to default ENV' do
@@ -117,12 +145,17 @@ module Beaker
117
145
 
118
146
  expect( host ).to be_a_kind_of Unix::Host
119
147
  expect( cmd.options ).to be == @options
120
- expect( cmd.args ).to be == @args
148
+ expect( cmd.args ).to be == [@args]
121
149
  expect( cmd.command ).to be == "puppet " + @command
122
150
 
123
151
  expect( cmd.args_string ).to be == 'to the baz'
124
152
  expect( cmd.options_string ).to be == '--foo=bar'
125
- expect( cmd.environment_string_for(host, cmd.environment) ).to be == "env PATH=\"/STRING_ENVIRONMENT/bin\" PATH=\"/usr/bin:/opt/puppet-git-repos/hiera/bin:${PATH}\" RUBYLIB=\"/opt/puppet-git-repos/hiera/lib:/opt/puppet-git-repos/hiera-puppet/lib:${RUBYLIB}\""
153
+
154
+ custom = %q[PATH="/STRING_ENVIRONMENT/bin"]
155
+ command_line = cmd.environment_string_for( host, cmd.environment )
156
+ expect( command_line ).to include( nix_path )
157
+ expect( command_line ).to include( nix_lib )
158
+ expect( command_line ).to include( custom )
126
159
  end
127
160
  end
128
161
  end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ module Beaker
4
+ module Shared
5
+ describe ErrorHandler do
6
+
7
+ let( :backtrace ) { "I'm the backtrace\nYes I am!\nI have important information" }
8
+ let( :logger ) { double( 'logger' ) }
9
+
10
+ before :each do
11
+ logger.stub( :error ).and_return( true )
12
+ logger.stub( :pretty_backtrace ).and_return( backtrace )
13
+
14
+ end
15
+
16
+ context 'report_and_raise' do
17
+
18
+ it "records the backtrace of the exception to the logger" do
19
+ ex = Exception.new("ArgumentError")
20
+ ex.stub( :backtrace ).and_return(backtrace)
21
+ mesg = "I'm the extra message"
22
+
23
+ backtrace.each_line do |line|
24
+ logger.should_receive( :error ).with(line)
25
+ end
26
+
27
+ subject.should_receive( :raise ).once
28
+
29
+ subject.report_and_raise(logger, ex, mesg)
30
+
31
+ end
32
+
33
+
34
+
35
+ end
36
+
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,104 @@
1
+ require 'spec_helper'
2
+
3
+ module Beaker
4
+ module Shared
5
+ describe HostHandler do
6
+ let( :host_handler ) { Beaker::Shared::HostHandler }
7
+ let( :platform ) { @platform || 'unix' }
8
+ let( :hosts ) { hosts = make_hosts( { :platform => platform } )
9
+ hosts[0][:roles] = ['agent']
10
+ hosts[1][:roles] = ['master', 'dashboard', 'agent', 'database']
11
+ hosts[2][:roles] = ['agent']
12
+ hosts }
13
+
14
+ context 'get_domain_name' do
15
+
16
+ it "can find the domain for a host" do
17
+ host = make_host('name', { :stdout => "domain labs.lan d.labs.net dc1.labs.net labs.com\nnameserver 10.16.22.10\nnameserver 10.16.22.11" } )
18
+
19
+ Command.should_receive( :new ).with( "cat /etc/resolv.conf" ).once
20
+
21
+ expect( host_handler.get_domain_name( host ) ).to be === "labs.lan"
22
+
23
+ end
24
+
25
+ it "can find the search for a host" do
26
+ host = make_host('name', { :stdout => "search labs.lan d.labs.net dc1.labs.net labs.com\nnameserver 10.16.22.10\nnameserver 10.16.22.11" } )
27
+
28
+ Command.should_receive( :new ).with( "cat /etc/resolv.conf" ).once
29
+
30
+ expect( host_handler.get_domain_name( host ) ).to be === "labs.lan"
31
+
32
+ end
33
+ end
34
+
35
+ context "get_ip" do
36
+ it "can exec the get_ip command" do
37
+ host = make_host('name', { :stdout => "192.168.2.130\n" } )
38
+
39
+ Command.should_receive( :new ).with( "ip a|awk '/g/{print$2}' | cut -d/ -f1 | head -1" ).once
40
+
41
+ expect( host_handler.get_ip( host ) ).to be === "192.168.2.130"
42
+
43
+ end
44
+
45
+ end
46
+
47
+ context "set_etc_hosts" do
48
+ it "can set the /etc/hosts string on a host" do
49
+ host = make_host('name', {})
50
+ etc_hosts = "127.0.0.1 localhost\n192.168.2.130 pe-ubuntu-lucid\n192.168.2.128 pe-centos6\n192.168.2.131 pe-debian6"
51
+
52
+ Command.should_receive( :new ).with( "echo '#{etc_hosts}' > /etc/hosts" ).once
53
+ host.should_receive( :exec ).once
54
+
55
+ host_handler.set_etc_hosts(host, etc_hosts)
56
+ end
57
+
58
+ end
59
+
60
+ context "hosts_with_role" do
61
+ it "can find the master in a set of hosts" do
62
+
63
+ expect( host_handler.hosts_with_role( hosts, 'master' ) ).to be === [hosts[1]]
64
+
65
+ end
66
+
67
+ it "can find all agents in a set of hosts" do
68
+
69
+ expect( host_handler.hosts_with_role( hosts, 'agent' ) ).to be === hosts
70
+
71
+ end
72
+
73
+ it "returns [] when no match is found in a set of hosts" do
74
+
75
+ expect( host_handler.hosts_with_role( hosts, 'surprise' ) ).to be === []
76
+
77
+ end
78
+
79
+ end
80
+
81
+ context "only_host_with_role" do
82
+ it "can find the single master in a set of hosts" do
83
+
84
+ expect( host_handler.only_host_with_role( hosts, 'master' ) ).to be === hosts[1]
85
+
86
+ end
87
+
88
+ it "throws an error when more than one host with matching role is found" do
89
+
90
+ expect{ host_handler.only_host_with_role( hosts, 'agent' ) }.to raise_error(ArgumentError)
91
+
92
+ end
93
+
94
+ it "throws an error when no host is found matching the role" do
95
+
96
+ expect{ host_handler.only_host_with_role( hosts, 'surprise' ) }.to raise_error(ArgumentError)
97
+
98
+ end
99
+ end
100
+
101
+ end
102
+
103
+ end
104
+ end