beaker 2.29.1 → 2.30.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,317 +1,20 @@
1
- require 'spec_helper'
2
- require 'fileutils'
1
+ require "spec_helper"
2
+ require "beaker/test_suite"
3
3
 
4
4
  module Beaker
5
5
  describe TestSuite do
6
-
7
- context 'new' do
8
- let(:test_dir) { 'tmp/tests' }
9
-
10
- let(:options) { {'name' => create_files(@files)} }
11
- let(:rb_test) { File.expand_path(test_dir + '/my_ruby_file.rb') }
12
- let(:pl_test) { File.expand_path(test_dir + '/my_perl_file.pl') }
13
- let(:sh_test) { File.expand_path(test_dir + '/my_shell_file.sh') }
14
-
15
- it 'fails without test files' do
16
- expect { Beaker::TestSuite.new('name', 'hosts', Hash.new, Time.now, :stop_on_error) }.to raise_error
17
- end
18
-
19
- it 'includes specific files as test file when explicitly passed' do
20
- @files = [ rb_test ]
21
- ts = Beaker::TestSuite.new('name', 'hosts', options, Time.now, :stop_on_error)
22
-
23
- tfs = ts.instance_variable_get(:@test_files)
24
- expect(tfs).to include rb_test
25
- end
26
-
27
- it 'defaults to :slow fail_mode if not provided through parameter or options' do
28
- @files = [ rb_test ]
29
- ts = Beaker::TestSuite.new('name', 'hosts', options, Time.now)
30
- tfm = ts.instance_variable_get(:@fail_mode)
31
- expect(tfm).to be == :slow
6
+ context "runner" do
7
+ it "returns the native test suite class when the 'native' runner name is provided" do
8
+ expect(Beaker::TestSuite.runner("native")).to be == Beaker::Runner::Native::TestSuite
32
9
  end
33
10
 
34
- it 'uses provided parameter fail_mode' do
35
- @files = [ rb_test ]
36
- ts = Beaker::TestSuite.new('name', 'hosts', options, Time.now, :fast)
37
- tfm = ts.instance_variable_get(:@fail_mode)
38
- expect(tfm).to be == :fast
11
+ it "returns the minitest test suite class when the 'minitest' runner name is provided" do
12
+ expect(Beaker::TestSuite.runner("minitest")).to be == Beaker::Runner::MiniTest::TestSuite
39
13
  end
40
14
 
41
- it 'uses options fail_mode if fail_mode parameter is not provided' do
42
- @files = [ rb_test ]
43
- options[:fail_mode] = :fast
44
- ts = Beaker::TestSuite.new('name', 'hosts', options, Time.now)
45
- tfm = ts.instance_variable_get(:@fail_mode)
46
- expect(tfm).to be == :fast
15
+ it "returns nil when unknown runner name is provided" do
16
+ expect(Beaker::TestSuite.runner("unknown")).to be_nil
47
17
  end
48
18
  end
49
-
50
- context 'run' do
51
-
52
- let( :options ) { make_opts.merge({ :logger => double().as_null_object, 'name' => create_files(@files), :log_dated_dir => '.', :xml_dated_dir => '.'}) }
53
- let(:broken_script) { "raise RuntimeError" }
54
- let(:fail_script) { "raise Beaker::DSL::Outcomes::FailTest" }
55
- let(:okay_script) { "true" }
56
- let(:rb_test) { 'my_ruby_file.rb' }
57
- let(:pl_test) { '/my_perl_file.pl' }
58
- let(:sh_test) { '/my_shell_file.sh' }
59
- let(:hosts) { make_hosts() }
60
-
61
- it 'fails fast if fail_mode != :slow and runtime error is raised' do
62
- allow( Logger ).to receive('new')
63
- @files = [ rb_test, pl_test, sh_test]
64
- File.open(rb_test, 'w') { |file| file.write(broken_script) }
65
- File.open(pl_test, 'w') { |file| file.write(okay_script) }
66
- File.open(sh_test, 'w') { |file| file.write(okay_script) }
67
-
68
- ts = Beaker::TestSuite.new( 'name', hosts, options, Time.now, :stop )
69
- tsr = ts.instance_variable_get( :@test_suite_results )
70
- allow( tsr ).to receive(:write_junit_xml).and_return( true )
71
- allow( tsr ).to receive(:summarize).and_return( true )
72
-
73
- ts.run
74
- expect( tsr.errored_tests ).to be === 1
75
- expect( tsr.failed_tests ).to be === 0
76
- expect( tsr.test_count ).to be === 1
77
- expect( tsr.passed_tests).to be === 0
78
-
79
- end
80
-
81
- it 'fails fast if fail_mode != :slow and fail test is raised' do
82
- allow( Logger ).to receive('new')
83
- @files = [ rb_test, pl_test, sh_test]
84
- File.open(rb_test, 'w') { |file| file.write(fail_script) }
85
- File.open(pl_test, 'w') { |file| file.write(okay_script) }
86
- File.open(sh_test, 'w') { |file| file.write(okay_script) }
87
-
88
- ts = Beaker::TestSuite.new( 'name', hosts, options, Time.now, :stop )
89
- tsr = ts.instance_variable_get( :@test_suite_results )
90
- allow( tsr ).to receive(:write_junit_xml).and_return( true )
91
- allow( tsr ).to receive(:summarize).and_return( true )
92
-
93
- ts.run
94
- expect( tsr.errored_tests ).to be === 0
95
- expect( tsr.failed_tests ).to be === 1
96
- expect( tsr.test_count ).to be === 1
97
- expect( tsr.passed_tests).to be === 0
98
-
99
- end
100
-
101
- it 'fails slow if fail_mode = :slow, even if a test fails and there is a runtime error' do
102
- allow( Logger ).to receive('new')
103
- @files = [ rb_test, pl_test, sh_test]
104
- File.open(rb_test, 'w') { |file| file.write(broken_script) }
105
- File.open(pl_test, 'w') { |file| file.write(fail_script) }
106
- File.open(sh_test, 'w') { |file| file.write(okay_script) }
107
-
108
- ts = Beaker::TestSuite.new( 'name', hosts, options, Time.now, :slow )
109
- tsr = ts.instance_variable_get( :@test_suite_results )
110
- allow( tsr ).to receive(:write_junit_xml).and_return( true )
111
- allow( tsr ).to receive(:summarize).and_return( true )
112
-
113
- ts.run
114
- expect( tsr.errored_tests ).to be === 1
115
- expect( tsr.failed_tests ).to be === 1
116
- expect( tsr.test_count ).to be === 3
117
- expect( tsr.passed_tests).to be === 1
118
-
119
- end
120
-
121
-
122
- end
123
-
124
- describe TestSuite::TestSuiteResult do
125
-
126
- let( :options ) { make_opts.merge({ :logger => double().as_null_object }) }
127
- let( :hosts ) { make_hosts() }
128
- let( :testcase1 ) { Beaker::TestCase.new( hosts, options[:logger], options) }
129
- let( :testcase2 ) { Beaker::TestCase.new( hosts, options[:logger], options) }
130
- let( :testcase3 ) { Beaker::TestCase.new( hosts, options[:logger], options) }
131
- let( :test_suite_result ) { TestSuite::TestSuiteResult.new( options, "my_suite") }
132
-
133
- it 'supports adding test cases' do
134
- expect( test_suite_result.test_count ).to be === 0
135
- test_suite_result.add_test_case( testcase1 )
136
- expect( test_suite_result.test_count ).to be === 1
137
- end
138
-
139
- it 'calculates passed tests' do
140
- testcase1.instance_variable_set(:@test_status, :pass)
141
- testcase2.instance_variable_set(:@test_status, :pass)
142
- testcase3.instance_variable_set(:@test_status, :fail)
143
- test_suite_result.add_test_case( testcase1 )
144
- test_suite_result.add_test_case( testcase2 )
145
- test_suite_result.add_test_case( testcase3 )
146
- expect( test_suite_result.passed_tests ).to be == 2
147
- end
148
-
149
- it 'calculates failed tests' do
150
- testcase1.instance_variable_set(:@test_status, :pass)
151
- testcase2.instance_variable_set(:@test_status, :pass)
152
- testcase3.instance_variable_set(:@test_status, :fail)
153
- test_suite_result.add_test_case( testcase1 )
154
- test_suite_result.add_test_case( testcase2 )
155
- test_suite_result.add_test_case( testcase3 )
156
- expect( test_suite_result.failed_tests ).to be == 1
157
- end
158
-
159
- it 'calculates errored tests' do
160
- testcase1.instance_variable_set(:@test_status, :error)
161
- testcase2.instance_variable_set(:@test_status, :pass)
162
- testcase3.instance_variable_set(:@test_status, :fail)
163
- test_suite_result.add_test_case( testcase1 )
164
- test_suite_result.add_test_case( testcase2 )
165
- test_suite_result.add_test_case( testcase3 )
166
- expect( test_suite_result.errored_tests ).to be == 1
167
- end
168
-
169
- it 'calculates skipped tests' do
170
- testcase1.instance_variable_set(:@test_status, :error)
171
- testcase2.instance_variable_set(:@test_status, :skip)
172
- testcase3.instance_variable_set(:@test_status, :fail)
173
- test_suite_result.add_test_case( testcase1 )
174
- test_suite_result.add_test_case( testcase2 )
175
- test_suite_result.add_test_case( testcase3 )
176
- expect( test_suite_result.skipped_tests ).to be == 1
177
- end
178
-
179
- it 'calculates pending tests' do
180
- testcase1.instance_variable_set(:@test_status, :error)
181
- testcase2.instance_variable_set(:@test_status, :pending)
182
- testcase3.instance_variable_set(:@test_status, :fail)
183
- test_suite_result.add_test_case( testcase1 )
184
- test_suite_result.add_test_case( testcase2 )
185
- test_suite_result.add_test_case( testcase3 )
186
- expect( test_suite_result.pending_tests ).to be == 1
187
- end
188
-
189
- it 'calculates sum_failed as a sum of errored and failed TestCases' do
190
- testcase1.instance_variable_set(:@test_status, :error)
191
- testcase2.instance_variable_set(:@test_status, :pending)
192
- testcase3.instance_variable_set(:@test_status, :fail)
193
- test_suite_result.add_test_case( testcase1 )
194
- test_suite_result.add_test_case( testcase2 )
195
- test_suite_result.add_test_case( testcase3 )
196
- expect( test_suite_result.sum_failed ).to be == 2
197
- end
198
-
199
- it 'reports success with no errors/failures' do
200
- testcase1.instance_variable_set(:@test_status, :pass)
201
- testcase2.instance_variable_set(:@test_status, :pending)
202
- testcase3.instance_variable_set(:@test_status, :fail)
203
- test_suite_result.add_test_case( testcase1 )
204
- test_suite_result.add_test_case( testcase2 )
205
- test_suite_result.add_test_case( testcase3 )
206
- expect( test_suite_result.success? ).to be == false
207
- end
208
-
209
- it 'reports failed if any tests error/fail' do
210
- testcase1.instance_variable_set(:@test_status, :pass)
211
- testcase2.instance_variable_set(:@test_status, :pending)
212
- testcase3.instance_variable_set(:@test_status, :fail)
213
- test_suite_result.add_test_case( testcase1 )
214
- test_suite_result.add_test_case( testcase2 )
215
- test_suite_result.add_test_case( testcase3 )
216
- expect( test_suite_result.failed? ).to be == true
217
- end
218
-
219
- it 'can calculate the sum of all TestCase runtimes' do
220
- testcase1.instance_variable_set(:@runtime, 1)
221
- testcase2.instance_variable_set(:@runtime, 10)
222
- testcase3.instance_variable_set(:@runtime, 100)
223
- test_suite_result.add_test_case( testcase1 )
224
- test_suite_result.add_test_case( testcase2 )
225
- test_suite_result.add_test_case( testcase3 )
226
- expect( test_suite_result.elapsed_time ).to be == 111
227
- end
228
-
229
- describe '#write_junit_xml' do
230
- let( :options ) { make_opts.merge({ :logger => double().as_null_object, 'name' => create_files(@files), :log_dated_dir => '.', :xml_dated_dir => '.'}) }
231
- let(:rb_test) { 'my_ruby_file.rb' }
232
-
233
- it 'doesn\'t re-order test cases themselves on time_sort' do
234
- nokogiri_mock = Hash.new
235
- allow( nokogiri_mock ).to receive( :add_child )
236
- allow( Nokogiri::XML::Node ).to receive( :new ) { nokogiri_mock }
237
- allow( LoggerJunit ).to receive( :write_xml ).and_yield( Object.new, nokogiri_mock )
238
-
239
- @files = [ rb_test, rb_test, rb_test]
240
- ts = Beaker::TestSuite.new( 'name', hosts, options, Time.now, :fast )
241
- tsr = ts.instance_variable_get( :@test_suite_results )
242
-
243
- allow( tsr ).to receive( :start_time ).and_return(0)
244
- allow( tsr ).to receive( :stop_time ).and_return(10)
245
- expect( tsr.instance_variable_get( :@logger ) ).to receive( :error ).never
246
-
247
- test_cases = []
248
- 3.times do
249
- tc = Beaker::TestCase.new( hosts, options[:logger], options, rb_test)
250
- allow( tc ).to receive( :sublog ).and_return( false )
251
- test_cases << tc
252
- end
253
- test_cases[0].instance_variable_set(:@runtime, 3)
254
- test_cases[1].instance_variable_set(:@runtime, 301)
255
- test_cases[2].instance_variable_set(:@runtime, 101)
256
- test_cases.map { |tc| tsr.add_test_case( tc ) }
257
-
258
- original_testcase_order = test_suite_result.instance_variable_get( :@test_cases ).dup
259
- tsr.write_junit_xml( 'fakeFilePath07', 'fakeFileToLink09', true )
260
- after_testcase_order = test_suite_result.instance_variable_get( :@test_cases ).dup
261
- expect( after_testcase_order ).to be === original_testcase_order
262
- end
263
-
264
- end
265
-
266
-
267
- end
268
-
269
- describe '#log_path' do
270
- let( :sh_test ) { '/my_shell_file.sh' }
271
- let( :files ) { @files ? @files : [sh_test] }
272
- let( :options ) { make_opts.merge({ :logger => double().as_null_object, 'name' => create_files(files) }) }
273
- let( :hosts ) { make_hosts() }
274
- let( :testsuite ) { Beaker::TestSuite.new( 'name', hosts, options, Time.now, :stop ) }
275
-
276
- it 'returns the simple joining of the log dir & file as required' do
277
- expect(testsuite.log_path('foo.txt', 'man/date')).to be === 'man/date/foo.txt'
278
- end
279
-
280
- describe 'builds the base directory correctly' do
281
- # the base directory is where the latest symlink itself should live
282
-
283
- it 'in the usual case' do
284
- expect( File.symlink?('man/latest') ).to be_falsy
285
- testsuite.log_path('foo.txt', 'man/date')
286
- expect( File.symlink?('man/latest') ).to be_truthy
287
- end
288
-
289
- it 'if given a nested directory' do
290
- expect( File.symlink?('a/latest') ).to be_falsy
291
- testsuite.log_path('foo.txt', 'a/b/c/d/e/f')
292
- expect( File.symlink?('a/latest') ).to be_truthy
293
- end
294
-
295
- end
296
-
297
- describe 'builds the symlink directory correctly' do
298
- # the symlink directory is where the symlink points to
299
-
300
- it 'in the usual case' do
301
- expect( File.symlink?('d/latest') ).to be_falsy
302
- testsuite.log_path('foo.txt', 'd/e')
303
- expect( File.readlink('d/latest') ).to be === 'e'
304
- end
305
-
306
- it 'if given a nested directory' do
307
- expect( File.symlink?('f/latest') ).to be_falsy
308
- testsuite.log_path('foo.txt', 'f/g/h/i/j/k')
309
- expect( File.readlink('f/latest') ).to be === 'g/h/i/j/k'
310
- end
311
-
312
- end
313
-
314
- end
315
-
316
19
  end
317
20
  end
data/spec/helpers.rb CHANGED
@@ -39,7 +39,7 @@ module HostHelpers
39
39
  HOST_NAME = "vm%d"
40
40
  HOST_SNAPSHOT = "snapshot%d"
41
41
  HOST_IP = "ip.address.for.%s"
42
- HOST_BOX = "%s_of_my_box"
42
+ HOST_BOX = "vm2%s_of_my_box"
43
43
  HOST_BOX_URL = "http://address.for.my.box.%s"
44
44
  HOST_DNS_NAME = "%s.box.tld"
45
45
  HOST_TEMPLATE = "%s_has_a_template"
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.29.1
4
+ version: 2.30.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-11-23 00:00:00.000000000 Z
11
+ date: 2015-12-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -662,6 +662,9 @@ files:
662
662
  - lib/beaker/perf.rb
663
663
  - lib/beaker/platform.rb
664
664
  - lib/beaker/result.rb
665
+ - lib/beaker/runner/mini_test/test_suite.rb
666
+ - lib/beaker/runner/native/test_case.rb
667
+ - lib/beaker/runner/native/test_suite.rb
665
668
  - lib/beaker/shared.rb
666
669
  - lib/beaker/shared/error_handler.rb
667
670
  - lib/beaker/shared/host_manager.rb
@@ -725,6 +728,7 @@ files:
725
728
  - spec/beaker/logger_junit_spec.rb
726
729
  - spec/beaker/logger_spec.rb
727
730
  - spec/beaker/network_manager_spec.rb
731
+ - spec/beaker/options/beaker_options_spec.rb
728
732
  - spec/beaker/options/command_line_parser_spec.rb
729
733
  - spec/beaker/options/data/badyaml.cfg
730
734
  - spec/beaker/options/data/hosts.cfg
@@ -737,6 +741,8 @@ files:
737
741
  - spec/beaker/options/presets_spec.rb
738
742
  - spec/beaker/perf_spec.rb
739
743
  - spec/beaker/platform_spec.rb
744
+ - spec/beaker/runner/native/test_case_spec.rb
745
+ - spec/beaker/runner/native/test_suite_spec.rb
740
746
  - spec/beaker/shared/error_handler_spec.rb
741
747
  - spec/beaker/shared/host_manager_spec.rb
742
748
  - spec/beaker/shared/repetition_spec.rb