testability-driver 1.1.1 → 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/config/sut_parameters.rb +21 -8
- data/config/tdriver_custom_error_recovery.rb +83 -0
- data/ext/extconf.rb +3 -2
- data/ext/native_extensions.c +60 -2
- data/lib/tdriver-devtools/behaviour/old/xml/example/flick-example.rb +2 -105
- data/lib/tdriver/base/behaviour/factory.rb +154 -89
- data/lib/tdriver/base/behaviour/factory_new.rb +409 -0
- data/lib/tdriver/base/errors.rb +3 -3
- data/lib/tdriver/base/state_object.rb +85 -22
- data/lib/tdriver/base/sut/adapter.rb +26 -0
- data/lib/tdriver/base/sut/controller.rb +1 -1
- data/lib/tdriver/base/sut/generic/behaviours/application.rb +89 -118
- data/lib/tdriver/base/sut/generic/behaviours/find.rb +67 -62
- data/lib/tdriver/base/sut/generic/behaviours/sut.rb +296 -187
- data/lib/tdriver/base/sut/generic/behaviours/switchbox_behaviour.rb +7 -7
- data/lib/tdriver/base/sut/generic/commands/application.rb +366 -295
- data/lib/tdriver/base/sut/sut.rb +19 -3
- data/lib/tdriver/base/test_object/abstract.rb +41 -21
- data/lib/tdriver/base/test_object/adapter.rb +62 -9
- data/lib/tdriver/base/test_object/behaviours/syncronization.rb +10 -6
- data/lib/tdriver/base/test_object/behaviours/test_object.rb +84 -47
- data/lib/tdriver/base/test_object/factory.rb +124 -68
- data/lib/tdriver/base/test_object/loader.rb +3 -4
- data/lib/tdriver/base/test_object/verification.rb +3 -3
- data/lib/tdriver/base/test_object/xml/adapter.rb +734 -0
- data/lib/tdriver/loader.rb +12 -0
- data/lib/tdriver/report/error_recovery/tdriver_error_recovery.rb +3 -2
- data/lib/tdriver/report/error_recovery/tdriver_error_recovery_settings.rb +14 -14
- data/lib/tdriver/report/report.rb +4 -8
- data/lib/tdriver/report/report_api.rb +9 -0
- data/lib/tdriver/report/report_crash_file_capture.rb +4 -4
- data/lib/tdriver/report/report_creator.rb +57 -35
- data/lib/tdriver/report/report_cucumber.rb +1 -1
- data/lib/tdriver/report/report_cucumber_listener.rb +5 -158
- data/lib/tdriver/report/report_cucumber_reporter.rb +7 -161
- data/lib/tdriver/report/report_execution_statistics.rb +4 -4
- data/lib/tdriver/report/report_file_capture.rb +5 -5
- data/lib/tdriver/report/report_grouping.rb +24 -22
- data/lib/tdriver/report/report_junit_xml.rb +5 -5
- data/lib/tdriver/report/report_test_case_run.rb +31 -22
- data/lib/tdriver/report/report_test_run.rb +107 -104
- data/lib/tdriver/report/report_writer.rb +150 -83
- data/lib/tdriver/tdriver.rb +147 -103
- data/lib/tdriver/util/common/boolean.rb +51 -0
- data/lib/tdriver/util/common/crc16.rb +110 -68
- data/lib/tdriver/util/common/hash.rb +63 -7
- data/lib/tdriver/util/common/kernel.rb +46 -1
- data/lib/tdriver/util/common/loader.rb +1 -0
- data/lib/tdriver/util/common/object.rb +20 -8
- data/lib/tdriver/util/common/string.rb +21 -2
- data/lib/tdriver/util/logger/logger.rb +4 -4
- data/lib/tdriver/util/parameter/loader.rb +2 -19
- data/lib/tdriver/util/parameter/parameter.rb +874 -177
- data/lib/tdriver/util/plugin/service.rb +1 -1
- data/lib/tdriver/util/recorder/recorder.rb +7 -1
- data/lib/tdriver/util/xml/abstraction.rb +13 -1
- data/lib/tdriver/util/xml/parsers/nokogiri/abstraction.rb +63 -10
- data/lib/tdriver/util/xml/parsers/nokogiri/attribute.rb +8 -2
- data/lib/tdriver/util/xml/parsers/nokogiri/document.rb +16 -3
- data/lib/tdriver/util/xml/parsers/nokogiri/node.rb +36 -32
- data/lib/tdriver/util/xml/parsers/nokogiri/nodeset.rb +19 -22
- data/lib/tdriver/util/xml/xml.rb +147 -32
- data/lib/tdriver/verify/verify.rb +1112 -289
- data/lib/tdriver/version.rb +1 -1
- data/xml/templates/generic.xml +14 -2
- metadata +51 -24
- data/lib/tdriver/util/parameter/parameter_hash.rb +0 -104
- data/lib/tdriver/util/parameter/parameter_new.rb +0 -869
- data/lib/tdriver/util/parameter/parameter_template.rb +0 -120
- data/lib/tdriver/util/parameter/parameter_user_api.rb +0 -116
- data/lib/tdriver/util/parameter/parameter_xml.rb +0 -261
@@ -23,6 +23,32 @@ module MobyController
|
|
23
23
|
# Abstract class SutAdapter. Not supposed to be instantiated as is
|
24
24
|
class SutAdapter
|
25
25
|
|
26
|
+
def add_hook( id, &block )
|
27
|
+
|
28
|
+
raise ArgumentError, 'Unable to add hook due to no block was given' unless block_given?
|
29
|
+
@hooks = {} unless @hooks
|
30
|
+
@hooks[ id ] = block
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
# TODO: document me
|
37
|
+
def execute_hook( id, *arguments )
|
38
|
+
|
39
|
+
@hooks[ id ].call( *arguments )
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
# TODO: document me
|
44
|
+
def hooked? ( id )
|
45
|
+
@hooks = {} unless @hooks
|
46
|
+
@hooks.has_key?( id )
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
|
26
52
|
end # SutAdapter
|
27
53
|
|
28
54
|
end # MobyController
|
@@ -21,7 +21,7 @@ module MobyBase
|
|
21
21
|
|
22
22
|
class SutController
|
23
23
|
|
24
|
-
attr_accessor :sut_controllers, :execution_order
|
24
|
+
attr_accessor :sut_controllers, :execution_order #, :test_object_adapter, :test_object_factory
|
25
25
|
|
26
26
|
# Creating new SutController associates SutAdapter to the controller
|
27
27
|
# == params
|
@@ -135,42 +135,23 @@ module MobyBehaviour
|
|
135
135
|
close_options[ :force_kill ] = close_options[ :force_kill ].to_boolean if close_options[ :force_kill ].kind_of?( String )
|
136
136
|
|
137
137
|
# verify :force_kill value type
|
138
|
-
close_options[ :force_kill ].check_type( [ NilClass, TrueClass, FalseClass ],
|
138
|
+
close_options[ :force_kill ].check_type( [ NilClass, TrueClass, FalseClass ], 'Wrong argument type $1 for :force_kill (expected $2)' )
|
139
139
|
|
140
140
|
# workaround/backwards compatibility: allow string as hash key value
|
141
141
|
close_options[ :check_process ] = close_options[ :check_process ].to_boolean if close_options[ :check_process ].kind_of?( String )
|
142
142
|
|
143
143
|
# verify :check_process value type
|
144
|
-
close_options[ :check_process ].check_type( [ TrueClass, FalseClass ],
|
144
|
+
close_options[ :check_process ].check_type( [ TrueClass, FalseClass ], 'Wrong argument type $1 for :check_process (expected $2)' )
|
145
145
|
|
146
146
|
if close_options[ :force_kill ] != nil
|
147
147
|
|
148
|
-
=begin
|
149
148
|
@sut.execute_command(
|
150
149
|
MobyCommand::Application.new(
|
151
|
-
:Close,
|
152
|
-
self.name, # app_name
|
153
|
-
self.uid, # app_uid
|
154
|
-
self.sut, # sut
|
155
|
-
nil, # arguments
|
156
|
-
nil, # environment
|
157
|
-
nil, # working directory
|
158
|
-
nil, # events_to_listen
|
159
|
-
nil, # signals_to_listen
|
160
|
-
{ # flags
|
161
|
-
:force_kill => close_options[ :force_kill ]
|
162
|
-
}
|
163
|
-
)
|
164
|
-
)
|
165
|
-
=end
|
166
|
-
|
167
|
-
@sut.execute_command(
|
168
|
-
MobyCommand::Application.new(
|
169
|
-
:Close, # command_type
|
150
|
+
:Close,
|
170
151
|
{
|
171
|
-
:application_name =>
|
172
|
-
:application_uid =>
|
173
|
-
:sut =>
|
152
|
+
:application_name => @name,
|
153
|
+
:application_uid => @id,
|
154
|
+
:sut => @sut,
|
174
155
|
:flags => { :force_kill => close_options[ :force_kill ] }
|
175
156
|
}
|
176
157
|
)
|
@@ -178,24 +159,13 @@ module MobyBehaviour
|
|
178
159
|
|
179
160
|
else
|
180
161
|
|
181
|
-
=begin
|
182
|
-
@sut.execute_command(
|
183
|
-
MobyCommand::Application.new(
|
184
|
-
:Close,
|
185
|
-
self.name,
|
186
|
-
self.uid,
|
187
|
-
self.sut
|
188
|
-
)
|
189
|
-
)
|
190
|
-
=end
|
191
|
-
|
192
162
|
@sut.execute_command(
|
193
163
|
MobyCommand::Application.new(
|
194
164
|
:Close,
|
195
165
|
{
|
196
|
-
:application_name =>
|
197
|
-
:application_uid =>
|
198
|
-
:sut =>
|
166
|
+
:application_name => @name,
|
167
|
+
:application_uid => @id,
|
168
|
+
:sut => @sut
|
199
169
|
}
|
200
170
|
)
|
201
171
|
)
|
@@ -212,7 +182,10 @@ module MobyBehaviour
|
|
212
182
|
$logger.enabled = false
|
213
183
|
|
214
184
|
# retrieve application synchronization timeout value
|
215
|
-
timeout_time =
|
185
|
+
timeout_time = sut_parameters[ :application_synchronization_timeout, '60' ].to_f
|
186
|
+
|
187
|
+
# retrieve application synchronization timeout retry interval value
|
188
|
+
refresh_interval = sut_parameters[ :application_synchronization_retry_interval, '0.25' ].to_f
|
216
189
|
|
217
190
|
# create application identification hash
|
218
191
|
application_identification_hash = { :type => 'application', :id => @id }
|
@@ -222,7 +195,7 @@ module MobyBehaviour
|
|
222
195
|
# verify close results
|
223
196
|
MobyUtil::Retryable.until(
|
224
197
|
:timeout => timeout_time,
|
225
|
-
:interval =>
|
198
|
+
:interval => refresh_interval,
|
226
199
|
:exception => MobyBase::VerificationError,
|
227
200
|
:unless => [ MobyBase::TestObjectNotFoundError, MobyBase::ApplicationNotAvailableError ]
|
228
201
|
){
|
@@ -231,7 +204,7 @@ module MobyBehaviour
|
|
231
204
|
@sut.refresh( application_identification_hash, [ {:className => 'application', :tasId => @id } ] )
|
232
205
|
|
233
206
|
# retrieve application object from sut.xml_data
|
234
|
-
matches, unused_rule =
|
207
|
+
matches, unused_rule = @test_object_adapter.get_objects( @sut.xml_data, application_identification_hash, true )
|
235
208
|
|
236
209
|
# check if the application is still found or not
|
237
210
|
if ( close_options[ :check_process ] == true )
|
@@ -243,7 +216,7 @@ module MobyBehaviour
|
|
243
216
|
|
244
217
|
if matches.count > 0
|
245
218
|
|
246
|
-
if
|
219
|
+
if @test_object_adapter.test_object_element_attribute( matches.first, 'id' ) == @id
|
247
220
|
|
248
221
|
# the application was still in the foreground
|
249
222
|
raise MobyBase::VerificationError, "Verification of close failed. The application that was to be closed was still in the foreground."
|
@@ -316,25 +289,25 @@ module MobyBehaviour
|
|
316
289
|
|
317
290
|
begin
|
318
291
|
|
319
|
-
|
292
|
+
name = attribute('FullName')
|
320
293
|
|
321
294
|
rescue MobyBase::AttributeNotFoundError
|
322
295
|
|
323
296
|
begin
|
324
297
|
|
325
|
-
|
298
|
+
name = attribute('exepath')
|
326
299
|
|
327
300
|
rescue MobyBase::AttributeNotFoundError
|
328
301
|
|
329
|
-
|
302
|
+
name = ''
|
330
303
|
|
331
304
|
end
|
332
305
|
|
333
306
|
end
|
334
307
|
|
335
|
-
|
308
|
+
name.not_empty 'Application does not have "FullName" or "exepath" attribute', RuntimeError
|
336
309
|
|
337
|
-
File.basename(
|
310
|
+
File.basename( name.gsub( /\\/, '/' ) )
|
338
311
|
|
339
312
|
end
|
340
313
|
|
@@ -348,7 +321,7 @@ module MobyBehaviour
|
|
348
321
|
# puts @sut.application.uid #prints foreground executable uid to console
|
349
322
|
def uid
|
350
323
|
|
351
|
-
id
|
324
|
+
@id
|
352
325
|
|
353
326
|
end
|
354
327
|
|
@@ -377,79 +350,77 @@ module MobyBehaviour
|
|
377
350
|
true
|
378
351
|
|
379
352
|
end
|
353
|
+
|
354
|
+
# == description
|
355
|
+
# Bring the application to foreground.\n
|
356
|
+
# \n
|
357
|
+
# [b]NOTE:[/b] Currently this works only for Symbian OS target!
|
358
|
+
#
|
359
|
+
# == returns
|
360
|
+
# NilClass
|
361
|
+
# description: -
|
362
|
+
# example: -
|
363
|
+
#
|
364
|
+
#
|
365
|
+
def bring_to_foreground
|
366
|
+
|
367
|
+
@sut.execute_command(
|
368
|
+
MobyCommand::Application.new(
|
369
|
+
:BringToForeground,
|
370
|
+
{
|
371
|
+
:application_uid => @id,
|
372
|
+
:sut => @sut
|
373
|
+
}
|
374
|
+
)
|
375
|
+
)
|
376
|
+
|
377
|
+
end
|
380
378
|
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
{
|
401
|
-
:application_uid => self.uid,
|
402
|
-
:sut => self.sut
|
403
|
-
}
|
379
|
+
# == description
|
380
|
+
# Kills the application process
|
381
|
+
#
|
382
|
+
# == returns
|
383
|
+
# NilClass
|
384
|
+
# description: -
|
385
|
+
# example: -
|
386
|
+
#
|
387
|
+
def kill
|
388
|
+
|
389
|
+
@sut.execute_command(
|
390
|
+
MobyCommand::Application.new(
|
391
|
+
:Kill,
|
392
|
+
{
|
393
|
+
:application_name => executable_name,
|
394
|
+
:application_uid => @id,
|
395
|
+
:sut => @sut
|
396
|
+
}
|
397
|
+
)
|
404
398
|
)
|
405
|
-
|
406
|
-
|
407
|
-
end
|
408
|
-
|
409
|
-
# == description
|
410
|
-
# Kills the application process
|
411
|
-
#
|
412
|
-
# == returns
|
413
|
-
# NilClass
|
414
|
-
# description: -
|
415
|
-
# example: -
|
416
|
-
#
|
417
|
-
def kill
|
418
|
-
|
419
|
-
#@sut.execute_command( MobyCommand::Application.new( :Kill, self.executable_name, self.uid, self.sut ) )
|
420
|
-
|
421
|
-
@sut.execute_command(
|
422
|
-
MobyCommand::Application.new(
|
423
|
-
:Kill,
|
424
|
-
{
|
425
|
-
:application_name => self.executable_name,
|
426
|
-
:application_uid => self.uid,
|
427
|
-
:sut => self.sut
|
428
|
-
}
|
429
|
-
)
|
430
|
-
)
|
431
|
-
|
432
|
-
|
433
|
-
end
|
434
|
-
|
435
|
-
# == description
|
436
|
-
# Returns the mem usage of the application if the information is available.
|
437
|
-
# Will return -1 if the information is not available.
|
438
|
-
#
|
439
|
-
# == returns
|
440
|
-
# Integer
|
441
|
-
# description: Current memory usage
|
442
|
-
# example: 124354
|
443
|
-
#
|
444
|
-
def mem_usage
|
445
|
-
mem = -1
|
446
|
-
begin
|
447
|
-
mem = self.attribute('memUsage')
|
448
|
-
rescue
|
399
|
+
|
449
400
|
end
|
450
|
-
mem
|
451
|
-
end
|
452
401
|
|
402
|
+
# == description
|
403
|
+
# Returns the mem usage of the application if the information is available.
|
404
|
+
# Will return -1 if the information is not available.
|
405
|
+
#
|
406
|
+
# == returns
|
407
|
+
# Integer
|
408
|
+
# description: Current memory usage
|
409
|
+
# example: 124354
|
410
|
+
#
|
411
|
+
def mem_usage
|
412
|
+
|
413
|
+
begin
|
414
|
+
|
415
|
+
attribute('memUsage').to_i
|
416
|
+
|
417
|
+
rescue
|
418
|
+
|
419
|
+
-1
|
420
|
+
|
421
|
+
end
|
422
|
+
|
423
|
+
end
|
453
424
|
|
454
425
|
# enable hooking for performance measurement & debug logging
|
455
426
|
TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
|
@@ -21,82 +21,87 @@
|
|
21
21
|
# Methods for finding test objects on the suttest objet state
|
22
22
|
module MobyBehaviour
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
24
|
+
# == description
|
25
|
+
# This module contains generic find behaviour
|
26
|
+
#
|
27
|
+
# == behaviour
|
28
|
+
# GenericFind
|
29
|
+
#
|
30
|
+
# == requires
|
31
|
+
# *
|
32
|
+
#
|
33
|
+
# == input_type
|
34
|
+
# *
|
35
|
+
#
|
36
|
+
# == sut_type
|
37
|
+
# *
|
38
|
+
#
|
39
|
+
# == sut_version
|
40
|
+
# *
|
41
|
+
#
|
42
|
+
# == objects
|
43
|
+
# *;sut
|
44
|
+
module Find
|
45
|
+
|
46
|
+
include MobyBehaviour::Behaviour
|
45
47
|
|
46
|
-
include MobyBehaviour::Behaviour
|
47
48
|
# == nodoc
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
49
|
+
# == description
|
50
|
+
# Finds a child test_object given its name and type and returns it as a reference
|
51
|
+
#
|
52
|
+
# == arguments
|
53
|
+
# attributes
|
54
|
+
# Hash
|
55
|
+
# description: one or more attributes defining the rules for the test object search. Must not be empty.
|
56
|
+
# example: { :name => 'oneButton' }
|
57
|
+
# default: {}
|
58
|
+
#
|
59
|
+
# == returns
|
60
|
+
# MobyBase::TestObject
|
61
|
+
# description: found test object
|
61
62
|
# example: -
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
63
|
+
#
|
64
|
+
# == exceptions
|
65
|
+
# TypeError
|
66
|
+
# description: Wrong argument type %s for attributes (expected Hash)
|
67
|
+
#
|
68
|
+
# ArgumentError
|
69
|
+
# description: Attributes hash must not be empty
|
70
|
+
#
|
71
|
+
# == info
|
72
|
+
# Same as calling child method.
|
73
|
+
def find( attributes = {} )
|
73
74
|
|
74
|
-
|
75
|
+
begin
|
75
76
|
|
76
|
-
|
77
|
+
# verify that attributes argument type is correct
|
78
|
+
attributes.check_type Hash, 'Wrong argument type $1 for attributes (expected $2)'
|
77
79
|
|
78
|
-
attributes
|
79
|
-
|
80
|
-
#raise ArgumentError.new( 'Attributes hash must not be empty' ) if attributes.empty?
|
80
|
+
# verify that attributes hash is not empty
|
81
|
+
attributes.not_empty 'Attributes hash must not be empty'
|
81
82
|
|
82
|
-
|
83
|
+
# retrieve desired object
|
84
|
+
result = child( attributes )
|
85
|
+
|
86
|
+
rescue
|
83
87
|
|
84
|
-
|
88
|
+
$logger.behaviour "FAIL;Failed to find test object.;#{ id.to_s };sut;{};find;#{ attributes.kind_of?( Hash ) ? attributes.inspect : attributes.class.to_s }"
|
85
89
|
|
86
|
-
|
90
|
+
# raise original exception
|
91
|
+
raise
|
87
92
|
|
88
|
-
|
93
|
+
end
|
89
94
|
|
90
|
-
|
95
|
+
$logger.behaviour "PASS;Test object found.;#{ id.to_s };sut;{};application;#{ attributes.inspect }"
|
91
96
|
|
92
|
-
|
97
|
+
# pass the result object
|
98
|
+
result
|
93
99
|
|
94
|
-
|
95
|
-
end
|
100
|
+
end
|
96
101
|
|
97
|
-
|
98
|
-
|
102
|
+
# enable hooking for performance measurement & debug logging
|
103
|
+
TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
|
99
104
|
|
100
|
-
|
105
|
+
end # Find
|
101
106
|
|
102
107
|
end # MobyBehaviour
|