testability-driver-runner 0.9.2

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 (74) hide show
  1. data/bin/sierra +19 -0
  2. data/bin/tdrunner +17 -0
  3. data/lib/tdrunner.rb +208 -0
  4. data/lib/tdrunner.yml +1 -0
  5. data/lib/tdrunner_cucumber.rb +222 -0
  6. data/lib/tdrunner_cucumber_runners.rb +35 -0
  7. data/lib/tdrunner_file_finder.rb +45 -0
  8. data/lib/tdrunner_monitor.rb +473 -0
  9. data/lib/tdrunner_profile.rb +416 -0
  10. data/lib/tdrunner_test_unit.rb +433 -0
  11. data/rakefile +135 -0
  12. data/readme +186 -0
  13. data/websi/README +243 -0
  14. data/websi/Rakefile +10 -0
  15. data/websi/app/controllers/application_controller.rb +29 -0
  16. data/websi/app/controllers/report_editor/test_run/cases_controller.rb +307 -0
  17. data/websi/app/controllers/report_editor_controller.rb +25 -0
  18. data/websi/app/controllers/websi_controller.rb +478 -0
  19. data/websi/app/controllers/websi_script.rb +26 -0
  20. data/websi/app/controllers/websi_support.rb +142 -0
  21. data/websi/app/helpers/application_helper.rb +22 -0
  22. data/websi/app/helpers/report_editor/report_editor_helper.rb +26 -0
  23. data/websi/app/helpers/report_editor/test_run/cases_helper.rb +26 -0
  24. data/websi/app/helpers/websi_helper.rb +21 -0
  25. data/websi/app/views/layouts/application.rhtml +17 -0
  26. data/websi/app/views/websi/execution.html.erb +28 -0
  27. data/websi/app/views/websi/index.html.erb +23 -0
  28. data/websi/app/views/websi/profile.html.erb +30 -0
  29. data/websi/app/views/websi/results.html.erb +30 -0
  30. data/websi/app/views/websi/tests.html.erb +23 -0
  31. data/websi/app/views/websi/weights.html.erb +16 -0
  32. data/websi/config/boot.rb +129 -0
  33. data/websi/config/database.yml +22 -0
  34. data/websi/config/environment.rb +60 -0
  35. data/websi/config/environments/development.rb +36 -0
  36. data/websi/config/environments/production.rb +47 -0
  37. data/websi/config/environments/test.rb +47 -0
  38. data/websi/config/initializers/backtrace_silencers.rb +26 -0
  39. data/websi/config/initializers/inflections.rb +29 -0
  40. data/websi/config/initializers/mime_types.rb +24 -0
  41. data/websi/config/initializers/new_rails_defaults.rb +40 -0
  42. data/websi/config/initializers/session_store.rb +34 -0
  43. data/websi/config/locales/en.yml +5 -0
  44. data/websi/config/routes.rb +62 -0
  45. data/websi/db/development.sqlite3 +0 -0
  46. data/websi/db/seeds.rb +26 -0
  47. data/websi/doc/README_FOR_APP +2 -0
  48. data/websi/log/development.log +0 -0
  49. data/websi/log/production.log +0 -0
  50. data/websi/log/server.log +0 -0
  51. data/websi/log/test.log +0 -0
  52. data/websi/public/report_editor/test_run/_index.html +12 -0
  53. data/websi/public/robots.txt +5 -0
  54. data/websi/public/stylesheets/tdriver_report_style.css +220 -0
  55. data/websi/public/tests/config/web_profile.sip +0 -0
  56. data/websi/public/tests/example_profile.sip +8 -0
  57. data/websi/public/tests/tdrunner.yml +3 -0
  58. data/websi/public/tests/web_profile.sip +8 -0
  59. data/websi/public/tests/websi_parameters.xml +4 -0
  60. data/websi/script/about +4 -0
  61. data/websi/script/console +3 -0
  62. data/websi/script/dbconsole +3 -0
  63. data/websi/script/destroy +3 -0
  64. data/websi/script/generate +3 -0
  65. data/websi/script/performance/benchmarker +3 -0
  66. data/websi/script/performance/profiler +3 -0
  67. data/websi/script/plugin +3 -0
  68. data/websi/script/runner +3 -0
  69. data/websi/script/server +3 -0
  70. data/websi/test/functional/websi_controller_test.rb +27 -0
  71. data/websi/test/performance/browsing_test.rb +28 -0
  72. data/websi/test/test_helper.rb +57 -0
  73. data/websi/test/unit/helpers/websi_helper_test.rb +23 -0
  74. metadata +199 -0
@@ -0,0 +1,416 @@
1
+ ############################################################################
2
+ ##
3
+ ## Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4
+ ## All rights reserved.
5
+ ## Contact: Nokia Corporation (testabilitydriver@nokia.com)
6
+ ##
7
+ ## This file is part of Testability Driver.
8
+ ##
9
+ ## If you have questions regarding the use of this file, please contact
10
+ ## Nokia at testabilitydriver@nokia.com .
11
+ ##
12
+ ## This library is free software; you can redistribute it and/or
13
+ ## modify it under the terms of the GNU Lesser General Public
14
+ ## License version 2.1 as published by the Free Software Foundation
15
+ ## and appearing in the file LICENSE.LGPL included in the packaging
16
+ ## of this file.
17
+ ##
18
+ ############################################################################
19
+
20
+
21
+ require File.expand_path( File.join( File.dirname( __FILE__ ), 'tdrunner_file_finder' ) )
22
+ require 'time'
23
+ require 'tdriver'
24
+ include TDriverReportAPI
25
+ include TDriverReportCreator
26
+
27
+ module TDRunner
28
+ #Class for loading tdrunner exeution profile from tdrunner.yml file
29
+ class TDRunnerProfileLoader
30
+ def initialize(args)
31
+ @execution_profiles=Array.new
32
+ parse_execution_profiles(args)
33
+ end
34
+ def parse_execution_profiles(args)
35
+ args.each do |value|
36
+ if value != '-p'
37
+ @execution_profiles << value.gsub(' ','')
38
+ end
39
+ end
40
+ end
41
+ def args_from(profile)
42
+ unless tdrunner_yml.has_key?(profile)
43
+ raise(ProfileNotFound, <<-END_OF_ERROR)
44
+ Could not find profile: '#{profile}'
45
+
46
+ Defined profiles in tdrunner.yml:
47
+ * #{tdrunner_yml.keys.join("\n * ")}
48
+ END_OF_ERROR
49
+ end
50
+
51
+ args_from_yml = tdrunner_yml[profile] || ''
52
+
53
+ case(args_from_yml)
54
+ when String
55
+ raise YmlLoadError, "The '#{profile}' profile in tdrunner.yml was blank. Please define the command line arguments for the '#{profile}' profile in tdrunner.yml.\n" if args_from_yml =~ /^\s*$/
56
+ args_from_yml = args_from_yml.split(' ')
57
+ when Array
58
+ raise YmlLoadError, "The '#{profile}' profile in tdrunner.yml was empty. Please define the command line arguments for the '#{profile}' profile in tdrunner.yml.\n" if args_from_yml.empty?
59
+ else
60
+ raise YmlLoadError, "The '#{profile}' profile in tdrunner.yml was a #{args_from_yml.class}. It must be a String or Array"
61
+ end
62
+ args_from_yml
63
+ end
64
+
65
+ def has_profile?(profile)
66
+ tdrunner_yml.has_key?(profile)
67
+ end
68
+
69
+ def tdrunner_yml_defined?
70
+ tdrunner_file && File.exist?(tdrunner_file)
71
+ end
72
+
73
+ def get_execution_profiles
74
+ @execution_profiles
75
+ end
76
+ private
77
+
78
+ # Loads the profile, processing it through ERB and YAML, and returns it as a hash.
79
+ def tdrunner_yml
80
+ return @tdrunner_yml if @tdrunner_yml
81
+ unless tdrunner_yml_defined?
82
+ raise(ProfilesNotDefinedError,"tdrunner.yml was not found. Please refer to tdrunner's documentation on defining profiles in tdrunner.yml. You must define a 'default' profile to use the tdrunner command without any arguments.\nType 'tdrunner --help' for usage.\n")
83
+ end
84
+
85
+ require 'erb'
86
+ require 'yaml'
87
+ begin
88
+ @tdrunner_erb = ERB.new(IO.read(tdrunner_file)).result
89
+ rescue Exception => e
90
+ raise(YmlLoadError,"tdrunner.yml was found, but could not be parsed with ERB. Please refer to tdrunner's documentation on correct profile usage.\n#{$!.inspect}")
91
+ end
92
+
93
+ begin
94
+ @tdrunner_yml = YAML::load(@tdrunner_erb)
95
+ rescue Exception => e
96
+ raise(e.message,"tdrunner.yml was found, but could not be parsed. Please refer to tdrunner's documentation on correct profile usage.\n")
97
+ end
98
+
99
+ if @tdrunner_yml.nil? || !@tdrunner_yml.is_a?(Hash)
100
+ raise("tdrunner.yml was found, but was blank or malformed. Please refer to tdrunner's documentation on correct profile usage.\n")
101
+ end
102
+
103
+ return @tdrunner_yml
104
+ end
105
+ # Locates tdrunner.yml file. The file can end in .yml or .yaml,
106
+ # and be located in the current directory (eg. project root) or
107
+ # in a .config/ or config/ subdirectory of the current directory.
108
+ def tdrunner_file
109
+ @tdrunner_file ||= Dir.glob('{,.config/,config/}tdrunner{.yml,.yaml}').first
110
+ end
111
+ end
112
+
113
+ #Calss for holding the tdrunner execution parameters
114
+ class TDRunnerParameters
115
+ #intializes tdrunner execution parameters and loads them to memory
116
+ def initialize(args)
117
+ @test_framework=nil
118
+ @test_framework_command=Array.new
119
+ @execution_mode='-i'
120
+ @lpt_run=1
121
+ @duration_value=0
122
+ @execution_profile=nil
123
+ @tdrunner_teardown=false
124
+ @tdrunner_ordered=false
125
+ @tdrunner_combine_report=nil
126
+ @start_time=nil
127
+ @failed_execution_profile=nil
128
+ parse_tdrunner_parameters(args)
129
+ end
130
+
131
+ #method for checking the end time for tdrunner run
132
+ def format_tdrunner_date(date_time)
133
+ Time.parse(date_time)
134
+ end
135
+
136
+ #method to check that the format of the duration value is correct - e.g. 4, 4.5, 4:23 are correct
137
+ def check_duration(duration_value)
138
+ ret=false
139
+ if (/^\d+$/.match(duration_value) or /^\d+.\d+$/.match(duration_value))
140
+ ret=true
141
+ elsif (/^\d+:\d+$/.match(duration_value))
142
+ if(duration_value.split(':') [1].to_i)<60
143
+ ret=true
144
+ end
145
+ end
146
+ ret
147
+ end
148
+
149
+ #method for combining a TDriver report with the current tdrunner execution
150
+ def combine_with_existing_tdriver_report(report_location)
151
+ Kernel::raise ArgumentError.new("Report folder does not exists") if File.directory?(report_location)==false
152
+ TDriverReportAPI::tdriver_report_combine_reports(report_location)
153
+ end
154
+
155
+ #method for checking the framework command
156
+ def check_if_parameters_contain_a_framework_command(args)
157
+ parameters_contains_framework_command=false
158
+ is_directory=false
159
+ args.each do |value|
160
+ is_directory=File.directory?(value)
161
+ if value=='test_suite'
162
+ if is_directory==false
163
+ parameters_contains_framework_command=true
164
+ @test_framework='test_suite'
165
+ end
166
+ end
167
+ if value=='test_unit'
168
+ if is_directory==false
169
+ parameters_contains_framework_command=true
170
+ @test_framework='test_unit'
171
+ end
172
+ end
173
+ if value=='cucumber'
174
+ if is_directory==false
175
+ parameters_contains_framework_command=true
176
+ @test_framework='cucumber'
177
+ end
178
+ end
179
+ end
180
+ parameters_contains_framework_command
181
+ end
182
+
183
+ #Parser method for tdrunner commandline parameters
184
+ #-H prameter defines the runtime
185
+ #-d parameter is for the end time stamp
186
+ #-i parameter is for the iteration number for the tests
187
+ #-m parameter is for creating a test set execution profile without running the tests
188
+ def parse_tdrunner_parameters(args)
189
+ hour_defined=false
190
+ end_date_defined=false
191
+ start_date_defined=false
192
+ iterations_defined=false
193
+ execution_profile_defined=false
194
+ make_execution_profile=false
195
+ combine_report_defined=false
196
+ make_failed_execution_profile_defined=false
197
+ parameters_contains_framework_command=check_if_parameters_contain_a_framework_command(args)
198
+
199
+ args.each do |value|
200
+ if hour_defined==true
201
+ @execution_mode='-H'
202
+ @duration_value=value.to_s
203
+ if !check_duration(@duration_value)
204
+ puts 'Error duration '+ @duration_value+ ' is not valid!'
205
+ exit
206
+ end
207
+ hour_defined=false
208
+ end
209
+ if end_date_defined==true
210
+ @execution_mode='-d'
211
+ @lpt_run=Time.new
212
+ @lpt_run=format_tdrunner_date(value)
213
+ if @lpt_run < Time.now
214
+ puts 'Error date '+ @lpt_run.to_s + ' is in the past!'
215
+ exit
216
+ end
217
+ end_date_defined=false
218
+ end
219
+ if start_date_defined==true
220
+ @start_time=format_tdrunner_date(value)
221
+ if @start_time < Time.now
222
+ puts 'Error date '+ @start_time.to_s + ' is in the past!'
223
+ exit
224
+ end
225
+ start_date_defined=false
226
+ end
227
+ if iterations_defined==true
228
+ @execution_mode='-i'
229
+ @lpt_run=value.to_i
230
+ iterations_defined=false
231
+ end
232
+ if execution_profile_defined==true
233
+ #@execution_mode='-e'
234
+ @execution_profile=value
235
+ execution_profile_defined=false
236
+ end
237
+ if make_execution_profile==true
238
+ @execution_mode='-m'
239
+ @execution_profile=value
240
+ make_execution_profile=false
241
+ end
242
+ if combine_report_defined==true
243
+ combine_report_defined=false
244
+ @tdrunner_combine_report=value
245
+ combine_with_existing_tdriver_report(value)
246
+ end
247
+ if make_failed_execution_profile_defined==true
248
+ make_failed_execution_profile_defined=false
249
+ @failed_execution_profile=value
250
+ end
251
+
252
+ if value.to_s == '--teardown'
253
+ @tdrunner_teardown=true
254
+ end
255
+ if value.to_s == '--ordered'
256
+ @tdrunner_ordered=true
257
+ end
258
+ if value.to_s == '-H'
259
+ hour_defined=true
260
+ end
261
+ if value.to_s == '-d'
262
+ end_date_defined=true
263
+ end
264
+ if value.to_s == '-s'
265
+ start_date_defined=true
266
+ end
267
+ if value.to_s == '-i'
268
+ iterations_defined=true
269
+ end
270
+ if value.to_s == '-e'
271
+ execution_profile_defined=true
272
+ end
273
+ if value.to_s == '-m'
274
+ make_execution_profile=true
275
+ end
276
+ if value.to_s == '-c'
277
+ combine_report_defined=true
278
+ end
279
+ if value.to_s == '-t'
280
+ make_failed_execution_profile_defined=true
281
+ end
282
+
283
+ end
284
+
285
+ framework_command_start=false
286
+ args.each do |value|
287
+ if value=='.'
288
+ value=Dir.getwd
289
+ end
290
+ if framework_command_start==true
291
+ @test_framework_command << value
292
+ end
293
+ if value==@test_framework && parameters_contains_framework_command==true
294
+ framework_command_start=true
295
+ else
296
+ if File.directory?(value) && framework_command_start==false && value!=@tdrunner_combine_report
297
+ @test_framework_command << value
298
+ framework_command_start=true
299
+ end
300
+ if File.file?(value) && framework_command_start==false && value.include?('.sip')==false
301
+ @test_framework_command << value
302
+ framework_command_start=true
303
+ end
304
+ end
305
+ end
306
+ if @execution_profile!=nil
307
+ if parameters_contains_framework_command==false
308
+ profile_location=sip_file(@execution_profile,@test_framework_command)
309
+ @execution_profile=profile_location
310
+ else
311
+ profile_location=sip_file(@execution_profile)
312
+ @execution_profile=profile_location
313
+ end
314
+ end
315
+ if @failed_execution_profile!=nil
316
+ failed_profile_location=create_failed_sip(@failed_execution_profile)
317
+ @failed_execution_profile=failed_profile_location
318
+ end
319
+ end
320
+ def create_failed_sip(failed_sip_profile)
321
+ sip_file=nil
322
+ failed_sip_profile=failed_sip_profile+'.sip' if failed_sip_profile.include?('.sip')==false
323
+ #check if failed_sip_profile already exists in current dir
324
+ if File.file?(failed_sip_profile)
325
+ sip_file = failed_sip_profile
326
+ end
327
+
328
+ #check if path given
329
+ if sip_file==nil
330
+ failed_sip_profile=failed_sip_profile.gsub(/\\/,'/')
331
+ dirs = File.dirname(failed_sip_profile)
332
+ if (dirs != ".")
333
+ #check if the dirs exist, if not create the dirs
334
+ File.makedirs(dirs) if !File.exist?(dirs)
335
+ sip_file=failed_sip_profile
336
+ else
337
+ FileUtils.mkdir_p 'config' if File::directory?('config')==false
338
+ sip_file=File.join('config/', failed_sip_profile)
339
+ end
340
+ #File.open(sip_file, 'w') { |file| file.write('') }
341
+ end
342
+
343
+ return sip_file
344
+ end
345
+ # Locates sip file.
346
+ # and be located in the current directory (eg. project root) or
347
+ # in a .config/ or config/ subdirectory of the current directory.
348
+ def sip_file(tdrunner_profile,profile_folder=nil)
349
+ @tdrunner_profile_file=nil
350
+ tdrunner_profile=tdrunner_profile+'.sip' if tdrunner_profile.include?('.sip')==false
351
+ if File.file?(tdrunner_profile)
352
+ @tdrunner_profile_file=tdrunner_profile
353
+ end
354
+
355
+ if @tdrunner_profile_file==nil
356
+ profile_finder=TDRunnerFileFinder.new('sip')
357
+ found_profile_files=profile_finder.get_files(Dir.getwd)
358
+ found_profile_files.each do |profile_file|
359
+ if File.basename(profile_file.gsub('\\','/')).downcase==tdrunner_profile.downcase
360
+ @tdrunner_profile_file=profile_file.gsub('\\','/')
361
+ end
362
+ end
363
+ end
364
+
365
+ if @tdrunner_profile_file==nil
366
+ if File::directory?('config')==false
367
+ FileUtils.mkdir_p 'config'
368
+ end
369
+ if tdrunner_profile.include?("\\")
370
+ prof_arr=tdrunner_profile.split("\\")
371
+ tdrunner_profile=prof_arr.last
372
+ elsif tdrunner_profile.include?('/')
373
+ prof_arr=tdrunner_profile.split("/")
374
+ tdrunner_profile=prof_arr.last
375
+ end
376
+ File.open('config/'+tdrunner_profile, 'w') { |file| file.write('') }
377
+ profile_file=File.join('config','**', tdrunner_profile)
378
+ end
379
+ @tdrunner_profile_file ||= Dir.glob(profile_file).first
380
+ @tdrunner_profile_file
381
+ end
382
+ def test_framework()
383
+ @test_framework
384
+ end
385
+ def test_framework_command()
386
+ @test_framework_command
387
+ end
388
+ def execution_mode()
389
+ @execution_mode
390
+ end
391
+ def lpt_run()
392
+ @lpt_run
393
+ end
394
+ def duration_value()
395
+ @duration_value
396
+ end
397
+ def tdrunner_teardown()
398
+ @tdrunner_teardown
399
+ end
400
+ def execution_profile()
401
+ @execution_profile
402
+ end
403
+ def make_execution_profile()
404
+ @make_execution_profile
405
+ end
406
+ def failed_execution_profile()
407
+ @failed_execution_profile
408
+ end
409
+ def tdrunner_ordered()
410
+ @tdrunner_ordered
411
+ end
412
+ def start_time()
413
+ @start_time
414
+ end
415
+ end
416
+ end
@@ -0,0 +1,433 @@
1
+ ##
2
+ ## Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
3
+ ## All rights reserved.
4
+ ## Contact: Nokia Corporation (tdriversupport@nokia.com)
5
+ ##
6
+ ## This file is part of Testability Driver.
7
+ ##
8
+ ## If you have questions regarding the use of this file, please contact
9
+ ## Nokia at tdriversupport@nokia.com.
10
+ ##
11
+ ## This library is free software; you can redistribute it and/or
12
+ ## modify it under the terms of the GNU Lesser General Public
13
+ ## License version 2.1 as published by the Free Software Foundation
14
+ ## and appearing in the file LICENSE.LGPL included in the packaging
15
+ ## of this file.
16
+ ##
17
+ ############################################################################
18
+ require File.expand_path( File.join( File.dirname( __FILE__ ), 'tdrunner_monitor' ) )
19
+ begin
20
+ require 'test/unit/ui/console/testrunner.rb'
21
+ require 'test/unit/util/observable'
22
+ module TDRunner
23
+ module TDRunnerTestUnit
24
+ #This class is used for building the TDRunner Test::Unit test suite
25
+ class TDRunnerTestSuiteBuilder
26
+ include TDRunner::TDRunnerMonitor
27
+ def initialize()
28
+ @exclude_folders_pattern = [ '.*', '_*' ]
29
+ @include_files_pattern = [ '*/*.rb' ]
30
+ @tests=nil
31
+ end
32
+ def file_pattern_matches?( patterns, filepath )
33
+ patterns.each{ | pattern | return true if File.fnmatch( pattern, filepath ) }; false
34
+ end
35
+ def get_files( folder, files_list = [] )
36
+ if File.directory?( folder )
37
+ folder = File.expand_path( folder )
38
+ Dir.open( folder ).each { | entry |
39
+ # create full filepath
40
+ filepath = "#{ folder }/#{ entry }"
41
+ # file: add file to required files list
42
+ files_list.push( filepath ) if file_pattern_matches?( @include_files_pattern, filepath )
43
+ # directory: go deeper in folder stack structure if exclusion pattern does not meet
44
+ files_list |= get_files("#{ filepath }/") if File.directory?( filepath ) and not file_pattern_matches?( @exclude_folders_pattern, entry )
45
+ }
46
+ files_list
47
+ else
48
+ folder
49
+ end
50
+ end
51
+ def add_file( tests )
52
+ collected_tests_and_classes=[]
53
+ @tests = []
54
+ @testcases = 0
55
+ @loaded_test_files=Array.new
56
+ tests = [ tests ] unless tests.kind_of?( Array )
57
+ tests.each{ | filename |
58
+
59
+ # expand wildcards to array if found
60
+ testsuites = ( filename.include?( '*' ) ? ( ( tmp = Dir.glob( filename ) ).empty? ? [ filename ] : tmp ): [ filename ] )
61
+
62
+ testsuites.each{ | testsuite_filename |
63
+
64
+ if File.exist?( testsuite_filename )
65
+ begin
66
+ @loaded_test_files << testsuite_filename
67
+ require testsuite_filename
68
+ rescue NoMethodError
69
+ #puts "Not a valid test unit file (#{ testsuite_filename })"
70
+ end
71
+ else
72
+ Kernel::raise LoadError.new( "Unable to add testcase to suite due to file not found (#{ testsuite_filename })" )
73
+ end
74
+
75
+ }
76
+
77
+ }
78
+
79
+ ObjectSpace.each_object( Class ){ | test_class |
80
+ if test_class.ancestors.include?( Test::Unit::TestCase ) && test_class != Test::Unit::TestCase
81
+ unless @tests.include? test_class
82
+
83
+ test_class=add_missing_methods_in_to_test_class(test_class,$tdrunner_parameters,@loaded_test_files) if $tdrunner_parameters.execution_profile!=nil
84
+
85
+ collected_tests_and_classes << test_class
86
+ test_class.public_instance_methods( true ).sort.each{ | method |
87
+ if method =~ /^test_/
88
+ collected_tests_and_classes << method+"(#{test_class})"
89
+ @testcases += 1
90
+ end
91
+ }
92
+ @tests.push test_class
93
+ end
94
+ end
95
+ }
96
+ randomize_test_cases(collected_tests_and_classes,$tdrunner_parameters)
97
+ @tests
98
+ end
99
+ end
100
+ # TDRunner test runner for Test::Unit tests
101
+ class ForkedTestRunnerMediator < Test::Unit::UI::TestRunnerMediator
102
+ require 'tdriver'
103
+ include TDRunnerMonitor
104
+ RESET = name + "::RESET"
105
+ STARTED = name + "::STARTED"
106
+ FINISHED = name + "::FINISHED"
107
+ include TDriverReportCreator
108
+ include Test::Unit::Util::Observable
109
+
110
+ # Creates a new TestRunnerMediator initialized to run
111
+ # the passed suite.
112
+ def initialize(suite)
113
+ super(suite)
114
+ trap_interrupt
115
+ @tc_result=nil
116
+ @current_suite_name=suite.name
117
+ @current_test_name=nil
118
+ add_listener(Test::Unit::TestCase::STARTED, &method(:test_started))
119
+ add_listener(Test::Unit::TestCase::FINISHED, &method(:test_finished))
120
+ add_listener(Test::Unit::TestResult::FAULT, &method(:fault))
121
+ end
122
+
123
+ # Runs the suite the TestRunnerMediator was created
124
+ # with.
125
+ def run_suite
126
+
127
+ Test::Unit.run = true
128
+ begin_time = Time.now
129
+ notify_listeners(RESET, @suite.size)
130
+ result = create_result
131
+ notify_listeners(STARTED, result)
132
+ result_listener = result.add_listener(Test::Unit::TestResult::CHANGED) do |updated_result|
133
+ notify_listeners(Test::Unit::TestResult::CHANGED, updated_result)
134
+ end
135
+
136
+ fault_listener = result.add_listener(Test::Unit::TestResult::FAULT) do |fault|
137
+ notify_listeners(Test::Unit::TestResult::FAULT, fault)
138
+ end
139
+
140
+ #SIERRA runner
141
+ run_start_time=Time.now
142
+ b_execution_monitor_thread=false
143
+ $tdrunner_interrupted=false
144
+ iteration=0
145
+ started_run()
146
+ while tdrunner_active(run_start_time,iteration,$tdrunner_parameters)==true
147
+ $tdrunner_interrupted=true if @suite.size==0
148
+ if b_execution_monitor_thread==false
149
+ b_execution_monitor_thread=true
150
+ t1 = Thread.new do
151
+ begin
152
+ while $tdrunner_interrupted==false
153
+ sleep 10
154
+ if tdrunner_active(run_start_time,iteration,$tdrunner_parameters)==false
155
+ $tdrunner_interrupted=true
156
+ end
157
+ end
158
+ rescue Exception => e
159
+ $tdrunner_interrupted=true
160
+ end
161
+ end
162
+ end
163
+ @suite.run(result) do |channel, value|
164
+ notify_listeners(channel, value)
165
+ break if $tdrunner_interrupted==true
166
+ end
167
+ iteration+=1
168
+ break if $tdrunner_interrupted==true
169
+ end
170
+ iteration=0
171
+ $tdrunner_interrupted=true
172
+ puts "\n"
173
+ current_run_time=Time.now-run_start_time
174
+ puts 'Run time: '+ format_duration(current_run_time)
175
+ #end SIERRA runner
176
+
177
+ result.remove_listener(Test::Unit::TestResult::FAULT, fault_listener)
178
+ result.remove_listener(Test::Unit::TestResult::CHANGED, result_listener)
179
+ end_time = Time.now
180
+ elapsed_time = end_time - begin_time
181
+ notify_listeners(FINISHED, elapsed_time) #"Finished in #{elapsed_time} seconds.")
182
+ return result
183
+ end
184
+ def get_class_name(full_test_name) #:nodoc:
185
+ begin
186
+ name=full_test_name
187
+ name=name.gsub(/[)]/,'')
188
+ name_arr=name.split('(')
189
+ return [name_arr[1].gsub(/[:]/,'_'),name_arr[0].gsub(/[:]/,'_')]
190
+ rescue
191
+ return ['Ruby test',full_test_name]
192
+ end
193
+ end
194
+ #This method initializes new test run
195
+ #
196
+ # === params
197
+ # === returns
198
+ # === raises
199
+ def started_run()
200
+ start_run()
201
+ add_report_group(@current_suite_name+'|')
202
+ end
203
+ #This method starts a new test case
204
+ #
205
+ # === params
206
+ # === returns
207
+ # === raises
208
+ def test_started(name)
209
+ full_name=get_class_name(name)
210
+ @current_test_name=full_name[1]
211
+ add_report_group(@current_suite_name+':'+full_name[0]+'|')
212
+ start_test_case(@current_test_name)
213
+ add_test_case_group(full_name[0])
214
+ @tc_result='passed'
215
+ end
216
+ #This method records the test case result
217
+ #
218
+ # === params
219
+ # === returns
220
+ # === raises
221
+ def test_finished(name)
222
+ if @tc_result=='passed'
223
+ update_test_case('-')
224
+ end
225
+ end_test_case(@current_test_name,@tc_result)
226
+ end
227
+ #This method records the test case fault result
228
+ #
229
+ # === params
230
+ # === returns
231
+ # === raises
232
+ def fault(fault)
233
+ capture_screen_test_case()
234
+ update_test_case(fault)
235
+ @tc_result='failed'
236
+ end
237
+ private
238
+ # A factory method to create the result the mediator
239
+ # should run with. Can be overridden by subclasses if
240
+ # one wants to use a different result.
241
+ def create_result
242
+ return Test::Unit::TestResult.new
243
+ end
244
+ end
245
+
246
+ #This class replaces the original Test::Unit runnerr with TDRunner runner and tdriver reporting
247
+ class TDRunnerTestUnitRunner < Test::Unit::UI::Console::TestRunner
248
+ def run(suite, output_level=NORMAL)
249
+ return new(suite, output_level).start
250
+ end
251
+ def create_mediator(suite)
252
+ return ForkedTestRunnerMediator.new(suite)
253
+ end
254
+ end
255
+
256
+ #This class initializes TDRunner for Test::Unit
257
+ class ForkedTestUnitRunner
258
+ include TDRunnerMonitor
259
+ # Creates a new TestRunner and runs the suite.
260
+ def initialize(test_suite)
261
+ results=TDRunnerTestUnitRunner.run(test_suite)
262
+ end
263
+ end
264
+ end
265
+ end
266
+ module Test
267
+ module Unit
268
+ class TestCase
269
+ # Runs the individual test method represented by this
270
+ # instance of the fixture, collecting statistics, failures
271
+ # and errors in result.
272
+ def run(result,arguments=nil,case_contents_array=nil,current_index=nil,status=nil)
273
+ @test_passed=true
274
+ yield(STARTED, name)
275
+ @_result = result
276
+ @case_contents_array=case_contents_array
277
+ begin
278
+
279
+ if self.respond_to?("setup_#{name[0..(name.to_s.index('(')-1)]}")
280
+ __send__("setup_#{name[0..(name.to_s.index('(')-1)]}") if status!=false
281
+ else
282
+ setup if status!=false
283
+ end
284
+
285
+ if arguments!=nil && status==nil
286
+ __send__(@method_name,*arguments)
287
+ elsif status==false
288
+ Kernel::raise('Previous dependency test failed')
289
+ else
290
+ __send__(@method_name)
291
+ end
292
+
293
+
294
+ rescue AssertionFailedError => e
295
+ add_failure(e.message, e.backtrace)
296
+ rescue Exception
297
+ raise if PASSTHROUGH_EXCEPTIONS.include? $!.class
298
+ add_error($!)
299
+ ensure
300
+ begin
301
+ if $tdrunner_parameters.tdrunner_teardown==true
302
+ if @test_passed != true
303
+ if respond_to?("teardown_#{name[0..(name.to_s.index('(')-1)]}")
304
+ __send__("teardown_#{name[0..(name.to_s.index('(')-1)]}") if status!=false
305
+ else
306
+ teardown if status!=false
307
+ end
308
+ end
309
+ else
310
+ if respond_to?("teardown_#{name[0..(name.to_s.index('(')-1)]}")
311
+ __send__("teardown_#{name[0..(name.to_s.index('(')-1)]}") if status!=false
312
+ else
313
+ teardown if status!=false
314
+ end
315
+ end
316
+ rescue AssertionFailedError => e
317
+ add_failure(e.message, e.backtrace)
318
+ rescue Exception
319
+ raise if PASSTHROUGH_EXCEPTIONS.include? $!.class
320
+ add_error($!)
321
+ end
322
+ @case_contents_array[current_index]=[@case_contents_array[current_index].at(0),@case_contents_array[current_index].at(1),@case_contents_array[current_index].at(2),@test_passed] if @case_contents_array!=nil && status==nil
323
+ end
324
+ result.add_run
325
+ yield(FINISHED, name)
326
+ end
327
+ end
328
+ class TestSuite
329
+ include TDRunner::TDRunnerMonitor
330
+ # Runs the tests and/or suites contained in this
331
+ # TestSuite.
332
+ def parse_parameter_string(string)
333
+ s = string
334
+
335
+ separator = '%separator%'
336
+
337
+ strings = []
338
+
339
+ # store strings
340
+ s.scan( /(["'])(.*?\1)/ ).each_with_index{ | match, index |
341
+
342
+ strings << match.join
343
+
344
+ s.gsub!( strings.last, "%string#{ index }%" )
345
+
346
+ }
347
+
348
+ s.gsub!( ',', separator )
349
+
350
+ # return string
351
+ strings.each_with_index{ | string, index |
352
+
353
+ s.gsub!( "%string#{ index }%", string )
354
+ }
355
+
356
+ parameters = s.split( separator )
357
+ parameters
358
+ end
359
+ def run(result,arguments=nil,case_contents_array=nil, current_index=nil,status=nil, &progress_block)
360
+ yield(STARTED, name)
361
+ @tests,@case_contents_array=randomize_test_cases(@tests,$tdrunner_parameters)
362
+ @test_level_and_result=Array.new if @test_level_and_result==nil
363
+ current_index=0
364
+ previous_test_level=0
365
+ previous_test_level_result=nil
366
+ current_test_level=0
367
+ @tests.each do |test|
368
+ parameters_arr=nil
369
+ eval_parameters_arr=[]
370
+ if @case_contents_array!=nil
371
+ if @case_contents_array[current_index]!=nil
372
+ parameters_arr=parse_parameter_string(@case_contents_array[current_index].at(1)) if @case_contents_array[current_index].at(1)!=nil
373
+ previous_test_level=@case_contents_array[current_index-1].at(2).count "-" if current_index > 0
374
+ previous_test_level_result=@case_contents_array[current_index-1].at(3) if current_index > 0
375
+ @test_level_and_result << [previous_test_level,previous_test_level_result]
376
+ current_test_level=@case_contents_array[current_index].at(2).count "-"
377
+ @test_level_and_result=[] if current_test_level==0
378
+ if parameters_arr!=nil
379
+ parameters_arr.each do |sip_parameter|
380
+ eval_result=eval(sip_parameter)
381
+ eval_parameters_arr.push eval_result if eval_result!=nil
382
+ end
383
+ end
384
+ #execution logic for running tests with dependency
385
+ #case contents array contains "test case name, test case parameters, test case position in tree, test case result"
386
+ if $tdrunner_parameters.tdrunner_ordered==true
387
+ b_dependency_passed=true
388
+ first_failed_test_level_fail=0
389
+ first_test_level_pass=0
390
+ @test_level_and_result.each do |test_level_result|
391
+ if test_level_result[1]==false
392
+ first_failed_test_level_fail=test_level_result[0]
393
+ if first_failed_test_level_fail.to_i<current_test_level.to_i
394
+ b_dependency_passed=false
395
+ end
396
+ elsif test_level_result[1]==true
397
+ first_test_level_pass=test_level_result[0]
398
+ if first_test_level_pass.to_i<current_test_level.to_i
399
+ b_dependency_passed=true
400
+ end
401
+ end
402
+ end
403
+
404
+ if current_test_level==0
405
+ test.run(result, eval_parameters_arr, @case_contents_array, current_index, nil, &progress_block)
406
+ elsif b_dependency_passed==false
407
+ test.run(result, eval_parameters_arr, @case_contents_array, current_index, false, &progress_block)
408
+ elsif b_dependency_passed==true
409
+ test.run(result, eval_parameters_arr, @case_contents_array, current_index, nil, &progress_block)
410
+ else
411
+ test.run(result, eval_parameters_arr, @case_contents_array, current_index, false, &progress_block)
412
+ end
413
+ else
414
+ test.run(result, eval_parameters_arr, @case_contents_array, current_index, nil, &progress_block)
415
+ end
416
+ end
417
+ else
418
+ test.run(result, eval_parameters_arr, @case_contents_array, current_index, &progress_block)
419
+ end
420
+
421
+ if (@case_contents_array!=nil && @case_contents_array[current_index]!=nil && @case_contents_array[current_index].at(3)==false)
422
+ add_failed_testunit_tests($tdrunner_parameters, @case_contents_array, current_index)
423
+ end
424
+ current_index+=1
425
+ end
426
+ yield(FINISHED, name)
427
+ end
428
+ end
429
+ end
430
+ end
431
+ rescue LoadError
432
+
433
+ end