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,5 +1,5 @@
1
1
  module Beaker
2
2
  module Version
3
- STRING = '2.30.0'
3
+ STRING = '2.30.1'
4
4
  end
5
5
  end
@@ -1,20 +1,317 @@
1
- require "spec_helper"
2
- require "beaker/test_suite"
1
+ require 'spec_helper'
2
+ require 'fileutils'
3
3
 
4
4
  module Beaker
5
5
  describe TestSuite do
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
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
9
32
  end
10
33
 
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
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
13
39
  end
14
40
 
15
- it "returns nil when unknown runner name is provided" do
16
- expect(Beaker::TestSuite.runner("unknown")).to be_nil
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
17
47
  end
18
48
  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
+
19
316
  end
20
317
  end
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.30.0
4
+ version: 2.30.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppetlabs
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-02 00:00:00.000000000 Z
11
+ date: 2015-12-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -662,9 +662,6 @@ 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
668
665
  - lib/beaker/shared.rb
669
666
  - lib/beaker/shared/error_handler.rb
670
667
  - lib/beaker/shared/host_manager.rb
@@ -728,7 +725,6 @@ files:
728
725
  - spec/beaker/logger_junit_spec.rb
729
726
  - spec/beaker/logger_spec.rb
730
727
  - spec/beaker/network_manager_spec.rb
731
- - spec/beaker/options/beaker_options_spec.rb
732
728
  - spec/beaker/options/command_line_parser_spec.rb
733
729
  - spec/beaker/options/data/badyaml.cfg
734
730
  - spec/beaker/options/data/hosts.cfg
@@ -741,8 +737,6 @@ files:
741
737
  - spec/beaker/options/presets_spec.rb
742
738
  - spec/beaker/perf_spec.rb
743
739
  - spec/beaker/platform_spec.rb
744
- - spec/beaker/runner/native/test_case_spec.rb
745
- - spec/beaker/runner/native/test_suite_spec.rb
746
740
  - spec/beaker/shared/error_handler_spec.rb
747
741
  - spec/beaker/shared/host_manager_spec.rb
748
742
  - spec/beaker/shared/repetition_spec.rb
@@ -1,58 +0,0 @@
1
- module Beaker
2
- module Runner
3
- module MiniTest
4
- class TestSuite
5
- attr_reader :name, :options, :fail_mode # TODO ?
6
-
7
- #Create {TestSuite} instance
8
- #@param [String] name The name of the {TestSuite}
9
- #@param [Array<Host>] hosts An Array of Hosts to act upon.
10
- #@param [Hash{Symbol=>String}] options Options for this object
11
- #@option options [Logger] :logger The Logger object to report information to
12
- #@option options [String] :log_dir The directory where text run logs will be written
13
- #@option options [String] :xml_dir The directory where JUnit XML file will be written
14
- #@option options [String] :xml_file The name of the JUnit XML file to be written to
15
- #@option options [String] :project_root The full path to the Beaker lib directory
16
- #@option options [String] :xml_stylesheet The path to a stylesheet to be applied to the generated XML output
17
- #@param [Symbol] fail_mode One of :slow, :fast
18
- #@param [Time] timestamp Beaker execution start time
19
- def initialize(name, hosts, options, timestamp, fail_mode=nil)
20
- # TODO ?
21
- end
22
-
23
- def run
24
- # TODO ?
25
- end
26
-
27
- #Execute all the TestCases in this suite.
28
- #This is a wrapper that catches any failures generated during TestSuite::run.
29
- def run_and_raise_on_failure
30
- # TODO ?
31
- end
32
-
33
- # Gives a full file path for output to be written to, maintaining the latest symlink
34
- # @param [String] name The file name that we want to write to.
35
- # @param [String] log_dir The desired output directory.
36
- # A symlink will be made from ./basedir/latest to that.
37
- # @example
38
- # log_path('output.txt', 'log/2014-06-02_16_31_22')
39
- #
40
- # This will create the structure:
41
- #
42
- # ./log/2014-06-02_16_31_22/output.txt
43
- # ./log/latest -> 2014-06-02_16_31_22
44
- #
45
- # @example
46
- # log_path('foo.log', 'log/man/date')
47
- #
48
- # This will create the structure:
49
- #
50
- # ./log/man/date/foo.log
51
- # ./log/latest -> man/date
52
- def log_path(name, log_dir)
53
- # TODO ?
54
- end
55
- end
56
- end
57
- end
58
- end
@@ -1,193 +0,0 @@
1
- [ 'host', 'dsl' ].each do |lib|
2
- require "beaker/#{lib}"
3
- end
4
-
5
- require 'tempfile'
6
- require 'benchmark'
7
- require 'stringio'
8
- require 'rbconfig'
9
-
10
- module Beaker
11
- module Runner
12
- module Native
13
- # This class represents a single test case. A test case is necessarily
14
- # contained all in one file though may have multiple dependent examples.
15
- # They are executed in order (save for any teardown procs registered
16
- # through {Beaker::DSL::Structure#teardown}) and once completed
17
- # the status of the TestCase is saved. Instance readers/accessors provide
18
- # the test case access to various details of the environment and suite
19
- # the test case is running within.
20
- #
21
- # See {Beaker::DSL} for more information about writing tests
22
- # using the DSL.
23
- class TestCase
24
- include ::Beaker::DSL
25
-
26
- # The Exception raised by Ruby's STDLIB's test framework (Ruby 1.9)
27
- TEST_EXCEPTION_CLASS = ::MiniTest::Assertion
28
-
29
- # Necessary for implementing {Beaker::DSL::Helpers#confine}.
30
- # Assumed to be an array of valid {Beaker::Host} objects for
31
- # this test case.
32
- attr_accessor :hosts
33
-
34
- # Necessary for many methods in {Beaker::DSL}. Assumed to be
35
- # an instance of {Beaker::Logger}.
36
- attr_accessor :logger
37
-
38
- # Necessary for many methods in {Beaker::DSL::Helpers}. Assumed to be
39
- # a hash.
40
- attr_accessor :metadata
41
-
42
- #The full log for this test
43
- attr_accessor :sublog
44
-
45
- #The result for the last command run
46
- attr_accessor :last_result
47
-
48
- # A Hash of 'product name' => 'version installed', only set when
49
- # products are installed via git or PE install steps. See the 'git' or
50
- # 'pe' directories within 'ROOT/setup' for examples.
51
- attr_reader :version
52
-
53
- # Parsed command line options.
54
- attr_reader :options
55
-
56
- # The path to the file which contains this test case.
57
- attr_reader :path
58
-
59
- # I don't know why this is here
60
- attr_reader :fail_flag
61
-
62
- # The user that is running this tests home directory, needed by 'net/ssh'.
63
- attr_reader :usr_home
64
-
65
- # A Symbol denoting the status of this test (:fail, :pending,
66
- # :skipped, :pass).
67
- attr_reader :test_status
68
-
69
- # The exception that may have stopped this test's execution.
70
- attr_reader :exception
71
-
72
- # @deprecated
73
- # The amount of time taken to execute the test. Unused, probably soon
74
- # to be removed or refactored.
75
- attr_reader :runtime
76
-
77
- # An Array of Procs to be called after test execution has stopped
78
- # (whether by exception or not).
79
- attr_reader :teardown_procs
80
-
81
- # @deprecated
82
- # Legacy accessor from when test files would only contain one remote
83
- # action. Contains the Result of the last call to utilize
84
- # {Beaker::DSL::Helpers#on}. Do not use as it is not safe
85
- # in test files that use multiple calls to
86
- # {Beaker::DSL::Helpers#on}.
87
- attr_accessor :result
88
-
89
- # @param [Hosts,Array<Host>] these_hosts The hosts to execute this test
90
- # against/on.
91
- # @param [Logger] logger A logger that implements
92
- # {Beaker::Logger}'s interface.
93
- # @param [Hash{Symbol=>String}] options Parsed command line options.
94
- # @param [String] path The local path to a test file to be executed.
95
- def initialize(these_hosts, logger, options={}, path=nil)
96
- @hosts = these_hosts
97
- @logger = logger
98
- @sublog = ""
99
- @options = options
100
- @path = path
101
- @usr_home = options[:home]
102
- @test_status = :pass
103
- @exception = nil
104
- @runtime = nil
105
- @teardown_procs = []
106
- @metadata = {}
107
- set_current_test_filename(@path ? File.basename(@path, '.rb') : nil)
108
-
109
-
110
- #
111
- # We put this on each wrapper (rather than the class) so that methods
112
- # defined in the tests don't leak out to other tests.
113
- class << self
114
- def run_test
115
- @logger.start_sublog
116
- @logger.last_result = nil
117
-
118
- set_current_step_name(nil)
119
-
120
- #add arbitrary role methods
121
- roles = []
122
- @hosts.each do |host|
123
- roles << host[:roles]
124
- end
125
- add_role_def( roles.flatten.uniq )
126
-
127
- @runtime = Benchmark.realtime do
128
- begin
129
- test = File.read(path)
130
- eval test,nil,path,1
131
- rescue FailTest, TEST_EXCEPTION_CLASS => e
132
- @test_status = :fail
133
- @exception = e
134
- rescue PendingTest
135
- @test_status = :pending
136
- rescue SkipTest
137
- @test_status = :skip
138
- rescue StandardError, ScriptError, SignalException => e
139
- log_and_fail_test(e)
140
- ensure
141
- @teardown_procs.each do |teardown|
142
- begin
143
- teardown.call
144
- rescue StandardError, SignalException, TEST_EXCEPTION_CLASS => e
145
- log_and_fail_test(e)
146
- end
147
- end
148
- end
149
- end
150
- @sublog = @logger.get_sublog
151
- @last_result = @logger.last_result
152
- return self
153
- end
154
-
155
- private
156
-
157
- # Log an error and mark the test as failed, passing through an
158
- # exception so it can be displayed at the end of the total run.
159
- #
160
- # We break out the complete exception backtrace and log each line
161
- # individually as well.
162
- #
163
- # @param exception [Exception] exception to fail with
164
- def log_and_fail_test(exception)
165
- logger.error("#{exception.class}: #{exception.message}")
166
- bt = exception.backtrace
167
- logger.pretty_backtrace(bt).each_line do |line|
168
- logger.error(line)
169
- end
170
- @test_status = :error
171
- @exception = exception
172
- end
173
- end
174
- end
175
-
176
- # The TestCase as a hash
177
- # @api public
178
- # @note The visibility and semantics of this method are valid, but the
179
- # structure of the Hash it returns may change without notice
180
- #
181
- # @return [Hash] A Hash representation of this test.
182
- def to_hash
183
- hash = {}
184
- hash['HOSTS'] = {}
185
- @hosts.each do |host|
186
- hash['HOSTS'][host.name] = host.overrides
187
- end
188
- hash
189
- end
190
- end
191
- end
192
- end
193
- end