beaker 2.7.1 → 2.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +8 -8
  2. data/HISTORY.md +121 -2
  3. data/lib/beaker/dsl.rb +2 -2
  4. data/lib/beaker/dsl/helpers.rb +13 -1429
  5. data/lib/beaker/dsl/helpers/facter_helpers.rb +48 -0
  6. data/lib/beaker/dsl/helpers/hiera_helpers.rb +71 -0
  7. data/lib/beaker/dsl/helpers/host_helpers.rb +506 -0
  8. data/lib/beaker/dsl/helpers/puppet_helpers.rb +698 -0
  9. data/lib/beaker/dsl/helpers/tk_helpers.rb +101 -0
  10. data/lib/beaker/dsl/helpers/web_helpers.rb +115 -0
  11. data/lib/beaker/dsl/install_utils.rb +8 -1570
  12. data/lib/beaker/dsl/install_utils/ezbake_utils.rb +256 -0
  13. data/lib/beaker/dsl/install_utils/module_utils.rb +237 -0
  14. data/lib/beaker/dsl/install_utils/pe_utils.rb +518 -0
  15. data/lib/beaker/dsl/install_utils/puppet_utils.rb +722 -0
  16. data/lib/beaker/dsl/outcomes.rb +0 -4
  17. data/lib/beaker/dsl/roles.rb +0 -3
  18. data/lib/beaker/dsl/structure.rb +127 -4
  19. data/lib/beaker/dsl/wrappers.rb +0 -4
  20. data/lib/beaker/host.rb +23 -0
  21. data/lib/beaker/host/unix/pkg.rb +4 -4
  22. data/lib/beaker/host_prebuilt_steps.rb +11 -5
  23. data/lib/beaker/hypervisor/vagrant.rb +1 -0
  24. data/lib/beaker/hypervisor/vmpooler.rb +38 -0
  25. data/lib/beaker/logger.rb +10 -4
  26. data/lib/beaker/network_manager.rb +5 -4
  27. data/lib/beaker/options/command_line_parser.rb +7 -0
  28. data/lib/beaker/shared.rb +2 -1
  29. data/lib/beaker/shared/semvar.rb +41 -0
  30. data/lib/beaker/test_suite.rb +20 -6
  31. data/lib/beaker/version.rb +1 -1
  32. data/spec/beaker/dsl/helpers/facter_helpers_spec.rb +59 -0
  33. data/spec/beaker/dsl/helpers/hiera_helpers_spec.rb +96 -0
  34. data/spec/beaker/dsl/helpers/host_helpers_spec.rb +413 -0
  35. data/spec/beaker/dsl/{helpers_spec.rb → helpers/puppet_helpers_spec.rb} +2 -611
  36. data/spec/beaker/dsl/helpers/tk_helpers_spec.rb +83 -0
  37. data/spec/beaker/dsl/helpers/web_helpers_spec.rb +60 -0
  38. data/spec/beaker/dsl/install_utils/module_utils_spec.rb +241 -0
  39. data/spec/beaker/dsl/install_utils/pe_utils_spec.rb +475 -0
  40. data/spec/beaker/dsl/install_utils/puppet_utils_spec.rb +523 -0
  41. data/spec/beaker/dsl/structure_spec.rb +108 -0
  42. data/spec/beaker/host_prebuilt_steps_spec.rb +44 -0
  43. data/spec/beaker/host_spec.rb +41 -0
  44. data/spec/beaker/hypervisor/vagrant_spec.rb +2 -1
  45. data/spec/beaker/logger_spec.rb +9 -2
  46. data/spec/beaker/network_manager_spec.rb +7 -1
  47. data/spec/beaker/options/command_line_parser_spec.rb +3 -2
  48. data/spec/beaker/shared/semvar_spec.rb +36 -0
  49. data/spec/beaker/test_suite_spec.rb +48 -0
  50. data/spec/mocks.rb +10 -0
  51. metadata +23 -5
  52. data/lib/beaker/dsl/ezbake_utils.rb +0 -259
  53. data/spec/beaker/dsl/install_utils_spec.rb +0 -1242
@@ -84,4 +84,112 @@ describe ClassMixedWithDSLStructure do
84
84
  expect{ subject.expect_failure 'this has no failure', &block }.to raise_error(RuntimeError, /An assertion was expected to fail, but passed/)
85
85
  end
86
86
  end
87
+
88
+ describe 'confine' do
89
+ let(:logger) { double.as_null_object }
90
+ before do
91
+ allow( subject ).to receive( :logger ).and_return( logger )
92
+ end
93
+
94
+ it 'skips the test if there are no applicable hosts' do
95
+ allow( subject ).to receive( :hosts ).and_return( [] )
96
+ allow( subject ).to receive( :hosts= )
97
+ expect( logger ).to receive( :warn )
98
+ expect( subject ).to receive( :skip_test ).
99
+ with( 'No suitable hosts found' )
100
+
101
+ subject.confine( :to, {} )
102
+ end
103
+
104
+ it 'raises when given mode is not :to or :except' do
105
+ allow( subject ).to receive( :hosts )
106
+ allow( subject ).to receive( :hosts= )
107
+
108
+ expect {
109
+ subject.confine( :regardless, {:thing => 'value'} )
110
+ }.to raise_error( 'Unknown option regardless' )
111
+ end
112
+
113
+ it 'rejects hosts that do not meet simple hash criteria' do
114
+ hosts = [ {'thing' => 'foo'}, {'thing' => 'bar'} ]
115
+
116
+ expect( subject ).to receive( :hosts ).and_return( hosts )
117
+ expect( subject ).to receive( :hosts= ).
118
+ with( [ {'thing' => 'foo'} ] )
119
+
120
+ subject.confine :to, :thing => 'foo'
121
+ end
122
+
123
+ it 'rejects hosts that match a list of criteria' do
124
+ hosts = [ {'thing' => 'foo'}, {'thing' => 'bar'}, {'thing' => 'baz'} ]
125
+
126
+ expect( subject ).to receive( :hosts ).and_return( hosts )
127
+ expect( subject ).to receive( :hosts= ).
128
+ with( [ {'thing' => 'bar'} ] )
129
+
130
+ subject.confine :except, :thing => ['foo', 'baz']
131
+ end
132
+
133
+ it 'rejects hosts when a passed block returns true' do
134
+ host1 = {'platform' => 'solaris'}
135
+ host2 = {'platform' => 'solaris'}
136
+ host3 = {'platform' => 'windows'}
137
+ ret1 = (Struct.new('Result1', :stdout)).new(':global')
138
+ ret2 = (Struct.new('Result2', :stdout)).new('a_zone')
139
+ hosts = [ host1, host2, host3 ]
140
+
141
+ expect( subject ).to receive( :hosts ).and_return( hosts )
142
+ expect( subject ).to receive( :on ).
143
+ with( host1, '/sbin/zonename' ).
144
+ and_return( ret1 )
145
+ expect( subject ).to receive( :on ).
146
+ with( host1, '/sbin/zonename' ).
147
+ and_return( ret2 )
148
+
149
+ expect( subject ).to receive( :hosts= ).with( [ host1 ] )
150
+
151
+ subject.confine :to, :platform => 'solaris' do |host|
152
+ subject.on( host, '/sbin/zonename' ).stdout =~ /:global/
153
+ end
154
+ end
155
+ end
156
+
157
+ describe '#select_hosts' do
158
+ let(:logger) { double.as_null_object }
159
+ before do
160
+ allow( subject ).to receive( :logger ).and_return( logger )
161
+ end
162
+
163
+ it 'it returns an empty array if there are no applicable hosts' do
164
+ hosts = [ {'thing' => 'foo'}, {'thing' => 'bar'} ]
165
+
166
+ expect(subject.select_hosts( {'thing' => 'nope'}, hosts )).to be == []
167
+ end
168
+
169
+ it 'selects hosts that match a list of criteria' do
170
+ hosts = [ {'thing' => 'foo'}, {'thing' => 'bar'}, {'thing' => 'baz'} ]
171
+
172
+ expect(subject.select_hosts( {:thing => ['foo', 'baz']}, hosts )).to be == [ {'thing' => 'foo'}, {'thing' => 'baz'} ]
173
+ end
174
+
175
+ it 'selects hosts when a passed block returns true' do
176
+ host1 = {'platform' => 'solaris1'}
177
+ host2 = {'platform' => 'solaris2'}
178
+ host3 = {'platform' => 'windows'}
179
+ ret1 = double('result1')
180
+ allow( ret1 ).to receive( :stdout ).and_return(':global')
181
+ ret2 = double('result2')
182
+ allow( ret2 ).to receive( :stdout ).and_return('a_zone')
183
+ hosts = [ host1, host2, host3 ]
184
+ expect( subject ).to receive( :hosts ).and_return( hosts )
185
+
186
+ expect( subject ).to receive( :on ).with( host1, '/sbin/zonename' ).once.and_return( ret1 )
187
+ expect( subject ).to receive( :on ).with( host2, '/sbin/zonename' ).once.and_return( ret2 )
188
+
189
+ selected_hosts = subject.select_hosts 'platform' => 'solaris' do |host|
190
+ subject.on(host, '/sbin/zonename').stdout =~ /:global/
191
+ end
192
+ expect( selected_hosts ).to be == [ host1 ]
193
+ end
194
+ end
87
195
  end
@@ -21,6 +21,50 @@ describe Beaker do
21
21
  hosts }
22
22
  let( :dummy_class ) { Class.new { include Beaker::HostPrebuiltSteps } }
23
23
 
24
+ shared_examples 'enables_root_login' do |platform, commands, non_cygwin|
25
+ subject { dummy_class.new }
26
+ it "can enable root login on #{platform}" do
27
+ hosts = make_hosts( { :platform => platform, :is_cygwin => non_cygwin} )
28
+
29
+ if commands.empty?
30
+ expect( Beaker::Command ).to receive( :new ).exactly( 0 ).times
31
+ end
32
+
33
+ commands.each do | command |
34
+ expect( Beaker::Command ).to receive( :new ).with(command).exactly( 3 ).times
35
+ end
36
+
37
+ subject.enable_root_login( hosts, options )
38
+ end
39
+ end
40
+
41
+ # Non-cygwin Windows
42
+ it_should_behave_like 'enables_root_login', 'pswindows', [], false
43
+
44
+ # Non-cygwin Windows
45
+ it_should_behave_like 'enables_root_login', 'windows', [
46
+ "sudo su -c \"sed -ri 's/^#?PermitRootLogin no|^#?PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config\""
47
+ ], true
48
+
49
+ it_should_behave_like 'enables_root_login', 'osx', [
50
+ "sudo sed -i '' 's/#PermitRootLogin yes/PermitRootLogin Yes/g' /etc/sshd_config",
51
+ "sudo sed -i '' 's/#PermitRootLogin no/PermitRootLogin Yes/g' /etc/sshd_config"
52
+ ]
53
+
54
+ ['debian','ubuntu','cumulus'].each do | deb_like |
55
+ it_should_behave_like 'enables_root_login', deb_like, [
56
+ "sudo su -c \"sed -ri 's/^#?PermitRootLogin no|^#?PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config\"",
57
+ "sudo su -c \"service ssh restart\""
58
+ ]
59
+ end
60
+
61
+ ['centos','el-','redhat','fedora','eos'].each do | rhel_like |
62
+ it_should_behave_like 'enables_root_login', rhel_like, [
63
+ "sudo su -c \"sed -ri 's/^#?PermitRootLogin no|^#?PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config\"",
64
+ "sudo -E /sbin/service sshd reload"
65
+ ]
66
+ end
67
+
24
68
  context 'timesync' do
25
69
 
26
70
  subject { dummy_class.new }
@@ -594,5 +594,46 @@ module Beaker
594
594
  end
595
595
 
596
596
  end
597
+
598
+ context 'deprecating host keys' do
599
+
600
+ describe '#build_deprecated_keys' do
601
+
602
+ it 'returns the correct array for a unix host' do
603
+ expect( host.build_deprecated_keys().include?(:puppetvardir) ).to be_truthy
604
+ end
605
+
606
+ it 'returns the correct array for a windows host' do
607
+ @platform = 'windows-xp-me-bla'
608
+ expect( host.build_deprecated_keys().include?(:hieraconf) ).to be_truthy
609
+ end
610
+
611
+ it 'can be called on an unsupported host type without an error being thrown' do
612
+ @platform = 'mac-osx-foo-tigerlion'
613
+ expect{ host.build_deprecated_keys() }.not_to raise_error
614
+ end
615
+
616
+ it 'returns an empty array for unsupported host types' do
617
+ @platform = 'mac-osx-foo-tigerlion'
618
+ expect( host.build_deprecated_keys().empty? ).to be_truthy
619
+ end
620
+
621
+ end
622
+
623
+ describe '#[]' do
624
+
625
+ it 'does not log for a key that isn\'t deprecated' do
626
+ expect( host ).to receive( :@logger ).exactly(0).times
627
+ host['puppetbindir']
628
+ end
629
+
630
+ it 'logs the warning message for a deprecated key' do
631
+ expect( host.instance_variable_get(:@logger) ).to receive( :warn ).once
632
+ host['hierapuppetlibdir']
633
+ end
634
+
635
+ end
636
+
637
+ end
597
638
  end
598
639
  end
@@ -34,6 +34,7 @@ module Beaker
34
34
  vagrantfile = File.read( File.expand_path( File.join( path, "Vagrantfile")))
35
35
  expect( vagrantfile ).to be === <<-EOF
36
36
  Vagrant.configure("2") do |c|
37
+ c.ssh.insert_key = false
37
38
  c.vm.define 'vm1' do |v|
38
39
  v.vm.hostname = 'vm1'
39
40
  v.vm.box = 'vm1_of_my_box'
@@ -185,7 +186,7 @@ EOF
185
186
  allow( file ).to receive( :path ).and_return( '/path/sshconfig' )
186
187
  allow( file ).to receive( :rewind ).and_return( true )
187
188
 
188
- expect( Tempfile ).to receive( :new ).with( "#{host.name}").and_return( file )
189
+ expect( Tempfile ).to receive( :new ).with( "#{host.name}").and_return( file )
189
190
  expect( file ).to receive( :write ).with("Host ip.address.for.#{name}\n HostName 127.0.0.1\n User root\n Port 2222\n UserKnownHostsFile /dev/null\n StrictHostKeyChecking no\n PasswordAuthentication no\n IdentityFile /home/root/.vagrant.d/insecure_private_key\n IdentitiesOnly yes")
190
191
 
191
192
  vagrant.set_ssh_config( host, 'root' )
@@ -6,6 +6,7 @@ module Beaker
6
6
  let(:my_io) { MockIO.new }
7
7
  let(:logger) { Logger.new(my_io, :quiet => true) }
8
8
  let(:test_dir) { 'tmp/tests' }
9
+ let(:dummy_prefix) { 'dummy' }
9
10
 
10
11
  context '#convert' do
11
12
  let(:valid_utf8) { "/etc/puppet/modules\n├── jimmy-appleseed (\e[0;36mv1.1.0\e[0m)\n├── jimmy-crakorn (\e[0;36mv0.4.0\e[0m)\n└── jimmy-thelock (\e[0;36mv1.0.0\e[0m)\n" }
@@ -28,12 +29,18 @@ module Beaker
28
29
 
29
30
  it 'generates path for a given timestamp' do
30
31
  input_time = Time.new(2014, 6, 2, 16, 31, 22, '-07:00')
31
- expect( Logger.generate_dated_log_folder(test_dir, input_time) ).to be === File.join(test_dir, '2014-06-02_16_31_22')
32
+ expect( Logger.generate_dated_log_folder(test_dir, dummy_prefix, input_time) ).to be === File.join(test_dir, dummy_prefix, '2014-06-02_16_31_22')
32
33
  end
33
34
 
34
35
  it 'generates directory for a given timestamp' do
35
36
  input_time = Time.new(2011, 6, 10, 13, 7, 55, '-09:00')
36
- expect( File.directory? Logger.generate_dated_log_folder(test_dir, input_time) ).to be_truthy
37
+ expect( File.directory? Logger.generate_dated_log_folder(test_dir, dummy_prefix, input_time) ).to be_truthy
38
+ end
39
+
40
+ it 'generates nested directories if given as a log_prefix' do
41
+ input_time = Time.new(2011, 6, 10, 13, 7, 55, '-09:00')
42
+ prefix = 'a/man/a/plan/a/canal/panama'
43
+ expect( File.directory? Logger.generate_dated_log_folder(test_dir, prefix, input_time) ).to be_truthy
37
44
  end
38
45
 
39
46
  end
@@ -7,7 +7,13 @@ module Beaker
7
7
  mock_provisioning_logger = Object.new
8
8
  allow( mock_provisioning_logger ).to receive( :notify )
9
9
  mock_provisioning_logger }
10
- let( :options ) { make_opts.merge({ 'logger' => double().as_null_object, :logger_sut => mock_provisioning_logger }) }
10
+ let( :options ) {
11
+ make_opts.merge({
12
+ 'logger' => double().as_null_object,
13
+ :logger_sut => mock_provisioning_logger,
14
+ :log_prefix => 'log_prefix_dummy'
15
+ })
16
+ }
11
17
  let( :network_manager ) { NetworkManager.new(options, options[:logger]) }
12
18
  let( :hosts ) { make_hosts }
13
19
  let( :host ) { hosts[0] }
@@ -6,7 +6,8 @@ module Beaker
6
6
 
7
7
  let(:parser) {Beaker::Options::CommandLineParser.new}
8
8
  let(:test_opts) {["-h", "vcloud.cfg", "--debug", "--tests", "test.rb", "--help"]}
9
- let(:full_opts) {["--hosts", "host.cfg", "--options", "opts_file", "--type", "pe", "--helper", "path_to_helper", "--load-path", "load_path", "--tests", "test1.rb,test2.rb,test3.rb", "--pre-suite", "pre_suite.rb", "--post-suite", "post_suite.rb", "--no-provision", "--preserve-hosts", "always", "--root-keys", "--keyfile", "../.ssh/id_rsa", "--install", "gitrepopath", "-m", "module", "-q", "--dry-run", "--no-ntp", "--repo-proxy", "--add-el-extras", "--config", "anotherfile.cfg", "--fail-mode", "fast", "--no-color", "--version", "--log-level", "info", "--package-proxy", "http://192.168.100.1:3128", "--collect-perf-data", "--parse-only", "--validate", "--timeout", "40"]}
9
+ let(:full_opts_in) {["--hosts", "host.cfg", "--options", "opts_file", "--type", "pe", "--helper", "path_to_helper", "--load-path", "load_path", "--tests", "test1.rb,test2.rb,test3.rb", "--pre-suite", "pre_suite.rb", "--post-suite", "post_suite.rb", "--no-provision", "--preserve-hosts", "always", "--root-keys", "--keyfile", "../.ssh/id_rsa", "--install", "gitrepopath", "-m", "module", "-q", "--dry-run", "--no-ntp", "--repo-proxy", "--add-el-extras", "--config", "anotherfile.cfg", "--fail-mode", "fast", "--no-color", "--version", "--log-level", "info", "--package-proxy", "http://192.168.100.1:3128", "--collect-perf-data", "--parse-only", "--validate", "--timeout", "40", "--log-prefix", "pants"]}
10
+ let(:full_opts_out) {{:hosts_file=>"anotherfile.cfg",:options_file=>"opts_file", :type => "pe", :helper => "path_to_helper", :load_path => "load_path", :tests => "test1.rb,test2.rb,test3.rb", :pre_suite => "pre_suite.rb", :post_suite => "post_suite.rb", :provision=>false, :preserve_hosts => "always", :root_keys=>true, :keyfile => "../.ssh/id_rsa", :install => "gitrepopath", :modules=>"module", :quiet=>true, :dry_run=>true, :timesync=>false, :repo_proxy=>true, :add_el_extras=>true, :fail_mode => "fast", :color=>false, :version=>true, :log_level => "info", :package_proxy => "http://192.168.100.1:3128", :collect_perf_data=>true, :parse_only=>true, :validate=>true, :timeout => "40", :log_prefix => "pants"}}
10
11
  let(:validate_true) {["--validate"]}
11
12
  let(:validate_false) {["--no-validate"]}
12
13
  let(:configure_true) {['--configure']}
@@ -18,7 +19,7 @@ module Beaker
18
19
  end
19
20
 
20
21
  it "supports all our command line options" do
21
- expect(parser.parse(full_opts)).to be === {:hosts_file=>"anotherfile.cfg", :options_file=>"opts_file", :type=>"pe", :helper=>"path_to_helper", :load_path=>"load_path", :tests=>"test1.rb,test2.rb,test3.rb", :pre_suite=>"pre_suite.rb", :post_suite=>"post_suite.rb", :provision=>false, :preserve_hosts=>"always", :root_keys=>true, :keyfile=>"../.ssh/id_rsa", :install=>"gitrepopath", :modules=>"module", :quiet=>true, :dry_run=>true, :timesync=>false, :repo_proxy=>true, :add_el_extras=>true, :fail_mode=>"fast", :color=>false, :version=>true, :log_level=>"info", :package_proxy => "http://192.168.100.1:3128", :collect_perf_data=>true, :parse_only=>true, :validate=>true, :timeout=>"40"}
22
+ expect(parser.parse(full_opts_in)).to be === full_opts_out
22
23
  end
23
24
 
24
25
  it "supports both validate options" do
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ module Beaker
4
+ module Shared
5
+ describe Semvar do
6
+
7
+ describe 'version_is_less' do
8
+
9
+ it 'reports 3.0.0-160-gac44cfb is not less than 3.0.0' do
10
+ expect( subject.version_is_less( '3.0.0-160-gac44cfb', '3.0.0' ) ).to be === false
11
+ end
12
+
13
+ it 'reports 3.0.0-160-gac44cfb is not less than 2.8.2' do
14
+ expect( subject.version_is_less( '3.0.0-160-gac44cfb', '2.8.2' ) ).to be === false
15
+ end
16
+
17
+ it 'reports 3.0.0 is less than 3.0.0-160-gac44cfb' do
18
+ expect( subject.version_is_less( '3.0.0', '3.0.0-160-gac44cfb' ) ).to be === true
19
+ end
20
+
21
+ it 'reports 2.8.2 is less than 3.0.0-160-gac44cfb' do
22
+ expect( subject.version_is_less( '2.8.2', '3.0.0-160-gac44cfb' ) ).to be === true
23
+ end
24
+
25
+ it 'reports 2.8 is less than 3.0.0-160-gac44cfb' do
26
+ expect( subject.version_is_less( '2.8', '3.0.0-160-gac44cfb' ) ).to be === true
27
+ end
28
+
29
+ it 'reports 2.8 is less than 2.9' do
30
+ expect( subject.version_is_less( '2.8', '2.9' ) ).to be === true
31
+ end
32
+ end
33
+ end
34
+
35
+ end
36
+ end
@@ -207,5 +207,53 @@ module Beaker
207
207
 
208
208
 
209
209
  end
210
+
211
+ describe '#log_path' do
212
+ let( :sh_test ) { '/my_shell_file.sh' }
213
+ let( :files ) { @files ? @files : [sh_test] }
214
+ let( :options ) { make_opts.merge({ :logger => double().as_null_object, 'name' => create_files(files) }) }
215
+ let( :hosts ) { make_hosts() }
216
+ let( :testsuite ) { Beaker::TestSuite.new( 'name', hosts, options, Time.now, :stop ) }
217
+
218
+ it 'returns the simple joining of the log dir & file as required' do
219
+ expect(testsuite.log_path('foo.txt', 'man/date')).to be === 'man/date/foo.txt'
220
+ end
221
+
222
+ describe 'builds the base directory correctly' do
223
+ # the base directory is where the latest symlink itself should live
224
+
225
+ it 'in the usual case' do
226
+ expect( File.symlink?('man/latest') ).to be_falsy
227
+ testsuite.log_path('foo.txt', 'man/date')
228
+ expect( File.symlink?('man/latest') ).to be_truthy
229
+ end
230
+
231
+ it 'if given a nested directory' do
232
+ expect( File.symlink?('a/latest') ).to be_falsy
233
+ testsuite.log_path('foo.txt', 'a/b/c/d/e/f')
234
+ expect( File.symlink?('a/latest') ).to be_truthy
235
+ end
236
+
237
+ end
238
+
239
+ describe 'builds the symlink directory correctly' do
240
+ # the symlink directory is where the symlink points to
241
+
242
+ it 'in the usual case' do
243
+ expect( File.symlink?('d/latest') ).to be_falsy
244
+ testsuite.log_path('foo.txt', 'd/e')
245
+ expect( File.readlink('d/latest') ).to be === 'e'
246
+ end
247
+
248
+ it 'if given a nested directory' do
249
+ expect( File.symlink?('f/latest') ).to be_falsy
250
+ testsuite.log_path('foo.txt', 'f/g/h/i/j/k')
251
+ expect( File.readlink('f/latest') ).to be === 'g/h/i/j/k'
252
+ end
253
+
254
+ end
255
+
256
+ end
257
+
210
258
  end
211
259
  end
@@ -44,6 +44,16 @@ module MockNet
44
44
  end
45
45
  end
46
46
 
47
+ class Put
48
+ def initialize uri
49
+ @uri = uri
50
+ end
51
+
52
+ def body= *args
53
+ hash
54
+ end
55
+ end
56
+
47
57
  class Delete
48
58
  def initialize uri
49
59
  @uri = uri
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: beaker
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.7.1
4
+ version: 2.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppetlabs
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-19 00:00:00.000000000 Z
11
+ date: 2015-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -412,9 +412,18 @@ files:
412
412
  - lib/beaker/command_factory.rb
413
413
  - lib/beaker/dsl.rb
414
414
  - lib/beaker/dsl/assertions.rb
415
- - lib/beaker/dsl/ezbake_utils.rb
416
415
  - lib/beaker/dsl/helpers.rb
416
+ - lib/beaker/dsl/helpers/facter_helpers.rb
417
+ - lib/beaker/dsl/helpers/hiera_helpers.rb
418
+ - lib/beaker/dsl/helpers/host_helpers.rb
419
+ - lib/beaker/dsl/helpers/puppet_helpers.rb
420
+ - lib/beaker/dsl/helpers/tk_helpers.rb
421
+ - lib/beaker/dsl/helpers/web_helpers.rb
417
422
  - lib/beaker/dsl/install_utils.rb
423
+ - lib/beaker/dsl/install_utils/ezbake_utils.rb
424
+ - lib/beaker/dsl/install_utils/module_utils.rb
425
+ - lib/beaker/dsl/install_utils/pe_utils.rb
426
+ - lib/beaker/dsl/install_utils/puppet_utils.rb
418
427
  - lib/beaker/dsl/outcomes.rb
419
428
  - lib/beaker/dsl/patterns.rb
420
429
  - lib/beaker/dsl/roles.rb
@@ -487,6 +496,7 @@ files:
487
496
  - lib/beaker/shared/error_handler.rb
488
497
  - lib/beaker/shared/host_manager.rb
489
498
  - lib/beaker/shared/repetition.rb
499
+ - lib/beaker/shared/semvar.rb
490
500
  - lib/beaker/shared/timed.rb
491
501
  - lib/beaker/ssh_connection.rb
492
502
  - lib/beaker/tasks/rake_task.rb
@@ -499,8 +509,15 @@ files:
499
509
  - spec/beaker/command_spec.rb
500
510
  - spec/beaker/dsl/assertions_spec.rb
501
511
  - spec/beaker/dsl/ezbake_utils_spec.rb
502
- - spec/beaker/dsl/helpers_spec.rb
503
- - spec/beaker/dsl/install_utils_spec.rb
512
+ - spec/beaker/dsl/helpers/facter_helpers_spec.rb
513
+ - spec/beaker/dsl/helpers/hiera_helpers_spec.rb
514
+ - spec/beaker/dsl/helpers/host_helpers_spec.rb
515
+ - spec/beaker/dsl/helpers/puppet_helpers_spec.rb
516
+ - spec/beaker/dsl/helpers/tk_helpers_spec.rb
517
+ - spec/beaker/dsl/helpers/web_helpers_spec.rb
518
+ - spec/beaker/dsl/install_utils/module_utils_spec.rb
519
+ - spec/beaker/dsl/install_utils/pe_utils_spec.rb
520
+ - spec/beaker/dsl/install_utils/puppet_utils_spec.rb
504
521
  - spec/beaker/dsl/outcomes_spec.rb
505
522
  - spec/beaker/dsl/roles_spec.rb
506
523
  - spec/beaker/dsl/structure_spec.rb
@@ -547,6 +564,7 @@ files:
547
564
  - spec/beaker/shared/error_handler_spec.rb
548
565
  - spec/beaker/shared/host_manager_spec.rb
549
566
  - spec/beaker/shared/repetition_spec.rb
567
+ - spec/beaker/shared/semvar_spec.rb
550
568
  - spec/beaker/ssh_connection_spec.rb
551
569
  - spec/beaker/test_case_spec.rb
552
570
  - spec/beaker/test_suite_spec.rb