beaker 2.30.0 → 2.30.1

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.
@@ -1,303 +0,0 @@
1
- require 'spec_helper'
2
- require 'fileutils'
3
-
4
- module Beaker
5
- module Runner
6
- module Native
7
- describe TestSuite do
8
- context 'new' do
9
- let(:test_dir) { 'tmp/tests' }
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::Runner::Native::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::Runner::Native::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::Runner::Native::TestSuite.new('name', 'hosts', options, Time.now)
30
- tfm = ts.instance_variable_get(:@fail_mode)
31
- expect(tfm).to be == :slow
32
- end
33
-
34
- it 'uses provided parameter fail_mode' do
35
- @files = [ rb_test ]
36
- ts = Beaker::Runner::Native::TestSuite.new('name', 'hosts', options, Time.now, :fast)
37
- tfm = ts.instance_variable_get(:@fail_mode)
38
- expect(tfm).to be == :fast
39
- end
40
-
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::Runner::Native::TestSuite.new('name', 'hosts', options, Time.now)
45
- tfm = ts.instance_variable_get(:@fail_mode)
46
- expect(tfm).to be == :fast
47
- end
48
- end
49
-
50
- context 'run' do
51
- let( :options ) { make_opts.merge({ :logger => double().as_null_object, 'name' => create_files(@files), :log_dated_dir => '.', :xml_dated_dir => '.'}) }
52
- let(:broken_script) { "raise RuntimeError" }
53
- let(:fail_script) { "raise Beaker::DSL::Outcomes::FailTest" }
54
- let(:okay_script) { "true" }
55
- let(:rb_test) { 'my_ruby_file.rb' }
56
- let(:pl_test) { '/my_perl_file.pl' }
57
- let(:sh_test) { '/my_shell_file.sh' }
58
- let(:hosts) { make_hosts() }
59
-
60
- it 'fails fast if fail_mode != :slow and runtime error is raised' do
61
- allow( Logger ).to receive('new')
62
- @files = [ rb_test, pl_test, sh_test]
63
- File.open(rb_test, 'w') { |file| file.write(broken_script) }
64
- File.open(pl_test, 'w') { |file| file.write(okay_script) }
65
- File.open(sh_test, 'w') { |file| file.write(okay_script) }
66
-
67
- ts = Beaker::Runner::Native::TestSuite.new( 'name', hosts, options, Time.now, :stop )
68
- tsr = ts.instance_variable_get( :@test_suite_results )
69
- allow( tsr ).to receive(:write_junit_xml).and_return( true )
70
- allow( tsr ).to receive(:summarize).and_return( true )
71
-
72
- ts.run
73
- expect( tsr.errored_tests ).to be === 1
74
- expect( tsr.failed_tests ).to be === 0
75
- expect( tsr.test_count ).to be === 1
76
- expect( tsr.passed_tests).to be === 0
77
- end
78
-
79
- it 'fails fast if fail_mode != :slow and fail test is raised' do
80
- allow( Logger ).to receive('new')
81
- @files = [ rb_test, pl_test, sh_test]
82
- File.open(rb_test, 'w') { |file| file.write(fail_script) }
83
- File.open(pl_test, 'w') { |file| file.write(okay_script) }
84
- File.open(sh_test, 'w') { |file| file.write(okay_script) }
85
-
86
- ts = Beaker::Runner::Native::TestSuite.new( 'name', hosts, options, Time.now, :stop )
87
- tsr = ts.instance_variable_get( :@test_suite_results )
88
- allow( tsr ).to receive(:write_junit_xml).and_return( true )
89
- allow( tsr ).to receive(:summarize).and_return( true )
90
-
91
- ts.run
92
- expect( tsr.errored_tests ).to be === 0
93
- expect( tsr.failed_tests ).to be === 1
94
- expect( tsr.test_count ).to be === 1
95
- expect( tsr.passed_tests).to be === 0
96
- end
97
-
98
- it 'fails slow if fail_mode = :slow, even if a test fails and there is a runtime error' do
99
- allow( Logger ).to receive('new')
100
- @files = [ rb_test, pl_test, sh_test]
101
- File.open(rb_test, 'w') { |file| file.write(broken_script) }
102
- File.open(pl_test, 'w') { |file| file.write(fail_script) }
103
- File.open(sh_test, 'w') { |file| file.write(okay_script) }
104
-
105
- ts = Beaker::Runner::Native::TestSuite.new( 'name', hosts, options, Time.now, :slow )
106
- tsr = ts.instance_variable_get( :@test_suite_results )
107
- allow( tsr ).to receive(:write_junit_xml).and_return( true )
108
- allow( tsr ).to receive(:summarize).and_return( true )
109
-
110
- ts.run
111
- expect( tsr.errored_tests ).to be === 1
112
- expect( tsr.failed_tests ).to be === 1
113
- expect( tsr.test_count ).to be === 3
114
- expect( tsr.passed_tests).to be === 1
115
- end
116
- end
117
-
118
- describe TestSuite::TestSuiteResult do
119
- let( :options ) { make_opts.merge({ :logger => double().as_null_object }) }
120
- let( :hosts ) { make_hosts() }
121
- let( :testcase1 ) { Beaker::Runner::Native::TestCase.new( hosts, options[:logger], options) }
122
- let( :testcase2 ) { Beaker::Runner::Native::TestCase.new( hosts, options[:logger], options) }
123
- let( :testcase3 ) { Beaker::Runner::Native::TestCase.new( hosts, options[:logger], options) }
124
- let( :test_suite_result ) { TestSuite::TestSuiteResult.new( options, "my_suite") }
125
-
126
- it 'supports adding test cases' do
127
- expect( test_suite_result.test_count ).to be === 0
128
- test_suite_result.add_test_case( testcase1 )
129
- expect( test_suite_result.test_count ).to be === 1
130
- end
131
-
132
- it 'calculates passed tests' do
133
- testcase1.instance_variable_set(:@test_status, :pass)
134
- testcase2.instance_variable_set(:@test_status, :pass)
135
- testcase3.instance_variable_set(:@test_status, :fail)
136
- test_suite_result.add_test_case( testcase1 )
137
- test_suite_result.add_test_case( testcase2 )
138
- test_suite_result.add_test_case( testcase3 )
139
- expect( test_suite_result.passed_tests ).to be == 2
140
- end
141
-
142
- it 'calculates failed tests' do
143
- testcase1.instance_variable_set(:@test_status, :pass)
144
- testcase2.instance_variable_set(:@test_status, :pass)
145
- testcase3.instance_variable_set(:@test_status, :fail)
146
- test_suite_result.add_test_case( testcase1 )
147
- test_suite_result.add_test_case( testcase2 )
148
- test_suite_result.add_test_case( testcase3 )
149
- expect( test_suite_result.failed_tests ).to be == 1
150
- end
151
-
152
- it 'calculates errored tests' do
153
- testcase1.instance_variable_set(:@test_status, :error)
154
- testcase2.instance_variable_set(:@test_status, :pass)
155
- testcase3.instance_variable_set(:@test_status, :fail)
156
- test_suite_result.add_test_case( testcase1 )
157
- test_suite_result.add_test_case( testcase2 )
158
- test_suite_result.add_test_case( testcase3 )
159
- expect( test_suite_result.errored_tests ).to be == 1
160
- end
161
-
162
- it 'calculates skipped tests' do
163
- testcase1.instance_variable_set(:@test_status, :error)
164
- testcase2.instance_variable_set(:@test_status, :skip)
165
- testcase3.instance_variable_set(:@test_status, :fail)
166
- test_suite_result.add_test_case( testcase1 )
167
- test_suite_result.add_test_case( testcase2 )
168
- test_suite_result.add_test_case( testcase3 )
169
- expect( test_suite_result.skipped_tests ).to be == 1
170
- end
171
-
172
- it 'calculates pending tests' do
173
- testcase1.instance_variable_set(:@test_status, :error)
174
- testcase2.instance_variable_set(:@test_status, :pending)
175
- testcase3.instance_variable_set(:@test_status, :fail)
176
- test_suite_result.add_test_case( testcase1 )
177
- test_suite_result.add_test_case( testcase2 )
178
- test_suite_result.add_test_case( testcase3 )
179
- expect( test_suite_result.pending_tests ).to be == 1
180
- end
181
-
182
- it 'calculates sum_failed as a sum of errored and failed TestCases' do
183
- testcase1.instance_variable_set(:@test_status, :error)
184
- testcase2.instance_variable_set(:@test_status, :pending)
185
- testcase3.instance_variable_set(:@test_status, :fail)
186
- test_suite_result.add_test_case( testcase1 )
187
- test_suite_result.add_test_case( testcase2 )
188
- test_suite_result.add_test_case( testcase3 )
189
- expect( test_suite_result.sum_failed ).to be == 2
190
- end
191
-
192
- it 'reports success with no errors/failures' do
193
- testcase1.instance_variable_set(:@test_status, :pass)
194
- testcase2.instance_variable_set(:@test_status, :pending)
195
- testcase3.instance_variable_set(:@test_status, :fail)
196
- test_suite_result.add_test_case( testcase1 )
197
- test_suite_result.add_test_case( testcase2 )
198
- test_suite_result.add_test_case( testcase3 )
199
- expect( test_suite_result.success? ).to be == false
200
- end
201
-
202
- it 'reports failed if any tests error/fail' do
203
- testcase1.instance_variable_set(:@test_status, :pass)
204
- testcase2.instance_variable_set(:@test_status, :pending)
205
- testcase3.instance_variable_set(:@test_status, :fail)
206
- test_suite_result.add_test_case( testcase1 )
207
- test_suite_result.add_test_case( testcase2 )
208
- test_suite_result.add_test_case( testcase3 )
209
- expect( test_suite_result.failed? ).to be == true
210
- end
211
-
212
- it 'can calculate the sum of all TestCase runtimes' do
213
- testcase1.instance_variable_set(:@runtime, 1)
214
- testcase2.instance_variable_set(:@runtime, 10)
215
- testcase3.instance_variable_set(:@runtime, 100)
216
- test_suite_result.add_test_case( testcase1 )
217
- test_suite_result.add_test_case( testcase2 )
218
- test_suite_result.add_test_case( testcase3 )
219
- expect( test_suite_result.elapsed_time ).to be == 111
220
- end
221
-
222
- describe '#write_junit_xml' do
223
- let( :options ) { make_opts.merge({ :logger => double().as_null_object, 'name' => create_files(@files), :log_dated_dir => '.', :xml_dated_dir => '.'}) }
224
- let(:rb_test) { 'my_ruby_file.rb' }
225
-
226
- it 'doesn\'t re-order test cases themselves on time_sort' do
227
- nokogiri_mock = Hash.new
228
- allow( nokogiri_mock ).to receive( :add_child )
229
- allow( Nokogiri::XML::Node ).to receive( :new ) { nokogiri_mock }
230
- allow( LoggerJunit ).to receive( :write_xml ).and_yield( Object.new, nokogiri_mock )
231
-
232
- @files = [ rb_test, rb_test, rb_test]
233
- ts = Beaker::Runner::Native::TestSuite.new( 'name', hosts, options, Time.now, :fast )
234
- tsr = ts.instance_variable_get( :@test_suite_results )
235
-
236
- allow( tsr ).to receive( :start_time ).and_return(0)
237
- allow( tsr ).to receive( :stop_time ).and_return(10)
238
- expect( tsr.instance_variable_get( :@logger ) ).to receive( :error ).never
239
-
240
- test_cases = []
241
- 3.times do
242
- tc = Beaker::Runner::Native::TestCase.new( hosts, options[:logger], options, rb_test)
243
- allow( tc ).to receive( :sublog ).and_return( false )
244
- test_cases << tc
245
- end
246
- test_cases[0].instance_variable_set(:@runtime, 3)
247
- test_cases[1].instance_variable_set(:@runtime, 301)
248
- test_cases[2].instance_variable_set(:@runtime, 101)
249
- test_cases.map { |tc| tsr.add_test_case( tc ) }
250
-
251
- original_testcase_order = test_suite_result.instance_variable_get( :@test_cases ).dup
252
- tsr.write_junit_xml( 'fakeFilePath07', 'fakeFileToLink09', true )
253
- after_testcase_order = test_suite_result.instance_variable_get( :@test_cases ).dup
254
- expect( after_testcase_order ).to be === original_testcase_order
255
- end
256
- end
257
- end
258
-
259
- describe '#log_path' do
260
- let( :sh_test ) { '/my_shell_file.sh' }
261
- let( :files ) { @files ? @files : [sh_test] }
262
- let( :options ) { make_opts.merge({ :logger => double().as_null_object, 'name' => create_files(files) }) }
263
- let( :hosts ) { make_hosts() }
264
- let( :testsuite ) { Beaker::Runner::Native::TestSuite.new( 'name', hosts, options, Time.now, :stop ) }
265
-
266
- it 'returns the simple joining of the log dir & file as required' do
267
- expect(testsuite.log_path('foo.txt', 'man/date')).to be === 'man/date/foo.txt'
268
- end
269
-
270
- describe 'builds the base directory correctly' do
271
- # the base directory is where the latest symlink itself should live
272
- it 'in the usual case' do
273
- expect( File.symlink?('man/latest') ).to be_falsy
274
- testsuite.log_path('foo.txt', 'man/date')
275
- expect( File.symlink?('man/latest') ).to be_truthy
276
- end
277
-
278
- it 'if given a nested directory' do
279
- expect( File.symlink?('a/latest') ).to be_falsy
280
- testsuite.log_path('foo.txt', 'a/b/c/d/e/f')
281
- expect( File.symlink?('a/latest') ).to be_truthy
282
- end
283
- end
284
-
285
- describe 'builds the symlink directory correctly' do
286
- # the symlink directory is where the symlink points to
287
- it 'in the usual case' do
288
- expect( File.symlink?('d/latest') ).to be_falsy
289
- testsuite.log_path('foo.txt', 'd/e')
290
- expect( File.readlink('d/latest') ).to be === 'e'
291
- end
292
-
293
- it 'if given a nested directory' do
294
- expect( File.symlink?('f/latest') ).to be_falsy
295
- testsuite.log_path('foo.txt', 'f/g/h/i/j/k')
296
- expect( File.readlink('f/latest') ).to be === 'g/h/i/j/k'
297
- end
298
- end
299
- end
300
- end
301
- end
302
- end
303
- end