testability-driver 1.0.3 → 1.0.4
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.
- data/lib/tdriver-devtools/behaviour/xml/rdoc_behaviour_xml_generator.rb +2 -2
- data/lib/tdriver-devtools/tdriver-devtools.rb +1 -1
- data/lib/tdriver-devtools/tests/feature_tests/lib/custom_rdoc_generator.rb +3 -3
- data/lib/tdriver/base/behaviour/behaviours/object_behaviour_composition.rb +6 -1
- data/lib/tdriver/base/behaviour/behaviours/object_behaviour_description.rb +5 -3
- data/lib/tdriver/base/behaviour/behaviours/object_composition.rb +1 -1
- data/lib/tdriver/base/behaviour/factory.rb +225 -225
- data/lib/tdriver/base/errors.rb +1 -1
- data/lib/tdriver/base/state_object.rb +227 -179
- data/lib/tdriver/base/sut/controller.rb +2 -2
- data/lib/tdriver/base/sut/factory.rb +190 -182
- data/lib/tdriver/base/sut/generic/behaviours/application.rb +69 -25
- data/lib/tdriver/base/sut/generic/behaviours/controller.rb +1 -1
- data/lib/tdriver/base/sut/generic/behaviours/find.rb +4 -4
- data/lib/tdriver/base/sut/generic/behaviours/flash_behaviour.rb +3 -3
- data/lib/tdriver/base/sut/generic/behaviours/sut.rb +350 -165
- data/lib/tdriver/base/sut/generic/behaviours/switchbox_behaviour.rb +9 -9
- data/lib/tdriver/base/sut/generic/behaviours/verification.rb +191 -103
- data/lib/tdriver/base/sut/generic/commands/application.rb +1 -1
- data/lib/tdriver/base/sut/generic/commands/key_sequence.rb +1 -1
- data/lib/tdriver/base/sut/generic/commands/screen_capture.rb +1 -1
- data/lib/tdriver/base/sut/generic/plugin.rb +1 -1
- data/lib/tdriver/base/sut/sut.rb +5 -1
- data/lib/tdriver/base/test_object/abstract.rb +136 -151
- data/lib/tdriver/base/test_object/adapter.rb +293 -82
- data/lib/tdriver/base/test_object/behaviours/syncronization.rb +20 -17
- data/lib/tdriver/base/test_object/behaviours/test_object.rb +159 -532
- data/lib/tdriver/base/test_object/cache.rb +1 -1
- data/lib/tdriver/base/test_object/factory.rb +254 -605
- data/lib/tdriver/base/test_object/identificator.rb +1 -1
- data/lib/tdriver/base/test_object/loader.rb +1 -1
- data/lib/tdriver/base/test_object/verification.rb +17 -17
- data/lib/tdriver/loader.rb +20 -9
- data/lib/tdriver/report/report.rb +5 -0
- data/lib/tdriver/report/report_creator.rb +2 -2
- data/lib/tdriver/report/report_cucumber_listener.rb +4 -4
- data/lib/tdriver/report/report_cucumber_reporter.rb +4 -4
- data/lib/tdriver/report/report_execution_statistics.rb +22 -22
- data/lib/tdriver/report/report_grouping.rb +2 -2
- data/lib/tdriver/report/report_javascript.rb +11 -4
- data/lib/tdriver/report/report_test_case_run.rb +2 -2
- data/lib/tdriver/report/report_test_run.rb +5 -5
- data/lib/tdriver/report/report_test_unit.rb +74 -26
- data/lib/tdriver/report/report_writer.rb +70 -13
- data/lib/tdriver/tdriver.rb +17 -8
- data/lib/tdriver/util/common/array.rb +1 -1
- data/lib/tdriver/util/common/crc16.rb +1 -1
- data/lib/tdriver/util/common/environment.rb +1 -1
- data/lib/tdriver/util/common/file.rb +18 -9
- data/lib/tdriver/util/common/gem.rb +1 -1
- data/lib/tdriver/util/common/hash.rb +21 -0
- data/lib/tdriver/util/common/kernel.rb +1 -1
- data/lib/tdriver/util/common/loader.rb +5 -2
- data/lib/tdriver/util/common/numeric.rb +54 -3
- data/lib/tdriver/util/common/retryable.rb +30 -12
- data/lib/tdriver/util/common/stackable.rb +185 -0
- data/lib/tdriver/util/common/string.rb +21 -5
- data/lib/tdriver/util/{dbaccess/dbaccess.rb → database/access.rb} +4 -1
- data/lib/tdriver/util/{dbaccess/dbconnection.rb → database/connection.rb} +3 -0
- data/lib/tdriver/util/{dbaccess → database}/error.rb +0 -1
- data/lib/tdriver/util/{dbaccess → database}/loader.rb +5 -6
- data/lib/tdriver/util/{dynamic_attribute_filter.rb → filters/dynamic_attributes.rb} +1 -1
- data/lib/tdriver/util/hooking/hooking.rb +477 -0
- data/lib/tdriver/util/loader.rb +35 -29
- data/lib/tdriver/util/localisation/error.rb +0 -1
- data/lib/tdriver/util/localisation/loader.rb +1 -4
- data/lib/tdriver/util/localisation/localisation.rb +30 -27
- data/lib/tdriver/util/{common.rb → logger/loader.rb} +2 -4
- data/lib/tdriver/util/logger/logger.rb +574 -0
- data/lib/tdriver/util/operator_data/loader.rb +4 -3
- data/lib/tdriver/util/operator_data/operator_data.rb +5 -5
- data/lib/tdriver/util/parameter/parameter.rb +7 -1
- data/lib/tdriver/util/parameter/parameter_hash.rb +1 -1
- data/lib/tdriver/util/parameter/parameter_template.rb +1 -1
- data/lib/tdriver/util/parameter/parameter_user_api.rb +28 -20
- data/lib/tdriver/util/parameter/parameter_xml.rb +1 -1
- data/lib/tdriver/util/plugin/abstract.rb +1 -1
- data/lib/tdriver/util/plugin/service.rb +1 -1
- data/lib/tdriver/util/{localisation.rb → recorder/loader.rb} +4 -3
- data/lib/tdriver/util/recorder/recorder.rb +66 -0
- data/lib/tdriver/util/recorder/scripter.rb +258 -0
- data/lib/tdriver/util/{stats.rb → statistics/statistics.rb} +7 -8
- data/lib/tdriver/util/user_data/error.rb +0 -1
- data/lib/tdriver/util/user_data/loader.rb +1 -2
- data/lib/tdriver/util/user_data/user_data.rb +6 -6
- data/lib/tdriver/util/video/camera.rb +67 -0
- data/lib/tdriver/util/video/camera_linux.rb +139 -0
- data/lib/tdriver/util/video/camera_windows.rb +174 -0
- data/lib/tdriver/util/video/loader.rb +31 -0
- data/lib/tdriver/util/video/video_utils.rb +139 -0
- data/lib/tdriver/util/xml/abstraction.rb +56 -5
- data/lib/tdriver/util/xml/builder.rb +2 -5
- data/lib/tdriver/util/{parameter.rb → xml/comment.rb} +10 -2
- data/lib/tdriver/util/xml/loader.rb +32 -22
- data/lib/tdriver/util/xml/nil_node.rb +2 -2
- data/lib/tdriver/util/xml/parsers/loader.rb +0 -1
- data/lib/tdriver/util/xml/parsers/nokogiri/abstraction.rb +18 -44
- data/lib/tdriver/util/xml/parsers/nokogiri/attribute.rb +9 -13
- data/lib/tdriver/util/xml/parsers/nokogiri/builder.rb +9 -3
- data/lib/tdriver/util/xml/parsers/nokogiri/comment.rb +39 -0
- data/lib/tdriver/util/xml/parsers/nokogiri/document.rb +6 -11
- data/lib/tdriver/util/xml/parsers/nokogiri/element.rb +2 -122
- data/lib/tdriver/util/xml/parsers/nokogiri/loader.rb +26 -16
- data/lib/tdriver/util/xml/parsers/nokogiri/node.rb +203 -0
- data/lib/tdriver/util/xml/parsers/nokogiri/nodeset.rb +1 -2
- data/lib/tdriver/util/xml/parsers/nokogiri/text.rb +2 -20
- data/lib/tdriver/util/xml/xml.rb +52 -20
- data/lib/tdriver/verify/verify.rb +238 -81
- data/xml/behaviours/generic.xml +12 -10
- metadata +156 -180
- data/lib/tdriver/base/test_object/factory_new.rb +0 -202
- data/lib/tdriver/util/hooking.rb +0 -434
- data/lib/tdriver/util/logger.rb +0 -506
- data/lib/tdriver/util/recorder.rb +0 -297
- data/lib/tdriver/util/video_utils.rb +0 -384
- data/lib/tdriver/util/xml/nil_element.rb +0 -89
|
@@ -99,12 +99,12 @@ module MobyBehaviour
|
|
|
99
99
|
|
|
100
100
|
MobyUtil::Retryable.until( :timeout => 60, :retry_timeout => 5 ) {
|
|
101
101
|
system(str_commands_after_powerup) if str_commands_after_powerup != nil
|
|
102
|
-
if
|
|
103
|
-
|
|
102
|
+
if $parameters[ :ats4_error_recovery_enabled, false ]!='true'
|
|
103
|
+
$logger.log "behaviour", "PASS;TDriver attempting reconnect"
|
|
104
104
|
self.connect(self.id)
|
|
105
|
-
|
|
105
|
+
$logger.log "behaviour", "PASS;TDriver connected"
|
|
106
106
|
else
|
|
107
|
-
|
|
107
|
+
$logger.log "behaviour", "PASS;ATS4 handling reconnection"
|
|
108
108
|
end
|
|
109
109
|
|
|
110
110
|
}
|
|
@@ -138,9 +138,9 @@ module MobyBehaviour
|
|
|
138
138
|
|
|
139
139
|
#execute switchbox command
|
|
140
140
|
str_command_arr.each do |foobox_command|
|
|
141
|
-
|
|
141
|
+
$logger.log "behaviour", "PASS;Executing powerdown command #{foobox_command}"
|
|
142
142
|
std_out = system(foobox_command)
|
|
143
|
-
|
|
143
|
+
$logger.log "behaviour", "PASS;Powerdown command #{foobox_command} executed"
|
|
144
144
|
sleep switchbox_sequence_timeout.to_i
|
|
145
145
|
Kernel::raise BehaviourError.new("power_down", "Failed to power down") unless std_out.to_s.downcase.include?(str_result.to_s.downcase)
|
|
146
146
|
end
|
|
@@ -175,9 +175,9 @@ module MobyBehaviour
|
|
|
175
175
|
|
|
176
176
|
#execute switchbox command
|
|
177
177
|
str_command_arr.each do |foobox_command|
|
|
178
|
-
|
|
178
|
+
$logger.log "behaviour", "PASS;Executing powerup command #{foobox_command}"
|
|
179
179
|
std_out = system(foobox_command)
|
|
180
|
-
|
|
180
|
+
$logger.log "behaviour", "PASS;Ppowerup command #{foobox_command} executed"
|
|
181
181
|
sleep switchbox_sequence_timeout.to_i
|
|
182
182
|
Kernel::raise BehaviourError.new("power_up", "Failed to power up") unless std_out.to_s.downcase.include?(str_result.to_s.downcase)
|
|
183
183
|
end
|
|
@@ -200,7 +200,7 @@ module MobyBehaviour
|
|
|
200
200
|
end
|
|
201
201
|
|
|
202
202
|
# enable hooking for performance measurement & debug logging
|
|
203
|
-
|
|
203
|
+
TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
|
|
204
204
|
|
|
205
205
|
end
|
|
206
206
|
|
|
@@ -38,111 +38,199 @@ module MobyBehaviour
|
|
|
38
38
|
# *
|
|
39
39
|
#
|
|
40
40
|
# == objects
|
|
41
|
-
#
|
|
41
|
+
# *;application;sut
|
|
42
42
|
#
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
include MobyBehaviour::Behaviour
|
|
46
|
-
|
|
47
|
-
# == description
|
|
48
|
-
# Checks if a child test object matching the given criteria can be found, under this application object or test object.
|
|
49
|
-
#
|
|
50
|
-
# == arguments
|
|
51
|
-
# type
|
|
52
|
-
# String
|
|
53
|
-
# description: String defining the type of the object
|
|
54
|
-
# example: "Button"
|
|
55
|
-
#
|
|
56
|
-
# attributes
|
|
57
|
-
# Hash
|
|
58
|
-
# description: Optional hash containing attributes that the object must have
|
|
59
|
-
# example: {}
|
|
60
|
-
#
|
|
61
|
-
# == returns
|
|
62
|
-
# TrueClass
|
|
63
|
-
# description: if the object exists on the sut display
|
|
64
|
-
# example: true
|
|
65
|
-
# FalseClass
|
|
66
|
-
# description: if the object exists on the sut display
|
|
67
|
-
# example: false
|
|
68
|
-
#
|
|
69
|
-
# == exceptions
|
|
70
|
-
# TypeError
|
|
71
|
-
# description: Wrong argument type %s for test object type (expected String)
|
|
72
|
-
#
|
|
73
|
-
# ArgumentError
|
|
74
|
-
# description: The test object type argument must not be empty
|
|
75
|
-
#
|
|
76
|
-
# TypeError
|
|
77
|
-
# description: Wrong argument type %s for test object attributes (expected Hash)
|
|
78
|
-
def test_object_exists?(type, attributes = {} )
|
|
79
|
-
|
|
80
|
-
# verify type
|
|
81
|
-
#Kernel::raise ArgumentError.new "The type argument must be a non empty String." unless (type.kind_of? String and !type.empty?)
|
|
82
|
-
type.check_type( String, "Wrong argument type $1 for test object type (expected $2)" )
|
|
83
|
-
|
|
84
|
-
# verify that type is not empty string
|
|
85
|
-
type.not_empty( "The test object type argument must not be empty" )
|
|
86
|
-
|
|
87
|
-
# verify type
|
|
88
|
-
#Kernel::raise ArgumentError.new "The attributes argument must be a Hash." unless attributes.kind_of?( Hash )
|
|
89
|
-
attributes.check_type( Hash, "Wrong argument type $1 for test object attributes (expected $2)")
|
|
90
|
-
|
|
91
|
-
#attributes_with_type = {}.merge attributes
|
|
92
|
-
|
|
93
|
-
attributes_with_type = attributes.clone
|
|
94
|
-
attributes_with_type[:type] = type
|
|
95
|
-
attributes_with_type.delete(:__logging)
|
|
96
|
-
|
|
97
|
-
#translate the symbol values into string using sut's localisation setting
|
|
98
|
-
translate!( attributes_with_type )
|
|
99
|
-
|
|
100
|
-
# JKo: is there some reason for the line below?
|
|
101
|
-
#identificator = MobyBase::TestObjectIdentificator.new( attributes_with_type )
|
|
102
|
-
|
|
103
|
-
original_logging = MobyUtil::Logger.instance.enabled
|
|
104
|
-
desired_logging = (attributes[:__logging] == nil || attributes[:__logging] == 'false') ? false : true
|
|
105
|
-
MobyUtil::Logger.instance.enabled = false
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
begin
|
|
109
|
-
|
|
110
|
-
self.child( attributes_with_type )
|
|
111
|
-
|
|
112
|
-
MobyUtil::Logger.instance.enabled = desired_logging
|
|
113
|
-
MobyUtil::Logger.instance.log "behaviour" , "PASS;Test object of type #{type} with attributes #{attributes.inspect} was found.;#{self.kind_of?(MobyBase::SUT) ? self.id.to_s : ''};test_object_exist;"
|
|
114
|
-
|
|
115
|
-
rescue MobyBase::MultipleTestObjectsIdentifiedError
|
|
116
|
-
|
|
117
|
-
MobyUtil::Logger.instance.enabled = desired_logging
|
|
118
|
-
MobyUtil::Logger.instance.log "behaviour" , "PASS;Multiple objects of type #{type} with attributes #{attributes.inspect} were found.;#{self.kind_of?(MobyBase::SUT) ? self.id.to_s : ''};test_object_exist;"
|
|
119
|
-
return true
|
|
43
|
+
module Verification
|
|
120
44
|
|
|
121
|
-
|
|
45
|
+
include MobyBehaviour::Behaviour
|
|
122
46
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
47
|
+
# == description
|
|
48
|
+
# Checks if a child test object matching the given criteria can be found, under this application object or test object.
|
|
49
|
+
#
|
|
50
|
+
# == arguments
|
|
51
|
+
# *attributes
|
|
52
|
+
# Hash
|
|
53
|
+
# description: Hash containing attributes that the object must have
|
|
54
|
+
# example: {}
|
|
55
|
+
#
|
|
56
|
+
# == returns
|
|
57
|
+
# TrueClass
|
|
58
|
+
# description: if the object exists on the sut display
|
|
59
|
+
# example: true
|
|
60
|
+
#
|
|
61
|
+
# FalseClass
|
|
62
|
+
# description: if the object exists on the sut display
|
|
63
|
+
# example: false
|
|
64
|
+
#
|
|
65
|
+
# == exceptions
|
|
66
|
+
# TypeError
|
|
67
|
+
# description: Wrong argument type %s for test object type (expected String)
|
|
68
|
+
#
|
|
69
|
+
# ArgumentError
|
|
70
|
+
# description: The test object type argument must not be empty
|
|
71
|
+
#
|
|
72
|
+
# ArgumentError
|
|
73
|
+
# description: Test object attributes hash argument must not be empty
|
|
74
|
+
#
|
|
75
|
+
# TypeError
|
|
76
|
+
# description: Wrong argument type %s for test object attributes (expected Hash)
|
|
77
|
+
def test_object_exists?( *attributes )
|
|
78
|
+
|
|
79
|
+
begin
|
|
80
|
+
|
|
81
|
+
# store original number of arguments
|
|
82
|
+
arguments_count = attributes.count
|
|
83
|
+
|
|
84
|
+
# verify that correct number of arguments were given
|
|
85
|
+
if ( 1..2 ).include?( arguments_count )
|
|
86
|
+
|
|
87
|
+
# retrieve and remove first argument from array
|
|
88
|
+
first = attributes.shift
|
|
89
|
+
|
|
90
|
+
if first.kind_of?( Hash )
|
|
91
|
+
|
|
92
|
+
# wrong number of arguments were given
|
|
93
|
+
raise ArgumentError if attributes.count > 0
|
|
94
|
+
|
|
95
|
+
# store first argument as attributes hash
|
|
96
|
+
attributes = first
|
|
97
|
+
|
|
98
|
+
# verify that attributes hash is not empty
|
|
99
|
+
attributes.not_empty( 'Test object attributes hash argument must not be empty' )
|
|
100
|
+
|
|
101
|
+
elsif first.kind_of?( String )
|
|
102
|
+
|
|
103
|
+
# print deprecated method usage warning
|
|
104
|
+
warn "deprecated method usage; use object#test_object_exists?( Hash ) instead of object#test_object_exists?( String, [ Hash ] )"
|
|
105
|
+
|
|
106
|
+
# verify that type is not empty string
|
|
107
|
+
first.not_empty( 'The test object type argument must not be empty' )
|
|
108
|
+
|
|
109
|
+
# retrieve attributes from argument; optional argument when type is kind of String
|
|
110
|
+
attributes = attributes.shift || {}
|
|
111
|
+
|
|
112
|
+
# verify that attributes argument type is correct (Hash)
|
|
113
|
+
attributes.check_type Hash, 'wrong argument type $1 for test object attributes (expected $2)'
|
|
114
|
+
|
|
115
|
+
# store test object type to attributes hash
|
|
116
|
+
attributes[ :type ] = first
|
|
117
|
+
|
|
118
|
+
else
|
|
119
|
+
|
|
120
|
+
# verify that first argument type is correct (Hash or String)
|
|
121
|
+
first.check_type Hash, 'wrong argument type $1 for test object type (expected $2)'
|
|
122
|
+
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
else
|
|
126
|
+
|
|
127
|
+
# wrong number of arguments were given
|
|
128
|
+
raise ArgumentError
|
|
129
|
+
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
rescue ArgumentError
|
|
133
|
+
|
|
134
|
+
# raise argument error; pass with proper description
|
|
135
|
+
raise ArgumentError, "wrong number of arguments (#{ arguments_count } for 1)"
|
|
136
|
+
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# make clone of original attributes
|
|
140
|
+
attributes_clone = attributes.clone
|
|
141
|
+
|
|
142
|
+
# If empty or only special attributes then add :type => '*' to search all
|
|
143
|
+
attributes_clone[ :type ] = '*' if attributes_clone.select{ | key, value | key.to_s !~ /^__/ ? true : false }.empty?
|
|
144
|
+
|
|
145
|
+
# translate the symbol values into string using sut's localisation setting
|
|
146
|
+
@sut.translate_values!( attributes_clone )
|
|
147
|
+
|
|
148
|
+
# default result (raises exception)
|
|
149
|
+
result = nil
|
|
150
|
+
|
|
151
|
+
# disable logging temporarly
|
|
152
|
+
$logger.push_enabled( false )
|
|
153
|
+
|
|
154
|
+
begin
|
|
155
|
+
|
|
156
|
+
# raise exception if multiple objects found; call child method, disable logging and allow multiple objects
|
|
157
|
+
raise MobyBase::MultipleTestObjectsIdentifiedError if child( attributes_clone.merge( :__logging => false, :__multiple_objects => true ) ).count > 1
|
|
158
|
+
|
|
159
|
+
# return true as return value
|
|
160
|
+
result = true
|
|
161
|
+
|
|
162
|
+
# result behaviour description
|
|
163
|
+
description = "Test object with attributes #{ attributes.inspect } was found."
|
|
164
|
+
|
|
165
|
+
rescue Exception
|
|
166
|
+
|
|
167
|
+
case $!
|
|
168
|
+
|
|
169
|
+
when MobyBase::MultipleTestObjectsIdentifiedError
|
|
170
|
+
|
|
171
|
+
# return true as return value
|
|
172
|
+
result = true
|
|
173
|
+
|
|
174
|
+
# result behaviour description
|
|
175
|
+
description = "Multiple objects with attributes #{ attributes.inspect } were found."
|
|
176
|
+
|
|
177
|
+
when MobyBase::TestObjectNotFoundError
|
|
178
|
+
|
|
179
|
+
# return false as return value
|
|
180
|
+
result = false
|
|
181
|
+
|
|
182
|
+
# result behaviour description
|
|
183
|
+
description = "Test object with attributes #{ attributes.inspect } was not found."
|
|
184
|
+
|
|
185
|
+
else
|
|
186
|
+
|
|
187
|
+
# store exception to be raised
|
|
188
|
+
result = $!
|
|
189
|
+
|
|
190
|
+
# result behaviour description
|
|
191
|
+
description = "Test object with attributes #{ attributes.inspect } was not found due to unexpected error (#{ $!.class }: #{ $!.message.inspect })"
|
|
192
|
+
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
ensure
|
|
196
|
+
|
|
197
|
+
# determines that will result be logged to behaviour level
|
|
198
|
+
$logger.enabled = ( attributes[ :__logging ] == 'true' ? true : false )
|
|
199
|
+
|
|
200
|
+
# behaviour logging
|
|
201
|
+
$logger.behaviour(
|
|
202
|
+
|
|
203
|
+
"%s;%s;%s;test_object_exists?;" % [
|
|
204
|
+
|
|
205
|
+
# status
|
|
206
|
+
( result == true ? 'PASS' : 'FAIL' ),
|
|
207
|
+
|
|
208
|
+
# description
|
|
209
|
+
description,
|
|
210
|
+
|
|
211
|
+
# sut id
|
|
212
|
+
( self.kind_of?( MobyBase::SUT ) ? self.id.to_s : '' )
|
|
213
|
+
|
|
214
|
+
]
|
|
215
|
+
|
|
216
|
+
)
|
|
217
|
+
|
|
218
|
+
# raise exception if neccessery
|
|
219
|
+
raise result if result.kind_of?( Exception )
|
|
220
|
+
|
|
221
|
+
# restore original logger state
|
|
222
|
+
$logger.pop_enabled
|
|
223
|
+
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
# return value
|
|
227
|
+
result
|
|
228
|
+
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
# enable hooking for performance measurement & debug logging
|
|
232
|
+
TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
|
|
233
|
+
|
|
234
|
+
end # module VerificationBehaviour
|
|
147
235
|
|
|
148
236
|
end # module MobyBase
|
|
@@ -212,7 +212,7 @@ module MobyCommand
|
|
|
212
212
|
end
|
|
213
213
|
|
|
214
214
|
# enable hooking for performance measurement & debug logging
|
|
215
|
-
|
|
215
|
+
TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
|
|
216
216
|
|
|
217
217
|
end # Application
|
|
218
218
|
|
|
@@ -87,7 +87,7 @@ module MobyCommand
|
|
|
87
87
|
end
|
|
88
88
|
|
|
89
89
|
# enable hooking for performance measurement & debug logging
|
|
90
|
-
|
|
90
|
+
TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
|
|
91
91
|
|
|
92
92
|
end # KeySequence
|
|
93
93
|
|
|
@@ -57,7 +57,7 @@ module MobyCommand
|
|
|
57
57
|
end
|
|
58
58
|
|
|
59
59
|
# enable hooking for performance measurement & debug logging
|
|
60
|
-
|
|
60
|
+
TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
|
|
61
61
|
|
|
62
62
|
end # ScreenCapture
|
|
63
63
|
|
|
@@ -90,7 +90,7 @@ module MobyPlugin
|
|
|
90
90
|
end
|
|
91
91
|
|
|
92
92
|
# enable hooking for performance measurement & debug logging
|
|
93
|
-
|
|
93
|
+
TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
|
|
94
94
|
|
|
95
95
|
# register plugin
|
|
96
96
|
MobyUtil::PluginService.instance.register_plugin( self ) # Note: self is MobyPlugin::Generic::SUT
|
data/lib/tdriver/base/sut/sut.rb
CHANGED
|
@@ -50,6 +50,10 @@ module MobyBase
|
|
|
50
50
|
@input = :key
|
|
51
51
|
@type = "sut"
|
|
52
52
|
|
|
53
|
+
@object_behaviours = []
|
|
54
|
+
|
|
55
|
+
@forced_xml = false
|
|
56
|
+
|
|
53
57
|
end
|
|
54
58
|
|
|
55
59
|
# Interface to forward command execution to sut specific controller (SutController#execute_command)
|
|
@@ -73,7 +77,7 @@ module MobyBase
|
|
|
73
77
|
end
|
|
74
78
|
|
|
75
79
|
# enable hooking for performance measurement & debug logging
|
|
76
|
-
|
|
80
|
+
TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
|
|
77
81
|
|
|
78
82
|
end # SUT
|
|
79
83
|
|
|
@@ -19,184 +19,169 @@
|
|
|
19
19
|
|
|
20
20
|
module MobyBase
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
# Function to verify is DATA of two TestObjects are the same,
|
|
55
|
-
# Defined in TestObject#== other_test_object
|
|
56
|
-
# === param
|
|
57
|
-
# other_test_object:: TestObject other, could be null
|
|
58
|
-
# === returns
|
|
59
|
-
# true:: if TestObjects have same DATA
|
|
60
|
-
# false:: if TestObjects have different DATA
|
|
61
|
-
# === raises
|
|
62
|
-
# nothing
|
|
63
|
-
def eql?( other_test_object )
|
|
64
|
-
|
|
65
|
-
self == other_test_object
|
|
66
|
-
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
# Function to verify is DATA of two TestObjects are the same,
|
|
70
|
-
# return TRUE if other_test_object:
|
|
71
|
-
# instance of MobyBase::TestObject
|
|
72
|
-
# type's are equal
|
|
73
|
-
# id's are equal
|
|
74
|
-
# name's are equal
|
|
75
|
-
# == param
|
|
76
|
-
# other_test_object:: TestObject other, could be null
|
|
77
|
-
# == returns
|
|
78
|
-
# true:: if TestObjects have same DATA
|
|
79
|
-
# false:: if TestObjects have different DATA
|
|
80
|
-
# == raises
|
|
81
|
-
# nothing
|
|
82
|
-
def ==( other_test_object )
|
|
83
|
-
|
|
84
|
-
#return false unless other_test_object.instance_of?( MobyBase::TestObject )
|
|
85
|
-
#return false unless self.type == other_test_object.type
|
|
86
|
-
#return false unless self.id == other_test_object.id
|
|
87
|
-
#return false unless self.name == other_test_object.name
|
|
88
|
-
#return true
|
|
89
|
-
|
|
90
|
-
# optimized version
|
|
91
|
-
other_test_object.instance_of?( MobyBase::TestObject ) &&
|
|
92
|
-
( @type == other_test_object.type ) &&
|
|
93
|
-
( @id == other_test_object.id ) &&
|
|
94
|
-
( @name == other_test_object.name )
|
|
95
|
-
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
# Function to calculate HASH value for a TestObject
|
|
99
|
-
# as required by, e.g. Set
|
|
100
|
-
#
|
|
101
|
-
# This is required, as eql? method is being overwritten.
|
|
102
|
-
# === returns
|
|
103
|
-
# Fixnum:: hash number representing current TestObject
|
|
104
|
-
def hash
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
#result = 17
|
|
108
|
-
#result = result * 37 + self.id.to_i
|
|
109
|
-
#result = result * 37 + type.hash
|
|
110
|
-
#result = result * 37 + name.hash
|
|
111
|
-
#return result
|
|
112
|
-
|
|
113
|
-
# optimized version
|
|
114
|
-
#( ( ( 17 * 37 + @id.to_i ) * 37 + @type.hash ) * 37 + @name.hash )
|
|
22
|
+
class TestObject
|
|
23
|
+
|
|
24
|
+
attr_reader(
|
|
25
|
+
:sut, # SUT associated to test object
|
|
26
|
+
:type, # test object type (from xml)
|
|
27
|
+
:id, # test object id (from xml)
|
|
28
|
+
:parent, # parent test object
|
|
29
|
+
:name, # test object name (from xml)
|
|
30
|
+
:x_path # xpath for test object, used when updating self with fresh ui dump
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
# Creation of a new TestObject requires a data object to be given to constructor
|
|
34
|
+
# === params
|
|
35
|
+
# factory:: TestObjectFactory used for creating test object for the sut this object is associated with
|
|
36
|
+
# sut:: SUT object that this test object is associated with
|
|
37
|
+
# xml_object:: REXML::Document object describing this test object
|
|
38
|
+
# === returns
|
|
39
|
+
# TestObject:: new TestObject instance
|
|
40
|
+
# === raises
|
|
41
|
+
def initialize( test_object_factory, sut, parent = nil, xml_object = nil )
|
|
42
|
+
|
|
43
|
+
# Initializes a test object by assigning it a test object factory and a sut and storing xml data
|
|
44
|
+
# describing the object.
|
|
45
|
+
@test_object_factory = test_object_factory
|
|
46
|
+
@parent = parent
|
|
47
|
+
@sut = sut
|
|
48
|
+
@object_behaviours = []
|
|
49
|
+
|
|
50
|
+
#self.xml_data = xml_object if xml_object
|
|
51
|
+
method( :xml_data= ).call( xml_object ) if xml_object
|
|
52
|
+
|
|
53
|
+
end
|
|
115
54
|
|
|
116
|
-
|
|
55
|
+
# Function to verify is DATA of two TestObjects are the same,
|
|
56
|
+
# Defined in TestObject#== test_object
|
|
57
|
+
# === param
|
|
58
|
+
# test_object:: TestObject other, could be null
|
|
59
|
+
# === returns
|
|
60
|
+
# true:: if TestObjects have same DATA
|
|
61
|
+
# false:: if TestObjects have different DATA
|
|
62
|
+
# === raises
|
|
63
|
+
# nothing
|
|
64
|
+
def eql?( test_object )
|
|
117
65
|
|
|
118
|
-
|
|
66
|
+
self == test_object
|
|
119
67
|
|
|
120
|
-
|
|
121
|
-
# Mostly for unit testing purposes, as Set is not ordered.
|
|
122
|
-
# should not be used normally. Thus, not documented.
|
|
123
|
-
def <=>( other )
|
|
68
|
+
end
|
|
124
69
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
70
|
+
# Function to verify is DATA of two TestObjects are the same,
|
|
71
|
+
# return TRUE if test_object:
|
|
72
|
+
# instance of MobyBase::TestObject
|
|
73
|
+
# type's are equal
|
|
74
|
+
# id's are equal
|
|
75
|
+
# name's are equal
|
|
76
|
+
# == param
|
|
77
|
+
# test_object:: TestObject other, could be null
|
|
78
|
+
# == returns
|
|
79
|
+
# true:: if TestObjects have same DATA
|
|
80
|
+
# false:: if TestObjects have different DATA
|
|
81
|
+
# == raises
|
|
82
|
+
# nothing
|
|
83
|
+
def ==( test_object )
|
|
84
|
+
|
|
85
|
+
#return false unless test_object.instance_of?( MobyBase::TestObject )
|
|
86
|
+
#return false unless self.type == test_object.type
|
|
87
|
+
#return false unless self.id == test_object.id
|
|
88
|
+
#return false unless self.name == test_object.name
|
|
89
|
+
#return true
|
|
90
|
+
|
|
91
|
+
# optimized version
|
|
92
|
+
test_object.instance_of?( MobyBase::TestObject ) && ( @type == test_object.type ) && ( @id == test_object.id ) && ( @name == test_object.name )
|
|
129
93
|
|
|
130
|
-
|
|
131
|
-
#other_name = other.name
|
|
132
|
-
#return -1 if self_name < other_name
|
|
133
|
-
#return 1 if self_name > other_name
|
|
94
|
+
end
|
|
134
95
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
96
|
+
# Function to calculate HASH value for a TestObject
|
|
97
|
+
#
|
|
98
|
+
# This is required, as eql? method is being overwritten.
|
|
99
|
+
# === returns
|
|
100
|
+
# Fixnum:: hash number representing current TestObject
|
|
101
|
+
def hash
|
|
139
102
|
|
|
140
|
-
#0
|
|
141
103
|
|
|
142
|
-
|
|
143
|
-
|
|
104
|
+
#result = 17
|
|
105
|
+
#result = result * 37 + self.id.to_i
|
|
106
|
+
#result = result * 37 + type.hash
|
|
107
|
+
#result = result * 37 + name.hash
|
|
108
|
+
#return result
|
|
144
109
|
|
|
145
|
-
|
|
110
|
+
# optimized version
|
|
111
|
+
#( ( ( 17 * 37 + @id.to_i ) * 37 + @type.hash ) * 37 + @name.hash )
|
|
146
112
|
|
|
147
|
-
|
|
148
|
-
def xml_data=( xml_object )
|
|
113
|
+
TDriver::TestObjectAdapter.test_object_hash( @id.to_i, @type, @name )
|
|
149
114
|
|
|
150
|
-
|
|
151
|
-
@name,
|
|
152
|
-
@x_path =
|
|
153
|
-
xml_object.attribute( 'name' ),
|
|
154
|
-
"%s/*//object[@type='%s' and @id='%s']" % [
|
|
155
|
-
@parent.x_path,
|
|
156
|
-
@type = xml_object.attribute( 'type' ),
|
|
157
|
-
@id = xml_object.attribute( 'id' )
|
|
158
|
-
]
|
|
159
|
-
=end
|
|
115
|
+
end
|
|
160
116
|
|
|
161
|
-
|
|
117
|
+
# Function to support sorting TestObjects within an array.
|
|
118
|
+
# Mostly for unit testing purposes, as Set is not ordered.
|
|
119
|
+
# should not be used normally. Thus, not documented.
|
|
120
|
+
def <=>( test_object )
|
|
162
121
|
|
|
163
|
-
|
|
122
|
+
#self_type = self.type
|
|
123
|
+
#other_type = test_object.type
|
|
124
|
+
#return -1 if self_type < other_type
|
|
125
|
+
#return 1 if self_type > other_type
|
|
164
126
|
|
|
165
|
-
|
|
166
|
-
|
|
127
|
+
#self_name = self.name
|
|
128
|
+
#other_name = test_object.name
|
|
129
|
+
#return -1 if self_name < other_name
|
|
130
|
+
#return 1 if self_name > other_name
|
|
167
131
|
|
|
168
|
-
|
|
132
|
+
#self_id = self.id
|
|
133
|
+
#other_id = test_object.id
|
|
134
|
+
#return -1 if self_id < other_id
|
|
135
|
+
#return 1 if self_id > other_id
|
|
136
|
+
|
|
137
|
+
#0
|
|
138
|
+
|
|
139
|
+
# optimized version
|
|
140
|
+
( ( result = ( @type <=> test_object.type ) ) == 0 ? ( ( result = ( @name <=> test_object.name ) ) == 0 ? @id <=> test_object.id : result ) : result )
|
|
169
141
|
|
|
170
142
|
end
|
|
171
143
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
# === returns
|
|
175
|
-
# LibXML::XML::Node:: XML representation of this test object
|
|
176
|
-
# === raises
|
|
177
|
-
# TestObjectNotFoundError:: The test object does not exist on the SUT any longer.
|
|
178
|
-
def xml_data()
|
|
144
|
+
# Function to be renamed, possibly refactored
|
|
145
|
+
def xml_data=( xml_object )
|
|
179
146
|
|
|
180
|
-
|
|
147
|
+
@x_path, @name, @type, @id, @env = TDriver::TestObjectAdapter.get_test_object_identifiers( xml_object, self )
|
|
181
148
|
|
|
182
|
-
|
|
149
|
+
end
|
|
183
150
|
|
|
184
|
-
|
|
151
|
+
# Returns a XML node representing this test object.
|
|
152
|
+
#
|
|
153
|
+
# === returns
|
|
154
|
+
# MobyUtil::XML::Element:: XML representation of this test object
|
|
155
|
+
# === raises
|
|
156
|
+
# TestObjectNotFoundError:: The test object does not exist on the SUT any longer.
|
|
157
|
+
def xml_data
|
|
185
158
|
|
|
186
|
-
|
|
159
|
+
begin
|
|
160
|
+
|
|
161
|
+
TDriver::TestObjectAdapter.get_xml_element_for_test_object( self )
|
|
187
162
|
|
|
188
|
-
|
|
189
|
-
|
|
163
|
+
rescue MobyBase::TestObjectNotFoundError
|
|
164
|
+
|
|
165
|
+
Kernel::raise MobyBase::TestObjectNotFoundError.new(
|
|
190
166
|
|
|
191
|
-
|
|
167
|
+
"The test object (id: #{ @id.inspect }, type: #{ @type.inspect }, name: #{ @name.inspect }) does not exist on #{ @sut.id.inspect } anymore"
|
|
168
|
+
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
end
|
|
192
172
|
|
|
193
|
-
|
|
173
|
+
end
|
|
194
174
|
|
|
195
|
-
|
|
175
|
+
# TODO: document me
|
|
176
|
+
def inspect
|
|
177
|
+
|
|
178
|
+
"#<#{ self.class }:0x#{ ( "%x" % ( self.object_id.to_i << 1 ) )[ 3 .. -1 ] } @id=\"#{ @id }\" @name=\"#{ @name }\" @parent=#{ @parent.inspect } @sut=#{ @sut.inspect } @type=\"#{ @type }\" @x_path=\"#{ @x_path }\">"
|
|
196
179
|
|
|
197
|
-
|
|
198
|
-
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
# enable hooking for performance measurement & debug logging
|
|
183
|
+
TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
|
|
199
184
|
|
|
200
|
-
|
|
185
|
+
end # TestObject
|
|
201
186
|
|
|
202
187
|
end # MobyBase
|