oats 0.0.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.
Files changed (181) hide show
  1. data/.gitignore +6 -0
  2. data/Gemfile +15 -0
  3. data/README.txt +165 -0
  4. data/Rakefile +2 -0
  5. data/bin/agent +204 -0
  6. data/bin/oats +10 -0
  7. data/bin/occ +29 -0
  8. data/bin/results_cleanup +6 -0
  9. data/doc/COPYING +55 -0
  10. data/doc/LICENSE +55 -0
  11. data/doc/OATS_Framework.doc +0 -0
  12. data/doc/classes/ApplicationLogs.html +239 -0
  13. data/doc/classes/Campaign.html +843 -0
  14. data/doc/classes/CommandlineOptions.html +131 -0
  15. data/doc/classes/Driver.html +182 -0
  16. data/doc/classes/Hash.html +137 -0
  17. data/doc/classes/Ide.html +194 -0
  18. data/doc/classes/MapSelenium.html +197 -0
  19. data/doc/classes/Net.html +107 -0
  20. data/doc/classes/Oats/OatsFilterError.html +119 -0
  21. data/doc/classes/Oats.html +998 -0
  22. data/doc/classes/OatsAssertError.html +119 -0
  23. data/doc/classes/OatsBadInput.html +119 -0
  24. data/doc/classes/OatsData.html +290 -0
  25. data/doc/classes/OatsError.html +117 -0
  26. data/doc/classes/OatsExit.html +117 -0
  27. data/doc/classes/OatsLock.html +254 -0
  28. data/doc/classes/OatsMain.html +182 -0
  29. data/doc/classes/OatsMysqlError.html +113 -0
  30. data/doc/classes/OatsMysqlMissingInput.html +113 -0
  31. data/doc/classes/OatsReportError.html +113 -0
  32. data/doc/classes/OatsSetupError.html +119 -0
  33. data/doc/classes/OatsTestError.html +119 -0
  34. data/doc/classes/OatsTestExit.html +119 -0
  35. data/doc/classes/OatsTestLocateError.html +120 -0
  36. data/doc/classes/OatsVerifyError.html +119 -0
  37. data/doc/classes/Ragent.html +397 -0
  38. data/doc/classes/Rclient.html +236 -0
  39. data/doc/classes/Report.html +368 -0
  40. data/doc/classes/Reports.html +244 -0
  41. data/doc/classes/RestApi.html +333 -0
  42. data/doc/classes/RhttpClient.html +236 -0
  43. data/doc/classes/Rimap.html +170 -0
  44. data/doc/classes/Rmysql.html +176 -0
  45. data/doc/classes/Roptions.html +131 -0
  46. data/doc/classes/Rselenium.html +233 -0
  47. data/doc/classes/Rssh.html +138 -0
  48. data/doc/classes/Runnable.html +174 -0
  49. data/doc/classes/SFTriggers.html +206 -0
  50. data/doc/classes/Selenium/Client/Driver.html +211 -0
  51. data/doc/classes/Selenium/Client.html +107 -0
  52. data/doc/classes/Selenium.html +107 -0
  53. data/doc/classes/SystemCapture.html +304 -0
  54. data/doc/classes/TestCase.html +418 -0
  55. data/doc/classes/TestData.html +235 -0
  56. data/doc/classes/TestList.html +264 -0
  57. data/doc/classes/Tools.html +244 -0
  58. data/doc/classes/Util.html +201 -0
  59. data/doc/classes/Variation.html +206 -0
  60. data/doc/fr_class_index.html +92 -0
  61. data/doc/fr_method_index.html +465 -0
  62. data/doc/index.html +23 -0
  63. data/doc/oats_httpd.conf +32 -0
  64. data/doc/oats_user.yml +25 -0
  65. data/doc/rdoc-style.css +208 -0
  66. data/lib/deep_merge/.gitignore +2 -0
  67. data/lib/deep_merge/core.rb +195 -0
  68. data/lib/deep_merge/deep_merge.rb +1 -0
  69. data/lib/deep_merge/deep_merge_hash.rb +28 -0
  70. data/lib/deep_merge/rails_compat.rb +27 -0
  71. data/lib/oats/application_logs.rb +163 -0
  72. data/lib/oats/build_id.rb +58 -0
  73. data/lib/oats/commandline_options.rb +128 -0
  74. data/lib/oats/diff.rb +278 -0
  75. data/lib/oats/driver.rb +492 -0
  76. data/lib/oats/ide.rb +227 -0
  77. data/lib/oats/keywords.rb +67 -0
  78. data/lib/oats/log4r_init.rb +14 -0
  79. data/lib/oats/mysql.rb +97 -0
  80. data/lib/oats/oats.rb +637 -0
  81. data/lib/oats/oats_data.rb +400 -0
  82. data/lib/oats/oats_exceptions.rb +25 -0
  83. data/lib/oats/oats_lock.rb +261 -0
  84. data/lib/oats/oats_selenium_api.rb +639 -0
  85. data/lib/oats/oselenium.rb +189 -0
  86. data/lib/oats/ossh.rb +36 -0
  87. data/lib/oats/patches_for_eventmachine_12.10.rb +66 -0
  88. data/lib/oats/ragent.rb +321 -0
  89. data/lib/oats/rclient.rb +42 -0
  90. data/lib/oats/report.rb +207 -0
  91. data/lib/oats/roptions.rb +88 -0
  92. data/lib/oats/test_case.rb +510 -0
  93. data/lib/oats/test_data.rb +98 -0
  94. data/lib/oats/test_list.rb +141 -0
  95. data/lib/oats/unixdiff.rb +75 -0
  96. data/lib/oats/util.rb +125 -0
  97. data/lib/oats/version.rb +3 -0
  98. data/lib/oats.rb +36 -0
  99. data/nbproject/configs/agent.properties +0 -0
  100. data/nbproject/configs/gr.properties +0 -0
  101. data/nbproject/project.properties +10 -0
  102. data/nbproject/project.xml +17 -0
  103. data/oats.gemspec +42 -0
  104. data/oats_ini.yml +258 -0
  105. data/oats_tests/Gemfile +18 -0
  106. data/oats_tests/aut_ini.yml +30 -0
  107. data/oats_tests/bin/oats +8 -0
  108. data/oats_tests/environments/qa.yml +4 -0
  109. data/oats_tests/environments/qa_chrome.yml +4 -0
  110. data/oats_tests/examples/core/coreExamples.yml +8 -0
  111. data/oats_tests/examples/core/expectedException.rb +39 -0
  112. data/oats_tests/examples/core/ok_verify.rb +2 -0
  113. data/oats_tests/examples/core/ok_verify.rb_ok/out/myfile.txt +1 -0
  114. data/oats_tests/examples/core/ok_verify.rb_ok/out/myfile2.txt +1 -0
  115. data/oats_tests/examples/core/ok_verify.rb_ok/rats_test.log +2 -0
  116. data/oats_tests/examples/core/unexpectedException.rb +30 -0
  117. data/oats_tests/examples/examples.yml +13 -0
  118. data/oats_tests/examples/gui/guiExamples.yml +7 -0
  119. data/oats_tests/examples/gui/seleniumGoogle.rb +10 -0
  120. data/oats_tests/examples/gui/webdriverGoogle.rb +9 -0
  121. data/oats_tests/examples/keywords/SampleXlList-1.xls +0 -0
  122. data/oats_tests/examples/keywords/SampleXlList-2.xls +0 -0
  123. data/oats_tests/examples/keywords/SampleXlLists.xls +0 -0
  124. data/oats_tests/examples/keywords/keywordsDriver.rb +1 -0
  125. data/oats_tests/examples/keywords/keywordsExamples.yml +8 -0
  126. data/oats_tests/examples/keywords/keywordsTC1.yml +5 -0
  127. data/oats_tests/examples/keywords/keywordsTestlist.yml +16 -0
  128. data/oats_tests/examples/needsWork/addTestDynamically.rb +4 -0
  129. data/oats_tests/examples/needsWork/emailVerify.rb +34 -0
  130. data/oats_tests/examples/needsWork/testSql/rtest.sql +6 -0
  131. data/oats_tests/examples/needsWork/testSql/rtest.yml +11 -0
  132. data/oats_tests/examples/occTest/occTest.rb +13 -0
  133. data/oats_tests/examples/occTest/occTest_1.rb +1 -0
  134. data/oats_tests/examples/occTest/occTest_1_1.rb +1 -0
  135. data/oats_tests/examples/occTest/occTest_1_2.rb +1 -0
  136. data/oats_tests/examples/occTest/occTest_1_3.rb +1 -0
  137. data/oats_tests/examples/occTest/occTest_1_4.rb +1 -0
  138. data/oats_tests/examples/occTest/occTest_2.rb +1 -0
  139. data/oats_tests/examples/occTest/occTest_2_1.rb +1 -0
  140. data/oats_tests/examples/occTest/occTest_2_2.rb +1 -0
  141. data/oats_tests/examples/occTest/occTest_2_3.rb +1 -0
  142. data/oats_tests/examples/occTest/occTest_2_4.rb +1 -0
  143. data/oats_tests/examples/occTest/occTest_3.rb +1 -0
  144. data/oats_tests/examples/occTest/occTest_3_1.rb +1 -0
  145. data/oats_tests/examples/occTest/occTest_3_2.rb +1 -0
  146. data/oats_tests/examples/occTest/occTest_3_3.rb +1 -0
  147. data/oats_tests/examples/occTest/occTest_3_4.rb +1 -0
  148. data/oats_tests/examples/occTest/occTest_4.rb +1 -0
  149. data/oats_tests/examples/occTest/occTestlist.yml +9 -0
  150. data/oats_tests/examples/occTest/occTestlist_1.yml +9 -0
  151. data/oats_tests/examples/occTest/occTestlist_2.yml +9 -0
  152. data/oats_tests/examples/occTest/occTestlist_3.yml +9 -0
  153. data/oats_tests/examples/occTest/variation1.yml +4 -0
  154. data/oats_tests/examples/occTest/variation2.yml +4 -0
  155. data/oats_tests/examples/testFileLocationUnitTests/extn_driver.rb +4 -0
  156. data/oats_tests/examples/testFileLocationUnitTests/folder/oats.yml +3 -0
  157. data/oats_tests/examples/testFileLocationUnitTests/folder/t1.rb +2 -0
  158. data/oats_tests/examples/testFileLocationUnitTests/folder1/t1.yml +2 -0
  159. data/oats_tests/examples/testFileLocationUnitTests/folder1/t1_1.yml +3 -0
  160. data/oats_tests/examples/testFileLocationUnitTests/folder2/oats.yml +3 -0
  161. data/oats_tests/examples/testFileLocationUnitTests/folder2/t1.rb +2 -0
  162. data/oats_tests/examples/testFileLocationUnitTests/folder2/t1.yml +2 -0
  163. data/oats_tests/examples/testFileLocationUnitTests/no_yaml.rb +3 -0
  164. data/oats_tests/examples/testFileLocationUnitTests/post_yaml.rb +1 -0
  165. data/oats_tests/examples/testFileLocationUnitTests/t1.rb +4 -0
  166. data/oats_tests/examples/testFileLocationUnitTests/t1.yml +2 -0
  167. data/oats_tests/examples/testFileLocationUnitTests/t1_1.yml +3 -0
  168. data/oats_tests/examples/testFileLocationUnitTests/testDir/oats.yml +3 -0
  169. data/oats_tests/examples/testFileLocationUnitTests/testDir/t1.rb +2 -0
  170. data/oats_tests/examples/testFileLocationUnitTests/testDir/t1.yml +2 -0
  171. data/oats_tests/examples/testFileLocationUnitTests/testDir2/t1.rb +2 -0
  172. data/oats_tests/examples/testFileLocationUnitTests/testDir2/t1.yml +2 -0
  173. data/oats_tests/examples/testFileLocationUnitTests/unitTestList.yml +36 -0
  174. data/oats_tests/examples/testFileLocationUnitTests/yml_driver.rb +2 -0
  175. data/oats_tests/lib/business.rb +28 -0
  176. data/oats_tests/lib/sample_xl_lists.rb +37 -0
  177. data/test/common_test_unit_setup.rb +21 -0
  178. data/test/test_basic.rb +16 -0
  179. data/test/test_selenium.rb +16 -0
  180. data/test/test_xl_lists.rb +16 -0
  181. metadata +291 -0
@@ -0,0 +1,510 @@
1
+ # Encapsulates data and methods for each test
2
+
3
+ module Oats
4
+
5
+ class TestCase
6
+ # Absolute path of the test
7
+ attr_reader :path
8
+ # extension of the test if it is a single rb file instead of a directory
9
+ attr_reader :is_file
10
+ # Path of handler defined by Oats.data <<:is_file>_extension>_handler
11
+ attr_reader :handler
12
+ # Path of test relative to the dir_tests library
13
+ attr_reader :id
14
+ # Type of last executed rtest file 1:rb, 2:ide, 3:sql, 0: post, 4: pre
15
+ attr_accessor :type
16
+ # Output result directory
17
+ attr_reader :result
18
+ # List of exceptions encountered on the test so far
19
+ attr_reader :errors
20
+ # Current status of the test 0:pass, 1:fail, 2:skip
21
+ attr_accessor :status
22
+ # Time object referring to the end time of the test.
23
+ attr_accessor :end_time
24
+ # Time object referring to the start time of the test.
25
+ attr_reader :start_time
26
+ # Array containing names of the downloded files during the test
27
+ attr_reader :downloaded_files
28
+ # System capture sets this to the name of last error file if one is created
29
+ attr_accessor :error_capture_file
30
+
31
+ def initialize(test_file, *args)
32
+ # Do minimal work here to avoid exception. Raise in run, so that test header appears.
33
+ @id, @is_file, @path, @handler = args.empty? ? TestCase.parse_test_files(test_file) : args
34
+ if args[0].instance_of?(Array)
35
+ @is_file = true
36
+ @path = args[0].shift# Treat as rb below
37
+ @method = args[0].shift
38
+ @id = args[0].shift
39
+ @args = args[0]
40
+ end
41
+ TestList.current.variations.last.tests << self
42
+ @result = nil
43
+ @status = nil
44
+ @errors = []
45
+ @sql_input_error = nil
46
+ @downloaded_files = []
47
+ @start_time = Time.now.to_i
48
+ end
49
+
50
+ def TestCase.parse_test_files(test_file)
51
+ extension = File.extname(test_file)[1..-1]
52
+ handler = $oats['execution'][extension+'_handler'] if extension
53
+ if handler
54
+ handler_located = TestData.locate(handler)
55
+ Oats.assert handler_located, "Could not find handler file #{handler}"
56
+ handler = handler_located
57
+ end
58
+ if extension == 'xlw'
59
+ id = test_file.sub(/\.#{extension}\z/,'')
60
+ test_file = File.join(File.dirname(File.dirname(test_file)), File.basename(test_file,extension) + 'xls')
61
+ end
62
+ path = TestData.locate(test_file,true)
63
+ unless path
64
+ unless handler
65
+ path = File.join($oats['execution']['dir_tests'], test_file)
66
+ if 'xltest' == extension
67
+ test_file.sub!(/\.#{extension}\z/,'')
68
+ else
69
+ path = nil
70
+ end
71
+ return test_file, extension, path, handler
72
+ end
73
+ test_dir = File.dirname(test_file)
74
+ if test_dir == '.'
75
+ path = File.join(File.dirname(handler),File.basename(test_file))
76
+ else
77
+ test_dir = TestData.locate(test_dir, true)
78
+ return test_file, extension, path, handler unless test_dir
79
+ path = File.join(test_dir,File.basename(test_file))
80
+ end
81
+ remove_extension = true
82
+ end
83
+ extension ||= File.extname(path)[1..-1] # In case of implied extensions
84
+ unless id
85
+ id = path.sub( Regexp.new( '^' + $oats['execution']['dir_tests'] + '/', Regexp::IGNORECASE ) , '')
86
+ id.sub!(/\.#{extension}\z/,'') unless remove_extension
87
+ end
88
+ return id, extension, path, handler
89
+ end
90
+
91
+ def backtrace(obj=nil)
92
+ TestCase.backtrace(obj)
93
+ end
94
+
95
+ def TestCase.backtrace(obj=nil)
96
+ obj ||= $!
97
+ return unless obj.kind_of? Exception
98
+ filtered = obj.backtrace
99
+ filtered = obj.backtrace.delete_if { |line| line !~ /[\/|\\]oats\/tests[\/|\\]/} unless $oats['execution']['full_stacktrace']
100
+ # Doing below only filters the message in the log, not the full backtrace in the results.dump
101
+ # unless $oats['execution']['full_stacktrace']
102
+ # filtered = obj.backtrace.delete_if { |line| line !~ /[\/|\\]oats\/tests[\/|\\]/}
103
+ # if TestCase.respond_to?('backtrace_filter')
104
+ # new_filtered = []
105
+ # filtered.each { |line| new_filtered << TestCase.backtrace_filter(line) }
106
+ # filtered = new_filtered
107
+ # end
108
+ # end
109
+ return "Caught #{obj.class}: #{obj.message}" + ( filtered.empty? ? '' : "\n\t") + filtered.join("\n\t")
110
+ end
111
+
112
+ def run
113
+ if @type == 0 or @type == 4
114
+
115
+ $log.info "*** #{@type == 0 ? 'POST':'PRE'} TEST LIST HANDLER [#{@id}] at #{Time.at(@start_time)}"
116
+ else
117
+ $log.info "*** TEST [#{@id}] at #{Time.at(@start_time)}"
118
+ end
119
+ unless @path
120
+ TestData.error Exception.new("Found no #{@id} file"+
121
+ ((@is_file and !%w(rb sql html).include?(@is_file)) ? " nor handler for #{@is_file.inspect}." : ".")
122
+ )
123
+ return
124
+ end
125
+ if @is_file
126
+ if !%w(rb sql html xltest).include?(@is_file) and !@handler
127
+ TestData.error Exception.new("Unrecognized extension #{@is_file} for test file [#{@path}]")
128
+ return
129
+ end
130
+ else
131
+ unless FileTest.directory?(@path)
132
+ TestData.error Exception.new("Test file must have extension")
133
+ return
134
+ end
135
+ end
136
+ if @is_file
137
+ oats_file = @path.sub(/\.#{@is_file}\z/,'.yml')
138
+ yaml_dir = File.dirname(@path) unless File.exist?(oats_file)
139
+ else
140
+ test_var_dir = File.join(@path,'environments')
141
+ oats_files = Dir.glob(File.join(@path,'*.yml'))
142
+ if oats_files.size == 1
143
+ oats_file = oats_files.first
144
+ else
145
+ yaml_dir = @path
146
+ end
147
+ end
148
+ if yaml_dir
149
+ oats_file = File.join(yaml_dir,'oats.yml')
150
+ oats_file = nil unless File.exist?(oats_file)
151
+ end
152
+ odat = nil
153
+ if @is_file == 'xltest'
154
+ pth = @id.split('/')
155
+ pth.pop
156
+ suit = pth.pop
157
+ $oats_global['xl'][@id]['data']['keywords'] = $oats_global['xl'][@id]['keywords']
158
+ odat = { pth.pop => { 'list' => suit, suit => $oats_global['xl'][@id]['data'] } }
159
+ end
160
+ $oats = OatsData.overlay(odat) if odat
161
+ $oats = OatsData.overlay(oats_file) if oats_file
162
+ if test_var_dir and File.directory?(test_var_dir)
163
+ vars_overlayed = []
164
+ $oats['_']['environments'].each do |var_file|
165
+ ## Overlay all previously introduced variations, but only once
166
+ var_name = File.basename(var_file,'.*')
167
+ test_var = File.join(test_var_dir,var_name+'.yml')
168
+ if File.exist?(test_var) and not vars_overlayed.include?(var_name)
169
+ $oats = OatsData.overlay(test_var)
170
+ vars_overlayed << var_name
171
+ end
172
+ end
173
+ end
174
+
175
+ $log.debug 'Effective config file history: ' + OatsData.history[1..-1].inspect
176
+
177
+ if $oats['execution']['dir_results']
178
+ FileUtils.mkdir_p($oats['execution']['dir_results']) unless File.directory?($oats['execution']['dir_results'])
179
+ result_root = Util.expand_path(id, $oats['execution']['dir_results'])
180
+ else
181
+ result_root = File.join(@is_file ? File.dirname(@path) : @path,'result')
182
+ end
183
+ hist_path = OatsData.history(true)
184
+ if hist_path.empty?
185
+ result_dir = result_root
186
+ else
187
+ result_dir = File.join( result_root,
188
+ hist_path[1..-1].collect{|f|File.basename(f , '.*')}.join('/'))
189
+ end
190
+ if $oats['execution']['no_run'] # Reuse the last timestamped result_dir
191
+ if File.directory?(result_dir)
192
+ latest = Dir.entries(result_dir).last
193
+ result_dir = File.join(result_dir,latest)
194
+ else
195
+ result_dir_save = result_dir
196
+ result_dir = nil
197
+ end
198
+ else
199
+ # result_dir = File.join(result_dir, @start_time.to_s[2..-1] ) # Create a new timestamped sub result_dir
200
+ FileUtils.mkdir_p(result_dir)
201
+ end
202
+ @result = result_dir
203
+ if result_dir
204
+ test_log = File.join(result_dir,'oats_test.log')
205
+ Log4r::FileOutputter.new('test_log',
206
+ :filename=>test_log, :trunc=>false, # :level=>level + 1)
207
+ :formatter=>Log4r::PatternFormatter.new(:depth=>50,
208
+ :pattern => "%-5l %d %M", :date_pattern=>"%y-%m-%d %H:%M:%S"))
209
+ $log.add('test_log')
210
+ end
211
+ if $oats['execution']['no_run']
212
+ @status = 2
213
+ msg = $oats['execution']['no_run'].instance_of?(String) ? (' to '+$oats['execution']['no_run'].inspect) : ''
214
+ $log.warn "Skipping execution since execution:no_run is set#{msg}."
215
+ return
216
+ end
217
+ # Clean download directory
218
+ if $oats_global['download_dir']
219
+ files = Dir.glob(File.join($oats_global['download_dir'],'*'))
220
+ FileUtils.rm(files) unless files.empty?
221
+ end
222
+ # Initialize classes this test may need
223
+ # $ide = Ide.new unless ENV['JRUBY_BASE']
224
+ # Execute the test
225
+ ApplicationLogs.new_errors(true) # Reset pre-existing errors
226
+ if @is_file
227
+ oats_tsts = [ @handler || @path ]
228
+ else
229
+ oats_tsts = Dir[File.join(@path,'rtest*.{rb,html,sql}')].delete_if { |e| /\.gen\./ =~ e }
230
+ oats_tsts.unshift(root + '.html') if File.exist?(@path + '.html') # Compatibility with older tests
231
+ oats_tsts = Dir[File.join(@path,'*.{rb,html,sql}')] if oats_tsts.empty?
232
+ raise(OatsError,"No files matching rtest*.{rb,html,sql} found in: #{@path}") if oats_tsts.empty?
233
+ end
234
+ if result_dir and Oats.data['execution']['run_in_dir_results']
235
+ unless @is_file
236
+ Dir.glob(File.join(@path,'*')).each do |file|
237
+ FileUtils.cp(file, result_dir ) if File.file?(file)
238
+ end
239
+ end
240
+ run_dir = result_dir
241
+ else
242
+ raise(OatsError,"Can not run single rb file test without a result_dir.") if @is_file
243
+ run_dir = @path
244
+ end
245
+ quit_on_error = $oats['execution']['quit_on_error']
246
+ skip_unless_previous_test_is_ok = $oats['execution']['skip_unless_previous_test_is_ok']
247
+ Oats.global['rbtests'] = []
248
+ Dir.chdir(run_dir) do
249
+ begin
250
+ oats_tsts.sort!
251
+ oload_hooks(oats_tsts, 'pre', 'unshift')
252
+ oload_hooks(oats_tsts, 'post', 'push')
253
+ # FileUtils.mkdir_p(out)
254
+ exception_in_rb = false
255
+ oats_tsts.each do |rt|
256
+ break if quit_on_error and not errors.empty?
257
+ if skip_unless_previous_test_is_ok and TestData.previous_test and TestData.previous_test.status != 0
258
+ $oats['execution']['no_run'] = true
259
+ Oats.info "Skipping due to previous test failure"
260
+ end
261
+ raise(OatsError,"Can not read file [#{rt}]") unless File.readable?(rt) unless @is_file == 'xltest'
262
+ begin
263
+ case @is_file
264
+ when 'html'
265
+ Oats.ide(rt)
266
+ when 'sql'
267
+ Oats.mysql(rt)
268
+ when /^rb$||^xltest$/
269
+ begin
270
+ if @method
271
+ $log.info "Executing OatsTest:#{@method}"
272
+ Oats.global['rbtests'] << rt # Not sure if this is needed
273
+ Oats.global['oloads'] = [] # Not sure if this is needed
274
+ exception_in_rb = true
275
+ OatsTest.send(@method,*@args)
276
+ exception_in_rb = false
277
+ else
278
+ next if exception_in_rb # Don't process a second rb if one throws an exception
279
+ Oats.global['rbtests'] << rt
280
+ Oats.global['oloads'] = []
281
+ exception_in_rb = true
282
+ if @is_file == 'xltest'
283
+ $log.info "Processing test: #{rt}"
284
+ Oats::Keywords.process
285
+ else
286
+ $log.info "Processing rb file: #{rt}"
287
+ load(rt,true)
288
+ end
289
+ exception_in_rb = false
290
+ end
291
+ rescue OatsTestExit # Regular exit from the rb test
292
+ message = $!.message
293
+ $log.info message unless message == 'OatsTestExit'
294
+ rescue Exception => e
295
+ case e
296
+ when OatsError, Timeout::Error then $log.error backtrace($!)
297
+ else $log.error $! # Full stackstrace
298
+ end
299
+ TestData.error($!)
300
+ Oats.system_capture unless Oats.data['selenium']['skip_capture']
301
+ ensure
302
+ Oselenium.pause_browser if defined?(Oats::Oselenium)
303
+ end
304
+ else
305
+ raise OatsError, "Unrecognized test extension #{@is_file}"
306
+ end
307
+ rescue OatsMysqlNoConnect
308
+ @sql_input_error = true
309
+ @status = 2
310
+ $log.warn "#{$!}. Test is classified as SKIPPED."
311
+ rescue OatsError # No stack for known errors from rmsql and ide
312
+ $log.error $!.to_s
313
+ TestData.error($!)
314
+ rescue # Otherwise want the stack trace
315
+ $log.error TestCase.backtrace($!)
316
+ end
317
+ end
318
+ ensure
319
+ begin
320
+ $mysql.processlist if timed_out? # Ensure selenium closes if this throws an exception
321
+ rescue
322
+ end
323
+ Oselenium.reset if defined?(Oats::Oselenium) and ($oats['selenium']['keep_alive'].nil? or ! errors.empty?)
324
+ FileUtils.rm_rf(out) if File.directory?(out) and
325
+ Dir.glob(File.join(out,'*')).empty?
326
+ if $oats['execution']['no_run']
327
+ $log.warn "Classifying test as SKIPPED since execution:no_run is set"
328
+ @status = 2
329
+ return
330
+ end
331
+ end
332
+ end # of the out generation phase
333
+
334
+ # Verify phase
335
+ if result_dir
336
+ verify
337
+ else
338
+ $log.warn "Skipping verification, can not find result directory: #{result_dir_save}"
339
+ end
340
+ log_errors = ApplicationLogs.new_errors
341
+ unless log_errors.empty?
342
+ log_errors.each {|e| $log.error e.chomp }
343
+ raise(OatsVerifyError,"Found errors in the application logs.")
344
+ end
345
+ if errors.empty?
346
+ @status = 0 unless @status
347
+ FileUtils.rm Dir[File.join( Oats.data['execution']['run_in_dir_results'] ? result_dir : dir ,'*.gen.*')] \
348
+ if result_dir and not Oats.data['selenium']['ide']['keep_generated_files']
349
+ end
350
+ end # of run
351
+
352
+ def oload_hooks(oats_tsts, pre, obj_msg)
353
+ if rb_file = $oats['execution']['oload_'+pre]
354
+ rb_file = [ rb_file ] unless rb_file.instance_of?(Array)
355
+ rb_file.reverse! if pre == 'pre'
356
+ rb_file.each do |rbf|
357
+ rbf_fnd = TestCase.locate_test_rb(rbf)
358
+ if rbf_fnd
359
+ oats_tsts.send(obj_msg,rbf_fnd)
360
+ else
361
+ # eval("self", TOPLEVEL_BINDING).method(:foobar) rescue false
362
+ begin
363
+ Oats.info "Executing oload_#{pre}: #{rbf}"
364
+ eval(rbf)
365
+ # rescue NoMethodError
366
+ end
367
+ # if rbf.method?
368
+ # raise OatsTestError, "Can not locate execution:oload_#{pre} file [#{rbf}]"
369
+ # end
370
+ end
371
+ end
372
+ end
373
+ end
374
+ private :oload_hooks
375
+
376
+ def timed_out?
377
+ @errors.each do |exc|
378
+ # $log.info exc # debug
379
+ return true if exc[0] == 'Timeout::Error'
380
+ end
381
+ return false
382
+ end
383
+
384
+ def verify
385
+ return unless Oats.data['execution']['out_verify'] or Oats.data['execution']['ok_verify']
386
+ test_ok_out = ok_out
387
+ test_out = out
388
+ test_ok = ok
389
+ test_result = result
390
+ return if ! File.directory?(test_out) and ! File.directory?(test_ok_out)
391
+ err = nil
392
+ if ! File.directory?(test_out) and File.directory?(test_ok_out)
393
+ err= "Missing test.out folder [#{test_out}], but ok_out folder exists: #{test_ok_out})"
394
+ if Oats.data['execution']['ok_verify'] == 'UPDATE'
395
+ err += " Removing test.ok folder from the test. Please commit it to code repository."
396
+ FileUtils.rm_r(test_ok)
397
+ end
398
+ $log.error(err)
399
+ end
400
+ if File.directory?(test_out) and ! File.directory?(test_ok_out)
401
+ err = "Missing test.ok_out folder [#{test_ok_out}], but out folder exists: #{test_out}"
402
+ $log.error(err)
403
+ if Oats.data['execution']['ok_verify'] == 'UPDATE'
404
+ FileUtils.mkdir_p test_ok unless File.directory?(test_ok)
405
+ Dir.chdir(test_result) do
406
+ Dir.glob('*').each{|f| FileUtils.cp_r(f, test_ok) unless f =~ /\.rb$/}
407
+ end
408
+ $log.warn "Created test.ok_out folder: #{test_ok_out}"
409
+ end
410
+ end
411
+ if err
412
+ if Oats.data['execution']['ok_verify'].nil?
413
+ ex = OatsVerifyError.exception(err)
414
+ TestData.error(ex)
415
+ elsif Oats.data['execution']['ok_verify'] != 'UPDATE'
416
+ $log.info "Ignoring missing ok directory since Oats.data execution.ok_verify is set"
417
+ end
418
+ return
419
+ end
420
+
421
+ error_line = []
422
+ out_files = Dir.entries(test_out)
423
+ ok_out_files = Dir.chdir(test_ok_out){Dir.glob('*')}
424
+ diff_lines = nil
425
+ out_files.each do |file|
426
+ next if File.directory?(file)
427
+ file_out = File.join(test_out, file)
428
+ file_ok = File.join(test_ok_out, file)
429
+ err = nil
430
+ if File.readable?(file_ok)
431
+ ok_contents = IO.read(file_ok).gsub(/\s/,'')
432
+ out_contents = IO.read(file_out).gsub(/\s/,'')
433
+ unless ok_contents == out_contents
434
+ err = "File in out folder did not match out folder in: #{file_ok}"
435
+ diff_lines = `diff -b '#{file_ok}' '#{file_out}'` unless ENV['OS'] == 'Windows_NT'
436
+ end
437
+ else
438
+ err = "Extra output [#{file}] missing from: #{test_ok_out}"
439
+ end
440
+ if err
441
+ error_line << err
442
+ if Oats.data['execution']['ok_verify'] == 'UPDATE'
443
+ FileUtils.cp(File.join(test_out,file), test_ok_out)
444
+ source = File.join(test_result,file)
445
+ FileUtils.cp(source, test_ok) if File.exist?(source)
446
+ FileUtils.cp(File.join(test_result,'oats_test.log'), test_ok)
447
+ end
448
+ end
449
+ end
450
+ extra_ok_files = ok_out_files - out_files
451
+ extra_ok_files.each do |f|
452
+ file = File.join(test_ok_out,f)
453
+ FileUtils.rm(file) if Oats.data['execution']['ok_verify'] == 'UPDATE'
454
+ error_line << "Missing output file: #{file}"
455
+ end
456
+
457
+ if error_line.empty?
458
+ $log.info "Contents of #{test_ok} matched the output: #{test_out}"
459
+ else
460
+ $log.warn "Differences found in execution.ok_verify:\n\t" +
461
+ error_line.join("\n\t") +
462
+ (diff_lines ? "\n" + diff_lines : '')
463
+ if Oats.data['execution']['ok_verify'] == 'UPDATE'
464
+ $log.warn "Contents of #{test_ok} is updated to match the output: #{test_out}"
465
+ elsif Oats.data['execution']['ok_verify'].nil?
466
+ ex = OatsVerifyError.exception(error_line.inspect)
467
+ TestData.error(ex)
468
+ # raise(OatsVerifyError,error_line.last)
469
+ end
470
+ end
471
+ end
472
+ private :verify
473
+
474
+ def TestCase.locate_test_rb(ruby_file_name)
475
+ file = ruby_file_name.sub(/\..*/,'')
476
+ file = File.join( $oats['execution']['dir_tests'],'/**/', file+'.rb')
477
+ Dir.glob(file).first
478
+ end
479
+
480
+ # Basename of test.dir
481
+ def name
482
+ return @name if @name
483
+ @name = File.basename(@id)
484
+ end
485
+
486
+ # Directory under test.result, contains output files to be compared
487
+ def out
488
+ return @out if @out
489
+ @out = File.join(self.result, 'out')
490
+ end
491
+
492
+ # Directory of expected results, manually checked in to code repository under test.dir
493
+ def ok
494
+ return @ok if @ok
495
+ raise OatsError, "Test [#{self.id}] does not have a directory" unless @path
496
+ if @is_file
497
+ @ok = @path + '_ok'
498
+ else
499
+ @ok = File.join(@path, 'ok')
500
+ end if @path
501
+ end
502
+
503
+ # Directory under test.ok, contains expected result output files
504
+ def ok_out
505
+ return @ok_out if @ok_out
506
+ @ok_out = File.join(self.ok,'out')
507
+ end
508
+ end
509
+
510
+ end
@@ -0,0 +1,98 @@
1
+ require 'oats/test_list'
2
+ require 'oats/test_case'
3
+
4
+ module Oats
5
+
6
+ # Interface module for TestCase or TestList related operations
7
+ module TestData
8
+ @@pause_after_error = false
9
+
10
+ # Returns array of test objects in the currently executing list
11
+ # TestData.tests[-1] is the same as as the current_test
12
+ def TestData.tests
13
+ cur_test_list = TestList.current
14
+ return nil unless cur_test_list
15
+ vars = cur_test_list.variations
16
+ return nil unless vars
17
+ last_var = vars.last
18
+ return nil unless last_var
19
+ tests = last_var.tests
20
+ return nil unless tests
21
+ return tests
22
+ end
23
+
24
+ # Returns last test in the currently executing list
25
+ # index:: of the test in tests array. Default is last
26
+ def TestData.current_test
27
+ TestData.tests[-1]
28
+ end
29
+
30
+ def TestData.previous_test
31
+ TestData.tests[-2]
32
+ end
33
+
34
+ def TestData.pause_after_error
35
+ @@pause_after_error
36
+ end
37
+
38
+ def TestData.pause_after_error=(do_pause)
39
+ @@pause_after_error = do_pause
40
+ end
41
+
42
+ def TestData.error(exception)
43
+ raise exception unless TestData.current_test
44
+ error = [exception.class.to_s,exception.message, exception.backtrace]
45
+ TestData.current_test.errors << error
46
+ TestData.current_test.status = 1
47
+ @@pause_after_error = true
48
+ end
49
+
50
+ # Returns absolute path after locating file in test directories, or nil
51
+ # If exact match is not found, searches with added .rb extension
52
+ # If dir is false, do not return a directory #
53
+ def TestData.locate(test_file, is_dir = false)
54
+ option ||= {}
55
+ # Don't rely on $oats when called from OCC
56
+ dir_tests = if $oats and $oats['execution'] and $oats['execution']['dir_tests']
57
+ $oats['execution']['dir_tests']
58
+ else
59
+ ENV['OATS_TESTS']
60
+ end
61
+ Oats.assert test_file, "Test File must be non-nil"
62
+ extn = File.extname(test_file)
63
+ extn = nil if extn == ''
64
+ found_file = catch :found_file do
65
+ if ENV['OS'] == 'Windows_NT' ? test_file[1] == ?: : test_file[0] == ?/ # absolute path
66
+ # Try exact match
67
+ throw(:found_file, test_file) if File.exist?(test_file) and (is_dir or not FileTest.directory?(test_file))
68
+
69
+ # Try globbing the input name as is
70
+
71
+ found_file = File.exist?(test_file)
72
+ throw(:found_file, test_file ) if found_file and (is_dir or not FileTest.directory?(test_file))
73
+ throw(:found_file, test_file+'.rb') if File.exist?(test_file+'.rb') unless extn
74
+ end
75
+
76
+ # Relative path
77
+
78
+ dir_tests = "{#{is_dir},#{dir_tests}}" if is_dir.instance_of?(String) and is_dir != dir_tests
79
+
80
+ # 19.2 glob skips over the exact test paths, so try that first
81
+ file = File.join(dir_tests, test_file)
82
+ file += '{,.rb}' unless extn
83
+ found_file = Dir.glob(file).first
84
+ throw(:found_file, found_file) if found_file and (is_dir or not FileTest.directory?(found_file))
85
+
86
+
87
+ # Try finding it anywhere inside the dir_test tree
88
+ file = File.join(dir_tests, '**', test_file)
89
+ file += '{,.rb}' unless extn
90
+ found_file = Dir.glob(file).first
91
+ throw(:found_file, found_file) if found_file and (is_dir or not FileTest.directory?(found_file))
92
+ return nil
93
+ end
94
+ Oats::Util.expand_path(found_file)
95
+ end
96
+
97
+ end
98
+ end