awetestlib 0.1.30-x86-mingw32 → 1.2.4-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +101 -41
  3. data/awetestlib.gemspec +36 -47
  4. data/awetestlib_osx.gemspec +24 -18
  5. data/awetestlib_windows.gemspec +46 -0
  6. data/bin/awetestlib +130 -111
  7. data/bin/awetestlib-driver-setup.rb +0 -2
  8. data/bin/awetestlib-helpers.rb +43 -30
  9. data/lib/awetestlib.rb +196 -20
  10. data/lib/awetestlib/command_line.rb +44 -0
  11. data/lib/awetestlib/html_report.rb +57 -50
  12. data/lib/awetestlib/logging.rb +242 -171
  13. data/lib/awetestlib/regression/awetest_dsl.rb +4240 -0
  14. data/lib/awetestlib/regression/browser.rb +514 -397
  15. data/lib/awetestlib/regression/date_and_time.rb +280 -0
  16. data/lib/awetestlib/regression/drag_and_drop.rb +24 -0
  17. data/lib/awetestlib/regression/find.rb +70 -43
  18. data/lib/awetestlib/regression/legacy.rb +1 -1
  19. data/lib/awetestlib/regression/mobile.rb +293 -0
  20. data/lib/awetestlib/regression/reporting.rb +298 -0
  21. data/lib/awetestlib/regression/runner.rb +156 -200
  22. data/lib/awetestlib/regression/tables.rb +117 -7
  23. data/lib/awetestlib/regression/test_data.rb +354 -0
  24. data/lib/awetestlib/regression/user_input.rb +179 -93
  25. data/lib/awetestlib/regression/utilities.rb +755 -286
  26. data/lib/awetestlib/regression/validations.rb +325 -115
  27. data/lib/awetestlib/regression/waits.rb +60 -133
  28. data/lib/awetestlib/runner.rb +5 -2
  29. data/lib/version.rb +11 -2
  30. data/setup_samples/sample_cucumber/features/step_definitions/predefined_steps.rb +109 -49
  31. data/setup_samples/sample_mobile_app/features/support/env.rb +1 -1
  32. data/test/google_search2.rb +7 -6
  33. data/test/popup_child_0.rb +13 -0
  34. data/test/popup_child_1.rb +33 -0
  35. data/test/watir_no_require.rb +13 -0
  36. data/test/watir_with_require.rb +16 -0
  37. data/test/zoho_exercise.rb +8 -8
  38. metadata +216 -303
  39. data/AwetestLib Instructions.rtf +0 -0
  40. data/awetestlib.windows.gemspec +0 -42
  41. data/lib/patches/README +0 -2
  42. data/lib/patches/firewatir.rb +0 -106
  43. data/lib/patches/watir.rb +0 -175
@@ -311,7 +311,7 @@ module Awetestlib
311
311
  # @param (see #click_button_by_id)
312
312
  # @return (see #click_button_by_id)
313
313
  def click_img_by_xpath_and_name(browser, what, desc = '')
314
- click(browser, :image, :xpath, "//a[@id = '#{what}']", desc)
314
+ click(browser, :image, :xpath, "//a[@name = '#{what}']", desc)
315
315
  end
316
316
 
317
317
  alias click_img_by_xpath click_img_by_xpath_and_name
@@ -0,0 +1,293 @@
1
+ module Awetestlib
2
+
3
+ module Regression
4
+
5
+ module Mobile
6
+
7
+ def open_mobile_browser
8
+
9
+ mark_test_level(": #{self.device_type.titleize}")
10
+
11
+ if Dir.pwd =~ /shamisen/i
12
+ subdir = 'awetest_report'
13
+ sleep1 = 30
14
+ sleep2 = 90
15
+ server_url = "http://127.0.0.1:4723/wd/hub"
16
+ # server_url = 'http://0.0.0.0:4723/wd/hub'
17
+ else
18
+ subdir = 'log'
19
+ sleep1 = 10
20
+ sleep2 = 10
21
+ server_url = "http://127.0.0.1:4723/wd/hub"
22
+ end
23
+
24
+ debug_to_log(with_caller("$debug => #{$debug}, $DEBUG => #{$DEBUG}"))
25
+ log_level = $debug ? 'debug:debug' : 'debug:debug' #'warn:debug'
26
+ debug_to_log(with_caller("#{Dir.pwd.chomp}"))
27
+
28
+ log_file = File.join(Dir.pwd.chomp, subdir, "#{File.basename(__FILE__, '.rb')}_appium_lib_#{Time.now.strftime("%Y%m%d%H%M%S")}.log")
29
+ command = "start \"appium server\" appium --log-timestamp --log-level #{log_level} -g #{log_file} &"
30
+ debug_to_log(command)
31
+ appium = IO.popen(command, :err => :out)
32
+ @appium_pid = appium.pid
33
+ debug_to_log(with_caller("Appium PID: #{@appium_pid}"))
34
+
35
+ debug_to_log(with_caller("nodejs version: #{`node --version`.chomp}"))
36
+
37
+ sleep_for(sleep1)
38
+
39
+ client = Selenium::WebDriver::Remote::Http::Default.new
40
+ client.timeout = 300
41
+ desired_caps = set_mobile_capabilities(self.device_id, self.device_type, self.sdk, self.emulator, client, server_url)
42
+
43
+ debug_to_log(desired_caps.to_yaml)
44
+
45
+ debug_to_log(with_caller('Instantiating Appium Driver'))
46
+ Appium::Driver.new(desired_caps)
47
+ debug_to_log(with_caller('Starting Appium Driver'))
48
+ $driver.start_driver
49
+
50
+ sleep_for(sleep2)
51
+
52
+ debug_to_log(with_caller('Getting Watir Browser from driver...'))
53
+ browser = Watir::Browser.new($driver.driver)
54
+
55
+ debug_to_log(with_caller('Returning browser'))
56
+
57
+ browser
58
+ rescue
59
+ failed_to_log(unable_to)
60
+ end
61
+
62
+ def set_mobile_capabilities(device_id, device_type, sdk, emulator, http_client, server_url = "http://127.0.0.1:4723/wd/hub")
63
+ mark_test_level
64
+
65
+ case device_type
66
+
67
+ when /android device/i
68
+ desired_caps = {
69
+ :caps => {
70
+ :newCommandTimeout => 600,
71
+ :androidDeviceReadyTimeout => 420,
72
+ :avdLaunchTimeout => 240000,
73
+ :avdReadyTimeout => 240000,
74
+ :deviceName => "Android Device",
75
+ :automationName => "Appium",
76
+ :platformName => "Android",
77
+ :browserName => "Chrome",
78
+ :platformVersion => sdk,
79
+ 'app' => "chrome",
80
+ # 'appPackage' => "com.android.chrome",
81
+ :udid => device_id,
82
+ :http_client => http_client,
83
+ :chromeOptions => { "args" => ['--ignore-certificate-errors', '--verbose'] } #ignore-certificate-errors=true homepage=about:blank test_type=true' }
84
+ },
85
+ :appium_lib => {
86
+ :server_url => server_url
87
+ }
88
+ }
89
+
90
+ when /android emulator/i
91
+
92
+ # NOTE: avd cannot start from snapshot?.
93
+
94
+ desired_caps = {
95
+ :caps => {
96
+ :newCommandTimeout => 1200,
97
+ :androidDeviceReadyTimeout => 420,
98
+ :avdLaunchTimeout => 240000,
99
+ :avdReadyTimeout => 240000,
100
+ :debug => true,
101
+ :deviceName => "Android Emulator",
102
+ :platformName => "Android",
103
+ :avd => emulator,
104
+ :browserName => "Browser",
105
+ :avdArgs => '-no-audio -http-proxy 151.151.15.250:8080 -dns-server 10.27.206.11:55,10.27.206.101:55,10.91.218.197:55',
106
+ :http_client => http_client,
107
+ :chromeOptions => { 'args' => ['--ignore-certificate-errors', '--verbose'] }
108
+ },
109
+ :appium_lib => {
110
+ :server_url => server_url
111
+ }
112
+ }
113
+
114
+ when /ios device/i
115
+ desired_caps = {
116
+ 'platformVersion' => sdk,
117
+ 'deviceName' => "My_device",
118
+ 'platformName' => "iOS",
119
+ 'browserName' => 'Safari',
120
+ 'udid' => device_id }
121
+
122
+ when /ios simulator/i
123
+ desired_caps = {
124
+ 'deviceName' => device_type,
125
+ 'platformVersion' => sdk,
126
+ 'browserName' => 'Safari',
127
+ 'platformName' => "iOS" }
128
+ else
129
+ raise "Unrecognized mobile device type: '#{device_type}'"
130
+ end
131
+
132
+ debug_to_log(with_caller("\n#{desired_caps.to_yaml}"))
133
+
134
+ desired_caps
135
+ rescue
136
+ failed_to_log(unable_to)
137
+ end
138
+
139
+ def parse_environment_node_for_mobile
140
+
141
+ if self.environment_nodename =~ /;/
142
+ entries = {}
143
+ self.environment['input_nodename'] = self.environment_nodename
144
+ unless self.environment_nodename =~ /^W:/
145
+ self.environment_nodename = "W:#{self.environment_nodename}"
146
+ end
147
+ parms = self.environment_nodename.split(';')
148
+ parms.each do |p|
149
+ key, vlu = p.split(':')
150
+ entries[key] = vlu
151
+ end
152
+
153
+ entries.each do |key, vlu|
154
+ case key
155
+ when 'W'
156
+ self.environment_nodename = vlu
157
+ self.options[:environment_nodename] = vlu
158
+ self.environment['nodename'] = vlu
159
+ when 'I'
160
+ self.device_id = vlu
161
+ self.options[:device_id] = vlu
162
+ when 'K'
163
+ self.sdk = vlu
164
+ self.options[:sdk] = vlu
165
+ when 'T'
166
+ self.device_type = vlu
167
+ self.options[:device_type] = vlu
168
+ when 'E'
169
+ self.emulator = vlu
170
+ self.options[:emulator] = vlu
171
+ end
172
+ end
173
+ end
174
+ rescue
175
+ failed_to_log(unable_to)
176
+ end
177
+
178
+ def clean_up_android_temp
179
+
180
+ debug_to_log 'Here we will clean up emulator TMP files...'
181
+ user = Etc::getlogin
182
+ # debug_to_log user
183
+ android_temp_path = 'C:\\Users\\'+user+'\\AppData\\Local\\Temp\\AndroidEmulator'
184
+ debug_to_log android_temp_path
185
+ if Dir.exists?(android_temp_path)
186
+ dir = Dir.new(android_temp_path)
187
+ dir.each do |file|
188
+ debug_to_log file if file =~ /^TMP.+\.tmp/
189
+ end
190
+ tmp_ptrn = '\\TMP*.tmp'
191
+ dir_cmd = "dir #{android_temp_path}#{tmp_ptrn} 2>&1"
192
+ del_cmd = "del #{android_temp_path}#{tmp_ptrn} 2>&1"
193
+ debug_to_log "#{__LINE__}: #{dir_cmd}"
194
+ dir_out = `#{dir_cmd}`
195
+ unless dir_out =~ /file not found/i
196
+ debug_to_log "#{__LINE__}: #{del_cmd}"
197
+ debug_to_log `#{del_cmd}`.chomp
198
+ if `#{dir_cmd}` =~ /file not found/i
199
+ debug_to_log 'Emulator TMP files deleted successfully'
200
+ end
201
+ end
202
+ else
203
+ debug_to_log("#{android_temp_path} not found")
204
+ end
205
+
206
+ rescue
207
+ failed_to_log(unable_to)
208
+ end
209
+
210
+ def end_android_processes
211
+
212
+ processes = ['node.exe', 'emulator-arm.exe', 'emulator-x86.exe', 'adb.exe', 'chromedriver.exe', 'cmd.exe']
213
+ tasks = get_process_list
214
+ targets = []
215
+
216
+ if USING_OSX
217
+ kill_cmd = 'kill -9 @@@@@'
218
+ else
219
+ kill_cmd = 'taskkill /f /pid @@@@@'
220
+ end
221
+
222
+ processes.each do |image_name|
223
+ if image_name == 'cmd.exe'
224
+ hit = tasks.detect { |t| t[:window_title] =~ /^appium server/i }
225
+ else
226
+ hit = tasks.detect { |t| t[:image_name] =~ /^#{image_name}/i }
227
+ end
228
+
229
+ if hit and hit.length > 0
230
+ targets << hit
231
+ end
232
+ end
233
+
234
+ ['node.exe', 'emulator', 'cmd.exe', 'adb.exe', 'chromedriver'].each do |process|
235
+ hit = targets.detect { |t| t[:image_name] =~ /^#{process}/i }
236
+ if hit and hit.length > 0
237
+ pid = hit[:pid]
238
+ name = hit[:image_name]
239
+ title = hit[:window_title]
240
+ cmd = kill_cmd.sub('@@@@@', pid)
241
+ debug_to_log("[#{cmd}] #{name} #{title}")
242
+ kill_io = IO.popen(cmd, :err => :out)
243
+ debug_to_log(kill_io.read.chomp)
244
+ kill_io.close
245
+ end
246
+
247
+ end
248
+ rescue
249
+ failed_to_log(unable_to)
250
+ end
251
+
252
+ def get_process_list
253
+
254
+ if USING_OSX
255
+ cmd = "ps axo comm,pid,sess,fname"
256
+ else
257
+ cmd = 'tasklist /v -fo csv 2>&1'
258
+ end
259
+
260
+ debug_to_log(cmd)
261
+ raw = `#{cmd}`
262
+ list = raw.force_encoding(Encoding::UTF_8)
263
+ # debug_to_log(list)
264
+ if list =~ /No tasks are running which match the specified criteria/i
265
+ tasks = nil
266
+ else
267
+ begin
268
+ csv = CSV.new(list, :headers => true, :header_converters => :symbol)
269
+ # debug_to_log(with_caller(__LINE__, "\n", "#{csv}"))
270
+ rescue => e
271
+ raise e
272
+ end
273
+ begin
274
+ arr = csv.to_a
275
+ # debug_to_log(with_caller(__LINE__, "\n", "#{arr}"))
276
+ rescue => e
277
+ raise e
278
+ end
279
+ begin
280
+ tasks = arr.map { |row| row.to_hash }
281
+ # debug_to_log(tasks)
282
+ rescue => e
283
+ raise e
284
+ end
285
+ end
286
+ tasks
287
+ rescue
288
+ failed_to_log(unable_to)
289
+ end
290
+
291
+ end
292
+ end
293
+ end
@@ -0,0 +1,298 @@
1
+ module Awetestlib
2
+
3
+ module Regression
4
+
5
+ module Reporting
6
+
7
+ def get_caller_line
8
+ last_caller = get_call_list[0]
9
+ line = last_caller.split(':', 3)[1]
10
+ line
11
+ end
12
+
13
+ def get_call_list(depth = 9, dbg = false)
14
+ my_list = []
15
+ call_list = Kernel.caller
16
+ debug_to_log(with_caller(call_list)) if dbg
17
+ call_list.each_index do |x|
18
+ my_caller = call_list[x].to_s
19
+ my_caller =~ /([\(\)\w_\_\-\.]+\:\d+\:?.*?)$/
20
+ my_list << "[#{$1.gsub(/eval/, @myName)}] "
21
+ break if x > depth or my_caller =~ /:in .run.$/
22
+ end
23
+ my_list
24
+ rescue
25
+ failed_to_log(unable_to)
26
+ end
27
+
28
+ alias get_callers get_call_list
29
+
30
+ def get_call_list_new(depth = 15, dbg = $debug)
31
+ a_list = ['[unknown]']
32
+ proj_name = File.basename(@library) if @library
33
+ call_list = Kernel.caller
34
+ log_message(DEBUG, with_caller(call_list)) if dbg
35
+ call_list.each_index do |x|
36
+ a_caller = call_list[x].to_s
37
+ a_caller =~ /([\(\)\w_\_\-\.]+\:\d+\:?.*?)$/
38
+ caller = $1
39
+ if caller =~ /#{@myName}/
40
+ a_list << "#{caller.gsub(/\(eval\)/, "(#{@myName})")}"
41
+ elsif proj_name and caller =~ /#{proj_name}/
42
+ a_list << "#{caller.gsub(/\(eval\)/, "(#{proj_name})")}" if proj_name
43
+ elsif @library2 and caller =~ /#{@library2}/
44
+ a_list << "#{caller.gsub(/\(eval\)/, "(#{@library2})")}" if @library2
45
+ else
46
+ a_list << "#{caller}"
47
+ end
48
+ next if a_caller =~ /:in .run.$/ and not a_caller.include?(@myName)
49
+ break if x > depth
50
+ end
51
+ a_list
52
+ rescue
53
+ failed_to_log(unable_to)
54
+ end
55
+
56
+ def get_debug_list(dbg = false, no_trace = false, last_only = false)
57
+ calls = get_call_array(10)
58
+ debug_to_log(with_caller("*** #{__LINE__}\n#{calls.to_yaml}\n***")) if dbg
59
+ arr = []
60
+ calls.each_index do |ix|
61
+ if ix > 1 # skip this method and the logging method
62
+ if filter_call(calls[ix])
63
+ arr << calls[ix]
64
+ end
65
+ end
66
+ end
67
+ debug_to_log(with_caller("*** #{__LINE__}\n#{arr.to_yaml}\n***")) if dbg
68
+ if arr.length > 0
69
+ list = ''
70
+ arr.reverse.each do |l|
71
+ if last_only
72
+ list = l
73
+ break
74
+ else
75
+ list << "=>#{l}"
76
+ end
77
+ end
78
+ if no_trace
79
+ "#{list}"
80
+ else
81
+ " [TRACE:#{list}]"
82
+ end
83
+ else
84
+ ''
85
+ end
86
+ rescue
87
+ failed_to_log(unable_to)
88
+ end
89
+
90
+ def filter_call(call)
91
+ modl = call.match(/^(browser|logging|find|runner|tables|user_input|utilities|validations|waits|page_data|legacy|drag_and_drop|awetest)/) || ''
92
+ meth = call.match(/in .(run|each)/) || ''
93
+ true unless "#{modl}#{meth}".length > 0
94
+ end
95
+
96
+ def get_test_level(meth = nil)
97
+ arr = []
98
+ each_line = 0
99
+ call_list = Kernel.caller
100
+ #debug_to_log("#{call_list.to_yaml}")
101
+ call_list.each_index do |x|
102
+ myCaller = call_list[x].to_s
103
+ myCaller =~ /([\(\)\w_\_\-\.]+\:\d+\:?.*?)$/
104
+ string = $1
105
+ unless string =~ /logging\.rb|mark_test_level|mark_test_level|debug_to_report|debug_toreport/
106
+ if string.length > 0
107
+ if string =~ /each|each_key/
108
+ each_line = string.match(/\:(\d+)\:/)[1]
109
+ elsif string.match(/\:(\d+)\:/)[1] == each_line
110
+ next
111
+ else
112
+ arr << string.gsub(/eval/, @myName)
113
+ end
114
+ end
115
+ end
116
+ break if meth and string.match(/#{meth}/)
117
+ break if myCaller =~ /:in .run.$|runner\.rb/
118
+ end
119
+ #debug_to_log("#{arr.length} #{nice_array(arr)}")
120
+ [arr.length, arr]
121
+ end
122
+
123
+ # TODO: need to sanitize html for html report
124
+ def html_to_log(element)
125
+ debug_to_log("#{element}\n #{element.html}")
126
+ end
127
+
128
+ # @private
129
+ def parse_caller(caller)
130
+ call_script, call_line, call_meth = caller.split(':')
131
+ call_script.gsub!(/\.rb/, '')
132
+ call_script = call_script.camelize
133
+ call_meth =~ /in .([\w\d_ ]+)./
134
+ call_meth = $1
135
+ if call_meth.match(/((rescue|block|eval)\s*in\s*)/)
136
+ delete = $1
137
+ append = $2
138
+ call_meth.sub!(delete, '')
139
+ call_meth << " (#{append})"
140
+ end
141
+ [call_script, call_line, call_meth]
142
+ rescue
143
+ failed_to_log(unable_to)
144
+ end
145
+
146
+ def initialize_reference_regexp
147
+ unless @reference_regexp.is_a?(Regexp)
148
+ @reference_template = '(\*\*\*\s+@@@@\s+\*\*\*)'
149
+ @reference_pattern = @reference_template.sub('@@@@', '([\w\d_\s,-:;\?]+)')
150
+ @reference_regexp = Regexp.new(@reference_pattern)
151
+ end
152
+ end
153
+
154
+ # @private
155
+ def choose_refs(arr, *indices)
156
+ refs = ''
157
+ indices.each do |idx|
158
+ refs << "*** #{arr[idx]} *** "
159
+ end
160
+ refs
161
+ rescue
162
+ failed_to_log(unable_to)
163
+ end
164
+
165
+ # @private
166
+ def format_refs(list)
167
+ refs = ''
168
+ if list
169
+ list.split(/,\s*/).each do |ref|
170
+ refs << format_reference(ref)
171
+ end
172
+ end
173
+ refs
174
+ end
175
+
176
+ # @private
177
+ def format_reference(ref)
178
+ "*** #{ref} *** "
179
+ end
180
+
181
+ # @private
182
+ def unformat_refs(list)
183
+ refs = ''
184
+ if list.is_a?(Array)
185
+ list.each { |ref| refs << unformat_reference(ref) + ' ' }
186
+ else
187
+ list.split(/,\s*/).each do |ref|
188
+ refs << unformat_reference(ref) + ' '
189
+ end
190
+ end
191
+ refs
192
+ rescue
193
+ failed_to_log(unable_to)
194
+ end
195
+
196
+ # @private
197
+ def unformat_ref_arr(arr)
198
+ refs = []
199
+ arr.each { |ref| refs << unformat_reference(ref) }
200
+ refs
201
+ rescue
202
+ failed_to_log(unable_to)
203
+ end
204
+
205
+ # @private
206
+ def unformat_reference(ref)
207
+ ref.gsub!('***', '').strip
208
+ rescue
209
+ failed_to_log(unable_to)
210
+ end
211
+
212
+ # @private
213
+ def collect_references(*strings)
214
+ refs = ''
215
+ strings.each do |strg|
216
+ refs << " #{format_refs(strg)}" if strg and strg.length > 0
217
+ end if strings
218
+ refs
219
+ end
220
+
221
+ # @private
222
+ def tally_error_references
223
+ tags_tested = 0
224
+ tags_hit = 0
225
+ if @my_error_hits and @my_error_hits.length > 0
226
+ mark_test_level(">> Failed Defect or Test Case instances:")
227
+ tags_hit = @my_error_hits.length
228
+ @my_error_hits.keys.sort.each do |ref|
229
+ msg = "#{ref} (#{@my_error_hits[ref]})"
230
+ msg << " -- #{@refs_desc[ref]}" if @refs_desc
231
+ message_to_report(msg)
232
+ end
233
+ end
234
+ if @my_error_references and @my_error_references.length > 0
235
+ tags_tested = @my_error_references.length
236
+ if self.report_all_test_refs
237
+ mark_test_level(">> All tested Defect or Test Case instances:")
238
+ @my_error_references.keys.sort.each do |ref|
239
+ msg = "#{ref} (#{@my_error_references[ref]})"
240
+ msg << " -- #{@refs_desc[ref]}" if @refs_desc
241
+ message_to_report(msg)
242
+ end
243
+ end
244
+ message_to_report(">> Fails on tested Defect or Test Case references: #{tags_hit} of #{tags_tested}")
245
+ else
246
+ message_to_report(">> No Defect or Test Case references found.")
247
+ end
248
+ end
249
+
250
+ # @private
251
+ def parse_error_references(message, fail = false)
252
+ initialize_reference_regexp unless @reference_regexp
253
+ msg = message.dup
254
+ while msg.match(@reference_regexp)
255
+ capture_error_reference($2, fail)
256
+ msg.sub!($1, '')
257
+ end
258
+ rescue
259
+ failed_to_log(unable_to)
260
+ end
261
+
262
+ # @private
263
+ def capture_error_reference(ref, fail)
264
+ if fail
265
+ @my_error_hits = Hash.new unless @my_error_hits
266
+ if @my_error_hits[ref]
267
+ @my_error_hits[ref] += 1
268
+ else
269
+ @my_error_hits[ref] = 1
270
+ end
271
+ #debug_to_report("#{__method__}: error hits:\n#{@my_error_hits.to_yaml}")
272
+ end
273
+ @my_error_references = Hash.new unless @my_error_references
274
+ if @my_error_references[ref]
275
+ @my_error_references[ref] += 1
276
+ else
277
+ @my_error_references[ref] = 1
278
+ end
279
+ rescue
280
+ failed_to_log(unable_to)
281
+ end
282
+
283
+ def report_results(errors, msg)
284
+ call_script, call_line, call_meth = parse_caller(get_call_array[1])
285
+ msg = ">> SUMMARY: #{build_msg("#{call_meth.titleize}:", msg)}"
286
+ if errors > 0
287
+ mark_test_level("#{msg} ::FAIL::")
288
+ else
289
+ mark_test_level("#{msg} ::Pass::")
290
+ true
291
+ end
292
+ rescue
293
+ failed_to_log(unable_to)
294
+ end
295
+
296
+ end
297
+ end
298
+ end